![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
编译原理
文章平均质量分 72
用编程写诗
一个在读计算机科学与技术专业的大学生。
int live=1;
while (live)
printf("用诗点亮每一天\n");
展开
-
编译原理结课感言及课程设计LR(1)语法分析器
经过一学期的学习编译原理考试也是成功结束,学校安排的课程设计也圆满完成。编译原理我复习的资料写了很多最终也没有辜负努力吧成功拿到了A+的成绩。课程设计抽取到的题目是LR(1)语法分析器,刚开始对我来说确实不知道从哪里下手。最后也是通过自己查阅资料以及努力成功实现了LR(1)语法分析器的功能。 关于课程设计的部分,基于LR(1)的语法分析器。我采用的是C++的方法进行的书写跟大家分享一下。由于身体原因当时采用的是从文件中读取ACTION和GOTO表的方式,然后对输入进去的句子进行分析是采用上课原创 2023-01-02 09:18:35 · 772 阅读 · 0 评论 -
编译原理复习—8,9,10章最后一部分
与语义分析相关的工作静态语义检查• 编译期间所进行的语义检查− 动态语义检查• 所生成的代码在运行期间进行的语义检查: 例如:除零溢出错误− 收集语义信息• 为语义检查收集程序的语义信息• 为代码生成等后续阶段收集程序的语义信息静态语义分析静态语义检查− 代码生成前程序合法性检查的最后阶段• 静态类型检查(type checks)• 名字的作用域(scope)分析• 控制流检查(flow-of-control checks)• 唯一性检查(uniqueness ch原创 2022-11-21 21:38:48 · 284 阅读 · 0 评论 -
编译原理复习——符号表
符号表作为编译系统的重要组成部分,贯穿于文法分析、检查和语义处理的编译全过程在编译程序中符号表用来存放源程序中出现的有关名字的属性信息,这些信息集中反映了名字的语义特征属性。符号表总体结构的设计和实现下列因素有关源语言的复杂性(包括词法结构、语法结构的复杂性)对于编译系统在时间效率和空间效率方面的要求符号表中所登记的信息在编译不同阶段都要用到例如:在词法分析及语法分析过程中不断更新表中的信息在语义分析之前已经创建符号表,语义分析阶段写入名字属性信息另外,在词法分析到代码生成的各阶段则原创 2022-11-19 11:15:41 · 2000 阅读 · 1 评论 -
编译原理复习——绪论
编译程序通常被组成若干遍。所谓遍就是对源程序或源程序的中间结果从头到尾扫描一次,并作有关的加工处理,生成新的中间结果或目标程序。目的是使程序的结构更加清晰。词法分析,语法分析,语义分析,中间代码生成。代码优化,目标代码生成。原创 2022-11-06 20:54:05 · 345 阅读 · 0 评论 -
编译原理复习——语法分析(自底向上)3
在SLR(1)分析中我们虽然解决了部分问题可以将移进—规约或者规约—规约冲突解决。但是我们有时候会发现这个冲突有很多时候是无法解决的,利用SLR(1)方法是不可以解决这个问题的。在这里我们可以看到4状态和7状态 8状态和9状态他们只有向前搜索符是不一样的其他都是一样的,那么我们是不是可以把他们转换成一个状态然后把向前搜索符进行合并。这时候我们需要引入的是一个更加强大的分析方法:LR(1)方法。非终结符的每个不同出现。原创 2022-11-05 21:01:39 · 1088 阅读 · 0 评论 -
编译原理复习——语法分析(自底向上)2
我们可以发现在标红的位置我们是不知道需要进行移进还是规约的这时候我们发现LR(0)的能力已经不够了。我们需要有一个能力更强大的武器来解决这个问题。前面简单介绍了什么是自底向上分析,而且也进行了讨论我们需要创建出一个LR分析表来就和自顶向下分析时我们需要创建的LL(1)分析表一样。但是有些时候我们会发现,在构建这个LR(0)分析表的时候我们会产生移进规约冲突。在这里先复习LR(0)分析表这个是最简单的分析表也是其他表的基础。这里引入SLR(1)文法这里的S指的是simple即简单的。原创 2022-11-04 19:28:36 · 739 阅读 · 0 评论 -
编译原理复习——语法分析(自底向上)
我们看到有两个部分一个是ACTION部分还有一个是GOTO状态转换部分。最后我们也是希望通过学习得到这样的一个分析表来实现。原创 2022-11-03 16:54:29 · 859 阅读 · 0 评论 -
编译原理复习——语法分析(自顶向下)2
在前一章分析了LL(1)文法是什么并且也知道了如何判断一个文法是不是LL(1)文法。那么我们肯定是很喜欢一个文法是一个LL(1)文法的,但是现实条件是无论是生活中还是工作中我们喜欢的往往是我们所无法得到的。那么我们是不是可以将一些不是LL(1)文法的东西转换成LL(1)文法呢。通过这个就可以求出了预测分析表然后当我们输入一个句子进去后就进行判断了。这里有两种方式:提取左公因子和消除左递归。原创 2022-11-01 20:41:37 · 864 阅读 · 0 评论 -
编译原理复习——语法分析(自顶向下)
自顶向下的语法分析定义:从文法的开始符号出发,反复使用文法的产生式,寻找与输入符号串匹配的推导。语法树的构造将文法的开始符号作为语法树的根,向下逐步建立语法树,使语法树的末端结点符号串正好是输入符号串。所以解决这个问题的核心在于如何找到合适的产生式从文法的开始符出发,如能根据当前的输入符号(单词符号)唯一地确定选用哪个产生式进行推导,则分析是确定的。LL(1)文法是我们在语法分析自顶向下中所希望遇到的文法,我们在遇到判断一个文法是不是LL(1)前我们需要先学习三个集合即:开始符号集FIRS原创 2022-10-31 20:44:02 · 662 阅读 · 0 评论 -
编译原理复习——词法分析
只有f和S是和DFA是不同的。个输入字符,则状态转换图有。中一个不同的输入字符做标记。以及DFA的最小化转化参考。个结点,每个结点至多有。条箭弧射出,每条箭弧用。原创 2022-10-30 19:47:30 · 250 阅读 · 0 评论 -
编译原理复习——文法和语言2
语法树表示了一个句型种种可能的不同推导过程。Elm E⇒rmE⇒rm ⇒⇒⇒⇒→。原创 2022-10-27 19:50:59 · 296 阅读 · 0 评论 -
编译原理复习——文法和语言
什么是文法?若干规则的组合就是文法语言——形式化的内容提取自然语言语言(Language)满足一定条件的句子集合句子(Sentence) 满足一定规则的单词序列单词(Token) 满足一定规则的字符(Character)串(String)程序设计语言——形式化的内容提取程序设计语言(Programming Language):组成程序的所有语句的集合程序(Program):满足语法规则的语句序列 右部。S P 直接推导直接归约记作: ⇒G VT VN SPVN VT ⇒。原创 2022-10-27 17:57:20 · 424 阅读 · 0 评论 -
语义分析——属性文法
属性文法(Attribute Grammar)在上下文无关文法的基础上进行如下扩展:为每个文法符号关联有特定意义的属性(Attribute)为文法的每个产生式关联一个语义规则集合或称为语义动作(或者条件谓词)形式上,属性文法是一个三元组A=(G, V, F)G为上下文无关文法V为属性的有穷集合F为关于属性的断言的有穷集合原创 2022-10-17 22:00:51 · 1323 阅读 · 0 评论 -
自底向上分析部分总结
LR 分析法是一种规范归约分析法,大多数上下文无关文法都可以用相应LR分析器识别LR分析器的关键部分是LR分析表从给定的上下文无关文法构造LR 分析表的方法是对 LR(0)或SLR(1)分析表,构造 LR(0) 项目集规范族,而对LR(1)或LALR(1)分析表,则构造LR(1)项目集族构造识别文法规范句型活前缀的 DFA将 DFA 转换成相应的 LR 分析表四种分析表的构造基本相同,仅对含归约项目的项目集构造分析表元素有所不同。原创 2022-10-15 18:05:01 · 368 阅读 · 0 评论 -
LALR(1)分析方法
我们可以看到当我们碰到C之后向前搜索符都是d/e那么我们就不知道是规约到A或者B了。这里就会产生归约-归约冲突。我们可以看到这几个状态均是所有的项目是一样的但是他们的向前搜索符是不一样的。至于为什么使同一个项目集分裂为多个项目集这里给出一个文法就可以明白了。我这里直接求出它的LR(1)分析项目集组。我们可以得到合并之后的分析集组。原创 2022-10-15 17:19:37 · 3580 阅读 · 0 评论 -
LR(1)分析方法
我们之前分析了SLR(1)方法,SLR(1)方法的S代表simple说明它是一个简单的LR(1)方法所以它也是会有一些问题的。我们在这里介绍LR(1)方法这个就会强大一些解决SLR(1)解决不了的一些问题。原创 2022-10-13 20:23:55 · 1959 阅读 · 1 评论 -
SLR(1)分析
我们可以看到S5和r1部分出现了冲突这个是移进规约冲突我们需要解决这个冲突那么我们现在所掌握的知识显然是不够的。所以我们需要引入新的东西来解决这个问题。求出下面文法的LR(0)分析表具体求的方法见。接下来开始引入SLR(1)分析。原创 2022-10-12 21:18:58 · 970 阅读 · 0 评论 -
LR(0)项目集规范族的构造及LR(0)分析表的构造
求出文法的所有项目,按一定规则构造识别活前缀的NFA, 再确定化为DFA确定化的工作量较大,而且容易出错,实际应用中并不使用,因此这里为了减轻工作量介绍一种实用的方法:通过闭包函数和转换函数,直接求出LR(0)项目集规范族,再由转换函数建立状态之间的连接关系得到识别活前缀的DFA。原创 2022-10-10 21:23:26 · 4723 阅读 · 0 评论 -
识别活前缀的有限自动机构建方法
识别活前缀的不确定有限自动机。这样的一个NFA只要我们进行确定化就可以得到一个确定的DFA关于确定化可以看我之前写的博客。掌握了上述基本知识后,我们现在可以开始进行构造识别活前缀的有限自动机。即 ab aAb aAcd aAcBe是可归前缀。在讲述构建方法之前,首先要掌握一些基础知识。识别活前缀的确定有限自动机DFA。原创 2022-10-04 17:44:58 · 2136 阅读 · 0 评论 -
自底向上语法分析LR(0)
我们需要根据这个分析表进行判断如何进行LR(0)分析现在讲一下这个表里面内容是什么意思。原创 2022-10-03 17:13:57 · 797 阅读 · 0 评论 -
利用消除左递归的方法转换成LL(1)文法的一道经典例题
利用消除左递归的方法转换成LL(1)文法的一道经典例题原创 2022-09-24 21:00:56 · 612 阅读 · 0 评论 -
非LL(1)文法到LL(1)文法的等价变换
我们喜欢和需要使用是LL(1)文法,但是我们往往遇到的文法不是LL(1)文法这时候需要将它进行转换转换成LL(1)文法。这里给出两种方法分别是提取左公因子和消除左递归1 提取左公因子原创 2022-09-24 19:52:11 · 2135 阅读 · 0 评论 -
LL(1)文法定义及判别
LL(1)文法定义及如何判别一个文法是不是LL(1)文法原创 2022-09-24 17:28:06 · 2303 阅读 · 0 评论 -
FIRST集 FOLLOW集和SELECT集
这里注意一点在求FIRST集合时很多时候会忘了ε,如果推导不出来那就没关系但是如果可以推导出来的话一定要写上。开始符号集FIRST 后跟符号集FOLLOW 选择集合SELECT。集合这个是最复杂的也是最难的。原创 2022-09-24 16:50:35 · 893 阅读 · 0 评论 -
确定的有穷自动机DFA的最小化
我们发现很多DFA他们是具有冗余的,还有一些多余的状态不是最小化最精简的状态所以我们需要进行化简来消除冗余和多余状态。原创 2022-09-14 17:23:04 · 935 阅读 · 0 评论 -
NFA转换成DFA的方法——子集法
子集法实现NFA转换成DFA原创 2022-09-11 16:58:04 · 3708 阅读 · 0 评论 -
有穷自动机 DFA(确定)和NFA(不确定)
在状态转换图中开始的状态是需要有一个箭头指向的,终止的状态是一个双圈的。有穷自动机分为DFA和NFA两种。分别位确定的和不确定的两种形式。一个确定的有穷自动机是一个五元组 M=(K,中一 个不同的输入字符做标记。个输入字符,则状态转换 图有。个结点,每个结点至多有。条箭弧射出,每条箭弧用。原创 2022-09-11 16:36:34 · 4927 阅读 · 0 评论