野牛 - 2班/减少冲突

时间:2014-11-10 02:24:46

标签: compiler-construction conflict bison yacc

我一直在盯着我的代码一段时间,我不知道如何解决这个问题。我使用调试器来找到问题,但我不明白错误。

number_constant :   integer
                |   SUBTRACT integer
                |   SUBTRACT integer PERIOD integer
                |   integer PERIOD integer
                ;
digit           :   INTEGER
                ;
integer         :   digit
                |   integer digit
                ;

这是输出告诉我冲突的两个状态

state 38

36 number_constant: integer .
40 decimal_constant: integer . PERIOD integer
46 integer: integer . digit

INTEGER  shift, and go to state 6
PERIOD   shift, and go to state 55

PERIOD    [reduce using rule 36 (number_constant)]
$default  reduce using rule 36 (number_constant)

digit  go to state 56    

------------------

state 46

37 number_constant: SUBTRACT integer .
39 decimal_constant: SUBTRACT integer . PERIOD integer
46 integer: integer . digit

INTEGER  shift, and go to state 6
PERIOD   shift, and go to state 65

PERIOD    [reduce using rule 37 (number_constant)]
$default  reduce using rule 37 (number_constant)

digit  go to state 56

整个输出:http://pastebin.com/bUxYZeHr

提前致谢

2 个答案:

答案 0 :(得分:1)

你的语法包括

27 term: value
28     | value PERIOD term
29     | value DIVIDE term

value可以是integerterm可以是value,因此integer PERIOD integer可以是decimal_constant或{ {1}}。

唯一可能的决议是消除歧义。什么是term应该是什么意思?

答案 1 :(得分:0)

在我看来,你正在做我的编译器课程。我最好来上课/实验室并向我寻求帮助,而不是在你可以更快地直接获得它时询问stackoverflow!

实际问题,我相信你现在已经找到了;当你的作业已经交付时,有些工作是在flex中的词法分析器中完成的,有些是在野外的解析器中完成的。 flex中的令牌INTEGER包含所有数字,并且在bison中不应该有一个数字序列的规则。