2014-04-02 92 views
0

空规则下面我有yacc语法:移位减少误差与野牛

OPTIONS:OPTIONS OPTION     {printf("%s\n", "Options enabled");} 
     | OPTION      {printf("%s\n",  "First option");} 
     | 
     ; 

OPTION: DEBUG       {printf("%s\n", "debug enabled");} 
     | NESTING      {printf("%s\n", "nesting enabled");} 
     | '(' STACK '=' NAME ')'  {printf("%s\n", "stack size given");} 
    | NOLIST      {printf("%s\n", "nolist enabled");} 
    | VIEW EQ NAME     {printf("%s\n", "this is a view, first name is view name");} 
    ; 

对于空规则,它给我转移/减少错误。 Y.output文件的错误如下:

17 OPTIONS: . OPTIONS OPTION 
18  | . OPTION 
19  | . [SEMICOLON, VIEW, DEBUG, NESTING, NOLIST, '('] 
20 OPTION: . DEBUG 
21  | . NESTING 
22  | . '(' STACK '=' NAME ')' 
23  | . NOLIST 
24  | . VIEW EQ NAME 

NAME  shift, and go to state 4 
VIEW  shift, and go to state 11 
DEBUG shift, and go to state 12 
NESTING shift, and go to state 13 
NOLIST shift, and go to state 14 
'('  shift, and go to state 15 

VIEW  [reduce using rule 19 (OPTIONS)] 
DEBUG  [reduce using rule 19 (OPTIONS)] 
NESTING [reduce using rule 19 (OPTIONS)] 
NOLIST [reduce using rule 19 (OPTIONS)] 
'('  [reduce using rule 19 (OPTIONS)] 
$default reduce using rule 19 (OPTIONS) 

有人可以建议,如何解决这个问题?

回答

1

您在规则选项上有一个递归。 conflit的存在是因为有两种方法来阻止递归。看,例如,如果你只有一个选项,有两个不同的解析树。

OPTIONS   or    OPTIONS 
    |        | \ 
OPTION      OPTIONS OPTION 
    |        | 
    ...      "empty rule" 

因此,删除空规则或OPTIONS : OPTION(保持空规则),问题应该消失。