我正在尝试使用Irony .NET创建一个简单的 DSL 来处理相当复杂的掷骰子指令。基本的计算器功能很容易实现(加法、减法等)。然而,当我终于可以添加滚动表达式时,我遇到了麻烦。理想情况下,我希望滚动表达式采用以下形式: ndm 其中 n 是要滚动的骰子数,m 是每个骰子的面数。
我的问题是我想要 d 旁边的表达式,如果我这样做, Irony 会抱怨 d 是一个无效字符。它周围的空格有效(1 d 6),用非字母数字字符代替它有效(1%6)。目前,我只需将源中的每个 d 替换为“ d ”即可工作,但这显然在我处理变量时不起作用(我计划在前面加上 '$' 以将它们分开)。
问题是,我怎样才能让它在没有空格(1d6)的情况下工作,最好不要对语法进行任何重大改变?(注意:如果它仍然适用于空格,那是完全可以的,我只是不希望它们是必需的。)
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;