将EBNF翻译成反讽

时间:2013-11-20 16:35:14

标签: c# ebnf irony

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

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

我已经尝试了一些像

这样的技巧
Chunk.Rule = (Ident | Ident + "," + Chunk);
CallArgs.Rule = '(' + Chunk + ')' | '(' + ')';

但它很丑陋,我甚至不确定它是否能按照应有的方式运行(尚未尝试过......)。有人有什么建议吗?

编辑: 我发现了这些辅助方法(MakeStarList,MakePlusList)但却无法找到如何使用它们,因为完全没有Irony的文档......有没有人知道?

1 个答案:

答案 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

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