【问题标题】:Translating EBNF into Irony将 EBNF 翻译成讽刺
【发布时间】:2013-11-20 16:35:13
【问题描述】:

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

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

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

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

但这很丑陋,我什至不确定这是否可以正常工作(还没有尝试过......)。有人有什么建议吗?

编辑: 我找到了这些辅助方法(MakeStarList、MakePlusList),但由于完全缺乏 Irony 的文档,所以无法找到如何使用它们……有没有人有任何线索?

【问题讨论】:

    标签: c# ebnf irony


    【解决方案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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多