1. 算符廣義為終結符,優先分析的基本思想是只規定終結符之間的優先關系,也就是只考慮終結符之間的優先關系,不考慮非終結符之間的優先關系;
2. 通常在算術表達式求值過程中,運算次序是先乘除后加減,這說明了乘除運算的優先級高于加減運算的優先級,
3. 乘除為同一優先級但運算符在前邊的先做,這稱為左結合,同樣加減運算也是如此,這也說明了運算的次序只與運算符有關,而與運算對象無關
4、結合性,決定運算秩序,左結合,從左向右運算,右結合從右向左運算
下面給出一個表達式的文法為:
E→E+E|E-E|E*E|E/E|E↑E|(E)|i
本文法是二義性的,由于人為地規定了算符之間的優先級別和同一個級別中的結合性質,所以可能構造出確定的分析過程。
我們可以對此表達式的文法按公認的計算順序規定優先級和結合性如下:
① ↑優先級最高。遵循右結合,相當↑
↑。
例如:2↑3↑2=2↑9=512。(而若為左結合則2↑3↑2=8↑2=64) 也就是同類運算符在歸約時為從右向左歸約。即 i1↑i2↑i3式先歸約i2↑i3。
② *,/ 優先級其次。服從左結合,相當 *
* 、*
/ 、/
/ 、/
* 。
③ +,- 優先級最低。服從左結合,相當 +
+、+
- 、-
+ 、-
- 。
④ 對'(',')'規定括號的優先性大于括號外的運算符,小于括號內的運算符,內括號的優先性大于外括號。對于句子括號'#'號規定與它相鄰的任何運算符的優先性都比它大。此外,對運算對象的終結符i其優先級最高。
========================
結合性:
一個運算量兩側的運算符優先級相同時,則按運算符的結合性所規定的結合方向處理。 (運算秩序)
例一: a = b = c;
運算量b的左右兩側都為=號,而=具有右結合性,故應該由右向左計算,即:a = (b = c);
例二: if (5 == 4 == 0) {}
由于關系運算符具有左結合性,那么先計算 5 == 4, 結果為0, 在計算 0 == 0, 結果為
真。