【发布时间】: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(*) 解析器。