【问题标题】:PEG and whitespace/commentsPEG 和空格/注释
【发布时间】:2012-04-09 11:21:33
【问题描述】:

我有一些使用 ANTLR 编写解析器的经验,我正在尝试(用于自学:))将其中一个移植到 PEG(解析表达式语法)。

当我试图了解这个想法时,有一件事让我觉得很麻烦,以至于我觉得我错过了一些东西:如何处理空白。

在 ANTLR 中,处理空格和 cmets 的常规方法是将标记放在隐藏通道中,但 PEG 语法没有标记化步骤。考虑到 C 或 Java 等语言几乎在任何地方都允许使用 cmets,因此希望立即“隐藏” cmets,但由于 cmets 可能具有语义含义(例如,在生成代码文档、类图等时),因此一个不只是想丢弃它们。

那么,有没有办法解决这个问题?

【问题讨论】:

    标签: parser-generator peg


    【解决方案1】:

    因为没有单独的标记化阶段,所以没有“时间”来丢弃某些字符(或标记)。

    由于您熟悉 ANTLR,因此可以这样想:假设 ANTLR 只处理 PEG。所以你只有解析器规则,没有词法分析器规则。现在你将如何丢弃空格? (你不能)。

    所以,你的问题的答案是:你不能,你必须在 PEG 中用空格规则乱扔你的语法:

    ANTLR

    add_expr
     : Num Add Num
     ;
    
    Add   : '+';
    Num   : '0'..'9'+;
    Space : ' '+ {skip();};
    

    PEG

    add_expr
     : num _ '+' _ num
     ;
    
    num : '0'..'9'+;
    _   : ' '*;
    

    【讨论】:

    • 这就是我的怀疑。只是想确认我并没有从根本上误解某些东西。谢谢!
    • 好答案,我几乎想换一个解析器生成器,直到我看到你使用“_”的答案,这使得 PEG 更具可读性!
    【解决方案2】:

    可以嵌套 PEG 解析器。这个想法是第一个解析器使用字符并将标记提供给第二个解析器。第二个 PEG 解析器使用令牌并完成实际工作。

    当然,这意味着您放弃了 Parsing Expression Grammar 与其他解析方案相比的一个优势:PEG 的简单性。

    【讨论】:

    • 你为什么要这样做?如果您无法将顶级解析器中的终端/非终端定义为第二个解析器将无济于事......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-10
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多