Mehrdeutigkeit der C11-Grammatik zwischen _Atomic-Typspezifizierer und Qualifizierer
Ich versuche, eine Lex / Yacc-Grammatik für C11 basierend auf N1570 zu schreiben. Der größte Teil meiner Grammatik wurde wörtlich aus der informativen Syntaxzusammenfassung übernommen, es traten jedoch einige Yacc-Konflikte auf. Ich habe es geschafft, alle außer einem zu lösen: Es scheint eine gewisse Unklarheit zwischen der Verwendung von '_Atomic' als Typspezifizierer und der Verwendung als Typqualifizierer zu bestehen.
In der Spezifiziererform wird _Atomic sofort von Klammern gefolgt, daher gehe ich davon aus, dass es etwas mit der wenig verwendeten Syntax von C zu tun hat, mit der Deklaratoren in Klammern gesetzt werden können, sodass Klammern einem Qualifizierer unmittelbar folgen können. Aber meine Grammatik weiß bereits, wie man typisierte Namen von anderen Bezeichnern unterscheidet, also sollte yacc den Unterschied kennen, nicht wahr?
Ich kann mir für mein ganzes Leben keinen Fall vorstellen, in dem es tatsächlich zweideutig wäre.
Ich bezweifle, dass es hilft, aber hier ist die relevante Statusausgabe, die ich erhalte, wenn ich das Flag -v von yacc verwende. "ATOMIC" ist offensichtlich mein Token für "_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)