编译原理期末笔记

一、编译程序与翻译程序:

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的地方不一样

2.3. 写出输入串的分析过程

3. LR(1)

3.1.画出LR(1)项目识别所有活前缀的DFA

3.2.构造LR(1)分析表

3.3.写出输入串的分析过程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值