2016-05-23 55 views
0

當你有像這樣的語法:效果只有很少的令牌

B: 'a' A 'a' 
| 'b' A 'b' 
A: 'a' 'a' 
| 'a' 

的右%「A」的聲明引起aa.a不是因爲被接受在'。', 和%left'a'之間發生移位而不是減少aa.aa和ba.ab,因爲解析總是在點處減少。

這是不是很清楚,我如何找出根本的關聯聲明具有在令牌(「A」)沒有被直接地用作運營商這樣的情況下什麼樣的影響。

回答

1

爲什麼你認爲LR(1)會更直觀?語法不是LR(1),因此任何LR(1)解析器生成器都應該像LALR(1)解析器生成器那樣報告移位/減少衝突。

當然,YACC /野牛不是純LALR(1)解析器生成。如果它通過優先/關聯性聲明來解決衝突/減少衝突,那麼它會抑制警告。儘管如此,這並不能使語法毫不含糊。使用優先聲明的(許多)問題之一是它不再清楚你正在解析什麼語言。默默地忽略的偏移/減少和靜態解決它有利於一個或另一個動作將產生一個分析器,其識別一些上下文無關語言,但它不是由文法描述語言。

都不具有與LALR算法做,雖然。


要回答你的問題:bison/yacc用來解決移位/減少衝突的算法非常簡單。

  1. 在優先權聲明中提到的每個終端都被賦予一個優先值。在同一聲明中提到的所有終端具有相同的優先級,並且比先前聲明中提到的任何終端具有更高的優先級。

  2. 每個生產其最後端具有優先級值被分配相同的優先級值。 (如果生產包括修改器%prec TERMINAL,則使用該終端而不是生產中的最後一個終端。

  3. 如果對於帶有某些先行符號的生產存在移位 - 縮減衝突,並且生產和前瞻符號具有優先值,則如果產品的優先級較高或者優先級相等並且優先級由%left聲明分配,則應用減少。如果先行符號的優先級較高或者優先級相等並且優先級相等並且優先級由%right聲明分配。

Th在它的。請注意,在上述算法中,沒有提及操作符,這實際上不是任何形式的LR解析中的概念。

+0

的*語言*是平凡的LR(1),因爲它是有限的 - 它僅僅是* *語法是不是LR(1)(它是LR(2)和LALR(3) - 如果你碰巧有這樣一臺發電機) –

+0

@chris:啊,對。我正在想象一個遞歸。謝謝。編輯。 – rici

+0

@rici關於2 .: 如果有這樣的產品: 「X:'y'Z」 X的優先級是'y'嗎?但如果生產是沒有終端的產品是 ?「X:A B」,那麼X沒有優先權? – user2373145