ANSI C YACC 语法中的歧义
Ambiguity in ANSI C YACC grammar
我正在看 ANSI C YACC 语法。
还有一点我不明白。
http://www.lysator.liu.se/c/ANSI-C-grammar-y.html#expression
assignment_expression
: conditional_expression
| unary_expression assignment_operator assignment_expression
;
constant_expression
: conditional_expression
;
这里是赋值表达式和常量表达式的规则。
我的问题是他们怎么都用conditional_expression
来减少?
如果有一个记号缩减为conditional_expression,在记号缩减之后,YACC解析器如何知道如何在assignment_expression
和constant_expression
之间缩减下一个记号?
我想我错过了一些巨大的东西,但我自己找不到。
谢谢
一个 EBNF 语法可以同时有多个有效的 rules/states time.That 意味着在这种情况下,如果它找到一个条件,它可以匹配一个 assignment_expression 和一个 constant_expression同时。要获得唯一的答案,使用这两个规则的规则必须足够具体,才能将给定的输入序列仅与单个规则序列匹配,或者您可以使用优先级 select 来自多个可能序列的单个规则序列。
没有歧义,因为没有上下文可以同时出现assignment_expression
和constant_expression
。
具有以下形式的规则绝对没有错
a: z;
b: z;
c: z;
if a
、b
和 c
都出现在不同的上下文中。如果你有以下
t: a | b | c;
那就有问题了。但是 conditional_expression
.
就没有这样的东西了
我正在看 ANSI C YACC 语法。 还有一点我不明白。 http://www.lysator.liu.se/c/ANSI-C-grammar-y.html#expression
assignment_expression
: conditional_expression
| unary_expression assignment_operator assignment_expression
;
constant_expression
: conditional_expression
;
这里是赋值表达式和常量表达式的规则。
我的问题是他们怎么都用conditional_expression
来减少?
如果有一个记号缩减为conditional_expression,在记号缩减之后,YACC解析器如何知道如何在assignment_expression
和constant_expression
之间缩减下一个记号?
我想我错过了一些巨大的东西,但我自己找不到。
谢谢
一个 EBNF 语法可以同时有多个有效的 rules/states time.That 意味着在这种情况下,如果它找到一个条件,它可以匹配一个 assignment_expression 和一个 constant_expression同时。要获得唯一的答案,使用这两个规则的规则必须足够具体,才能将给定的输入序列仅与单个规则序列匹配,或者您可以使用优先级 select 来自多个可能序列的单个规则序列。
没有歧义,因为没有上下文可以同时出现assignment_expression
和constant_expression
。
具有以下形式的规则绝对没有错
a: z;
b: z;
c: z;
if a
、b
和 c
都出现在不同的上下文中。如果你有以下
t: a | b | c;
那就有问题了。但是 conditional_expression
.