ANSI C YACC 语法中的歧义问题

4

我正在查看 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
    ;

这里是有关赋值表达式和常量表达式的规则。 我的问题是它们如何都使用条件表达式来简化? 如果一个令牌被简化为条件表达式,那么在该令牌被简化后,YACC解析器如何知道如何在赋值表达式常量表达式之间简化下一个令牌? 我认为我错过了一些重要的东西,但我自己找不到。 谢谢

@n.m. 抱歉,我刚刚编辑了。 - TYFA
2个回答

4

因为不存在assignment_expressionconstant_expression同时出现的上下文,所以这里没有任何歧义。

规则如此形式毫无问题。

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

如果在不同的上下文中出现了abc,如果您有以下内容:
t: a | b | c;

那么就会存在一个问题。但是对于conditional_expression没有这样的情况。


2

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

Translated text:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接