编译原理心得体会.docx
《编译原理心得体会.docx》由会员分享,可在线阅读,更多相关《编译原理心得体会.docx(17页珍藏版)》请在冰豆网上搜索。
编译原理心得体会
编译原理心得体会
【篇一:
编译原理总结】
1编译程序:
从高级语言到汇编语言或机器语言的翻译程序
2.源程序:
用汇编语言或高级语言编写的程序
3.目标程序:
用目标语言所表示的程序。
目标语言:
介于源语言和机器语言之间的“中间语言”,也可以是某种机器的机器语言,也可以是某机器的汇编语言。
4翻译程序:
将源程序转换为目标程序的程序称为翻译程序。
5赋值语句的语法规则:
a:
:
=v=ee:
:
=t|e+tt:
:
=f|t*ff:
:
=v|(e)|cv:
:
=标识符c:
:
=常数
6遍:
对源程序(包括源程序中间形式)从头到尾扫描一次,并做有关的加工处理,生成新的源程序中间形式或目标程序,通常称之为一遍。
优点:
节省内存空间,提高目标代码质量,逻辑机构清晰
缺点:
编译时间较长,会增加输入输出所消耗的时间,在内存许可下少用为妙
7前端:
通常将与源程序有关的编译部分称为前端。
包括词法分析,语法分析,语义分析,等分析部分
后端:
与目标机有关的部分称为后端。
包括中间代码生成,代码优化,目标程序生成等综合部分
8编译程序构成部分以及功能:
(1)词法分析(扫描器):
输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词及其有关属性,并转换成属性字。
(2)语法分析(分析器):
在词法分析的基础上,根据语言的语法规则,逐一分析词法分析时得到的属性字,检查语法错误,若没有错误,则给出正确的语法结构(如短语、子句、句子、程序段、程序等)。
(3)语义分析(语义处理):
语法分析识别出的各类语法范畴,分析其含义,进行和初步翻译,产生介于源代码和目标代码之间的一种代码“中间代码”。
或者直接生成目标代码。
(4)优化:
依据程序的等价变换规则,尽量压缩
目标程序运行时所需的时间和所占的存储空间,以提高目标程序的质量(5)目标代码生成:
把经过优化的中间代码转化成特定机器上的低级语言代码。
9计算机执行用高级语言编写的程序途径有两种:
解释方式和编译方式。
根本区别:
是否生成了目标代码。
解释方式下,翻译程序事先并不对高级语言程序进行彻底翻译以得到机器代码,而是读入一条语句,就解释其含义并执行,然后再读入下一条语句,再解释执行,即按,源程序中语句的动态顺序逐句地进行分析解释,并立即予以执行。
编译方式下,翻译程序先对高级语言程序进行彻底翻译并生成目标代码,然后再对目标代码进行执行,即对源程序的处理是先翻译后执行。
简单来说解释方式不生成目标代码,编译方式生成目标代码
10编译程序采用多遍扫描还是单编扫描需要考虑哪些因素不一定,多遍编译器结构清晰,构造时间短,运行时需要内存少,产生的目标代码质量高,但时间效率低,
应该根据具体情况决
(1)语句的大小与结构,
(2)机器规模(3)设计目的(4)设计人员的素质及数量。
11比较lr(0),slr
(1),lr
(1)和lalr
(1)
分析表的优缺点
(1)lr(0)分析表局限性大,但其构造方法是其他构造方法的基础
(2)slr分析表虽然不是对所有文法都存在,但这种分析表状态少,存储空间占用少,较易实现又极有实用价值。
(3)规范lr分析表,即lr
(1)分析表,它的,它的分析能力最强,能适用于一大类文法,但是实现代价过高,主要是体积过大(4)lalr分析表的能力介于slr分析表和规范lr分析表之间,稍加努力,就可以高效的实现。
12比较ll(k)分析表与lr(k)分析法共同点:
(1)两者多借助于可能句柄左部的全部符号及向右看k个符号来确定所应执
行的唯一动作,识别过程严格地从左到右扫描,无回溯,效率高。
(2)都能及时察觉错误2。
(3)识别程序都能自动生成。
区别:
(1)两者都是严格地从左到右扫描,名称中第一个l隐指这点,但lr分析技术利用的是最右推导(最左归约),由r隐指,ll(k)分析利用的是最左推导,由第二个l隐指。
(2)ll(k)要求文法无左递归,满足无回溯的条件,而lr分析法则无此限制。
(3)ll(k)是自上而下构造推导的,而lr(k)是自下而上构造归约的。
13语法制导翻译过程:
对单词符号串进行语法分析,构造语法分析树,构造属性依赖图,遍历语法树并在语法树各结点处按语义规则计算顺序。
14静态语义检查:
类型检查,控制流检查,一致性检查,相关名字检查,名字的作用域分析。
15引入中间代码的好处:
(1)便于进行与机器无关的代码优化工作
(2)使编译程序更容易改变目标机
(3)使编译程序的结构在逻辑上更为简单明确,以中间语言为界限,编译前端和后端的接口更清晰。
16编译程序分类
(1)诊断编译程序
(2)优化编译程序(3)交叉编译程序(4)可变目标编译程序
17编译程序工作过程5个阶段及其任务:
(1)词法分析:
任务是从左到右逐个字符的读入源程序,对构成源程序的字符流进行扫描和分解,进而识别一个个单词。
(2)语法分析:
任务是根据语法规则,分析并识别出各种语法成分,并经行语法正确性检查。
(3)语义分析与中间代码生成:
任务是对识别出的各种语法成分进行语义分析,并产生相应的中间代码。
(4)目标代码生成:
任务是把中间代码转换成特定机器上的低级语言代码。
18编译程序和解释程序
(1)编译程序需要在运行前将源代码译成目标代码,解释程序接受某个语言的程序并立即运行这个源程序
(2)二者存储组织有着很大不同,编译程序处理时存储区要存储编译用时需要的各种表格;解释程序将分析结果存放在源程序区
(3)编译程序动态性很差,可形成永久性可执行文件,解释程序动态性较好。
19程序性合计语言范型:
(1)强制(命令)式语言:
c,fortron,pasal
(2)函数式语言:
ml,lisp
(3)基于规则(逻辑)的语言:
prolog(4)面向对象语言:
ada,c++,java
1.推导:
—自上而下的语法分析过程
—预测分析程序,递归下降分析法(最左推导)
2.归约:
—自下而上的语法分析过程
—简单优先分析法,算符优先分析法、lr分析法3
3.自下而上的语法分析过程思想
—自下而上的语法分析过程是一个最左归约的过程,从输入串开始。
朝着文法的开始符号进行归约,直到到达文法的开始符号为止的过程注意:
输入串在这里是指从词法分析器送来的单词符号组成的二元式的有限序列。
即:
自左至右把输入串的符号一个一个移进栈,在移进过程中不断查看栈顶符号串,一旦形成某个句型的句柄时,就将此句柄用相应的产生式左部替换(归约),若再形成句柄,就继续替换,直到栈顶不再形成句柄为止,然后继续移进符号,重复上面的过程直到栈顶只剩下文法的开始符号,输入串读完为止,这样就认为识别了一个句子。
1)初态时栈内仅有栈底符“#”,读头指在最左边的单词符号上.
2)语法分析程序执行的动作:
a)移进:
读入一个单词并压入栈内,读头后移;
b)归约:
检查栈顶若干个符号能否进行归约,若能,就以产生式左部替代该符号串,同时输出产生式编号.
c)识别成功:
移进—归约的结局是栈内只剩下栈底符号和文法开始符号,读头也指向语句的结束符.
d)识别失败.
注:
一个句型的语法树中任一子树叶节点所组成的符号串就是该句型的短语,当子树中不包含其他更小的子树时,该子树结点所组成的字符串就是该句型的直接(简单)短语。
素短语:
一个递归的定义,至少含有一个终结符,并且除它自身之外不在含有任何更小的素短语,(所谓最左素短语就是处于句型最左边的素短语)。
简单优先分析法:
1.确定相邻文法符号之间的优先关系在句型中,句柄内各相邻符号之间具有相同的优先级,相同优先级用“”
由于句柄要先归约,所以规定句柄两端符号的优先级要比位于句柄之外的相邻符号的优先级高,优先级低于表示为“﹤”,优先级高于表示为“>”
某句型中:
n1…..ni-1ni……nj>nj+1…..nn
定义:
一个文法g,如果它不含e产生式,也不含任何右部相
同的不同产生式,并且它的任何符号对(x,y)
x,y是终结符或非终结符——或者没有关系,
——或者存在优先级相同或低于、高于等关系之一,
则这是一个简单优先文法。
1lr(0)文法:
该文法的以lr(0)项目集为状态的识别规范句型活前缀的dfa中没有冲突状态。
2slr
(1)文法:
该文法的以lr(0)项目集为状态的识别规范句型活前缀的dfa中有冲突状态,冲突可用follow集解决。
该文法不是slr
(1)文法。
因为follow(s)={a,b,#},所以无法解决冲突
3算符优先:
(t)(firstvt(t)lastvt(t))(6章)
1.静态语义检查包括:
(1)类型检查
(2)控制流检查(3)一致性检查(4)相关名字检查(5)名字的作用域分析
2.引入中间代码的好处:
(1)便于进行与机器无关的代码优化工作
(2)使编译程序更容易改变目标机
(3)使编译程序的结构在逻辑上更为简单
明确,以中间语言为界限,编译前端和后端的接口更清晰。
(1章)1.源程序:
用编译语言或高级语言编写的程序
目标程序:
用目标语言表示的程序
翻译程序:
将源程序转换为目标程序的程序。
2.编译程序分类
(1)诊断编译程序
(2)优化编译程序(3)交叉编译程序(4)可变目标编译程序
3.编译程序工作过程5个阶段及其任务:
(1)词法分析:
任务是从左到右逐个字符的读入源程序,对构成源程序的字符流进行扫描和分解,进而识别一个个单词。
(2)语法分析:
任务是根据语法规则,分析并识别出各种语法成分,并经行语法正确性检查。
(3)语义分析与中间代码生成:
任务是对识别出的各种语法成分进行语义分析,并产生相应的中间代码。
(4)目标代码生成:
任务是把中间代码转换成特定机器上的低级语言代码。
4.编译程序和解释程序
(1)编译程序需要在运行前将源代码译成目标代码,解释程序接受某个语言的程序并立即运行这个源程序
(2)二者存储组织有着很大不同,编译程序处理时存储区要存储编译用时需要的各种表格;解释程序将分析结果存放在源程序区
(3)编译程序动态性很差,可形成永久性可执行文件,解释程序动态性较好。
5.程序性合计语言范型:
(1)强制(命令)式语言:
c,fortron,pasal
(2)函数式语言:
ml,lisp
(3)基于规则(逻辑)的语言:
prolog
(4)面向对象语言:
ada,c++,java
6.构造编译程序必须掌握的三方面内容:
(1)源程序
(2)目标语言(3)编译方法
7.编译前端和后端
前端:
通常指与源程序有关的编译部分,包括词法分析,语法分析,语义分析,特点是与源程序有关。
后端:
与目标机有关的部分,包括中间代码生成,代码优化,目标程序生成,特点是与目标机有关。
1.推导:
—自上而下的语法分析过程
—预测分析程序,递归下降分析法(最左推导)
—注:
要求文法是ll
(1)文法
2.归约:
—自下而上的语法分析过程
—简单优先分析法,算符优先分析法、lr分析法3
3.自下而上的语法分析过程思想
—自下而上的语法分析过程是一个最左归约的过程,从输入串开始。
朝着文法的开始符号进行归约,直到到达文法的开始符号为止的过程注意:
输入串在这里是指从词法分析器送来的单词符号组成的二元式的有限序列。
即:
自左至右把输入串的符号一个一个移进栈,在移进过程中不断查看栈顶符号串,一旦形成某个句型的句柄时,就将此句柄用相应的产生式左部替换(归约),若再形成句柄,就继续替换,直到栈顶不再形成句柄为止,然后继续移进符号,重复上面的过程直到栈顶只剩下文法的开始符号,输入串读完为止,这样就认为识别了一个句子。
1)初态时栈内仅有栈底符“#”,读头指在最左边的单词符号上.
2)语法分析程序执行的动作:
a)移进:
读入一个单词并压入栈内,读头后移;
b)归约:
检查栈顶若干个符号能否进行归约,若能,就以产生式左部替代该符号串,同时输出产生式编号.
c)识别成功:
移进—归约的结局是栈内只剩下栈底符号和文法开始符号,读头也指向语句的结束符.
d)识别失败.
的直接短语,一个句型的最左直接短语称为该句型的句柄。
注:
一个句型的语法树中任一子树叶节点所组成的符号串就是该句型的短语,当子树中不包含其他更小的子树时,该子树结点所组成的字符串就是该句型的直接(简单)短语。
素短语:
一个递归的定义,至少含有一个终结符,并且除它自身之外不在含有任何更小的素短语,(所谓最左素短语就是处于句型最左边的素短语)。
简单优先分析法:
1.确定相邻文法符号之间的优先关系在句型中,句柄内各相邻符号之间具有相同的优先级,相同优先级用“”
由于句柄要先归约,所以规定句柄两端符号的优先级要比位于句柄之外的相邻符号的优先级高,优先级低于表示为“﹤”,优先级高于表示为“>”
某句型中:
n1?
..ni-1ni?
?
nj>nj+1?
..nn
定义:
一个文法g,如果它不含e产生式,也不含任何右部相
同的不同产生式,并且它的任何符号对(x,y)
x,y是终结符或非终结符——或者没有关系,
——或者存在优先级相同或低于、高于等关系之一,
则这是一个简单优先文法。
【篇二:
编译原理概念总结】
第一章引论
?
为什么要用编译器?
与编译器相关的程序?
翻译步骤
?
编译器中的主要数据结构
1、语言处理器1、简单的说,一个编译器就是一个程序,它可以阅读以某一种语言(源语言)编写的程序,并把该程序翻译成一个等价的、用另一种语言(目标语言)编写的程序。
2、编译器的重要任务之一就是报告它在翻译过程中发现的源程序中的错误。
3、使用编译器是为了提高编程的速度和准确度。
4、与编译器相关的程序:
解释程序(interpreter)、汇编程序(assembler)、连接程序(linker)、装入程序(loader)、预处理器(preprocessor)、编辑器(editor)、调试程序(debugger)、描述器(profiler)、项目管理程序(projectmanager)。
5、解释器是另一种常见的语言处理器。
它并不通过翻译的方法生成目标程序。
从用户的角度来看,解释器直接利用用户提供的输入执行源程序中指定的操作。
object
source
program
output
6、一个源程序可能被分割成多个模块,并存放于独立的文件中。
把源程序聚合在
一起的任务有时会由一个被称为预处理器(preprocessor)的程序独立完成。
预处理器还负责把那些称为宏的缩写形式转换为源语言的语句。
7、连接器(linker)能够解决外部内存地址的问题。
8、加载器(loader)把所有的可执行目标文件放到内存中执行。
2、一个编译器的结构
frontend
backend
1、将编译器看成黑盒,则源程序映射为在语义上等价的目标程序,而这个映射由
两部分组成:
分析部分和综合部分。
2、分析部分把源程序分解成多个组成要素,并在这些要素之上加上语法结构。
3、综合部分根据中间表示和符号表中的信息来构造用户期待的目标程序。
4、编译器的第一个步骤:
词法分析(lexical)或扫描(scanning)。
词法分析器读
入组成源程序的字符流,并且将它们组成有意义的词素(lexeme)的序列。
词法分析器产生词法单元(token)。
5、分隔词素的空格会被词法分析器忽略掉。
6、编译器的第二个步骤:
语法分析(syntax)或解析(parsing)。
语法分析器使用
由词法分析器生成的各个词法单元的第一个分量来创建树形的中间表示。
7、语义分析(staticsemanticanalysis):
语义分析器使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致。
它同时也收集类型信息,并把这些信息存放在语法树或符号表中,以便在随后的中间代码生成过程中使用。
语义分析的一个重要部分是类型检查(typechecking)。
编译器检查每个运算符是否具有匹配的运算分量。
8、总的说,编译器的翻译步骤是:
扫描程序----语法分析程序----语义分析程序----源代码优化程序----代码生成器----目标代码优化程序。
3、编译器结构中的主要数据结构1、记号(token)2、语法树(syntaxtree)3、符号表(symboltable)4、常数表(literaltable)5、中间代码(intermediatecode)6、临时文件(temporaryfile)4、将编译器分成了只依赖于源语言(前端(frontend))的操作和只依赖于目标语言(后端(backend))的操作两部分。
第二章词法分析
?
扫描处理?
正则表达式?
有穷自动机
?
从正则表达式到dfa?
利用lex自动生成扫描程序
1、tokens记号标记:
identifiers、keywords、integers、floating-point、symbols、strings、comments
1、使用正则表达式去描述程序语言tokens2、一个正则表达式是归纳确定
3、一个正则表达式r描述一组字符串集合l(r)4、l(r)=thelanguagedefinedbyr
5、所有的token都能用正则表达式表示2、正则表达式:
1、基本正则表达式:
他们是字母比哦啊中的单个字符且自身匹配
2、正则表达式运算:
1、从各选择对象中选择,用元字符“|”表示2、连结,由并置表示(不用元字符)3、重复或“闭包”,由元字符“*”表示3、从各选择对象中选择:
4、连结:
正则表达式r和正则表达式s的连接可写作rs5、重复:
正则表达式的重复有时称为kleene闭包((kleene)closure),写作r*6、运算的优先和括号的使用:
前面的内容忽略了选择、连接和重复的优先问题。
7、正则表达式的名字:
为较长的正则表达式提供一个简化了的名字很有用处,这样就不再需要在每次使用正则表达式时书写常常的表达式本身了。
3、有穷自动机(有穷状态机):
是描述(或“机器”)特定类型算法的数学方法。
1、确定性有穷自动机:
下一个状态由当前状态和当前输入字符惟一给出的自动机。
2、非确定性有穷自动机:
由它产生的。
4、从正则表达式到dfa1、构造一个个扫描程序的自动过程可分为3步
2、从正则表达式到
nfa
3、从nfa到
dfa
4、将dfa中的状态最小化
第三章上下文无关文法及分析
?
分析过程?
上下文无关文法
?
上下文无关语言的形式特性?
分析树与抽象语法树?
二义性
1、分析过程:
2、上下文无关文法:
3、分析树与抽象语法树:
【篇三:
编译原理实验心得】
编译原理实验心得
第一章、引论
经过这一章节的学习我学到了如下知识:
1.自1954年frotranⅠ语言问世以来,计算机高级语言的到迅速发展。
高级语言给编程带来了极大的方便,但是计算机只能直接执行用机器语言编写的程序,不能直接执行用高级语言编写的程序。
要执行高级语言程序,必须提供该语言的翻译程序。
翻译有编译和解释两种方式。
编译方式是先将源程序翻译成目标程序,然后再执行目标程序,相应的翻译程序称为编译程序。
解释方式是边翻译边执行,相应的翻译程序称为解释程序。
2、编译理论和技术主要研究和讨论编译程序的构造和设计原理。
3、编译程序一般包括词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格处理程序和出错处理程序等。
4、编译过程可采用分遍形式,及编译过程可由一遍或多遍完成。
5、对于具有自编译性的高级语言,可运行自展技术构造其编译程序,即将源程序分解成核心部分和扩充部分,对核心部分进行多次扩充之后得到源语言。
6、一个具有自编译性的高级语言在宿主机上的编译程序可以移植到目标机上。
7、lex是一个有代表性的词法分析程序生成器。
yacc是一种基于lalr
(1)分析法的语法分析程序生成器。
凡是有助于减少编写翻译程序工作的软件或工具包,统称为翻译程序的编写系统。
8、传统的串行编译程序只适应于sisd结构计算机,具有并行处理功能的并行编译程序则适于sisd和misd结构计算机。
第二章、形式语言概论
1、形式语言由chomsky于1956年提出,其理论的形成和发展推动了计算机考完学技术发展。
形式语言理论是编译原理的重要理论基础。
2、文法是形式语言中十分重要的基本概念。
文法可以定义为一个四
元组,文法g=(vn,vt,p,s)。
其中,vn是一个非终结符集,vt是一个终结符集,p是一个产生式集,s属于vn是文法的识别符。
3、chomsky将文法分类为0型、1型、2型、3型文法。
程序设计语言的语法规则属于3型文法(正规文法)。
程序设计的语言和语义部分,一般属于1型文法(上下文有关文法),但实际上都是采用2型文法(上下文无关文法)来描述语法。
4、对于一个文法,我们需要研究它的句型、句子和语言。
要识别一个符号串是不是一个文法的合法句子,需要对它进行语法分析。
分析方法有两类,一列是自上而下分析法,另一类是自下而上分析法。
5、为了进行语法分析,需要事先将文法的产生式存储在计算机中,可以为文法建立一个产生式表,把文法的所有产生式都放在这个产生式表中。
为了在分析过程中能迅速地查找到相应的产生式,还可以再建立一个目录表。
第三章、有穷自动机
1、自动机是一种能进行运算并能实行自我控制的装置。
它是描述符号串处理的强有力地工具,是研究扫描器的理论基础。
有穷自动机分为确定有穷自动机(dfa)和非确定有穷自动机(nfa)。
4、对于nfa可采用子集法和造表法进行确认化,将其转化为等价的dfa。
对dfa化简的基本思想是将状态集分解成若干个互不相交的子集,使每个子集中的状态都是等价的,而不同子集的状态是可区分的。
5、正规文法与fa有着特殊的关系。
从正规文法可直接构造其自动机;反之,由自动机也可以直接构造其正规文法。
6、正规表达式与fa也有着特殊的关系。
对于字母表∑上的任意一个正规表达式e,一定可以构造一个nfam,使l(m)=l(e);反之,对于一个具有输入字母表∑的nfam,在∑上也可以构造一个正规表
达式e,使l(e)=l(m)。
7、正规语言可用正规文法描述,也可以用正规表达式描述。
8、dfa在计算机中有两种表示,一种是矩阵表示,另一种是表结构。
第四章、词法分析
1、词法分析是编译过程的第一阶段,是编译过程的基础。
它负责对源程序扫描,从中识别出一个个的单词。
2、单词是程序设计语言的基本语法单位和最小的语义单位。
单词一般分为五类,即关键字(又称为保留字或基本字)、标识符、常数、运算符和界限符。
3、源程序经词法分析程序识别的单词背表示成机内符,机内符包括单词类别和单词自身值两部分。
4、词法分析程序课利用状态转换图进行设计。
状态转换图是一个有向图,每个节点表示一个状态,其中有一个初始状态,至少有一个终止状态。
5、词法分析程序还可以根据正规文法或正规表达式来进行设计、
第五章、自上而下语法分析
1、递归下降分析程序及其设计
例、设文法g[s]:
s→(a)|aab
a→ea′|dsa′
a′→da′|e
子程序p(s):
read(ch)
ifch=′(′then
begin
read(