Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Irony.NET-作为运算符的角色_C#_.net_Irony - Fatal编程技术网

C# Irony.NET-作为运算符的角色

C# Irony.NET-作为运算符的角色,c#,.net,irony,C#,.net,Irony,我正在尝试创建一个简单的DSL,使用它来处理相当复杂的掷骰子指令。基本的计算器功能非常简单,可以实现(加法、减法等)。然而,当我终于开始添加滚动表达式时,我遇到了麻烦。理想情况下,我希望滚动表达式的形式为:ndm,其中n是要滚动的骰子数,m是每个骰子上的边数 我这里的问题是,我希望表达式位于d的旁边,如果我这样做的话,讽刺的是d是一个无效字符。它周围的空格起作用(1d6),用非字母数字字符替换它起作用(1%6)。目前,我只需将源代码中的每个d替换为“d”就可以了,但当我谈到变量时,这显然不起作用

我正在尝试创建一个简单的DSL,使用它来处理相当复杂的掷骰子指令。基本的计算器功能非常简单,可以实现(加法、减法等)。然而,当我终于开始添加滚动表达式时,我遇到了麻烦。理想情况下,我希望滚动表达式的形式为:ndm,其中n是要滚动的骰子数,m是每个骰子上的边数

我这里的问题是,我希望表达式位于d的旁边,如果我这样做的话,讽刺的是d是一个无效字符。它周围的空格起作用(1d6),用非字母数字字符替换它起作用(1%6)。目前,我只需将源代码中的每个d替换为“d”就可以了,但当我谈到变量时,这显然不起作用(我计划在变量前面加上“$”以区分它们)

问题是,在没有空格(1d6)的情况下,我如何使它工作,最好是在语法上没有任何大的变化?(注意:如果它仍然可以使用空格,那也没关系,我只是不希望它们是必需的。)


问题是您需要某种方法来告诉令牌从何处开始和结束。如果不能首先将字符串分解为标记,语法就无法理解是什么

我相信反讽确实支持这一点,看看AssignWhitespaceAndDelimiters(),它看起来像是“d”需要添加到关键术语列表中,或者可以添加为分隔符本身

expression = new NonTerminal("expression");
add = new NonTerminal("add");
subtract = new NonTerminal("subtract");
multiply = new NonTerminal("multiply");
divide = new NonTerminal("divide");
roll = new NonTerminal("roll");

expression.Rule = number | add | subtract | multiply | divide | roll;
add.Rule = expression + "+" + expression;
subtract.Rule = expression + "-" + expression;
multiply.Rule = expression + "*" + expression;
divide.Rule = expression + "/" + expression;
roll.Rule = expression + "d" + expression;

RegisterOperators(1, "+", "-");
RegisterOperators(2, "*", "/");
RegisterOperators(3, "d");

MarkPunctuation("+", "-", "*", "/", "d");
MarkTransient(expression);

this.Root = expression;