编译原理第四章课程总结

语法分析的方法主要有:

1. 自上而下分析方法:A、递归下降子程序 B、非递归预测分析,如LL1

2. 自下向上分析方法:A、算符优先分析 BLR分析方法(LR(0),SLR(1),LR(1),LALR

一、 自上而下分析方法

1、递归下降子程序分析方法

a) 为每一个非终结符写一个分析过程

b) 这些过程可能是递归的

 2、非递归预测分析方法

X是栈顶符号,a是当前输入符号

预测分析总控程序如下:

A X=a=$,宣告分析成功,并终止。

B X=a!=$,弹出栈顶符号X,并将输入指针移至下一个

C X是非终结符,则访问分析表MM[X,a]项,M[X,a]项是文法的一个X产生式或者出错信息。例如,若M[X,a]={X->UVW},则语法分析器用WVU来代替XU在栈顶)。若M[X,a]=error,则语法分析器调用错误处理程序。

由此看来,非递归预测的方法主要的工作在构造预测分析表上。

下面介绍文法G的预测分析表的方法:

• 基础知识:FIRST(α)={a|α=>a…0步或多步),a∈Vt},α=>ee表示空),则e∈FIRST(α)

FOLLOW(A)= {a|S=>αAaβ0步或多步),a∈Vt},A是某句型的最右符号,那么$∈FOLLOW(A)

算法:

1)对文法的每个产生式A ® a ,执行(2)(3)

2)对FIRST(a)的每个终结符a,把A ® a 加入M[A, a]

3)如果eFIRST(a)中,对FOLLOW(A)的每个终结符b(包括$A ® a加入M[A, b]

4M的其它没有定义的条目都是error 

LL(1)文法---构造出的分析表中没有多重出口项。LL(1)没有二义性,也不含左递归。

消除间接左递归:  

 (1)将间接左递归改造为直接左递归

 (2)消除直接左递归

    P→Pα1|Pα2|...|Pαm|β1| β2|...| βn

    消除P的左递归

    P→ β1P'| β2P'|...| βnP'

    P'→α1 P'| α2 P'|...|αm P'| ε

 (3)化简改写后的文法,即去除那些从开始符号出发却永远无法到达的非终结符的产生规则。

 最终得到无左递归的文法。

当一个文法满足LL(1)条件时,我们就可以构造一个不带回溯的自上而下分析程序,这个分析程序由一组(可能的)递归程序组成,每个过程对应文法的一个非终结符。这样一个分析程序称为递归下降分析器。

  具体做法:

  对文法的每一个非终结符都编一个分析程序,当根据文法和当时的输入符号预测到要用某个非终结符去匹配输入串时,就调用该非终结符的分析程序。

  LL-自左向右扫描、自左向右的分析和匹配输入串。分析过程表现为最左推导的性质。该过程由分析表、总控程序、符号栈三部分组成。由于最左推导,进栈过程是逆序的。

 习题:
     总结:
        语法分析感觉是最难的一章,FIRST集和FOLLOW集总是求错,还是要多练习多看一下其他的资料。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值