2017-05-23 46 views
0

test.yYACC移位/减少空规则相冲突

%% 
TOP : 
    OPTIONS 
    ; 

OPTIONS : 
    OPTION 
    | OPTIONS OPTION 
    ; 

OPTION : 
    /*no option is possible*/ 
    | 'C' 
    ; 
%% 

YACC -v test.y

y.output包含以下

0 $accept : TOP $end 

    1 TOP : OPTIONS 

    2 OPTIONS : OPTION 
    3   | OPTIONS OPTION 

    4 OPTION : 
    5   | 'C' 

0: shift/reduce conflict (shift 1, reduce 4) on 'C' 
state 0 
    $accept : . TOP $end (0) 
    OPTION : . (4) 

    'C' shift 1 
    $end reduce 4 

    TOP goto 2 
    OPTIONS goto 3 
    OPTION goto 4 


state 1 
    OPTION : 'C' . (5) 

    . reduce 5 


state 2 
    $accept : TOP . $end (0) 

    $end accept 


3: reduce/reduce conflict (reduce 1, reduce 4) on $end 
3: shift/reduce conflict (shift 1, reduce 4) on 'C' 
state 3 
    TOP : OPTIONS . (1) 
    OPTIONS : OPTIONS . OPTION (3) 
    OPTION : . (4) 

    'C' shift 1 
    $end reduce 1 

    OPTION goto 5 


state 4 
    OPTIONS : OPTION . (2) 

    . reduce 2 


state 5 
    OPTIONS : OPTIONS OPTION . (3) 

    . reduce 3 


State 0 contains 1 shift/reduce conflict. 
State 3 contains 1 shift/reduce conflict, 1 reduce/reduce conflict. 


3 terminals, 4 nonterminals 
6 grammar rules, 6 states 

为什么有移进/归约并减少/减少冲突。

我已阅读yacc解析器如何在http://dinosaur.compilertools.net/yacc/的“解析器如何工作”部分中工作,但我不明白yacc如何处理空白规则。似乎它试图在任何地方使用空的规则。

问题1. yacc如何处理状态机的空规则以及上面链接中描述的“向前看令牌”。

问题2.我如何摆脱冲突并仍然保持语法的“逻辑”?

感谢您的帮助事先。

回答

1

当然,它试图使用空的规则“无处不在”。它正在做你告诉它做的事情。

你说的是,非终结OPTIONS代表OPTION非终端任意正数,以及OPTION非终端可以是C或空。

由于OPTION可以为空,所以在空输入中可以有任意数量的它们。两个空OPTION看起来完全像153空OPTION s。更重要的是,两个C令牌之间可以有任意数量的空OPTION

所以你的语法是不明确的,野牛报告解析冲突。

如果你想定义OPTIONS任何数量的OPTION S,包括零个OPTION S,然后只是说:

options: %empty 
     | options option 
option : 'C' 
+0

YACC:电子 - “test.y”,语法错误 %的线13空 yacc -V yacc - 1.9 20070509 – abdullam

+0

@abdullam:在旧版本的野牛或除野牛之外的yacc实现中,不要使用'%empty'。只要把它放在外面,或者使用'/ * EMPTY * /'或其他方式(如在你的语法中)。 – rici

+0

所以不能摆脱旧版本的冲突? – abdullam