如何在解析表达式语法(如 PEG.js)中处理语法上的歧义(如在 C 中)

Lan*_*ard 5 c syntax parsing peg

所以从我有限的理解来看,C 有语法歧义,如表达式所示:

T(*b)[4];
Run Code Online (Sandbox Code Playgroud)

这里是这样说的:

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

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

typedef a;
b * a;                    // multiplication
a * b;                    // b is pointer to type a 
Run Code Online (Sandbox Code Playgroud)

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

Chr*_*odd 3

在 PEG 语法中处理此问题的常用方法是在规则上使用语义谓词,以便规则仅在谓词为 true 时匹配,并让谓词检查所讨论的名称是否是当前上下文中的类型。在您提供的链接中,有一个规则

typedefName : Identifier
Run Code Online (Sandbox Code Playgroud)

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