Неоднозначность грамматики C11 между спецификатором типа _Atomic и квалификатором

Я пытаюсь написать грамматику lex/yacc для C11 на основе N1570. Большая часть моей грамматики дословно скопирована из информативного резюме синтаксиса, но возникли некоторые конфликты yacc. Мне удалось решить все из них, кроме одного: кажется, существует некоторая двусмысленность между тем, когда '_Atomic' используется в качестве спецификатора типа, и когда он используется в качестве квалификатора типа.

В форме спецификатора за _Atomic сразу следуют круглые скобки, поэтому я предполагаю, что это как-то связано с малоиспользуемым синтаксисом C, который позволяет деклараторам заключаться в круглые скобки, что позволяет скобкам следовать сразу за квалификатором. Но моя грамматика уже знает, как отличать имена typedef от других идентификаторов, так что yacc должен знать разницу, не так ли?

Я не могу в жизни придумать случай, когда это действительно было бы двусмысленно.

Сомневаюсь, что это поможет, но вот соответствующий вывод состояния, который я получаю, когда использую флаг -v yacc. «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)
11
задан Jo Bates 19 May 2012 в 21:21
поделиться