随笔分类 -  编译原理自学笔记

初学编译原理,终篇。
摘要:大概一个月的时间吧, 一直在学习编译原理,直到5月31号我仍然还在看编译原理的视频教程, 但是我直接其实我的各方面知识还是有很多欠缺, 比如我没有办法把我分析得出的抽象语法树进一步转化为汇编代码或者java字节码, 因为那些对于我而言又是一个全新的领域, 同时我知道我大4还是会有编译器的课程的, 同时我一直在用java写编译器, 一个很重要的原因就在于, 我的C语言水平不够支持我完成这样一个比较复... 阅读全文
posted @ 2016-06-09 17:24 内脏坏了 阅读(560) 评论(0) 推荐(1)
代码生成(4)...
摘要:接下来来看下一种体系结构, 寄存器计算机... 为了方便学习, 这里构建出了一个相对简化寄存器计算机结构模型... 和栈式计算机流程一样, 接来下是指令集和伪指令和代码生成算法.. 最终生成的寄存器计算机代码 : 阅读全文
posted @ 2016-05-31 12:43 内脏坏了 阅读(270) 评论(0) 推荐(0)
手撸编译器(3)...
摘要:写到12点20勉强算是实现了, 缺陷还很多就不多说了, 具体自己上github去看, 上面我写的很清楚... 发现有任何bug随时联系我... https://github.com/zhang77595103/Simple-C 阅读全文
posted @ 2016-05-31 00:26 内脏坏了 阅读(206) 评论(0) 推荐(0)
代码生成(3)...
摘要:具体来看看如何从C--(之前有提到)到Stack : 下面都是简单的实例代码, 也没什么好说的... 大概就是这样...接下来是运行生成代码的几种思路(为了便于以后复习还是截下来了...) 指的一提的是 : 最后一种非栈式计算机模拟栈式计算机的思路其实就是java虚拟机中jit技术的思路, 在解释过 阅读全文
posted @ 2016-05-30 14:59 内脏坏了 阅读(177) 评论(0) 推荐(0)
代码生成(2)...
摘要:先来看栈式计算机...栈式计算机的背景 : 接下来是它的结构和指令集... 接下来是每条指令的具体意义 : 同理减法乘除法就不说了... 接下来再看看变量内存分配的伪指令(之所以叫伪指令是因为它并不会被ALU执行, 而真正的指令是需要ALU来执行的).. 接下来是一个实例... 如图, 上面三条就是 阅读全文
posted @ 2016-05-30 14:13 内脏坏了 阅读(222) 评论(0) 推荐(0)
代码生成(1)...
摘要:这两天把编译器撸到了抽象语法树环节, 准备看完第八单元一口气撸完编译器...至于翻译成什么语言, 先看看再说... 之前讨论完语法检查和符号表, 那么前端就算全部结束了, 那么我们可以把视角转移到中后端... 其结构大概是这样的... 这个阶段就是所谓的代码生成, 那么代码生成具体要完成任务是这样的 阅读全文
posted @ 2016-05-30 13:35 内脏坏了 阅读(208) 评论(0) 推荐(0)
手撸编译器(2)...
摘要:经过一天的实践, 勉强写完了语法分析部分和词法分析的抽象语法树的生成部分... 但是也发现也昨天规定的词法和文法中出现的一些问题, 同时我根据情况进行了一些改动... prog -> func funcs | func -> type id () block block -> { stmts } s 阅读全文
posted @ 2016-05-29 20:45 内脏坏了 阅读(311) 评论(0) 推荐(0)
手撸编译器(1)...
摘要:从上海回来这两天一口气看完了语义分析, 前段也就差不多了, 本来准备看代码生成的, 人突然就不想看了, 老毛病又犯了 : 很久没不敲代码, 手痒的不行, 所以决定边往前推进边实现前面的部分... 想到终于可以开始实现编译器心里就激动的不行, 那么就这么愉快的开始了... 首先当然是规定语言的词法语法 阅读全文
posted @ 2016-05-28 20:00 内脏坏了 阅读(467) 评论(0) 推荐(0)
语义分析(2)...
摘要:语义分析中有一些比较常见的问题值得思考 : 感觉这一部分也没什么可讲的, 主要还是看实践吧... 接下来是这一部分的题目, 在这个题目中,你将亲自动手实现C--语义的语义分析器。具体的题目要求见: http://staff.ustc.edu.cn/~bjhua/mooc/semant.html 具体 阅读全文
posted @ 2016-05-28 13:06 内脏坏了 阅读(264) 评论(0) 推荐(0)
语义分析(1)...
摘要:生成了抽象语法树, 接着就来进行语义分析...语义分析的任务如下图: 一个比较简单的类型检查算法可以是这样的 : 加上id之后可以是这样的: 这里就引出了符号表的概念 : 同时符号表还应该满足程序中作用域的概念, 实现作用域的方法如下: 同时符号表还应该解决名字空间的问题, 可以看到图中多次出现li 阅读全文
posted @ 2016-05-28 12:38 内脏坏了 阅读(377) 评论(0) 推荐(0)
语法翻译(3)...
摘要:接着上节讲, 我们来看如何在分析中插入合适的代码来生成语法树... 对于抽象语法树的总结 : 下面是作业 : 【抽象语法树】 在这个题目中,你将完整的实现抽象语法树(包括数据结构的定义、语法树的生成等)。首先,请下载我们提供的代码包: http://staff.ustc.edu.cn/~bjhua/ 阅读全文
posted @ 2016-05-28 00:40 内脏坏了 阅读(392) 评论(0) 推荐(0)
语法翻译(2)...
摘要:从分析树到语法树...什么意思呢, 就说这个图中其实很多节点是多余的, 比如左右括号, 还有从E到3其实可以直接由3代替E等等, 因为到了分析树这一阶段, 其实优先级结合性都已经由树的结构简介的体现出来了, 所以用于表示优先级结合性的括号, 以及分析过程中冗余的结构(3和4 上面的E)都不必要... 阅读全文
posted @ 2016-05-27 21:37 内脏坏了 阅读(393) 评论(0) 推荐(0)
语法翻译(1)...
摘要:完成了语法分析, 那么这一阶段最后要讨论的就是如何生成抽象语法树了...这一阶段称之为语法翻译 : 那么我们来看看翻译的基本思想 : 其实现如下 : 下面是具体实例 : 阅读全文
posted @ 2016-05-27 20:47 内脏坏了 阅读(210) 评论(0) 推荐(0)
语法分析(16)...
摘要:接下来是这一节的习题 : 在这个题目中,你将实现一个简单的台式计算器。这个台式计算器的功能像在最后一个讲义中演示的例子一样:即用户可以在控制台上交互输入算术表达式,你的程序判断该表达式是否合法,不合法的话报错并退出运行。 你的程序涉及表达式的部分要支持如下的表达式: E -> n | E + E | 阅读全文
posted @ 2016-05-27 20:01 内脏坏了 阅读(187) 评论(0) 推荐(0)
语法分析(15)...
摘要:到这里词法分析模块就接近尾声了, 下面对词法分析模块进行总结 : 递归下降本质上也算是自顶向下的分析算法, 适合手工编码, 它相对来说更加灵活, 能够对于特定的DSL进行更加灵活的处理优化, 但是相对来说比较慢.而自动生成器则恰好相反, 接下来是一个LR(1)语法生成器的实例 -- YACC. 首先 阅读全文
posted @ 2016-05-27 17:31 内脏坏了 阅读(206) 评论(0) 推荐(0)
语法分析(14)...
摘要:上一节讲完了SLR(LL(0)改进算法)的由来, 我们来大致分析一下该算法的基本思想... 具体我们可以再来看一个冲突... 可以看到状态2中, 既可以移进也可以归约, 同时由于R的follow集中也存在=(R可以是L, L后面可以是=), 所以两种情况都无法避免... 为了解决这个冲突, 我们引出 阅读全文
posted @ 2016-05-27 13:41 内脏坏了 阅读(171) 评论(0) 推荐(0)
语法分析(13)...
摘要:最后我们来分析一下这个所谓的LR(0)分析算法... 图中第二个L应该是R, 然后所谓的0个前看符号我确实不太能够理解, 据说要和lr(1)比较了才知道, 接下来研究它的缺点(说实话感觉能分析的文法有限这不是ll(1)的缺点吗? 不说说lr类算法没有这类缺点吗? ) 接下来就是具体的错误分析实例了. 阅读全文
posted @ 2016-05-27 12:25 内脏坏了 阅读(171) 评论(0) 推荐(0)
语法分析(12)...
摘要:那么最后我就来看看这个所谓的lr(0)分析表生成算法 : 这个算法乍一看好像又和前面脱节了, 但是如果仔细看之前的讲解, 比如下图, 仔细比较, 感受一下 ... 你会发现 : 每次产生的D其实就相当于是一个新的状态, 那么再看一下closure 和 goto的具体实现 : 不难发现closure其 阅读全文
posted @ 2016-05-22 22:48 内脏坏了 阅读(199) 评论(0) 推荐(0)
语法分析(11)...
摘要:下面来具体看一下这个算法(这边可能会有点跳跃, 但是仔细看的话还是能看出来之间的联系的) : 上面已经说了, 这个算法的核心思想就是移进和归约, 移进可以看出是图中自动机的状态转化过程, 但这里的转化并不需要弹出任何字符, 只需要讲状态与字符可以得到的新状态压入即可, 每一个状态都是一个推导式, 之 阅读全文
posted @ 2016-05-22 22:08 内脏坏了 阅读(291) 评论(0) 推荐(0)
语法分析(10)...
摘要:从这一节开始研究自底向上的分析算法, 该类分析算法分析能力更加强大, 其中目前广泛运用在实际当中的一类就是LR了.. 具体来讲LR是这样的... 注意这边LR, L指的是读入程序仍然是自左向右, 但是R指的是最右推倒, 如果右边的推导从下往上看的话, 你会发现其实就是最右推导... 接着来看一个更加 阅读全文
posted @ 2016-05-22 21:29 内脏坏了 阅读(220) 评论(0) 推荐(0)