编译原理

编译原理简介

纵饮孤独 提交于 2020-02-19 00:42:43
机器语言:可以被计算机直接理解,由二进制0与1组成 汇编语言:引入助记符,依赖于特定的机器 高级语言:类似于数字定义或自然语言的简洁形式 1.什么是编译: 编译: 将 高级语言 (源语言) 翻译 成 汇编语言或者机器语言 (目标语言) 的过程语言翻译成汇编语言或者机器语言的过程 2.编译器在语言处理系统中的位置: 3.编译器的结构: 编译器各个结构 作用 词法分析器 从左到右逐行扫描源程序的字符,识别出各个单词,确定单词的类型。 语法分析器 从词法分析器输出的token序列中识别出各类短语,并构造语法分析树 语义分析器 收集标识符的属性信息;语义检查 中间代码生成器 以三地址码的形式表示高级语言;生成语法结构树/语法树 目标代码生成器 以源程序的中间形式作为输入,并把它映射到目标语言;为程序中使用的变量合理分配寄存器 机器有/无关代码优化器 为改进代码所进行的等价程序变换,使其运行得更快一些、占用空间更少一些,或者二者兼顾 来源: CSDN 作者: blacksunday2 链接: https://blog.csdn.net/blacksunday2/article/details/104382334

[编译原理]0.引论

試著忘記壹切 提交于 2020-02-18 00:01:07
一、语言处理器 语言处理器有编译器(compiler)、解释器(interpreter) 编译器先把源程序翻译成目标程序,目标程序处理输入产生输出。 解释器自身直接(根据源程序提示)处理输入产生输出。 编译器的处理速度较快,但排错功能不如解释器。 编译器: 解释器: 将源程序翻译成目标程序的过程: 二、编译器的结构 编译器由分析(analysis)部分,和综合(synthesis)部分组成。分析部分又称为编译器的前端,综合部分又称为编译器的后端。在前端和后端之间可以加入代码优化部分。 分析部分 1.词法分析(lexical analysis): 这一阶段的任务是分析出输入的代码流中的词素(lexeme), 对于每个词素,词法分析器都会产生一个词法单元(token)。词法单元的格式为<token-name, attribute-value>。 2.语法分析(syntax analysis) 3.语义分析(semantic analysis):这个阶段有一项重要的任务是类型检查(type checking)。 4.中间代码生成(intermediate code generation) 可选阶段 5.代码优化(code optimization):优化的目的是使代码跑的跟快或者更节能。 综合部分 6.代码生成(code generation):这一阶段的输出即为目标代码。 来源:

编译原理 (二)词法分析、语法分析、语义分析以及中间代码生成器的基本概念

[亡魂溺海] 提交于 2020-02-17 14:37:26
1.词法分析 词法分析的过程中,源代码程序被输入到了一个叫做扫描器的东西中,扫描器的任务就是进行词法分析。他应用了一种叫做 有限状态机 的算法把源代码分割成一个一个的记号,举例比如 array[index] = (index + 4) * (2 + 3) 这行代码,经过扫描就会变成如下的一个个记号: 记号 类型 array 标识符 [ 左方括号 index 标识符 ] 右方括号 = 赋值 ( 左圆括号 index 标识符 + 加号 4 数字 ) 左圆括号 * 乘号 ( 左圆括号 2 数字 + 加号 3 数字 ) 右圆括号 以上的这些记号一般有以下几类: 关键字 、 标识符 、 字面量 (数字、字符串等)和 特殊符号 。 单词类型 种别 种别码 关键字 if、else、for…… 一词一码 标识符 变量名、数组名…… 多词一码 常量 整型、浮点型、字符…… 一型一码 运算符 算术(+ - * / %)、关系(> < =)、逻辑(& | ~) 一词一码 界限符 ; ( ) [ ] { } 一词一码 在识别这些标志的同时,扫描器也同时把标识符存放到了符号表,将数字、字符串常量存放到文字表,以备后续步骤使用。对于C语言的预处理,他的宏替换和文件包含等工作不交给编译器范围而是交给独立的预处理器处理。 2.语法分析 语法分析则由 分析器 去扫描扫描器产生的那些记号去进行语法分析,产生语法树

编译原理 -- 语法制导翻译

