2016-09-14 64 views
0

我有以下EBNF表達式語法:操作關聯性

<expr> -> <term> { (+|-) <term> } 
<term> -> <factor> { (*|/|%) <factor> } 
<factor> -> <pow> { ** <pow> } 
<pow>  -> (<expr>) | <id> 
<id>  -> A | B | C 

我需要確定語法強制任何特定的關聯性進行其經營者,或者如果必須在解析器代碼來實現。從我目前閱讀的內容來看,它看起來並不像它,但我很難理解什麼會導致關聯性。任何幫助將大大appreaciated!

回答

0

由於LL語法不能處理左聯合操作,因此標準轉換將表達式語法轉換爲可以用自上而下(LL)語法解析的形式已經刪除了關聯性信息。實際上,分析樹是由LL語法引發的,它使所有雙向操作符都是正確關聯的。但是,您通常可以重新關聯操作員,而不會在語義操作中遇到太多麻煩。

這就是爲什麼乘法和指數運算符似乎有相似的語法生成,儘管通常取冪將是右聯合而其他二元運算符是左聯合的。

在LR語法,這將是顯而易見的:

<expr> -> <term> | <expr> + <term> | <expr> - <term> 
<term> -> <factor> | <term> * <factor> | <term>/<factor> | <term> % <factor> 
<factor> -> <pow> | <pow> ** <factor> 
<pow> -> (<expr>) | <id> 
<id>  -> A | B | C 

在上述語法中,操作者是向左結合如果生產是左遞歸(因爲操作者可以只作爲部分發生運營商左側的非終端)。同樣,出於同樣的原因,右聯合算子有一個右遞歸規則。