Я пытаюсь написать грамматику lex/yacc для C11 на основе N1570. Большая часть моей грамматики дословно скопирована из информативного резюме синтаксиса, но возникли некоторые конфликты yacc. Мне удалось решить все из них, кроме одного: кажется, существует некоторая двусмысленность между тем, когда '_Atomic' используется в качестве спецификатора типа, и когда он используется в качестве квалификатора типа.
В форме спецификатора за _Atomic сразу следуют круглые скобки, поэтому я предполагаю, что это как-то связано с малоиспользуемым синтаксисом C, который позволяет деклараторам заключаться в круглые скобки, что позволяет скобкам следовать сразу за квалификатором. Но моя грамматика уже знает, как отличать имена typedef от других идентификаторов, так что yacc должен знать разницу, не так ли?
Я не могу в жизни придумать случай, когда это действительно было бы двусмысленно.
Сомневаюсь, что это поможет, но вот соответствующий вывод состояния, который я получаю, когда использую флаг -v yacc. «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)