English 中文(简体)
如何在明确的图表中解决导致转变的冲突
原标题:
  • 时间:2009-06-06 02:55:34
  •  标签:

我试图利用LALR(1)教区发电机(Bison,但问题并非这一工具所特有的)来打上简单的语法,我打上了一场转移冲突。 The docs and other sources I ve found about fixing thesegues to provide one or more of the following:

  • If the grammar is ambiguous (e.g. if-then-else ambiguity), change the language to fix the ambiguity.
  • If it s an operator precedence issue, specify precedence explicitly.
  • Accept the default resolution and tell the generator not to complain about it.

然而,这似乎都没有适用于我的情况:只要我能说,图马是明确的(当然,它只带有一个头盔的模棱两可),它只有一名操作员,而违约解决导致在正确知情的投入上出现错误。 是否有办法重新制定图表定义,以消除不上 above的转移冲突?

具体来说,这里的图表是:

%token LETTER

%%
%start input;
input:          /* empty */ | input input_elt;
input_elt:      rule | statement;
statement:      successor  ; ;
rule:           LETTER "->" successor  ; ;
successor:      /* empty */ | successor LETTER;
%%

目的是将“[A-Za-z]+”或“[A-Za-z]->[A-Za-z]+”等形式的半分界线划为平线。

最佳回答

使用<代码>yacc的太阳系版本,我获得:

1: shift/reduce conflict (shift 5, red n 7) on LETTER
state 1
    $accept :  input_$end
    input :  input_input_elt
    successor : _    (7)

    $end  accept
    LETTER  shift 5
    .  reduce 7

    input_elt  goto 2
    rule  goto 3
    statement  goto 4
    successor  goto 6

因此,问题常常是空洞的统治,特别是空洞的继承者。 现在,你是否希望让半殖民地作为有效投入,这是完全清楚的。 3. 如果您修改了后继规则:

successor: LETTER | successor LETTER;

转移/减少冲突已经消除。

问题回答

感谢 whi酸 whi并张贴。 将后继规则改为:

successor:      /* empty */ | LETTER successor;

......为我工作。 http://www.un.org/Depts/DGACM/index_russian.htm





相关问题
热门标签