Bison的这种转变/减少冲突在哪里?

问题描述:

我想通过在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 

如果后即可包含如果语句,你怎么知道,如果ELSE属于第一或第二IF?在这里看到更多的信息:http://www.gnu.org/software/bison/manual/html_node/Shift_002fReduce.html

唯一的100%非歧义的解决办法是要求你的if/else语句周围的某种分隔符(大多数语言使用括号“{”和“}”)。当然,

IF BoolExpression THEN '{' Statement '}' ELSE '{' Statement '}' 
+0

对不起,这个时候没有if/then/else的问题。他的ELSE不是可选的,这也是避免这种标准陷阱的一个很好的方法。 – 2013-04-14 00:34:27

你移减少检测冲突,因为>=是在后续集Expression非终端。这主要是由于Statement可能是ExpressionIntExpression可能以statement结尾。考虑下面的输入IF c THEN S1 ELSE S2 >= 42,如果你有括号来消除歧义,那么这可以解释为(IF c THEN S1 ELSE S2) >= 42IF c THEN S1 ELSE (S2 >= 42)。由于转换优于减少,后者将被选中。