算符优先文法的定义:
所有产生式的右部都不是ε,且没有两个相邻的非终结符。
终结符之间的优先关系:
a < b:a的优先级低于b
a = b:a的优先级等于b
a > b:a的优先级高于b
算符优先表:记录终结符之间的优先关系,或者一个错误处理的编号。
算符优先函数:游算符优先表得来的两个优先函数f、g,并不是所有优先表都能转换成优先函数。
FirstVT集合:
若有产生市P->a…,或P->Qa…,则a∈FirstVT(P)
若a∈FirstVT(Q),且有P->Q…,则a∈FirstVT(P)
LastVT集合:
若有产生式P->…a,或P->…aQ,则a∈LastVT(P)
若a∈LastVT(Q),且有P->…Q,则a∈LastVT(P)
根据产生式确定优先关系:
若有产生式右部为 …aPb…,则a=b
若有产生式右部为 …aP…,且b∈FirstVT(P),则a<b
若有产生式右部为 …Pb…,且a∈LastVT(P),则a>b
S为目标符号,若a∈FirstVT(S),则$<a,若b∈LastVT(S),则b>$
文法
E: E - T | T | - E
T: T * F | F
F: ( E ) | d
FirstVT |
规则一 |
规则二 |
合并后 |
E |
- |
FirstVT(T) |
- * ( d |
T |
* |
FirstVT(F) |
* ( d |
F |
( d |
|
( d |
LaVT |
规则一 |
规则二 |
合并后 |
E |
- |
LastVT(T) |
- * ) d |
T |
* |
LastVT(F) |
* ) d |
F |
) d |
|
) d |
优先表 |
d |
- |
* |
( |
) |
$ |
d |
|
> |
> |
|
> |
> |
- |
< |
< > |
< |
< |
> |
> |
* |
< |
> |
> |
< |
> |
> |
( |
< |
< |
< |
< |
= |
|
) |
|
> |
> |
|
> |
> |
$ |
< |
< |
< |
< |
|
|
优先表中空白部分为输入错误,红色部分为文法错误,存在冲突。
冲突的来源:根据规则E: - E,得到 - < FirstVT(E),其中有 - < -;根据规则E: E – T,得到LastVT(E) > -,其中有 - > -。
冲突的直观解释:多个负号后面一个数字时,负号是右结合的,例如---123;连续多个减法时,减号是左结合的,例如1-2-3。因此出现冲突。