给出了实现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;
我在这里看不到什么?
答案 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]
优先于前缀限定符*
,这是表达式的正常模式。这与声明的语法相比如何?为什么要做出这个决定?