我正在使用Irony为脚本语言创建解析器,但我遇到了一个小问题:如何在Irony中翻译这样的EBNF表达式?
'(' [ Ident { ',' Ident } ] ')'
我已经尝试了一些像
这样的技巧Chunk.Rule = (Ident | Ident + "," + Chunk);
CallArgs.Rule = '(' + Chunk + ')' | '(' + ')';
但它很丑陋,我甚至不确定它是否能按照应有的方式运行(尚未尝试过......)。有人有什么建议吗?
编辑: 我发现了这些辅助方法(MakeStarList,MakePlusList)但却无法找到如何使用它们,因为完全没有Irony的文档......有没有人知道?
答案 0 :(得分:1)
// 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
它还将终端标记为表示列表,该列表将告诉解析器将列表树展开为子节点的方便列表。