2013-05-06 62 views
2

我的編譯器課程分配中的語言不允許在沒有括號的表達式中使用混合運算符,可能不會使我們處理執行優先級。這意味着以下是有效的表達式:解析表達式時沒有混合運算符時減少/減少衝突

# Valid 
1 + 2 + 3 
1 + (2 * 3) 
1 

但是,這並不:

# Invalid 
1 + 2 * 3 

也不是空的表達。從我的實際語法摘錄,表達式如下解析:

%token TNumber 
%start expr 

%% 

expr : mulexpr 
    | addexpr 
    ; 

mulexpr : mulexpr '*' term 
     | term 
     ; 

addexpr : addexpr '+' term 
     | term 
     ; 

term : '(' expr ')' 
    | TNumber 
    ; 

但是,這種情況會發生減少/減少衝突。我是猜測這是因爲像123這樣的單項表達式可以減少爲TNumber -> term -> mulexpr -> exprTNumber -> term -> addexpr -> expr,但我並不確定。我寧願讓語法毫不含糊,而不是希望模糊性是我認爲的那樣。但是,我不能想出解決這種歧義的方法。

我的想法是,我要補充一個規則expr : term;,然後以某種方式使addexprmulexpr需要2個或更多項目,但我無法弄清楚如何表達這一點。

更新:雖然我找到了一個工作解決方案,如果有一個重複「代碼」少,它會得到接受。

回答

2

製作爲mulexpraddexpr遞歸停止條件是兩任表達作品:。

expr : mulexpr 
    | addexpr 
    | term 
    ; 

mulexpr : mulexpr '*' term 
     | term '*' term 
     ; 

addexpr : addexpr '+' term 
     | term '+' term 
     ; 

(想通了這一點5秒發佈問題後,SO爲一個偉大的橡皮鴨 我猜測我的大腦只是強迫性地試圖避免這種重複。)