私はC11用のlex/yacc文法をN1570に基づいて書こうとしています。私の文法のほとんどは、有益な構文の要約からそのままコピーされていますが、yaccの競合が起きています。私は1つを除いてすべてを解決することに成功しました。「_Atomic」が型指定子として使用されているときと、型修飾子として使用されているときのあいまいさがあるようです。_Atomic型指定子と修飾子の間のC11文法のあいまいさ
_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'、...のいずれかの順序で混在させることができるため、文法の区別指定子と修飾子は大体非標準です。 – Kaz