我正在尝试使用Irony .NET创建一个简单的领域特定语言来处理相当复杂的掷骰子指令。基本的计算器功能很容易实现(加法、减法等)。但是,当我终于可以开始添加roll表达式时,我遇到了麻烦。理想情况下,我希望一个掷骰子表达式采用以下形式: ndm,其中n是要掷出的骰子数,m是每个骰子上的边数。
我这里的问题是,我想让表达式紧挨着d,如果我这样做了,讽刺的是我会抱怨d是一个无效字符。它周围的空格起作用(1d 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;发布于 2012-10-04 08:13:48
问题是你需要一些方法来告诉你一个令牌在哪里开始和结束。如果不能首先将字符串分解成标记,语法就不能弄清楚什么是什么。
我相信讽刺确实支持这一点,看看AssignWhitespaceAndDelimiters(),它看起来"d“需要添加到关键术语列表中,或者可以作为分隔符本身添加。
https://stackoverflow.com/questions/12470593
复制相似问题