答案的一部分是從bison -v
難以看清輸出文件。對於你的第一個語法,我得到了這些摘錄:
State 8 conflicts: 1 shift/reduce
State 9 conflicts: 1 shift/reduce
State 10 conflicts: 1 shift/reduce
State 11 conflicts: 1 shift/reduce
State 12 conflicts: 1 shift/reduce
Grammar
0 $accept: expr $end
1 expr: NUMBER
2 | expr '+' expr
3 | expr '-' expr
4 | expr '*' expr
5 | expr '/' expr
6 | expr expr
所以在語法中有5個shift/reduce衝突。這些是較不嚴重的衝突類型;如果您確信語法正在做的是正確的,那麼您可以聲明,如果您希望他們在文法中使用%expect 5
。
state 0
0 $accept: . expr $end
NUMBER shift, and go to state 1
expr go to state 2
state 1
1 expr: NUMBER .
$default reduce using rule 1 (expr)
state 2
0 $accept: expr . $end
2 expr: expr . '+' expr
3 | expr . '-' expr
4 | expr . '*' expr
5 | expr . '/' expr
6 | expr . expr
$end shift, and go to state 3
'+' shift, and go to state 4
'-' shift, and go to state 5
'*' shift, and go to state 6
'/' shift, and go to state 7
NUMBER shift, and go to state 1
expr go to state 8
state 3
0 $accept: expr $end .
$default accept
state 4
2 expr: expr '+' . expr
NUMBER shift, and go to state 1
expr go to state 9
狀態5,6,7模擬狀態4但是對於其他操作員。州8是第一個有轉變/減少衝突的州。記住規則中的.
(點)表示解析器達到此狀態時的位置。
state 8
2 expr: expr . '+' expr
3 | expr . '-' expr
4 | expr . '*' expr
5 | expr . '/' expr
6 | expr . expr
6 | expr expr .
NUMBER shift, and go to state 1
NUMBER [reduce using rule 6 (expr)]
$default reduce using rule 6 (expr)
expr go to state 8
state 9
2 expr: expr . '+' expr
2 | expr '+' expr .
3 | expr . '-' expr
4 | expr . '*' expr
5 | expr . '/' expr
6 | expr . expr
'*' shift, and go to state 6
'/' shift, and go to state 7
NUMBER shift, and go to state 1
NUMBER [reduce using rule 2 (expr)]
$default reduce using rule 2 (expr)
expr go to state 8
有這兩種狀態之間的差異和相似性,但狀態10,11,12匹配狀態9除了不同點模糊性。
麻煩的是,當語法看到:
NUMBER OP NUMBER NUMBER
它不能告訴是否能夠解析爲:
(NUMBER OP NUMBER)NUMBER EXPR EXPR
或爲:
NUMBER OP (NUMBER NUMBER)
expr OP expr
考慮到這是一個轉換/減少關聯在每種情況下,它都選擇轉移。如果這就是你想要的,然後添加%expect 5
並繼續生活。如果這不是你想要的,那麼你需要重新思考你的語法。一對相鄰的數字表示什麼,你確定你不需要一些操作符(可能是逗號或冒號)來區分它們嗎?
我試圖通過提高丟失的運算符的優先級:
%left MISSING
其他優先級聲明後,再使用:
expr expr %prec MISSING
這並沒有改變任何東西。將MISSING的優先級列入其他運營商的優先級也不會太低。
,如果你考慮如何像這樣的表達應該解釋你得到的問題的端倪:
NUMBER OP NUMBER NUMBER NUMBER OP NUMBER NUMBER OP NUMBER
凡OP是每個外觀相同。我的大腦受傷了!那麼bison
的!
你期望相鄰的數字做什麼? – 2012-02-11 20:05:46
@JonathanLeffler,我會乘他們。實際上,我想實現隱式乘法,所以星號例如可以在例如「4 *(1 + 2)」 - >「4(1 + 2) – UncleAli 2012-02-11 20:32:14