//【】表示难
上下文无关文法
/*上下文无关文法的分析*/
概念
推导(最右、最左)
分析树
分析树和推导的关系
二义性
验证文法语言&证明(配对括号)
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→α . Xβ]的项对应的项[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 0
非SLR(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归约
错误纠正
2021-05-30 编译原理chapter4
最新推荐文章于 2023-06-20 11:37:34 发布