编译原理课程笔记 第五章:自顶向下的语法分析

 [第一章:文法(语法)和语言]
[第四章:词法分析]
[第五章:自顶向下的语法分析]
[第六章:自底向上的语法分析(移进—归约分析)]
[第七章:LR分析:一种自下而上的分析方法]
[第八章:语法制导和中间代码生成]


从文法开始符号出发,自上而下地构造语法树

待解决的问题:回溯问题---分析错误需要回溯,效率低;左递归---造成死循环

消除左递归:改写产生式,变左递归为右递归

(通过消除左递归、提取公因子等手段不一定能改写成LL(1)文法)

  1. 直接左递归

如PàPα | β    

例:

  1. 间接左递归:转为直接左递归,然后套公式

例子中把A带入了B。换成B带入A也照样能做

提取左公因子:

预测分析方法:

LL(1)文法:

含义:第一个L-自左向右扫描分析输入符号串;第二个L-从识别符号开始生成句子的最左推导;LL(1):向前看一个输入符号,便能唯一确定当前应选择的规则;LL(k):向前看k个输入符号,才能唯一确定当前应选择的规则

FIRST集:FRIST(a)为a的开始符号集

 例

FOLLOW集:FOLLOW(A):是所有句型中紧接A之后的终结符号或#。

FOLLOW集算法:参照:BV17K4y1a72M

第一条改动:每个foll集都加上#

例:

FIRST集就不说了。FOLLOW集,首先,每个follow集都先加上#。然后从E开始,产生式右边出现E的只有第五条,first())=),所以follow(E)={),#}。再看T,第一条看似T后面是E’,应该将first(E’)加入follow(T),但其实第二条中可以看出E’是可以推出e的,所以应该把follow(E)加入follow(T),第二条看出,应该把follow(E’)加入follow(T)

SELECT集:

实际上要完成预测分析表的构造,首先要判断文法是否是LL(1)文法

LL(1)文法的判别则需要计算SELECT集

一个上下文无关文法是LL(1)文法的充要条件是:对每个非终结符A的两个不同的产生式Aà α,Aà β,满足:SELECT(Aà α) ∩ SELECT(A à β)= Φ(其中α和β不能同时推导出)。

例:

 

对输入串i+i*i#进行分析 1

构造分析表---矩阵M

LL(1)方法的一般流程:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值