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 '}'
答
你移减少检测冲突,因为>=
是在后续集Expression
非终端。这主要是由于Statement
可能是Expression
而IntExpression
可能以statement
结尾。考虑下面的输入IF c THEN S1 ELSE S2 >= 42
,如果你有括号来消除歧义,那么这可以解释为(IF c THEN S1 ELSE S2) >= 42
和IF c THEN S1 ELSE (S2 >= 42)
。由于转换优于减少,后者将被选中。
对不起,这个时候没有if/then/else的问题。他的ELSE不是可选的,这也是避免这种标准陷阱的一个很好的方法。 – 2013-04-14 00:34:27