以下是我Bison语法规则的相关部分:
我知道问题与优先级有关。例如,如果表达式是:
a + b * c
Bison是否在a +之后进行移位并希望找到一个表达式,还是将a减少为一个表达式?我觉得这是由于Bison 1个令牌向前查看的限制,但我无法弄清楚如何重写规则以解决冲突。
我的教授会因移位/规约冲突而扣分,因此我不能使用%expect。我的教授还声明我们不能使用%left或%right优先级值。
这是我在Stack上的第一篇文章,请告诉我是否发布不当。我已搜索现有的帖子,但这似乎是一个逐案例的事情。如果我从Stack中使用任何代码,我将在提交的项目中注明来源。
谢谢!
statement:
expression ';' |
IF expression THEN statement ELSE statement END_IF ';'
;
expression:
IDENTIFIER |
IDENTIFIER '('expressions')' |
LIT_INT |
LIT_REAL |
BOOL_OP |
LOG_NOT expression |
expression operator expression |
'('expression')'
;
expressions:
expression |
expressions ',' expression
;
operator:
REL_OP |
ADD_OP |
MULT_OP |
LOG_OR |
LOG_AND
;
编译时,我遇到了10个移位/规约冲突:
其中5个冲突是由LOG_NOT表达式规则引起的:
State 45
25 expression: LOG_NOT expression .
26 | expression . operator expression
REL_OP shift, and go to state 48
ADD_OP shift, and go to state 49
MULT_OP shift, and go to state 50
LOG_OR shift, and go to state 51
LOG_AND shift, and go to state 52
REL_OP [reduce using rule 25 (expression)]
ADD_OP [reduce using rule 25 (expression)]
MULT_OP [reduce using rule 25 (expression)]
LOG_OR [reduce using rule 25 (expression)]
LOG_AND [reduce using rule 25 (expression)]
$default reduce using rule 25 (expression)
operator go to state 54
“表达式运算符表达式”的规则会导致以下5个冲突:
State 62
26 expression: expression . operator expression
26 | expression operator expression .
REL_OP shift, and go to state 48
ADD_OP shift, and go to state 49
MULT_OP shift, and go to state 50
LOG_OR shift, and go to state 51
LOG_AND shift, and go to state 52
REL_OP [reduce using rule 26 (expression)]
ADD_OP [reduce using rule 26 (expression)]
MULT_OP [reduce using rule 26 (expression)]
LOG_OR [reduce using rule 26 (expression)]
LOG_AND [reduce using rule 26 (expression)]
$default reduce using rule 26 (expression)
operator go to state 54
我知道问题与优先级有关。例如,如果表达式是:
a + b * c
Bison是否在a +之后进行移位并希望找到一个表达式,还是将a减少为一个表达式?我觉得这是由于Bison 1个令牌向前查看的限制,但我无法弄清楚如何重写规则以解决冲突。
我的教授会因移位/规约冲突而扣分,因此我不能使用%expect。我的教授还声明我们不能使用%left或%right优先级值。
这是我在Stack上的第一篇文章,请告诉我是否发布不当。我已搜索现有的帖子,但这似乎是一个逐案例的事情。如果我从Stack中使用任何代码,我将在提交的项目中注明来源。
谢谢!