如何解决明确语法中的换档冲突
-
12-09-2019 - |
题
我试图使用LALR(1)解析器生成器(Bison,但问题不是该工具特定的)来解析简单的语法,并且我正在遇到Shift-Reduce冲突。我发现解决这些问题的文档和其他消息来源倾向于说以下一个或多个:
- 如果语法是模棱两可的(例如,如果是遗憾的话,请更改语言以解决歧义。
- 如果是操作员优先问题,请明确指定优先级。
- 接受默认分辨率,并告诉生成器不要抱怨它。
但是,这些似乎都不适用于我的情况:据我所知,语法是明确的(尽管当然,只有一个字符模棱两可),它只有一个操作员,并且默认解决方案导致解析错误在正确构建的输入上。是否有任何技术来重新设计语法的定义,以消除不属于上述存储桶的转移冲突?
为了具体,这是有问题的语法:
%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-Z]+”形式的半分隔线。
解决方案
使用Solaris版本的 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
因此,问题通常是空的规则 - 特别是空的继任者。目前尚不清楚您是否要允许半彩色作为有效的输入 - 目前。如果您修改了继任规则为:
successor: LETTER | successor LETTER;
消除了转变/减少冲突。
其他提示
感谢您降低语法并发布它。将继任规则更改为 -
successor: /* empty */ | LETTER successor;
...为我工作。 itym 语 看起来明确。
不隶属于 StackOverflow