【问题标题】:How to handle ambiguity in syntax (like in C) in a Parsing Expression Grammar (like PEG.js)如何在解析表达式语法(如 PEG.js)中处理语法歧义(如在 C 中)
【发布时间】:2020-04-16 08:15:54
【问题描述】:

所以根据我的有限理解,C has syntax ambiguity 如表达式所示:

T(*b)[4];

Here据说这种事:

解析 C 时众所周知的“typedef 问题”是标准 C 语法是模棱两可的,除非词法分析器将 typedef 绑定的标识符和其他标识符区分为两个单独的词法类。这意味着解析器需要在解析期间将范围信息提供给词法分析器。结果之一是词法分析必须与解析同时进行。

问题是它可以被解释为乘法或指针,具体取决于上下文(我不是 100% 理解这方面的细节,因为我不是 C 方面的专家,但我明白了它的要点以及为什么这是个问题)。

typedef a;
b * a;                    // multiplication
a * b;                    // b is pointer to type a 

我想知道的是,如果您要使用解析表达式语法 (PEG) 解析 C,例如 this C grammar,它如何处理这种歧义?由于这个问题,我认为这个语法不是 100% 正确的,所以我想知道你将如何解决它。它需要跟踪什么或采取不同的措施来解决这个问题?

【问题讨论】:

  • 强制转换在类型周围有括号。所以歧义在(a)*b(b)*a 之间。 a*b 总是乘法(或错误)。
  • 另外,您链接到的语法是 Antlr4 语法,不是 PEG。 Antlr4 使用扩展的 BNF 表示法构建 LL(*) 解析器。

标签: c parsing syntax peg


【解决方案1】:

在 PEG 语法中处理这种情况的通常方法是在规则上使用语义谓词,使得规则仅在谓词为真时匹配,并让谓词检查所讨论的名称是否是当前的类型上下文与否。在您提供的链接中,有一条规则

typedefName : Identifier

这是(唯一)需要语义谓词来解决这种歧义的。谓词只是根据当前范围内的定义检查有问题的标识符。如果它没有被定义为一个类型,那么它会拒绝这个规则,所以下一个优先级较低的将(尝试)匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2012-02-01
    • 2017-03-25
    相关资源
    最近更新 更多