关于自顶向下语法分析一些笔记。

关于自顶向下语法分析一些笔记。

这段时间学习了编译原理的两种语法分析,想要记录下来,方便考前自己复习。

自顶向下的语法分析

特点

1.分析过程是带预测的
2.分析过程是一种试探过程(所以需要进行回溯)
3.效率低

主旨

对任何输入串,试图用一切可能的办法,从文法的开始符号出发,自顶向下的为输入串建立一棵语法树。
一般方法是带“回溯“的。

存在的问题

不能处理具有左递归的文法,也就是说,要使用自顶向下分析方法,就必须消除文法的左递归。

LL(1)分析法

左递归的消除
直接消除左递归:
假设P关于的全部产生式是
P->Pα1 | Pα2|···|Pαn 
消除P的直接左递归性就是:
P->β1 P' | β2 P' |···| βn P'
P’->α1P'| α2P'|···|αnP'

消除左递归的算法
(1)把文法G的所有非终结符按人一顺序排列成P1,P2···Pn;按此顺序执行
(2)

For i:=1 to n do
	begin
		for j:=1 to i-1 do
			把每个形如Ai::=Aj r的规则替换成
			Ai::=δ1γ|δ2γ|···|δkγ
			其中Aj::=δ1|δ2|···|δk是当前Aj的全部规则
		消除Ai过程中的直接左递归
		end	
first集合的构造方法
FIRST(α)={a|α->a···,a∈VT}
即为非终结符α的首符集为所有可能推到的开头终结符或者空字
若A->B | ····则 FIRST(A)包含FIRST(B)
如果要避免回溯就需要
FIRST(αi) ∩ FIRST(αj) = 空集
要做到文法的任何非终结符的所有候选首符集两两不相交,就需要提取公共左因子
follow集合的求法
FOLLOW(A)={a|S->···Aa···,a∈VT}
即FOLLOW集合为在文法中所有在A后面的非终结符的集合
另外,若S->A|··· 则规定 #∈FOLLOW(A)
若有A->αBβ|··· 如果β为空时,则FOLLOW(B)包含 FOLLOW(A) 
						如果β不为空时,则FOLLOW(B)包含 FIRST(β)-空集
LL(1)的分析条件
(1)不含左递归
(2)对于文法中 A->α1 | α2 |···
				FIRST(αi) ∩ FIRST(αj) = 空集
(3)对于每个非终结符A,如果它存在某个FIRST集合包含空字,则
		FIRST(A) ∩ FOLLOW(A)=空集
预测分析表的构造
(1)对文法G的每个产生是A->α执行(2)和(3)
(2)对每个a∈FIRST(α),把A->α加入M[A,a]中
(3)若FIRST(α)含有空字,则把任何b∈FOLLOW(A)把A->α加入M[A,b]
(4)把所有无定义的M[A,a]标上“出错标志”
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值