Parsing 这种转变/减少冲突是从何而来的?
我试图通过在Jison(javascript解析器)中定义一种非常简单的语言来掌握解析的诀窍。它接受与bison相同/非常相似的语法 这是我的语法:Parsing 这种转变/减少冲突是从何而来的?,parsing,bison,lalr,shift-reduce-conflict,jison,Parsing,Bison,Lalr,Shift Reduce Conflict,Jison,我试图通过在Jison(javascript解析器)中定义一种非常简单的语言来掌握解析的诀窍。它接受与bison相同/非常相似的语法 这是我的语法: %token INT TRUE FALSE WHILE DO IF THEN ELSE LOCATION ASSIGN EOF DEREF %left "+" %left ">=" /* Define Start Production */ %start Program /* Define Grammar Productions */
%token INT TRUE FALSE WHILE DO IF THEN ELSE LOCATION ASSIGN EOF DEREF
%left "+"
%left ">="
/* Define Start Production */
%start Program
/* Define Grammar Productions */
%%
Program
: Statement EOF
;
Statement
: Expression
| WHILE BoolExpression DO Statement
| LOCATION ASSIGN IntExpression
;
Expression
: IntExpression
| BoolExpression
;
IntExpression
: INT IntExpressionRest
| IF BoolExpression THEN Statement ELSE Statement
| DEREF LOCATION
;
IntExpressionRest
: /* epsilon */
| "+" IntExpression
;
BoolExpression
: TRUE
| FALSE
| IntExpression ">=" IntExpression
;
%%
我正在换班/减少冲突。Jison的输出如下所示:
Conflict in grammar: multiple actions possible when lookahead token is >= in state 6
- reduce by rule: Expression -> IntExpression
- shift token (then go to state 17)
States with conflicts:
State 6
Expression -> IntExpression . #lookaheads= EOF >= THEN DO ELSE
BoolExpression -> IntExpression .>= IntExpression #lookaheads= EOF DO THEN ELSE >=
你的问题来自哪里
IF BoolExpression THEN Statement ELSE Statement
如果THEN之后的语句包含If,您如何知道ELSE是属于第一个If还是第二个If?有关更多信息,请参见此处:
唯一100%无歧义的修复方法是在if/else语句周围使用某种分隔符(大多数语言使用括号“{”和“}”)。前,
检测到移位减少冲突,因为
=
在表达式的follow集合中。这基本上是因为语句
可以是表达式
,interexpression
可以以语句
结尾。考虑下面的输入<代码>如果C,则S1,S2>=42 < /代码>,如果您有括号来消除歧义,那么这可以被解释为<代码>(如果C,然后S1 Ser-S2)>=42 < /C>和<代码>如果C然后S1EFER(S2>=42)。由于班次优先于减少,因此将选择后者。对不起,这次没有if/then/else问题。他的ELSE
不是可选的,这也是避免这个标准陷阱的一个很好的方法。
IF BoolExpression THEN '{' Statement '}' ELSE '{' Statement '}'