首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Irony .NET -作为运算符的字符

Irony .NET -作为运算符的字符
EN

Stack Overflow用户
提问于 2012-09-18 12:54:38
回答 1查看 901关注 0票数 0

我正在尝试使用Irony .NET创建一个简单的领域特定语言来处理相当复杂的掷骰子指令。基本的计算器功能很容易实现(加法、减法等)。但是,当我终于可以开始添加roll表达式时,我遇到了麻烦。理想情况下,我希望一个掷骰子表达式采用以下形式: ndm,其中n是要掷出的骰子数,m是每个骰子上的边数。

我这里的问题是,我想让表达式紧挨着d,如果我这样做了,讽刺的是我会抱怨d是一个无效字符。它周围的空格起作用(1d 6),用非字母数字字符替换它起作用(1%6)。目前,我只需将源代码中的每个d替换为“d ",就可以让它工作,但当我处理变量时,这显然不会起作用(我计划在变量之前加上”$“,以将它们分开)。

问题是,我如何让它在没有空格(1d6)的情况下工作,最好是在语法没有任何重大变化的情况下?(注意:如果它仍然适用于空格,这是完全没有问题的,我只是不希望它们是必需的。)

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-04 08:13:48

问题是你需要一些方法来告诉你一个令牌在哪里开始和结束。如果不能首先将字符串分解成标记,语法就不能弄清楚什么是什么。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12470593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档