Вопрос по c – C11 грамматическая неоднозначность между спецификатором типа _Atomic и классификатором

11

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

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

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

Я сомневаюсь, что это помогает, но вот соответствующий вывод состояния, который я получаю, когда использую флаг yacc-s. & Quot; АТОМНОЙ & Quot; очевидно, мое имя токена для "_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)
Error: User Rate Limit Exceededconst unsigned int, unsigned const int, int unsigned const, ... Kaz

Ваш Ответ

2   ответа
9

If the _Atomic keyword is immediately followed by a left parenthesis, it is interpreted as a type specifier (with a type name), not as a type qualifier.

"_Atomic"/{WHITESPACE}*"(" {return ATOMIC_SPECIFIER;}
"_Atomic"                  {return ATOMIC_QUALIFIER;}

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
7

Error: User Rate Limit Exceeded

_Atomic int (*f)(int);

здесь_AtomicError: User Rate Limit Exceeded

int _Atomic (*f)(int);

Error: User Rate Limit ExceededintError: User Rate Limit Exceeded_Atomic сопровождается круглыми скобками, так чтоmustError: User Rate Limit Exceeded*fError: User Rate Limit Exceededtypedef.

Error: User Rate Limit Exceeded

The properties associated with atomic types are meaningful only for expressions that are lvalues.

Error: User Rate Limit Exceeded_AtomicError: User Rate Limit Exceeded

Edit:

Error: User Rate Limit Exceeded

_Atomic int (*A)[3];

Error: User Rate Limit Exceeded

int _Atomic (*A)[3];

Edit 2:Error: User Rate Limit Exceeded

typedef int toto;

int main(void) {
  const int toto(void);
  int const toto(void);
  const int (toto)(void);
  int const (toto)(void);
  return toto();
}

Error: User Rate Limit ExceededtotoError: User Rate Limit ExceededmainError: User Rate Limit Exceeded_AtomicError: User Rate Limit Exceeded

typedef int toto;

int main(void) {
  int _Atomic (toto)(void);
  return toto();
}

Error: User Rate Limit ExceededconstError: User Rate Limit Exceeded_AtomicError: User Rate Limit Exceeded

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededmustError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded_Atomic(*anything)Error: User Rate Limit ExceededIf the _Atomic keyword is immediately followed by a left parenthesis, it is interpreted as a type specifier (with a type name), not as a type qualifier.Error: User Rate Limit Exceeded Jo Bates

Похожие вопросы