我正在尝试基于 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)