【发布时间】:2012-05-19 21:21:00
【问题描述】:
我正在尝试基于 N1570 为 C11 编写 lex/yacc 语法。我的大部分语法都是从信息丰富的语法摘要中逐字复制的,但出现了一些 yacc 冲突。我已经设法解决了所有问题,除了一个:“_Atomic”用作类型说明符和用作类型限定符之间似乎存在一些歧义。
在说明符形式中,_Atomic 后面紧跟括号,所以我假设它与 C 的很少使用的语法有关,它允许声明符放在括号中,从而允许括号紧跟限定符。但是我的语法已经知道如何区分 typedef 名称和其他标识符,所以 yacc 应该知道区别,不是吗?
我这辈子都想不出一个实际上是模棱两可的案例。
我怀疑它是否有帮助,但这是我使用 yacc 的 -v 标志时得到的相关状态输出。 “ATOMIC”显然是我对“_Atomic”的标记名称
state 23
152 atomic_type_specifier: ATOMIC . '(' type_name ')'
156 type_qualifier: ATOMIC .
'(' shift, and go to state 49
'(' [reduce using rule 156 (type_qualifier)]
$default reduce using rule 156 (type_qualifier)
【问题讨论】:
-
在语法中区分说明符和限定符在很大程度上是行不通的,因为声明可以按任何顺序混合说明符和限定符:
const unsigned int,unsigned const int,int unsigned const, ...