![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
编译原理
文章平均质量分 77
编译原理相关知识笔记以及实验内容
花无凋零之时
这个作者很懒,什么都没留下…
展开
-
语义分析——声明语句、赋值语句、条件语句和循环语句的翻译
接下来介绍各种常用语句在语义分析中如何翻译。声明语句的翻译程序语言中的声明语句都是给编译程序提供信息的,其作用是告知编译器把某个名字和某个类型联系起来,并为它分配相应的内存空间。因此对声明语句一般不生成代码,只是在编译时把有关信息填入相应表格即可。为局部名字建立符号表条目,其中包含名字的类型和分配给它的存储单元的相对地址等信息赋值语句的翻译简单算术表达式的赋值语句所谓简单指不考虑数组元素、记录、函数引用等情况。如C语言中的:a = 1;对应的四元式为:(=, a, _, 1)原创 2021-06-22 19:35:48 · 1781 阅读 · 0 评论 -
属性文法——S属性文法、L属性文法/语法制导定义SDD
属性文法是在上下文无关文法的基础上为每个文法符号(终结符或非终结符)配备若干个相关的“值”(称为属性)。这些属性代表与文法符号相关的信息,例如它的类型、值、代码序列 、符号表内容等等。属性和变量一样,可以进行计算和传递。属性一般分为两类:综合属性:用于“自下而上”传递信息。在语法树中,一个结点的综合属性的值由其子结点或其自身的某些属性值确定。继承属性:用于“自上而下”传递信息。在语法树中,一个结点的继承属性值由该结点的父结点、兄弟结点和其自身的某些属性值确定。注意:终结符只有综合属性,由词法原创 2021-06-22 18:35:32 · 12268 阅读 · 1 评论 -
自下而上的语法分析——LR(0)和SLR分析
借助于一个栈,可以将这种方法简化为“移进—规约分析”:从左向右逐个扫描待分析的单词符号串,并将串中单词一个一个地移入栈中,边移入边分析;每当栈顶符号串形成了所给文法的某个产生式右部时就进行一次归约,即用该产生式的左部非终结符去替换相应的右部符号串(即:出现在栈顶的这一串单词符号,称为可归约串)。重复这一过程,若能将所有的单词符号都归约到文法的开始符号,则该单词符号串是该文法的合法句子,否则不是。关键问题分析过程中的关键问题是如何确定栈顶已经形成了可规约串,即:如何定义可归约串?如何识别可归约串?原创 2021-06-22 16:58:46 · 3688 阅读 · 0 评论 -
自上而下的语法分析-递归下降分析和LL(1)文法
对输入的任意单词符号串,试图用一切可能的办法,从文法开始符号(树根)出发,自上而下、自左而右地建立起一棵语法分析树,使得该树的叶结点自左而右地排列起来,刚好就是所给的输入串。显然,这一过程应该与一个最左推导相对应。方法特点:这实际上是一种穷举法,自上而下地试探,有时免不了要走回头路—回溯存在的问题及解决方法左递归问题自顶向下分析为什么不能处理左递归文法?如果在匹配输入串过程中,正好轮到要用非终结符 U 直接匹配输入串,那么就会用到 U 所对应的右部符号串 U… 去匹配;然后又轮到 U 去匹配,又原创 2021-06-21 21:37:29 · 4101 阅读 · 0 评论 -
一文搞定有穷状态自动机(FA)——DFA、NFA区别、转换以及DFA化简
有穷状态自动机(Finite Automata, FA)分为确定的和不确定的,简称为DFA和NFA。确定有穷自动机(DFA)形式定义:表示形式为:注意:终态是用两个圆圈表示的,图中的3号即为DFA的终态。不确定的有穷自动机(NFA)形式定义:DFA与NFA的区别DFA与NFA的区别在于,NFA的状态转换过程中可以有空串,如下图即为NFA。这就导致了一个问题:开始之后,在给出字符a或b之前,我们能够确定当前是处于1状态还是2状态吗?很显然,我们是无法确定的,因此才被称为不确定的有穷自原创 2021-06-21 20:07:32 · 41402 阅读 · 5 评论 -
编译过程概述
编译过程大概的过程为:没错,编译程序的过程就是一个IPO过程,那么具体的过程则为:词法分析词法分析,就是依据语言构词规则,从输入的源程序(字符串)中识别出一个个单词(符号)。首先,单词的种类有:关键字:for if while运算符:+ - × /分割符: , ;() { }标识符:a1 a2 pi常数: 9 1024 4.8 6E6其中,前三个为有穷集合(程序设计语言确定了,那么这些就确定了),后三个则为无穷集合。词法分析工作由词法分析器完成,又称扫描器(scanner)。词原创 2021-06-21 10:36:26 · 1072 阅读 · 0 评论 -
编译程序与解释程序的区别
高级程序设计语言主要可以分为两类:编译执行的语言和解释执行的语言,对应的程序即为编译程序和解释程序,那么这两个之间的区别是什么呢?根本区别编译程序和解释程序的根本区别在于是否产生低级语言形式的目标程序。编译程序在生成可执行文件之后,花费的时间就会比解释程序短,因为编译程序已经转换成低级语言形式了,而解释程序还需要重新先转换成低级语言形式,这就相当于多走了一段路程,花费的时间自然就会长一些。编译程序这里以C语言为例,首先我们编写的源程序的文件后缀名为.c文件,然后点击运行之后,首先进行预处理,这一步原创 2021-06-21 10:00:27 · 2192 阅读 · 0 评论 -
编译原理实验十:语义分析构造能处理完整程序的递归下降翻译器
实验要求【任务介绍】对递归下降分析器进行改造,使其能够一遍处理,同时完成语法分析和中间代码翻译。【输入】一个完整的源程序。【输出】与输入对应的一个四元式序列。【题目】对实验六的程序进行升级改造,使得程序对于输入的一个完整的源程序,在对其做递归下降分析的同时,生成等价的四元式序列,一遍完成。编程环境和语言编程语言:C++IDE:vs 2019实验原理分析实验六的文法如下:<Block> → { <Decls> <STMTS> } <Decls&g原创 2021-06-06 15:41:43 · 2855 阅读 · 2 评论 -
编译原理实验七:对完整程序的递归下降语法分析并构造语法树
【任务介绍】递归下降的语法分析。【输入】一个完整的源程序。【输出】语法树或者错误。【题目】设计一个程序,输入字符串形式的源程序,输出该程序的语法分析树,有错误时报告错误。要求:1.源语言及其语法规则:可以参照附录A,也可以自定义。2.输入为字符串形式的源程序,因此,需要调用前面实验做过的词法分析器,为语法分析器提供单词符号。3.应该指出错误的具体位置,如:在xx单词之后/之前发现错误,分析中止。编译环境和语言编程语言:C++IDE:vs 2019实验原理分析根据附录A提供的文法,结合我原创 2021-05-08 09:36:15 · 4259 阅读 · 3 评论 -
编译原理实验六:对多条执行语句的递归下降分析
【任务介绍】根据给定的上下文无关文法,对高级程序设计语言中常见的几种执行语句进行语法分析。【输入】一串执行语句,其中包括:赋值语句、选择语句和循环语句。【输出】与输入对应的一颗完整的语法树或者错误。【题目】设计一个程序,根据给定的上下文无关文法,对于输入的一串源程序语句,构造其对应的语法树或者报告错误。要求:1.基础文法以为开始符号:<Block> → { <Decls> <STMTS> } <Decls> → <Decls> <原创 2021-05-08 09:26:07 · 1720 阅读 · 0 评论 -
编译原理实验五:对算术表达式的递归下降分析
【任务介绍】根据给定的上下文无关文法,分析任意一个算术表达式的语法结构。【输入】任意的算术表达式。【输出】与输入对应的一颗语法树或者错误。【题目】设计一个程序,根据给定的上下文无关文法,构造一颗语法树来表达任意一个算术表达式的语法结构。要求:1.基础文法:<Expr> → <Term> <Expr1> <Expr1> → <AddOp> <Term> <Expr1> | empty <Term> →原创 2021-05-08 09:20:03 · 4368 阅读 · 7 评论 -
编译原理实验三:对完整程序进行词法分析并输出对应的二元组
实验要求【任务介绍】根据给定源语言的构词规则,从任意字符串中识别出该语言所有的合法的单词符号,并以等长的二元组形式输出。【输入】字符串形式的源程序。【输出】单词符号所构成的串(流),单词以等长的二元组形式呈现。【题目】设计一个程序,根据给定源语言的构词规则,从任意字符串中识别出该语言所有的合法的单词符号,并以等长的二元组形式输出。注意:该程序应该设计为至少包含2个模块:驱动模块和工作模块。驱动模块包含了程序的入口和出口,主要负责输入、输出处理并调用工作模块;工作模块负责具体的分割、识别、归类等工原创 2021-04-10 23:44:47 · 4023 阅读 · 2 评论 -
编译原理实验二:标识符的识别
实验要求【任务介绍】根据给定源语言的构词规则,从任意字符串中识别出所有的合法标识符。【输入】字符串。【输出】单词符号流,一行一个单词。【题目】设计一个程序,从任意字符串中识别出所有可视为C语言“名字”的子串。注意:构词规则:以字母打头,后跟任意多个字母、数字的单词;长度不超过15;不区分大小写;把下划线视为第27个字母。关键字保留,即:语言定义中保留了某些单词用作关键字,程序员不可以将这些单词用作“名 字“(变量名、常量名、函数名、标号名等等)。编程环境和语言编程语言:C++I原创 2021-04-10 23:40:08 · 5786 阅读 · 1 评论 -
编译原理实验一:预处理
实验要求设计一个程序,从任意字符串中剔除C语言形式的注释,包括:①形如: //… 的单行注释;②形如: /…/ 的多行注释。(1)输入文件:input.txt,纯文本。内容是一个可能带有注释的源程序字符串。(2)输出文件:output.txt。内容是剔除可能存在的注释之后剩余的字符串。编程环境和语言编程语言:C++IDE:vs 2019实验原理分析按行读取,有两个字符变量,用来存储当前字符和上一个字符,若两个字符为“//”或者“/*”,则说明进入到注释部分,后面的数据都可以忽略,同时将空原创 2021-04-09 08:55:10 · 2561 阅读 · 0 评论