证明类型声明语法的句法歧义

时间:2014-10-06 06:39:50

标签: language-agnostic programming-languages logic grammar proof

给出了实现C风格类型声明的语法:

Declaration ::= Type Declarator ;

       Type ::= int | char

 Declarator ::= * Declarator

              | Declarator [ num ]

              | Declarator ( Type )

              | ( Declarator )

              | name

我必须证明语法含糊不清。我很难识别出含糊不清的案例。以下是我提出的满足语法的所有情况:

  • int * Declarator;
  • char * Declarator;
  • int Declarator[num];
  • char Declarator[num];
  • int Declarator(type);
  • char Declarator(type);
  • int Declarator;
  • char Declarator;
  • int name;
  • char name;

我在这里看不到什么?

1 个答案:

答案 0 :(得分:3)

int *something[3]是三个指针的数组还是指向三个整数数组的指针? int **something[3]怎么样?

C标准附录A中的简化C语法包括:

(Many productions omitted)
declarator: pointeropt direct-declarator
pointer: '*'
       | '*' pointer
direct-declarator: identifier
                   '(' declarator ')'
                   direct-declarator '[' assignment-expressionopt ']'

这如何解决上述歧义?

另外,请考虑表达式*a[3]和声明int *a[3]。在表达式中,后缀限定符[3]优先于前缀限定符*,这是表达式的正常模式。这与声明的语法相比如何?为什么要做出这个决定?