1、主要思想:
按照一定原则,求出文法中所有符号(Vt和Vn)之间的优先关系,再依此确定句柄。
2、步骤:
- 拓广文法:S' --> #S#
- 构造优先关系表
- 判断是否为简单优先文法
- 根据优先关系表分析句子
优先关系定义:
(1)X=Y:存在产生式A-->...XY...
(2)X<Y:存在产生式A-->...XB...,B有限次推导出Y...
(3)X>Y:存在产生式A-->...BD...,B至少一次推导出...X,D有限次推导出Y...(或者说D-->Y)
例:
若有文法G[S]:
S-->bAb
A-->(B
A-->a
B-->Aa)
步骤一:拓广文法:
S'-->#S# /特殊:#=#,#<右相邻符号,左相邻符号>#
S-->bAb
A-->(B
A-->a
B-->Aa)
步骤二:求优先关系定义:
- 求=关系:找相邻符号V1V2,有:
b=A,A=b,(=B,A=a,a=)
- 求<关系:找VtVn/Vn1Vn2形式(非终结符在后的形式):Vt<first(Vn)、Vn<first(Vn2),有:
由bA:first(A)=(,a 得:b<(,b<a
由(B:first(B)=first(A)=a,( 得:(<A,(<a,(<(
由#特殊性得:#<S,#<b
- 求>关系:找VnVt/Vn1Vn2(非终结符在前,非终结符/终结符在后的形式),有:
由Ab: A-->(B,A-->a,B-->Aa): B>b,a>b,)>b
由Aa: A-->(B,A-->a,B-->Aa): B>a,a>a,)>a
由#特殊性得:S>#,b>#
步骤三:根据优先关系,构造优先关系矩阵:
S | A | B | a | b | ( | ) | # | |
S | ||||||||
A | = | = | ||||||
B | > | > | ||||||
a | > | > | = | |||||
b | = | < | < | |||||
( | < | = | < | < | ||||
) | > | > | ||||||
# | = |
简单优先文法的定义:
- 在文法符号集中,任意两个符号之间最多只有一种优先关系
- 任意两个产生式没有相同的右部 A-->a B-->a
- 不含空产生式 A-->
根据这些判断是否为简单优先分析文法
步骤四:分析句子:
分析输入串#b(aa)b#
步骤 | 符号栈S | 待输入符号串 | 优先关系 | 动作 |
1 | # | b(aa)b# | #<b | 入栈 |
2 | #b | (aa)b# | b<( | 入栈 |
3 | #b( | aa)b# | (<a | 入栈 |
4 | #b(a | a)b# | a>a | 规约a<--A |
5 | #b(A | a)b# | A=a | 入栈 |
6 | #b(Aa | )b# | a=) | 入栈 |
7 | #b(Aa) | b# | )>b | 规约Aa)<--B |
8 | #b(B | b# | B>b | 规约(B<--A |
9 | #bA | b# | A=b | 入栈 |
10 | #bAb | # | b># | 规约bAb<--S |
11 | #S | # | 接受 |
- 只要不大于就入栈
- 规约时,最右边为句柄尾,往左看,只要遇到不小于就为句柄头