因此,根据我的有限理解,C has syntax ambiguity如表达式所示:
T(*b)[4];
Here关于这种事情的说法:
解析C时众所周知的“ typedef问题”是,除非词法分析器将由typedef绑定的标识符和其他标识符区分为两个单独的词法类,否则标准C语法是模棱两可的。这意味着解析器需要在解析期间将范围信息提供给词法分析器。一个结果是,词法分析必须与解析同时进行。
问题是它可以根据上下文解释为乘法或指针(由于我不是C专家,所以我不是100%理解它的细节,但是我了解它的要点以及为什么这是一个问题)。
typedef a;
b * a; // multiplication
a * b; // b is pointer to type a
我想知道的是,是否要使用诸如this C grammar之类的解析表达语法(PEG)来解析C,它如何处理这种歧义?由于该问题,我认为此语法不是100%正确的,因此我想知道您将如何解决它。它需要跟踪或采取其他措施来解决这个问题吗?
答案 0 :(得分:1)
在PEG语法中处理此问题的通常方式是在规则上使用语义谓词,以使该规则仅在谓词为true时才匹配,并让谓词检查当前使用的名称是否为类型是否上下文。在您提供的链接中,有一条规则
typedefName : Identifier
是(唯一)一个需要语义谓词来解决这种歧义的人。谓词仅根据当前作用域中的定义检查相关标识符。如果未将其定义为类型,则它将拒绝此规则,因此下一个优先级较低的优先级将(尝试)匹配。