ansic-YACC语法中的歧义

ansic-YACC语法中的歧义,c,grammar,yacc,C,Grammar,Yacc,我正在看ANSI C YACC语法。 还有一件事我不明白。 下面是赋值表达式和常量表达式的规则。 我的问题是,它们如何都使用条件表达式来减少? 如果有一个标记被缩减为条件_表达式,那么在标记缩减之后,YACC解析器如何知道如何在赋值_表达式和常量_表达式之间缩减下一个标记? 我想我错过了一些重要的东西,但我自己找不到。 谢谢一个EBNF语法可以同时具有多个有效规则/状态。这意味着在这种情况下,如果它找到一个条件,它可以同时匹配赋值表达式和常量表达式。要获得唯一的答案,使用这两个规则的规则必须足

我正在看ANSI C YACC语法。 还有一件事我不明白。

下面是赋值表达式和常量表达式的规则。 我的问题是,它们如何都使用
条件表达式来减少?
如果有一个标记被缩减为条件_表达式,那么在标记缩减之后,YACC解析器如何知道如何在
赋值_表达式
常量_表达式
之间缩减下一个标记? 我想我错过了一些重要的东西,但我自己找不到。
谢谢

一个EBNF语法可以同时具有多个有效规则/状态。这意味着在这种情况下,如果它找到一个条件,它可以同时匹配赋值表达式和常量表达式。要获得唯一的答案,使用这两个规则的规则必须足够具体,以便只将给定的输入序列与单个规则序列相匹配,或者您可以使用优先级从多个可能的序列中选择单个规则序列。

没有歧义,因为没有同时包含
赋值表达式的上下文。
可能会出现
常量表达式

形式规则绝对没有错

a: z;
b: z;
c: z;
如果
a
b
c
都出现在不同的上下文中。如果你有以下几点

t: a | b | c;

那就有问题了。但是对于
条件表达式

@n.m.对不起,我刚刚编辑过
t: a | b | c;