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)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage