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, 结果为
真。