Я пытаюсь написать грамматику lex/yacc для C11, основанной на N1570. Большая часть моей грамматики скопирована дословно из резюме информационного синтаксиса, но возникли некоторые конфликты yacc. Мне удалось решить все из них, кроме одного: кажется, что существует некоторая неопределенность между тем, когда "_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)