Language agnostic 类型声明语法的句法歧义性证明
给定实现C样式类型声明的语法: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 我必须证明句法歧义。我很难识
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]
优先于前缀限定符*
,这是表达式的正常模式。这与声明的语法相比如何?为什么会做出这样的决定 声明符
是一个非终结符,就像类型
一样。您不应该将声明符放入要分析的字符串中,您必须将其简化为一系列的终端。是什么让您认为它是不明确的?