0

我正在尝试使用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;
4

1 回答 1

2

问题是您需要某种方式来判断令牌的开始和结束位置。如果不能首先将字符串分解为标记,语法就无法弄清楚是什么。

I do believe Irony does support this, have a look at AssignWhitespaceAndDelimiters(), it looks like "d" needs to be added to the list of key terms, or could be added as a delimiter itself.

于 2012-10-04T00:13:48.097 回答