我是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 ;