![](https://img-blog.csdnimg.cn/20190918140053667.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
编译原理-学习记录
文章平均质量分 68
此专栏包含武汉大学2020-2021学年第一学期伍春香老师《编译技术及应用》的上课笔记,内容主要包括文法的概念,词法分析,语法分析,语义分析和中间语句生成的简述
十万行出头天
那一日,咱可以出头天
展开
-
比方法更重要的,是方法的应用——《编译原理》课程结课感言
比方法更重要的,是方法的应用——《编译原理》课程结课感言 在大三第二学期的《软件工程》课程期间,第一次接触到“编译”这个概念。当时也只是稍微翻了一下龙书的第一章,看了看编译主要都是要做些啥。大致看了第一章后,觉得非常有意思,就决定在大四第一学期的时候去选《编译原理》了(非常巧的是,大三第二学期的《软件工程》,和大四第一学期的《编译原理》,是同一位老师上的)。 在第一节课上,老师便提到,编译原理的范畴,绝不仅仅是“程序的翻译”这么窄。虽然编译的本意是将高级语言翻译为机器语言,但在这其中用到的种种方法原创 2021-01-28 17:59:54 · 182 阅读 · 1 评论 -
编译原理-学习记录16【课程完结】
ch6.运行时刻的环境程序设计语言基础嵌套结构语言 允许在过程内部又说明过程(函数和过程,可以统一称作过程/子程序) 以PSACAL语言为例,PSACAL语言的特点如下: 1、最近嵌套作用域原则:一个名字的作用域是那个包含了这个名字的说明的最小过程或函数 2、过程/函数允许嵌套:允许在一个过程或函数的内部又说明过程或函数,内层可以引用外层过程中说明的名字 在PASCAL语言中,子程序调用规则如下: 1、外层可以调用内层,但不能隔层调用 2、内层可以调用外层,且可以隔层调用原创 2020-12-27 13:42:37 · 941 阅读 · 1 评论 -
编译原理-学习记录15
ch5.语义分析(续) 给每个符号增加一组属性(一个或多个),随后给属性增加一组计算规则(可能是计算、打印等处理) 在语法分析过程中,随着分析的进行,来处理语义动作。语义分析和中间代码生成是随着产生式选用来进行的,所以叫做语法制导翻译常见语法成分的翻译赋值语句 赋值语句具有下述语法形式:A→i:=EE→E+EE→E∗EE→−EE→(E)E→i\begin{aligned}A&\to i:=E\\E&\to E+E\\E&\to E*E\\E&\to -原创 2020-12-24 17:19:34 · 550 阅读 · 1 评论 -
编译原理-学习记录14
ch5.语义分析(续)语法制导翻译(续) 编译时,需要很多信息和内容来处理,这些内容是和语法成分相关的 如何表达这些内容?可以给每一个语法成分定义一组属性(属性因语法成分的不同而不同) 原来的文法称作基础文法,加了属性后,满足某种条件时,叫做属性文法 语法制导定义(SDD),是上下文无关文法和属性及规则的结合 定义属性后,并没有给出计算顺序的要求。考虑到属性的计算顺序,对属性进行操作的内容叫做语义动作,将语义动作插入到合适的位置——语法制导翻译方案。在产生式的右部的任何一个地方都可能会原创 2020-12-13 13:46:56 · 1144 阅读 · 0 评论 -
编译原理-学习记录13
ch4.(2)自下而上语法分析(续) 可规约串已变为句柄。因此,问题变为:如何找到句柄?将句柄规约到哪个非终结符号? 句柄一定是某个产生式的右部——在产生式右部打一个点的方式来表示句柄识别进行到的程度。只看句柄时信息不够,需要带上前面的内容——活前缀 活前缀转换为DFA,从而构造LR(0)分析表。LR(0)方法仍有不足,因此使用follow集,创造出SLR1(1)方法。而SLR(1)方法还不能彻底解决冲突,因此加上向前搜索符号,产生了LR(1)方法,为每一个句柄找到了当前的环境信息 LR(1原创 2020-12-04 12:51:51 · 433 阅读 · 0 评论 -
编译原理-学习记录12
ch4.(2)自下而上语法分析(续) 之前提到,因为在自下而上的语法分析中,只能进行最左直接规约,所以引入句柄的定义便十分重要,因为句柄能够被规约。此外,最左的可以被直接规约的子串是唯一的 而关于移进-规约思想,这个思想主要面临着两大问题。一个是关于如何帮助程序找到句柄,另一个则是如何帮助分析程序判断句柄应该规约到哪个符号。对于这两个问题,可以用LR(0)项目来表示一个句柄的所有识别状态。除此之外,还应使用“记住历史”的方式,以帮助分析程序进行预测(句柄的识别需要借助实际句型中的所有历史信息)原创 2020-11-28 11:36:43 · 192 阅读 · 0 评论 -
编译原理-学习记录11
ch4.(2)自下而上语法分析(续) 上回,为了解决移进-规约时的几个问题,引入了几个定义: 短语: 设有文法G[Z],w=xuy是它的一个句型,如果有:Z⇒∗xUyZ\mathop\Rightarrow\limits^* xUyZ⇒∗xUy并且U⇒+uU\mathop\Rightarrow\limits^+uU⇒+u,则称句型xuy中子串u为句型xuy(相对于非终结符号U)的短语 特别地,如果是Z⇒∗xUyZ\mathop\Rightarrow\limits^* xUyZ⇒∗xUy并且U⇒原创 2020-11-22 14:59:59 · 586 阅读 · 0 评论 -
编译原理-学习记录10
ch4.(1)自顶向下语法分析(续)LL(1)分析法(续) 二义性文法的LL(1)分析表一定存在冲突项 分析表的存储,可以进行下述优化: 1、所有产生式只保存右部 2、将右部逆序过来,这样在进行入栈操作的时候,就可以顺序入栈 相比于递归子程序法而言,LL(1)分析法更能够适应文法的修改(在修改文法后,只需要修改分析表),因此,后期编译器的语法分析就开始逐渐使用LL(1)分析法了出错处理 遇到错误时,可以先跳过一些符号,直至遇到合法符号为止ch4.(2)自下而上语法分析基本思想原创 2020-11-14 19:17:37 · 111 阅读 · 0 评论 -
编译原理-学习记录9
ch4.(1)自顶向下语法分析(续)LL(1)文法 回顾first集和follow集的定义: first集:first(αi\alpha_iαi)={a∣αi⇒∗a..., a∈VTa|\alpha_i\mathop\Rightarrow\limits^* a...,\ a\in V_Ta∣αi⇒∗a..., a∈VT},即从αi\alpha_iαi出发,能够推导出的排在首位的终结符的集合。特别地,如果αi⇒∗ϵ\alpha_i\mathop\Rightarrow\li原创 2020-11-07 16:16:03 · 195 阅读 · 0 评论 -
编译原理-学习记录8
ch4.(1)自顶向下语法分析 词法分析时,依据词法规则。类似地,语法分析时,依据语法规则语法分析的功能及基本思想 语法分析的任务:依据语法规则分析词法分析得到的单词串,来确定单词如何组成语句,以及语句如何组成程序。如果遇到了不合语法规则的现象,则会报告这一错误;而如果没有语法错误,则会使用中间形式给出正确的语法结构 语法分析依据的原理:判断一个符号串是不是能从文法推导而出 从分析顺序这一方面来讲,语法分析方法分为自上而下和自下而上两种,在此处,首先讨论自上而下的方法自上而下语法分析的基原创 2020-10-31 15:02:27 · 405 阅读 · 0 评论 -
编译原理-学习记录7
ch4.词法分析(2)——词法分析程序实现词法分析程序简介词法分析程序的工作 对由字符组成的源程序进行分析,将其识别为“单词”(具有独立意义的最小语法单位),再识别出与单词相关的属性(标识符、界限符、数等),最后再转换成长度上统一的标准形式——属性字,以供其他部分使用 词法分析时,注解、空格等非必要信息会被删除,而标识符会被录入符号表 例如,源程序:begin M := 3.1415 / 4 * (d1 * d1 - d2 * d2) end 按顺序先后被识别为: 属性1,beg原创 2020-10-25 19:22:34 · 271 阅读 · 0 评论 -
编译原理-学习记录6
ch3.词法分析(1)——有穷自动机(续)正规表达式(RE)与有穷自动机RE与FA 正规集:字母表Σ\SigmaΣ上的正规表达式e,所描述的语言集合L(e) 从e到L(e)的变换有如下规则:eL(e)ϵ\epsilonϵ{ϵ\epsilonϵ}∅\empty∅{∅\empty∅}a{a}(e1e_1e1)L(e1e_1e1)e1e2e_1e_2e1e2L(e1e_1e1)L(e2e_2e2)e1e_1e1e2e_2e2原创 2020-10-20 00:31:33 · 585 阅读 · 0 评论 -
编译原理-学习记录5
ch3.词法分析(1)——有穷自动机(续)NFA存在的问题 1、开始状态不确定:开始状态可能有数个,无法确定该从哪一个状态开始 2、状态转换不确定:接收一个输入,可能会使得状态转移到多个状态中的一个 3、ϵ\epsilonϵ(空弧)带来的不确定性:有些状态之间的转换关系是ϵ\epsilonϵ,即没有输入也能进行状态转换。在此情形下,状态也是不确定的NFA到DFA的转换 基本思想:从原本的状态间的转换关系,通过构造集合的方法,转变为状态子集之间的转换关系。 形象地讲,假设A要去P、Q、原创 2020-10-10 23:23:36 · 319 阅读 · 0 评论 -
编译原理-学习记录4
递归直接递归:呈现出U→xUyU\rightarrow xUyU→xUy形式的文法产生式间接递归:具有U⇒∗xUyU\mathop\Rightarrow\limits^* xUyU⇒∗xUy形式的推导(规则)左递归产生式呈U→UyU\rightarrow UyU→Uy形式如果是经过多步推导得到,则称之为文法/间接左递归(规则)右递归产生式呈U→xUU\rightarrow xUU→xU形式同左递归,如果是多步推导得到的,则称之为文法/间接右递归递归的作用使用有限的产生式,描述无限的句子—原创 2020-10-03 23:26:10 · 697 阅读 · 0 评论 -
编译原理-学习记录3
产生式关于如何从集合中取出符号,构成程序产生式规则是一个有序对(α\alphaα,β\betaβ),通常写作α→β\alpha\rightarrow \betaα→β或α::=β\alpha ::=\betaα::=βα\alphaα称为产生式的左部/头部,β\betaβ称为产生式的右部/体α∈(VT∪VN)+\alpha\in (V_T\cup V_N)^+α∈(VT∪VN)+,β∈(VT∪VN)∗\beta\in (V_T\cup V_N)^*β∈(VT∪VN)∗产生式用于定义语法成分原创 2020-09-26 00:38:11 · 400 阅读 · 0 评论 -
编译原理-学习记录2.5-关系的性质
关系的性质集合上的关系具有五个性质:自反性、反自反性、对称性、反对称性、传递性自反性定义:设R是集合A上的关系,若∀x∈A\forall x\in A∀x∈A,都有<x,x>∈R<x,x>\in R<x,x>∈R,则称R是A中的自反关系例如,有集合X={a,b,c},则关系R1=R_1=R1={<a,a>,<b,b>,<c,c>,<a,b>}是自反关系,因为对于集合A中的a,b,c,都存在自己与自己的关系<a原创 2020-09-23 20:18:39 · 2968 阅读 · 0 评论 -
编译原理-学习记录2
编译程序的工作步骤(续)中间代码生成 通常和语义分析在同一步代码优化 保持等价变换,提高目标程序的质量代码生成 如果在语义分析时已经得到目标指令,则不需要进行代码生成目标指令可能是绝对指令代码、可重新定位的指令代码或汇编指令代码 从编译实现的角度,有表格管理和出错处理,这两个步骤贯穿整个编译过程表格管理 使用符号表,登记源程序中出现的每个名字及其各种属性,有些名字的属性需在各个阶段才能填入出错处理 错误分为语法错误和语义错误。语法错误指源程序中不符合语法或词法的错误,可以原创 2020-09-19 20:59:25 · 886 阅读 · 0 评论 -
编译原理-学习记录1
ch1.编译程序概述程序的翻译程序翻译目的将高级语言源程序转换为等价的低级语言程序,让计算机能够执行翻译程序定义:将一种语言(源语言)翻译成与之等价的、用另一种语言(目标语言)书写的程序高级语言翻译为低级语言时,特称为编译程序程序翻译两种形式:编译和解释。前者是分阶段进行的方式,后者属于即时翻译。编译方式编译方式分阶段进行:1、首先为翻译阶段(编译阶段),将高级语言或汇编语言源程序翻译为机器语言的目标程序。在翻译阶段中,数千种高级语言源程序,经过各自的编译程序,被翻译为汇编语言或机器语言原创 2020-09-15 13:32:13 · 153 阅读 · 0 评论