拜拜、爱过 提交于 2020-02-06 05:58:39
语法制导翻译 语法制导翻译是通过向一个文法的产生式附加一些规则或程序片段而得到的。 语法制导翻译的两个概念 下面是与语法制导翻译相关的两个概念: 属性 (attribute) : 表示与某个程序构造相关的量。这个属性就是我们平常所理解的 属性 ,可以是表达式的数据类型,指定数据类型的字节大小,生成的代码中的指令数目,等等等。 (语法制导的) 翻译方案 :翻译方案是一种将程序片段附加到一个文法的各个产生式上的表示法。这个程序片段就是你用来翻译这个产生式的翻译程序。将这些翻译程序的输出结果(翻译结果)按照一定的顺序组合起来,就成了最终的翻译结果。 综合属性与继承属性 综合属性 即“自底向上”求值的属性,综合属性的值是由属性值所在结点及其子结点确定的。对 (语法分析树的) 某个结点的综合属性的值只需要对 (语法分析树的) 该结点做自底向上遍历就可得到。 相对于“自底向上”求值的综合属性,编译原理里还有一种重要的“自顶向下”求值的属性,叫做 继承属性 ,继承属性的值是由属性所在结点及其父节点、兄弟结点决定的。 语法制导定义 : ① 每个文法符号和一个属性集合相关联。 ② 每个产生式和一组 语义规则 相关联。这些规则用于计算该产生式的相关属性值。 如果将语法分析树的各个结点的属性标记在语法分析树上,那么这棵语法分析树我们称之为 注释语法树 。 我们通过深度优先遍历整棵注释语法树

0909 粗浅的认识编译原理

99封情书 提交于 2020-02-04 09:58:59
经过相关网页的浏览,也看到了各大网站中各方牛人的回答,我似乎对编译原理有了自己一点粗浅的认识。首先,编译原理及技术从根本上来讲就是对算法问题进行求解,这个问题十分复杂,更不用说其解决算法。 而本学期开的算法分析与上学期学习的数据结构也是讲算法的,不过讲的是基础算法,而编译原理这门课程讲的就是比较专注解决一种的算法。它所包含的内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成等这几大类,要学好是相当的困难,需要倾注自己的苦心与耐心。   学习编译原理可以更好的去理解代码背后的东西,对自己所写的程序、程序语言都会有更深的本质认识,若果拥有这样的认识,自身肯定可以企及更高的高度,我想别人看到的是语法,我看到的,是背后的实现部分。如此一来,拥有对代码更加通透的理解,对以后的代码编写工作具有相当的帮助。 对于编译原理的学习,作为一个初学者,几乎对书籍都不了解,更不用说如何去通过自己的努力写出一个可以正常使用的编译器,网上说的“龙书”、“虎书”、“鲸书”,三本编译原理中的圣经,完全找不到去看的动力,希望接下来的课程能够激发我的求知欲,那样子,什么书都啃的下。总而言之,兴趣是最好的老师,也是最好的学习方式,有了它,何尝不会自己百度、买书,深入钻研! 而说到自己编写编译器,我越想越不明白到底应该如何编写,还有用何种语言去入手,没有自己的一个思路

编译原理实验一 词法分析

