如何避免 yacc C 语法乘法和指针之间的冲突?



我是yacc初学者

C 语法乘法和指针

a = 10 ***** b

如何区分乘法和指针?

我认为只能根据b的类型来推断?

实际上,我看到了一些例子: http://www.quut.com/c/ANSI-C-grammar-l-2011.html 和 https://github.com/JavinYang/go-1/blob/release-branch.go1/src/cmd/gc/go.y

我不明白为什么这两个例子不会导致减少/减少冲突

我模仿上面的代码会引起冲突

logical_and_expression
: equality_expression
| logical_and_expression LOGICAL_AND equality_expression
{
$$ = 0;
}
;
equality_expression
: relational_expression
| equality_expression EQ relational_expression
{
$$ = 0;
}
| equality_expression NE relational_expression
{
$$ = 0;
}
;
relational_expression
: additive_expression
| relational_expression GT additive_expression
{
$$ = 0;
}
| relational_expression GE additive_expression
{
$$ = 0;
}
| relational_expression LT additive_expression
{
$$ = 0;
}
| relational_expression LE additive_expression
{
$$ = 0;
}
;
additive_expression
: multiplicative_expression 
| additive_expression ADD multiplicative_expression
{
}
| additive_expression SUB multiplicative_expression
{
};
multiplicative_expression
: unary_expression
| multiplicative_expression MUL unary_expression
{
}
| multiplicative_expression DIV unary_expression
{
}
unary_expression
: primary_expression
| MUL unary_expression // cause reduce/reduce conflicts
{
}
| SUB unary_expression
{
}
| EXCLAMATION unary_expression
{
}
| BIT_XOR unary_expression
{
}
;

y.输出冲突行:

state 85
79 multiplicative_expression: unary_expression .
83 unary_expression: MUL unary_expression .
LOGICAL_AND  reduce using rule 79 (multiplicative_expression)
LOGICAL_AND  [reduce using rule 83 (unary_expression)]
LOGICAL_OR   reduce using rule 79 (multiplicative_expression)
LOGICAL_OR   [reduce using rule 83 (unary_expression)]
EQ           reduce using rule 79 (multiplicative_expression)
EQ           [reduce using rule 83 (unary_expression)]
NE           reduce using rule 79 (multiplicative_expression)
NE           [reduce using rule 83 (unary_expression)]
GT           reduce using rule 79 (multiplicative_expression)
GT           [reduce using rule 83 (unary_expression)]
GE           reduce using rule 79 (multiplicative_expression)
GE           [reduce using rule 83 (unary_expression)]
LT           reduce using rule 79 (multiplicative_expression)
LT           [reduce using rule 83 (unary_expression)]
LE           reduce using rule 79 (multiplicative_expression)
LE           [reduce using rule 83 (unary_expression)]
ADD          reduce using rule 79 (multiplicative_expression)
ADD          [reduce using rule 83 (unary_expression)]
SUB          reduce using rule 79 (multiplicative_expression)
SUB          [reduce using rule 83 (unary_expression)]
MUL          reduce using rule 79 (multiplicative_expression)
MUL          [reduce using rule 83 (unary_expression)]
DIV          reduce using rule 79 (multiplicative_expression)
DIV          [reduce using rule 83 (unary_expression)]
NEW_LINE     reduce using rule 79 (multiplicative_expression)
NEW_LINE     [reduce using rule 83 (unary_expression)]
$default     reduce using rule 79 (multiplicative_expression)

没有冲突,因为乘法是中缀,指针取消引用是前缀,所以它们可以从上下文中消除歧义,在 LALR(1( 解析器中很简单。 您上面发布的片段没有冲突,因此您显示的冲突实际上来自其他规则。

最有可能来自允许两个连续表达式而没有标记分隔它们的规则,例如 (function_application: expression expression ;(。 如果将此类规则与可能是中缀或前缀的运算符(例如-*(结合使用,则结果不明确,因为a - b可以解析为(a) (- b)(函数应用程序 + 一元(或二进制操作。 为了消除歧义(以及将一元运算应用于函数应用程序结果的相关歧义(,您可以将函数应用程序的操作数设为 prime:function_application: primary_expression | primary_expression function_application ;

最新更新