N1570をベースにしたC11用のlex/yacc文法を書き込もうとしています。私の文法のほとんどは、有益な構文の要約から逐語的にコピーされていますが、いくつかのyaccの競合が発生しました。1つを除いて、すべてを解決できました。「_ 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)