Parsing 这种转变/减少冲突是从何而来的?

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 */

我试图通过在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 */
%%

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 '}'