Bison yacc移位/减少与空规则的冲突

Bison yacc移位/减少与空规则的冲突,bison,yacc,Bison,Yacc,测试 yacc-v试验 y、 输出包含以下内容 %% TOP : OPTIONS ; OPTIONS : OPTION | OPTIONS OPTION ; OPTION : /*no option is possible*/ | 'C' ; %% 为什么会有转移/减少和减少/减少冲突 我已经在的“解析器如何工作”一节中阅读了yacc解析器如何工作,但我不理解yacc如何处理空规则。似乎它试图在所有地方使用空规则 问题1。yacc如何处理状态机的空

测试

yacc-v试验

y、 输出包含以下内容

%%
TOP :
    OPTIONS
  ;

OPTIONS :
    OPTION
  | OPTIONS OPTION
  ;

OPTION :
   /*no option is possible*/
  | 'C'
  ;
%%
为什么会有转移/减少和减少/减少冲突

我已经在的“解析器如何工作”一节中阅读了yacc解析器如何工作,但我不理解yacc如何处理空规则。似乎它试图在所有地方使用空规则

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

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


感谢您事先提供的帮助。

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

您所说的是,非终端
选项
表示
选项
非终端的任何正数,
选项
非终端可以是a
C
或空

由于
选项可以为空,因此空输入中可以有任意数量的选项。两个空的
选项
s看起来就像153个空的
选项
s。此外,两个
C
令牌之间可以有任意数量的空
OPTION
s

因此,您的语法不明确,bison报告解析冲突

如果您想将
选项
定义为任意数量的
选项
s,包括零个
选项
s,那么只需说:

   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

当然,它试图使用“无处不在”的空洞规则。它在做你让它做的事

您所说的是,非终端
选项
表示
选项
非终端的任何正数,
选项
非终端可以是a
C
或空

由于
选项可以为空,因此空输入中可以有任意数量的选项。两个空的
选项
s看起来就像153个空的
选项
s。此外,两个
C
令牌之间可以有任意数量的空
OPTION
s

因此,您的语法不明确,bison报告解析冲突

如果您想将
选项
定义为任意数量的
选项
s,包括零个
选项
s,那么只需说:

   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:e-test.y的第13行,语法错误%empty yacc-V yacc-1.920070509@abdullam:在bison的旧版本或bison以外的yacc实现上,不要使用
%empty
。只需省去它,或者使用
/*EMPTY*/
或其他一些东西(如语法)。因此无法消除旧版本中的冲突?请再次阅读我之前的评论。不要使用
%empty
。别提了。或者将其替换为注释。如果我将其忽略,选项将变为必填项(不能为空)。如果我把/*empty*/放进去,我就有了s/r冲突。因此,我想答案是在我的yacc版本中,如果我想使选项非强制性,我必须忽略s/r冲突。对吗?yacc:e-test.y的第13行,语法错误%empty yacc-V yacc-1.920070509@abdullam:在bison的旧版本或bison以外的yacc实现上,不要使用
%empty
。只需省去它,或者使用
/*EMPTY*/
或其他一些东西(如语法)。因此无法消除旧版本中的冲突?请再次阅读我之前的评论。不要使用
%empty
。别提了。或者将其替换为注释。如果我将其忽略,选项将变为必填项(不能为空)。如果我把/*empty*/放进去,我就有了s/r冲突。因此,我想答案是在我的yacc版本中,如果我想使选项非强制性,我必须忽略s/r冲突。正确的?