代码优化不考,考前把题型自己做一遍。
主要视频(一到六章):
参考:
第一章:概述
-
编译原理八个过程
-
正闭包/自反传递闭包,A+B与AB的概念,AB实际上不是A交B,它由两部分构建而成
(注意+和*)
讨论0.1.2.3,A1是1,因此右边是0.1.2,闭包列出来,A0,A1,A2,U与和都是加,AB是乘。
第二章:词法分析
-
右线性文法,也是正规文法,3型文法(aB)。 想象A->上面一个a,右边一个B,右边必须有终结符,以及构造一个(先推出句型,然后根据这个画状态转换图)。
注意终止状态的时候,要补一个终结符。这个题是构造,它把原来的式子先画出语法树,然后去画了状态转换图,再构造了右线性文法。A->a直接指向终态。
左线性文法反过来,终结符在右边,A->Bb等价为B->bA,而且A->a变成了初态指向A。 (语法树不带箭头)
(本题目有个隐含条件,nmk均大于0,所以状态转换图的箭头上不是ε,而是具体abc的值)
左线性文法少一个S,因为S->aA变成了A->a,与右线性文法类似,S与A之间的,a单独写出。
C->cC|c,是C与c之间的c
(11条消息) 正规文法构造状态转换图,状态转换图构造正规文法—编译原理_Cenhelm的博客-CSDN博客_编译原理状态转换图怎么画
-
状态转换图,NFA,DFA…注意一个指向S的箭头,还有终止状态的两个圈。
-
正规表达式转NFA
-
NFA转DFA确定化
先列出0的空闭包,在这个基础上一步步推a和b的闭包,注意圆圈里的是数字,箭头上是ab,Ia代表先接触a,后面才再看ε。
-
DFA最小化(根据终态分组与合并)(用π和π new分组)
(先按照是否终态分组,然后每个分组都进行只对a的推导,如果结果所在的组不同,就再分组,然后再只对b推导,最后删掉,递推分析。)
注意最小化中,本题的4.6.8由于没有什么能推出它,所以可以消去,简便处理。
第三章:文法和语言
-
记住文法的定义,注意顺序
-
写出文法,这里U用 | 表示,#没有特殊含义,就是个符号。写G[S]注意前三个都是集合。
这个注意+ Z | - Z,还有CC,再就是Z->A的情况,很考验全面程度吧
-
正规文法与状态转换图的互换
第四章:自顶向下语法分析
-
两类语法,注意是规约不是归约。
最右推导是规范推导,生成右句型,称作规范句型。
而最左规约是规范规约。最左规约是最右推导的逆过程。
-
语法树:直接子树(只有根和叶子)。
特点:
写法:
可以看出包括+这种的,它们是终结符,也要给一个线连接上。
-
二义性,根据同样的最左(或最右)推导,能画出不同的语法树。
两个不同的最左推导,也是两个不同的最右推导。下面这两个图,从左看和从右看,图一样,式子不一样,也就是说有4个式子…两个图代表二义性,每个图2个式子代表两种推导。
NOTE:类似E->EA,A->+b*C,最终样子是E->E+b*c,并不带括号。
(下图全是最左推导)
-
概念:短语,素短语,直接短语,句柄。
如何找句柄,各步骤的句柄:最左直接短语是相对最左规范规约来的,也就是把它的逆过程最右推导列出来,看最后被推导的终结符是谁,这里bbAacb->bbaacb,所以句柄是a。而每一步的句柄,就是删掉上个句柄,剩下的,比方说bAacb->bbAacb,所以A->bA,那一步的句柄就是bA!
-
化简文法:
-
-
判断LL(1)文法的三个步骤(这里E’与T’碰巧带ε了而已,判断是看ε,交集。建表用的是FOLLOW(xx’))
-
消除左递归,构建等价的LL(1)文法
这里的“,”原来是个符号,需要当成终结符来看
-
构建First和Follow集
First集不是那么简单,要考虑ε,所以代入非终结符去看是比较稳妥的。
这里代入B和C,除非B,C全是ε,不然A推不出ε,如果B是ε,C是c,那么推出c
Follow集,情况2的α可以空,β不可以,还要注意去掉ε
-
判断:1.先消除左递归和化简 2.同一个式子的几个分式的First不相交3.A->ε的话,保证它First和Follow不相交(也就是等于Φ)
-
建立LL(1)分析表(预测分析表)
左边非终结符,上面终结符,包括#,列式子按照First集。然后带’的这种,E’和T’,要按照Follow再列一次,方法和First一样,只不过填的是T‘->ε。
-
第五章:自底向上语法分析
-
项目定义和四类项目
-
-
判断LR(0)分析表的两个条件
-
画出LR(0)的DFA图(加S’拓广文法,加·,从S’递推文法,In画框,根据·后不同的非终结符讨论,·后移一位并递推,直到In不存在重复)
-
(注意后面rn要用到标号,S’是标号是0)
-
一堆递推只算一个In,先列完前面的,然后递推
-
ACTION是终结符,GOTO是非终结符,左边S2与右边的2区别不大,如果点在最后,要么是规约要么是接受项目,移不动,所以在它这儿写rn,S’开头(不是S)的接受项目写acc
-
建立LR(0)分析表。ACTION GOTO (非终结符 #)(终结符)(标数字)
-
(四类元素:acc Sn rn n)
-
(特别注意,接受项目在拓广文法以后,变为了S’->而不是S->,判断是否有移进冲突时注意)
-
判断SLR(1)等文法
-
(只要是移进和规约在同一个In就可以进行判断了,移进前面的阿尔法可以为空,关键是后面的x,如果FOLLOW(A)(其实在填表的时候,也是在FOLLOW的地方填入了ε),和x的交集不为空,则不是SLR(1)文法,如果是两个移进,就两个FOLLOW交集判断)
-
多个移进全部算进去,FOLLOW(S)是第一个,ab是后三个,交集注意包含#号(也不一定,但得注意)
-
-
-
LR(1)的判断,分析表
-
-
LL(1),LR(0),SLR(1),LR(1),LALR(1)的 联系与区别 - Arrkwin - 博客园 (cnblogs.com)
-
(11条消息) 语法分析之LL(1)、LR(0)、SLR(1)、LR(1)、LALR(1)_向前走一点点的博客-CSDN博客
第六章:语法制导翻译&中间代码生成
-
逆波兰表示
-
三类转移操作符和四类优先级(非与或**“W”** ) (1+2=3^ )
第七章:运行时存储空间组织
没有笔记