烂漫一生 提交于 2020-01-29 12:28:57
一、 实验目的 编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。 二、 实验题目 如源程序为C语言。输入如下一段: main() { int a=-5,b=4,j; if(a>=b) j=a-b; else j=b-a; } 要求输出如下: (” main ” , 1 , 1 ) (”(” , 5 ) (”)” , 5 ) (” { ” , 5) (” int ” , 1 , 2 ) (” a ” , 2 ) (” = ” , 4 ) (” -5 ” , 3 ) (” , ” , 5 ) (” b ” , 2 ) (” = ” , 4 ) (” 4 ” , 3 ) (” , ” , 5 ) (” j ” , 2 ) (” ; ” , 5 ) (” if ” , 1 ) (”(” , 5 ) (” a ” , 2 ) (” >= ” , 4 ) (” b ” , 2 ) (”)” , 5 ) (” j ” , 2 ) (” = ” , 4 ) (” a ” , 2 ) (” - ” , 4 ) (” b ” , 2 ) (” ; ” , 5 ) (” else ” , 1 ) (” j ” , 2 ) (” = ” , 4 ) (” b ” , 2 ) (” - ” ,

浅谈编译原理

走远了吗. 提交于 2020-01-26 00:23:54
什么是编译原理? 编译原理顾名思义,编译就是将源语言(高级程序语言)翻译成等价的目标语言(机器语言即计算机可以识别的语言即0和1或汇编语言)的过程。原理就是研究这一过程的思想方法、理论和技术。从本质上来讲编译是一个算法问题,但由于它的问题相当复杂,导致设计解决这个问题的算法也十分复杂。这里的算法和我们学习的数据结构和算法中的算法有些不同,后者讲述的是基础算法,是解决我们生活中遇到的问题,而编译中的算法则是在人与计算机交流时需要解决的“沟通”问题的算法,比较专注解决一种的算法。编译的过程包括:源程序->词法分析->语法分析->语义分析->中间代码生成->代码优化->目标代码生成->目标程序 为什么我们要编译程序? 因为在计算机发展的初期,我们要想操作计算机则需要学习如何与计算机沟通,当时沟通的方法只有0和1,只有熟练使用0和1来表示程序的科学家才能通过打孔卡或纸带操控计算机,由于直接使用二进制编程的门槛过高,使得除特定的科学家以外的人学习使用计算机较为困难且周期较长,不利于计算机的发展,所以之后的计算机科学家就设计了很多的高级语言使得程序代码更贴近自然语言,但还是有其特定的结构,通过高级语言解决了对学习编程门槛高的问题,但这也照成了机器不能识别高级语言的问题,这是就需要一个翻译程序(就像我们用翻译程序将英文翻译为中文)来使计算机“读懂”程序员写的高级语言。编译程序油然而生。

深入分析Java的编译原理

浪子不回头ぞ 提交于 2020-01-26 00:21:26
在《 Java代码的编译与反编译 》中,有过关于Java语言的编译和反编译的介绍。我们可以通过 javac 命令将Java程序的源代码编译成Java字节码,即我们常说的class文件。这是我们通常意义上理解的编译。 但是,字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令。这个过程是Java虚拟机做的,这个过程也叫编译。是更深层次的编译。 在编译原理中,把源代码翻译成机器指令,一般要经过以下几个重要步骤: 根据完成任务不同,可以将编译器的组成部分划分为前端(Front End)与后端(Back End)。 前端编译主要指与源语言有关但与目标机无关的部分,包括词法分析、语法分析、语义分析与中间代码生成。 后端编译主要指与目标机有关的部分,包括代码优化和目标代码生成等。 我们可以把将 .java 文件编译成 .class 的编译过程称之为前端编译。把将 .class 文件翻译成机器指令的编译过程称之为后端编译。 Java中的前端编译 前端编译主要指与源语言有关但与目标机无关的部分,包括词法分析、语法分析、语义分析与中间代码生成。 我们所熟知的 javac 的编译就是前端编译。除了这种以外,我们使用的很多IDE,如eclipse,idea等,都内置了前端编译器。主要功能就是把 .java 代码转换成 .class 代码。 词法分析 词法分析阶段是编译过程的第一个阶段

编译原理(语法分析)

删除回忆录丶 提交于 2020-01-25 13:14:11
文章目录 上下文无关文法 下推自动机PDA 自上而下语法分析 二义性 消除左递归 提取公共左因子 预测分析程序 自下而上语法分析 LR(0) 活前缀 项目 SLR(1) 如何判断一个文法是不是SLR(1)? 上下文无关文法 与正规式属于同一层面,表达语法分析的基本单元 越接近根节点的运算优先级越低 运算符左结合和右结合的判断: S=A+S 则+是右结合 A=A*id 则*是左结合 CSL上下文有关文法,sensitive CFL上下文无关文法,free 下推自动机PDA 相比NA自动机,多了下推栈和下推栈内字母表 给定语言,如何写出他的下推自动机? 例如L={a n cb n ,n>=0} 写出他对应的文法,S→aSb | c 生成相应的PDA M 这4个映射关系的含义 1,2,3的映射代表了栈顶是a,读头指向了a,用空串替换了栈里的a 4的映射代表了读头指向了S,栈中没有与之匹配的,故用空串表示,然后向栈里压入S的文法表达,aSb或者c PDA的推导过程,首先收到语言aacbb,栈内是S,表头指向a,因此用aSb替换掉栈内的S,此时栈顶变为a,a对a,抵消,以此类推,如果能抵消掉整个字符串,即最后#对#,代表这个语言符合语法,与定义的文法保持一致; 自上而下语法分析 自上而下分析的含义 从符号开始 从左到右 推导出最后的句子, 自上而下 建立它的分析树

编译原理 词法分析题型

ぃ、小莉子 提交于 2020-01-22 19:12:23
概念 词法分析阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号) 题型 1:语言的正规式、正规文法 例:G[s]={a m b n |m≥1,n≥1} 分析语言得到正规式:a(a)*(b)*b 正规文法: S->AB A->aA|a B->bB|b 2:根据正规式画NFA(不确定有限自动机) NFA M是一个五元组,M=(S,Σ,δ,S0,F) S:状态集合 Σ:字母表 S0 :非空初始状态集, S0∈S F:终止状态集,F∈S δ:状态转换函数,δ:S×Σ*→LS的映射 δ(S,a)={S1,S2,……,Sn} 上例: 正规式 : a(a) * (b)*b NFA: ε a a b b ε X 1 2 3 Y 3:DFA(确定有限自动机) DFA是一个五元组,M=(S,Σ,δ,S0,F) S:状态集合 Σ:有穷字母表 S0:初始状态, S0∈S F:终止状态,FS δ:状态转换函数,δ:S×Σ→S的映射且为单射 δ(S,a)=S’:当前状态为S,输入符号a,经状态转换函数转向状态S’ DFA M含有m个状态,n个输入字符,则状态转换图有m个结点,每个结点至多有n条箭弧射出,每条箭弧用Σ中一个不同的输入字符做标记 DFA 初始状态唯一,后继状态唯一 例:DFA M=(S,Σ,δ,S0,F)=({S,U,V