2021-05-30 编译原理chapter4

//【】表示难

上下文无关文法

	/*上下文无关文法的分析*/
	概念
	推导(最右、最左)
	分析树
	分析树和推导的关系
	二义性
	验证文法语言&证明(配对括号)
	CFG和正则表达式(NFA->文法)

	/*设计(上下文无关)文法*/
	文法分解
	消除二义性(以if-then-else为例)
	消除左递归(其中βi都不以A开始,αi都是非空的)
		(算法:一般左递归的消除)
	消除左公因子

自顶向下的分析

	自顶向下分析的一般方法(先根次序--最左推导)(试探)
			    (此表达式文法本无二义性,已明确了优先级和结合性)
	递归下降的语法分析(未说明选哪个产生式,可能需要回溯)
			(左递归,无限循环)
			(回溯,穷举,代价大)
	确定的递归下降分析的例子
	First集 概念&计算(First(文法符号/文法符号串))(迭代定义)
	Follow集 概念&计算
	预测分析器的转换图
	LL(1)文法(非二义、左递归、左公因子/回溯)
		    (确定语法分析动作--唯一选择产生式)【那么,LL1的1怎么解释】
		    (要看输入符号,1 隐藏在分析表的构建中,即对first和follow集的分析)
	非递归的预测分析器 (结构)
	预测分析表的构造(算法)
	非递归的预测分析过程 (模拟最左推导)
			  (结构 算法)
			  (关系:已匹配+= 最左句型)
	预测分析器的错误恢复 (跳过,同步记号的选择)& (举例)【 ?】
	短语级恢复 (不能换栈顶,压栈, 输入串↓ 或者栈↓)

自底向上的分析
	
	自底向上分析举例(叶节点开始,逆序得到根节点)(符号串归约到开始符)
			(选择哪一个子串归约)
	句柄 (一个产生式和一个位置)(最右推导的逆过程)(“右句型的句柄”)
	         (句柄的位置和产生式)(最右最后推左边,归约最先推左边)
	句柄作用 (句柄在栈顶)(移进-归约分析器)
	活前缀 (没有句柄后的终结符)
	移进-归约的语法分析 (如何选择句柄)
			(句柄确定且在栈顶)
	自底向上的分析和预测分析的比较 (更强大,可以处理左递归)
				   (对栈和符号的使用不同)(匹配/推导 vs 归约)
	移进归约分析的两种冲突 (移-归,移进优先)( 归-归,加符号)

LR分析器
	
	LR(k)分析 (强大,无回溯移进-归约方法)
	项(item) (对应了分析的状态)
	LR(0)项目 (区分位置、空串项目、初始项目)
	增广文法
	LR(0)项目集合的有限自动机的构造 (添加一个到项目X→.β的ε转换)
				        (初始状态:增广文法的开始)
				          (不是识别串,了解分析状态,无分析状态)
	以配对文法为例(NFA:项目到项目, DFA:项目集到项目集)
			(因为是ε转换!)
	文法的LR项目的闭包运算 (算法)
	项目分类 (内核项、非内核项)
		(DFA应用的项目集是 核心项目的闭包形成)
	函数GOTO(I,X)(自动机的转换函数: 项目集×文法符号->项目集)
			(为I中所有形如[A→α .]的项对应的项[A→αX . β]的集合的闭包)
			(栈中的文法符号总是形成活前缀)
	规范LR(0)项目集族的计算 (例子(+,*,id,左括,右括))
	LR(0)自动机的用法 (状态栈、文法符号栈)【】
	LR分析算法 (状态--1 文法符号, 文法符号-- 多状态符号)
		  (分析表:ACTION 包括移进归约 GOTO)
		(shift reduce)
		(格局 二元组 & 行为 按照分析表)
		(执行归约, 进入格局(s0s1s2…sm-rs, aiai+1…an$), 其中:r是β的长度, s=GOTO[sm-r , A])
		(算法)(得到ω的自下而上分析)(令t是现在的栈顶状态,把GOTO[t , A]压入栈)
	SLR(1)分析表举例 (LR0所有符号都归约,SLR1只对Follow集(产生式左部的)归约,即构造好表之后(❌)再多看一位)
			(可以处理左递归!)【】
			(只在归约时往后看一位,决定是否归约)(有了自动机才往后看的)

	/*LR文法*/
	SLR(1)分析过程举例 【同项目集的选择】【看分析表分析】
			   (k是决定分析动作时向前看的符号个数)【那么LR0需要分析表来分析吗】(自动机就可以分析)
			   (即,输入符号是向前读的一位吗?)应该不是。
			   (状态栈式显式的,文法符号栈只是为了方便理解,即shift 5指压5入栈,即压id入栈)
	LR文法 (句柄出现在栈顶时,LR分析器不需要扫描整个栈,栈顶的状态符号包含了所需要的一切信息)
	SLR分析 
	SLR分析表的构造 (算法)
		            (所有归约 vs 部分归约) SLR1>LR 0SLR(1)文法的例子 (为指针或变量赋值,遇‘=’移进还是归约?若归约,即第一式的左边换成第二式)
	
	/*LR1*/
	DFA识别活前缀,右句型 【不是所有最右句型的前缀都可以出现在栈里的,因为栈里的内容不能越过(当时的)句柄】
				(活前缀不带句柄后的终结符,但可以有句柄前的符号,即不是从属关系)
	项目对活前缀是有效的  (同一活前缀的几个有效项目引起了冲突)
	LR(1)规范分析 (搜索符仅对归约项目起作用)(搜索符:项目产生式右边(和左边相同)后的第一个符号)
	LR(1)项目集族构造 (闭包算法:考虑非核心项的搜索符生成,对非终结符 后First(βa))(形式化证明)
			(项目集族构造算法:文法->项目集族,对I,对GOTO,对G)
	LR(1)构造的例子 (c中有d)(增广文法第一式后面跟$是有原因的,不算规定)
			(非核心项是由核心项的βa(上式)决定的)(β可能是ε,a可能是$,β不会是$)
	规范的LR(1)分析表的构造 (算法)(项目集合过多)
				(无二义性的有的没有SLR1,但几乎所有合理的程序设计语言的文法都是LR1文法)
				(移进项是DFA的转换箭头上的字符,归约项看搜索符)
				(s和r后面的序号不一样,一个是状态序号,一个是式子编号)
	
	/*LALR1*/
	LALR(1)分析 (有相同核心的项目合并,动作和转移函数也合并)
	LALR(1)分析表构造(算法)
	构造方法解读 (不会引入移进-归约冲突,会引入归约归约冲突)【如果本归约项的搜索符,在某式可以移进,必有一LR1核心项目集有次冲突】
		      (报错前有一些虚假归约)
	LALR(1)分析例子 (但会找到)

	高效构造分析表(算法)【????看不懂哇】
	高效构造例子 (得到内核项)
	向前看符号的两种来源  (确定向前看符号)
			(自发生成的,a;计算,First(βa);传播得到)
			(算法)(LR0项目集->LALR1项目集)
	高效计算方法 (算法)
	例子 


二义文法的应用

自底向上分析的错误处理(校正)
	综述 (何时发现,如何更好发现)
	例子

语法分析器生成工具
	Yacc构成
	计算器例子
	Yacc消除二义性 (默认移进优先,或规定优先级)
	Lex归约
	错误纠正	

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值