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

How to handle ambiguity in syntax (like in C) in a Parsing Expression Grammar (like PEG.js)

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

T(*b)[4];

Here据说是这样的:

The well-known "typedef problem" with parsing C is that the standard C grammar is ambiguous unless the lexer distinguishes identifiers bound by typedef and other identifiers as two separate lexical classes. This means that the parser needs to feed scope information to the lexer during parsing. One upshot is that lexing must be done concurrently with parsing.

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

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

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

在 PEG 语法中处理这个问题的通常方法是在规则上使用语义谓词,这样规则只在谓词为真时才匹配,并让谓词检查所讨论的名称是否是当前上下文与否。在你给出的link中,有一条规则

typedefName : Identifier

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