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

标签 c parsing syntax peg

所以从我有限的理解,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 

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

最佳答案

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

typedefName : Identifier

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

关于c - 如何在解析表达式语法(如 PEG.js)中处理语法上的歧义(如在 C 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59482460/

相关文章:

c++ - 为什么在c++中两次包含一个头文件是有效的?

java - 在Java中,如何在不提前知道名称的情况下加载类?

c - 如何在不引用 c 对象的情况下导入使用 FFI 的 haskell 模块?

用 mod 计算 rand 的动态范围

c# - 用于 html 解析的正则表达式(在 c# 中)

java - 如何在不使用 .parse() 的情况下解析 Java 中的字符串?

c - 错误: Declaration of non-variable 'strlen' in 'for' loop initial declaration - C

c - 如何检查整数是否是数组中元素的线性组合?

mysql - 在 ANTLR 中编写 SQL 解析器有哪些挑战?

javascript - typescript const x = [...this.x]