我正在使用Irony为脚本语言创建解析器,但是遇到一个小问题:如何在Irony中翻译这样的EBNF表达式?

'(' [ Ident { ',' Ident } ] ')'


我已经尝试过一些技巧

Chunk.Rule = (Ident | Ident + "," + Chunk);
CallArgs.Rule = '(' + Chunk + ')' | '(' + ')';


但这很丑陋,我甚至不确定它是否可以正常工作(还没有尝试过……)。有任何建议吗?

编辑:
我发现了这些辅助方法(MakeStarList,MakePlusList),但由于完全缺少Irony的文档,因此找不到如何使用它们的方法。

最佳答案

// Declare the non-terminals
var Ident = new NonTerminal("Ident");
var IdentList = new NonTerminal("Term");

// Rules
IdentList.Rule = ToTerm("(") + MakePlusRule(IdentList, ",", Ident) + ")";
Ident.Rule = // specify whatever Ident is (I assume you mean an identifier of some kind).


您可以使用MakePlusRule帮助程序方法来定义某个终端的一次或多次出现。 MakePlusRule基本上只是将您的终端显示为标准的递归列表惯用法:

Ident |  IdentList + "," + Ident


它还将终端标记为代表列表,这将告诉解析器将列表树展开为方便的子节点列表。

关于c# - 将EBNF转换为反讽,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20101574/

10-10 21:56