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_expressionconstant_expression之间缩减下一个记号? 我想我错过了一些巨大的东西,但我自己找不到。 谢谢

一个 EBNF 语法可以同时有多个有效的 rules/states time.That 意味着在这种情况下,如果它找到一个条件,它可以匹配一个 assignment_expression 和一个 constant_expression同时。要获得唯一的答案,使用这两个规则的规则必须足够具体,才能将给定的输入序列仅与单个规则序列匹配,或者您可以使用优先级 select 来自多个可能序列的单个规则序列。

没有歧义,因为没有上下文可以同时出现assignment_expressionconstant_expression

具有以下形式的规则绝对没有错

a: z;
b: z;
c: z;

if abc 都出现在不同的上下文中。如果你有以下

t: a | b | c;

那就有问题了。但是 conditional_expression.

就没有这样的东西了