我在理解轉換/減少關於語法的轉換/減少的問題時遇到了問題,我知道它沒有含糊之處。這種情況是if類型之一,但它不是'懸而未決'的問題,因爲我有強制性的END子句分隔代碼塊。轉換減少衝突
這裏是GPPG語法(它是一種野牛一樣編譯器編譯...這不是一個回聲):
%output=program.cs
%start program
%token FOR
%token END
%token THINGS
%token WHILE
%token SET
%token IF
%token ELSEIF
%token ELSE
%%
program : statements
;
statements : /*empty */
| statements stmt
;
stmt : flow
| THINGS
;
flow : '#' IF '(' ')' statements else
;
else : '#' END
| '#' ELSE statements '#' END
| elseifs
;
elseifs : elseifs '#' ELSEIF statements else
| '#' ELSEIF statements else
;
這裏是衝突輸出:
// Parser Conflict Information for grammar file "program.y"
Shift/Reduce conflict on symbol "'#'", parser will shift
Reduce 10: else -> elseifs
Shift "'#'": State-22 -> State-23
Items for From-state State 22
10 else: elseifs .
-lookahead: '#', THINGS, EOF
11 elseifs: elseifs . '#' ELSEIF statements else
Items for Next-state State 23
11 elseifs: elseifs '#' . ELSEIF statements else
// End conflict information for parser
我已經切換了一切,我確實知道如何解決它,但該解決方案涉及放棄'elseif'上的左遞歸以獲得正確的遞歸。
香港專業教育學院已通過所有scarse文檔我有一個關於這個問題(我張貼在最後的一些鏈接),並在互聯網上發現至今還沒有找到一個很好的解決方案。我知道ANTLR,我現在不想考慮它。請將您的解決方案限制爲Yacc/Bison解析器。
我會感激優雅的解決方案,我設法做到這一點,通過排除/ *空* /規則和重複所有需要一個空列表,但在更大的語法我在工作它只是結束了像'sparghetti語法症候羣' 。
這裏有一些鏈接:
http://nitsan.org/~maratb/cs164/bison.html
http://compilers.iecc.com/comparch/article/98-01-079
是的。我也期待它的工作,你說的最容易理解是對的。但是我確實在解析器上運行了它,並且不幸地給出了4個轉換/減少衝突。通過gppg運行並親自查看。我不明白(得到我的'龍'編譯器手冊回) – Caerbanog 2008-10-12 23:58:19