C# Irony.NET-作为运算符的角色
我正在尝试创建一个简单的DSL,使用它来处理相当复杂的掷骰子指令。基本的计算器功能非常简单,可以实现(加法、减法等)。然而,当我终于开始添加滚动表达式时,我遇到了麻烦。理想情况下,我希望滚动表达式的形式为:ndm,其中n是要滚动的骰子数,m是每个骰子上的边数 我这里的问题是,我希望表达式位于d的旁边,如果我这样做的话,讽刺的是d是一个无效字符。它周围的空格起作用(1d6),用非字母数字字符替换它起作用(1%6)。目前,我只需将源代码中的每个d替换为“d”就可以了,但当我谈到变量时,这显然不起作用(我计划在变量前面加上“$”以区分它们) 问题是,在没有空格(1d6)的情况下,我如何使它工作,最好是在语法上没有任何大的变化?(注意:如果它仍然可以使用空格,那也没关系,我只是不希望它们是必需的。)C# Irony.NET-作为运算符的角色,c#,.net,irony,C#,.net,Irony,我正在尝试创建一个简单的DSL,使用它来处理相当复杂的掷骰子指令。基本的计算器功能非常简单,可以实现(加法、减法等)。然而,当我终于开始添加滚动表达式时,我遇到了麻烦。理想情况下,我希望滚动表达式的形式为:ndm,其中n是要滚动的骰子数,m是每个骰子上的边数 我这里的问题是,我希望表达式位于d的旁边,如果我这样做的话,讽刺的是d是一个无效字符。它周围的空格起作用(1d6),用非字母数字字符替换它起作用(1%6)。目前,我只需将源代码中的每个d替换为“d”就可以了,但当我谈到变量时,这显然不起作用
问题是您需要某种方法来告诉令牌从何处开始和结束。如果不能首先将字符串分解为标记,语法就无法理解是什么 我相信反讽确实支持这一点,看看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;