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

Proving syntactic ambiguity of type declaration grammar

提问人:pramington 提问时间:10/6/2014 最后编辑:pramington 更新时间:10/6/2014 访问量:395

问:

给定实现 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赞 n. m. could be an AI 10/6/2014
Declarator是非终端,就像.你不应该输入一个你想分析的字符串,你必须把它简化为一系列终端。typeDeclarator
1赞 Ira Baxter 10/6/2014
是什么让你觉得它是模棱两可的?

答:

3赞 rici 10/6/2014 #1

是三个指针的数组还是指向三个 int 数组的指针?怎么样 ?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]*