语法分析之自定向下语法分析概述与三个重要概念的集合


 
语法分析之自顶向下语法分析概述与三个重要概念的集合
 
 
 
自顶向下语法分析概述:
 
     基本思想
 
  1. 检查程序是否为文法的句子
  2. 按定义从开始符号出发能推导出程序
    
    一个一个尝试,选择规则没有依据。

例子:
 
     Z→aBb[1]|aD[2]
 
     B→b[3]|bB[4]
 
     D→d[5]|bD[6]
 
分析一个串abbd,穷举过程如下
 
Z#                    abbd#
 
aBb#                  abbd# (a匹配)
 
Bb#                   bbd#
 
bb#                   bbd#( B→b,两个b匹配)
 
#                      d#(匹配失败,回溯)
 
bBb#                  bbd#(匹配成功,b)
 
Bb#                    bd#
 
bb#                    bd#B→b,b匹配成功)
 
b#                     d#(匹配失败,回溯)
 
bBb#                   bd#(b匹配)
 
Bb#                      d#(匹配失败)继续回溯(这里省略几步,直接回溯到了Z的另一条路径Z→aD
 
aD#                      abbd#
 
D#                        bbd#
 
d#                         bbd#(匹配失败,回溯使用D的另外一条路径)
 
bD#                       bbd#
 
D#                         bd#
 
d#                         bd#(匹配失败,使用D的另外一条路径)
 
bD#                        bd#
 
D#                         d#
 
d#                          d#
 
#                            #
 
匹配成功。
 
 
 
选择规则的策略:
 
  • 穷举方法效率非常的差,从上面的过程,可以看出来
  • 考虑更过的信息,如输入流
  • 根据输入流选取规则
  • 考察输入流的几个符号,比如头符





 
 
First集的定义
 
G = (Vt Vn SP)是上下文无关文法,2型文法。
 
β
∈Vt 
Vn*
 
First(β)
= {a属于Vt|β =>*a……}∪(if β=>*then {}
else 空集)
 
首先我们要理解β它是一个串,这个串的组成是由终极符和非终极符的星闭包。它是针对于一个串而言的。
 
aD能推出若干个字符串,最后退出来的每个串的头一个终极符所组成的集合。就是first集了。
 
First(aD)
= {a}
 
串经过若干部推导,推导出若干串,所有这些串以终极符开头的,这些终极符都属于First(β)
 
Follow集的定义
 
G = (Vt Vn SP)是上下文无关文法,2型文法,AVn,S是开始符号
 
FollowA = {a∈Vt | S=>+……Aa……} U (if S => *……A
then {#} else 空集)
 
注意:我们需要注意到从开始符号推出的所有举行中有A的并且紧跟A的终极符的集合。
 
从开始符号出发,推出一个句型,这个句型中有A,所有跟在A后面的非终极符的集合,如果次句型中A位于最后一个符号,则Follow(A)包括{#}
 
Predict集的定义
 
     PredictA→β = 
 
  1. =
    First(β)     First(β)不包含空
  2. =
    First(β) – 空 ∪ Follow(A)          First(β)包含空 

注:Predict集是针对于一条规则而言的。而且我们的最终目的是为了求出Predict帮我们判断要选择那一条规则进行推导的。求出firstfollow只是我们的手段而已。
 
 
 
计算first(X) 集(X是一个长度为1的符号,也就是分为终极符和非终极符)
 
     X∈Vt,(即暗示长度为1且为终极符),则First(X) = {X}
 
X∈Vn,(即暗示长度为1且是非终极符),则FirstX = {a|X→a……属于产生式PaVt}
 
X属于Vn,且有产生式X→空,则空∈First(X)
 
X属于Vn,有产生式X→Y1Y2Y3……Yn,且Y1Y2……Yi∈Vn
 
     Y1Y2Y3……Yi=>*(也就是隐含了Yi+1经过星闭包推不出空)
 
     First(Y1) – {}First(Y2)
– {}……, First(Yi) – {}都包含在FirstX)中
 
     Yi=>*空(i=1, 2, 3, ……, n,将空也并入FirstX)中。(也就是从X推出的产生式规则右侧只有非终极符的序列,而且每个非终极符都可以推出空,则空包含在FirstX))
 
设符号串α = X1X2X3……Xn
 
α=空,则空属于First(α)
 
FirstXi),i=1,2,……n
 
n = 1FirstX1 = First(α)
 
n>=2,且j=1 2 3……i-1,都有空属于First(Xj)则令所有(Xj)-{}
都是First(α)的子集
 
若所有的X都能推出空,即都有空∈First(Xi),则空属于First(α)
 
 
 
 
 
计算Follow集(找出含有规则友部含有A的全部规则)
 
  1. 对开始符号S{#}∈Follow(S)
  2. 有规则B→α1Abα2bVt,则b属于FololowA)(α1可空可不空,关键是Amain的额东西,这一种情况是说A后面是一个非终极符。)
  3. 对于一般情形,有规则B→α1Aα2
    
    First(α2-{}FollowA)的子集
  4. B→Aα或者是B→βAα,且α=>*
    
    FollowB)是FollowA)的子集。





注:我们可以看出求Follow集合的时候我们是基于规则而言的,这是因为我们不可能找出所有举行来判断A后面的非终极符。而且对于规则B→α1Aα2而言,α1Aα2一定是在某一个句型中。只要使用B→α1Aα2规则,即α2first集一定是FollowB)的子集。

 
PredictA→β)的计算在求出FirstFollow之后也就迎刃而解了。在此不赘述
 
 
 
 
 
 
 
 
 
 
 
 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值