2

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

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

我已经尝试了一些技巧,比如

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

但这很丑陋,我什至不确定这是否按应有的方式工作(还没有尝试过……)。有人有什么建议吗?

编辑:我发现了这些辅助方法(MakeStarList、MakePlusList),但由于完全缺乏 Irony 的文档,我无法找到它们的使用方法……有人知道吗?

4

1 回答 1

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

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

于 2013-12-19T08:04:20.570 回答