2013-03-23 51 views
0

我已經爲布爾和算術表達式做了一個語法。我想處理像算術表達式:LALR語法模糊

(1+5)+(-3) 

我與所做的工作:我可以處理所有我想要的表情。

我的問題是一個布爾表達式可以是這樣的:那麼在某些時候我的布爾規則不得不提到我的算術表達式規則

(((2+2==4) or (3>2)) and 2==2) 

。我不能在我的布爾規則中使用括號(),因爲它會導致我的語法不明確。我明白爲什麼,但我無法弄清楚這個問題的解決方案。

+0

到目前爲止您嘗試過什麼?顯示您的代碼並提供yacc標識的衝突的詳細信息。 – 2013-03-25 14:33:06

+0

在布爾表達式和算術表達式中都沒有任何含括號的含糊不清的含義(簡單的做法會使語法不是LL,但對於LR來說很好)。你有什麼嘗試? – 2014-06-17 04:45:16

+0

[簡單模糊語法與減少 - 減少衝突]的可能重複(http://stackoverflow.com/questions/12887072/simple-ambiguous-grammer-with-reduce-reduce-conflict) – 2014-06-17 06:01:48

回答

1

這對黃金應該讓你寫的LALR語法開始:

<Formula>  ::= <BoolConcat> <Formula> | <BoolConcat> 

<BoolConcat> ::= <BoolConcat> 'and' <Comparison> | <Comparison> 

<Comparison> ::= <Comparison> '>' <Expression> | <Expression> 

<Expression> ::= <Expression> '+' <Term> | <Term> 

<Term> ::= <Term> '*' <Fact> | <Fact> 

<Fact> ::= Integer | '(' <BoolConcat> ')' 

對於布爾一部分算術語法典型的概念被重新使用。沒有新東西,只有不同類型的布爾運算符具有新的優先級。

只需將'=='添加到比較,或'BoolConcat等等。