Language agnostic 类型声明语法的句法歧义性证明

Language agnostic 类型声明语法的句法歧义性证明,language-agnostic,programming-languages,logic,grammar,proof,Language Agnostic,Programming Languages,Logic,Grammar,Proof,给定实现C样式类型声明的语法: Declaration ::= Type Declarator ; Type ::= int | char Declarator ::= * Declarator | Declarator [ num ] | Declarator ( Type ) | ( Declarator ) | name 我必须证明句法歧义。我很难识

给定实现C样式类型声明的语法:

Declaration ::= Type Declarator ;

       Type ::= int | char

 Declarator ::= * Declarator

              | Declarator [ num ]

              | Declarator ( Type )

              | ( Declarator )

              | name
我必须证明句法歧义。我很难识别那些模棱两可的案例。以下是我提出的符合语法要求的所有案例:

  • int*声明符
  • char*声明符
  • int声明符[num]
  • char声明符[num]
  • int声明符(类型)
  • char声明符(类型)
  • int声明器
  • char声明器
  • int名称
  • 字符名

我在这里没有看到什么?

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

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

(Many productions omitted) declarator: pointeropt direct-declarator pointer: '*' | '*' pointer direct-declarator: identifier '(' declarator ')' direct-declarator '[' assignment-expressionopt ']' (许多作品省略) 声明器:指针式直接声明器 指针:'*' |“*”指针 直接声明器:标识符 “('declarator')” 直接声明符'['赋值表达式']' 这如何解决上述歧义


也可以考虑表达式<代码> *[3 ] < /代码>和声明<代码> int *[3 ] < /代码>。在表达式中,后缀限定符

[3]
优先于前缀限定符
*
,这是表达式的正常模式。这与声明的语法相比如何?为什么会做出这样的决定

声明符
是一个非终结符,就像
类型
一样。您不应该将声明符放入要分析的字符串中,您必须将其简化为一系列的终端。是什么让您认为它是不明确的?