一、编译程序与翻译程序:
1.定义:
编译程序:指将高级语言源程序翻译成与之等价的目标程序的程序。
!目标程序不一定能执行,只有生成机器语言才能执行。
翻译程序:立即执行,通常逐句翻译。
2.区别:
编译程序与翻译程序的根本区别是否生成目标代码。
3.编译程序任务:
编译程序任务:
① 翻译
② 出错处理
语法(定位、出错问题)全部
语义(逻辑)部分
③ 为目标程序运行时组织好存储空间
4.编译程序的总体结构:
编译前端:工作是与源语言有关而与机器无关的
词法分析
语法分析
语义分析
中间代码生成
符号表的建立
与机器无关的中间代码优化
编译后端:工作是与机器相关的部分
与机器相关的中间代码优化
目标代码的生成
相关错误的处理
符号表的访问
等等
词法分析
输入:源程序的字符串
输出: 单词符号序列
描述工具:有限自动机
任务:(可能有错!!!)
识别单词,找到列表
去掉注释,剔除多余的空白符
定位错误,记录位置
语法分析
输入:词法分析器的输出,即单词序列
输出:不同层次的语法成份/语法单位
描述工具:上下无关文法
任务:(可能有错!!!)
分析单词如何构成句子
语句如何构成程序
分析程序结构
语义分析
描述工具:属性文法
任务:
分析语法成份的含义和用途
应进行的运算和操作
同时进行相应的语义检查
5.一些期末可能会考的题:
问:在编译程序总体结构中哪些是必须的,哪些是可选的?
答:代码优化和中间代码可不要
问:编译程序执行顺序必须自顶向下吗?
答:不一定,例如可以先执行语法,再在语法里面调用词法模块。
问:含有优化部分编译程序效率更高?
答:这种说法本来就是错的,含代码优化程序的编译程序本身就比不含的效率低,因为多了一个模块
但是,含代码优化程序的编译程序生成的目标程序比不含的效率高。
逆波兰式:
后缀转中缀:(栈存储的是运算对象)
利用一个栈,自左向右扫描表达式,遇到运算对象就压栈,遇到运算符就弹出栈顶两个(或一个)运算对象,然后将运算结果压栈。
中缀转后缀:(栈存储的是运算符)
--------语言与文法---------
一、文法
1.文法的定义
文法是规则的有限集合
/* 文法 */是描述语言的工具,语言由/* 句子 */构成,句子由/* 符号 */构成。
2.文法类型
0型(短语)
1型(上下文有关)
2型(上下文无关)
3型(正规文法)
3.名称解释
规范规约:
短语:
直接短语:
//句柄: 最左直接短语
算符优先分析:
素短语: 句型的至少含一个终结符且不含其它素短语的短语(至少含一个终结符!!!)
//最左素短语: 最左边的素短语
规范规约的句柄是“最左直接短语”
算法优先分析的句柄是“最左素短语”
4.一些期末可能会考的题:
语法树:是用来描述句型推导过程的树形数据结构
规范推导:即最右推导,每次替换用最右的; 规范推导产生的句型叫规范句型。
规范规约:即最左规约
同一语法树可表示对同一句型不同的推导过程
同一语法树最多对应唯一的最左(右)推导
一个句型有可能对应不同语法树
一个文法存在某个句子对应着两颗不同的语法树就是二义性文法
描述同一语言只能是一个文法(错)
一个文法的任何句型都有一个规范推导(错)
所有规范句型都有一个规范推导(对)
二、LL(1)文法(自顶向上语法分析)
1. LL(1)文法的定义
LL(1)文法表示了自顶向下方法能够处理的一类文法
第一个L:从左向右扫描输入符号串
第二个L:表示生成最左推导
1 :表示读入一个符号可确定下一步推导 (即LL(1)文法是非二义性的!!!)
一些可能会考的题
LL(1)的符号的意思?
第一个L:从左向右扫描输入符号串
第二个L:表示生成最左推导
1 :表示读入一个符号可确定下一步推导 (即LL(1)文法是非二义性的!!!)
非LL(1)的文法可通过 消除左递归、提取左公共因子 的方法将非LL(1)文法转成LL(1)文法
三、算符优先文法(自底向上的语法分析)
待续。。。
--------------大题-----------------
一、正规式->NFA->DFA ->最简DFA
1. 正规式转NFA
靠感觉吧
2.NFA转DFA(确定化)
3.最简 (最小化)
二、LL(1)文法——P电93 follow记得加#
1.消除公共因子和左递归,并改写
消除公共因子:
消除左递归:
记得改写后压缩!!!
3.求first集 follow集 select集
例题:
2.判断是否为LL(1)文法
如果相同左部不同右部 select的交集 为空集,即为LL(1)文法
3.构造预测分析表
4.给出输入串的分析过程
三、算符优先文法
1. 求FIRSTVT 、 LASTVT集
2. 画优先关系表,判断是否为算符优先文法
判断是否为算符优先文法,答题格式:
因为同时任意两个终结符的优先关系唯一,所以该文法是算符优先文法。
3.算符优先分析过程
大于栈 里的元素 就 规约
4.给出句型的短语等
短语: 直接短语: 句柄: 最左直接短语 素短语: 句型的至少含一个终结符且不含其它素短语的短语(至少含一个终结符!!!) 最左素短语: 最左边的素短语
四、SLR(1)、LR(1) !!!记得扩展
1. 问答题
LR分析
L:从左到右扫描输入符号
R:最右推导对应的最左规约(反序完成最右推导)
k:超前读入k个字符,用以确定归约所有的规则
四种分析动作:移入 归约 成功 报错
可归前缀: 即规范句型中每步归约的前部分串
活前缀: 可归前缀的前缀
LR(0)项目的意义:
圆点左边代表用该产生式归约时句柄中已识别过的部分,右边为未识别过的部分
比较lr三中分析表的优缺点;
三种分析表都能识别对应的文法所产生的全部语句,但又各有优缺点。
LR(0)分析表局限性大,但构造方法是其他构造方法的基础。
SLR(1)分析表容易实现且具有较好的实用价值。
LR(1)分析能力最强,能适用于大类文法,但是由于其表体积较大,其实现代价过高。
2. SLR(1)P电142
2.1. 画出SLR(1)项目识别所有活前缀的DFA
跟LR(0)一样
2.2. 构造SLR(1)分析表
若有移进归约 或 归约规约 冲突,则填r的地方不一样