2013-04-11 56 views
0

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

回答

-1

您的問題來自

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

1

你移減少檢測衝突,因爲>=是在後續集Expression非終端。這主要是由於Statement可能是ExpressionIntExpression可能以statement結尾。考慮下面的輸入IF c THEN S1 ELSE S2 >= 42,如果你有括號來消除歧義,那麼這可以解釋爲(IF c THEN S1 ELSE S2) >= 42IF c THEN S1 ELSE (S2 >= 42)。由於轉換優於減少,後者將被選中。