2013-11-24 159 views
0

我在這個普通的正則表達式解析器中遇到了移位/減少衝突。我是yacc的初學者,我似乎有點困惑。以下是我迄今寫:移位/減少衝突byaccj

%token ID 
%% 
exp: ID { $$ = new YYRegExParserVal(this._createObjectForID($1.ival)); } 
     | exp exp { $$ = new YYRegExParserVal(this._createObjectForConcat($1.obj, $2.obj)); } 
     ; 
%% 

我的解析器類的名稱是YYRegExParser而現在應該兩個正則表達式之間只承認簡單的ID(字母數字符號)和串聯。然而,第二條規則永遠不會被匹配,即使我輸入的是正確的

回答

0

語法

EXP → ID | exp exp

是不明確的,因爲id id id有兩種不同的分析樹。一般來說,只要從開始符號可以到達S非終結符,生成格式爲S → SS的CFG將是不明確的。由於沒有歧義語法是LALR(1),因此解析器將找到shift/reduce或reduce/reduce衝突。

要解決這個問題,嘗試改變你的語法

EXP → ID | id exp

該語法是明確的,應該可以解決問題。

希望這會有所幫助!

+0

謝謝!確實。沒有更多的轉變/減少衝突。問題仍然存在:第二條規則沒有匹配。 – Gog