我寫了一個flex/bison prog語言解析器。目前差不多完成了(我認爲完成了,只需要處理語法錯誤)。在特定的班級中,會出現一些奇怪的問題。關於移位/減少警告的野牛
我相信問題出在解析器中。我停止看今天編譯控制檯,我又回到了它,看到一件壞事:
parser.y: conflicts: 801 shift/reduce, 237 reduce/reduce
之後,我重新建立解析器和閱讀的結果,發現問題後馬上做到了。
input:
| input expression { std::cout << $2; }
;
expression:
expression comparing expression { $$ = new AExpOperation($1, $2, $3); }
| expr2 { $$ = $1; }
| TNEW identifier TLBRACKET TRBRACKET { $$ = new AExpNewArray(NULL, $2); }
| TLPAREN expression TRPAREN { $$ = new AExpParent($2); }
;
expr2:
TPLUS expr2 { $$ = $2; }
| TMINUS expr2 { $$ = new AExpFastOp($2, $1, true); }
| TBNOT expr2 { $$ = new AExpFastOp($2, $1, true); }
| TNOT expr2 { $$ = new AExpFastOp($2, $1, true); }
| expr2 TINCREMENT { $$ = new AExpFastOp($1, $2, false); }
| TINCREMENT expr2 { $$ = new AExpFastOp($2, $1, true); }
| expr2 TDECREMENT { $$ = new AExpFastOp($1, $2, false); }
| TDECREMENT expr2 { $$ = new AExpFastOp($2, $1, true); }
;
comparing:
TEQ | TNE | TLT | TLE | TGT | TGE | TPLUS | TMINUS | TDIVIDE | TMULT | TOR | TAND
| TBXOR | TLSHIFT | TRSHIFT | TZFILL | TBOR | TBAND | TBNOT | TEQA | TNEA | TINSTANCEOF
;
identifier:
TNUMBER { $$ = new AExpression($1); }
| TNAME { $$ = new AExpression($1); }
| TSTRING { $$ = new AExpression($1); }
| TFALSE { $$ = new AExpression($1); }
| TTRUE { $$ = new AExpression($1); }
| TNULL { $$ = new AExpression($1); }
| TTHIS { $$ = new AExpression($1); }
;
只是這個小部分得到了,爲什麼我沒有理解錯誤:
parser.y: warning: 1 useless nonterminal and 9 useless rules
parser.y:40.25-29: warning: useless nonterminal: expr2
parser.y:69.11-28: warning: useless rule: expression: expr2
parser.y:75.11-34: warning: useless rule: expr2: TPLUS expr2
parser.y:76.11-63: warning: useless rule: expr2: TMINUS expr2
parser.y:77.11-62: warning: useless rule: expr2: TBNOT expr2
parser.y:78.11-61: warning: useless rule: expr2: TNOT expr2
parser.y:79.11-68: warning: useless rule: expr2: expr2 TINCREMENT
parser.y:80.11-67: warning: useless rule: expr2: TINCREMENT expr2
parser.y:81.11-68: warning: useless rule: expr2: expr2 TDECREMENT
parser.y:82.11-67: warning: useless rule: expr2: TDECREMENT expr2
爲什麼它說t此外表達式2是沒用的,例如?
現在我想知道有多少不好轉變/減少和減少/減少?
嗯,我需要一個線索。
對於轉換/減少衝突,您是否對操作員有任何優先級聲明?如果沒有,你會得到大量的轉換/減少衝突,因爲'野牛'不知道運營商的優先級是什麼。 – templatetypedef