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

语法分析(9)...
摘要:之前一节讲完了ll(1)分析算法的主要框架, 现在我们来看看冲突的处理...冲突处理的方式有很多种, 这里讲的这种叫做消除左递归... 右上文法是左递归文法, 你会发现任何一个左递归文法都不是ll(1)的, 为什么呢 ? 比如你看文法的第0条和第1条, 分别可以写成 : E = T + T + T 阅读全文
posted @ 2016-05-22 13:57 内脏坏了 阅读(164) 评论(0) 推荐(0)
语法分析(8)...
摘要:考试昨天下午就算考完了, SE考的好像不太理想啊, 概念多实践少的科目果然不适合我啊(复习的时候, 坚持不了5分钟就开始玩手机, 真是日了狗, 然后开始自责, 然后循环...) 唯一一个好消息是好像我dbi是年级最高分, 不过对于这种没什么技术含量的考试分的高低其实也没什么重要, 不挂科其实都还行吧 阅读全文
posted @ 2016-05-22 00:07 内脏坏了 阅读(190) 评论(0) 推荐(0)
语法分析(7)...
摘要:类似于词法分析, 语法分析也可以有自动生成器, 之前讨论了递归下降的分析算法(适用于手撸词法分析器), 接下来几节来研究生成器生成分析器的内部实现原理... 还是自顶向下, 先看第一类... 接下来是结合具体的分析表进行分析 ... (其实我在这边也是疑问有点多啊 ... 也不知道这表是怎么生成的, 阅读全文
posted @ 2016-05-15 21:27 内脏坏了 阅读(253) 评论(0) 推荐(0)
语法分析(6)...
摘要:这两天都没更, 主要是马上要连着要考三门(16, 18, 20), 都没时间学编译器了, 等过了这段时间应该能有很多时间来搞这个, 之后我准备先把之前写的那个词法分析器生成器改造一下, 弄个最简版的正则引擎出来玩玩, 不过这些都是后话了, 今天似乎也没什么时间, 也就把这单元的作业写了一下... 代 阅读全文
posted @ 2016-05-14 19:09 内脏坏了 阅读(181) 评论(0) 推荐(0)
语法分析(5)...
摘要:然后就是, 递归下降分析算法(也算是自顶向下分析算法的一个子类(也算是改进))... 然后给出伪代码 ... 然而想象是美好的, 现实是残酷的 : 如上图, 真正要实现的时候却又遇到了问题, 那就是, 当读入第一个token时(此处显然是num), 发现无论是 E + T 和 T 都是可行的, 所以 阅读全文
posted @ 2016-05-12 13:51 内脏坏了 阅读(275) 评论(0) 推荐(0)
语法分析(4)...
摘要:接下来开始研究语法分析的具体实现 ... 总来说有两种 : 自顶向下 和 自底向上 ... 先来看看自顶向下 那么具体到底是怎么实现的呢 : 那么你可以发现, 其实算法实现的过程就是以最左推导的方式在遍历所有可能的情况, 同时遍历所使用的栈, 利用栈做了一个显式的遍历代替了递归... 值得注意的是( 阅读全文
posted @ 2016-05-12 13:48 内脏坏了 阅读(360) 评论(0) 推荐(0)
语法分析(3)...
摘要:接下来具体看推导过程... 这是对于表达式 3 + 4 * 5 的推导 ... (其实对于上图我是存在一定疑惑的, 程序从什么时候开始从非终结符到终结符的替换 ? 就是说为什么第一步能E*E, 判断E+E我可以认为是它发现3后面有个 '+', 但是判断 E * E 难道它是从左边开始看的 ? 也有另 阅读全文
posted @ 2016-05-12 11:21 内脏坏了 阅读(185) 评论(0) 推荐(0)
语法分析(2)...
摘要:先来看看上下文无关文法, 总的来说上下文无关文法的定义如图 : BNF范式(Backus-Naur Form)经常用来表示上下文无关文法... 接下来提出一个概念叫推导 : 推导有两种, 最左推倒和最右推倒 : 那么其实词法分析的目的就可以用这个上面我们所提到的上下文无关文法来描述了 : 下面是一道 阅读全文
posted @ 2016-05-12 00:22 内脏坏了 阅读(175) 评论(0) 推荐(0)
语法分析(1)...
摘要:首先我们来分析一下语法分析器的任务 : 将由词法分析器返回的Tokens(记号流)经过检查和处理生成根据规定的语法规则来生成抽象语法树... 最终大概是这样 (两个输入 一个输出): 然后是语法树, 大概是这样 : 那么接下来看看在这一阶段所需要学习的内容 : 大概就是这样... 阅读全文
posted @ 2016-05-11 22:29 内脏坏了 阅读(177) 评论(0) 推荐(0)
手撸词法生成器(3)...
摘要:今天撸了一个晚上终于完成了, 感觉还是要说一下体会吧... 其实之前课程本身已经提供了相关的算法伪代码, 那么在思路上应该没有问题, 那么最后我却用了一个晚上才完成最后的hopcroft 算法呢... 其实难点在于数据结构的运用, 这边图论算法熟悉的话应该会感觉轻松一些...(不幸的是我还没有系统的 阅读全文
posted @ 2016-05-11 00:16 内脏坏了 阅读(275) 评论(0) 推荐(0)
手撸词法生成器(2)...
摘要:今天AI考的还算顺利, 没有不会做的, 目前也没发现错的, 在这里顺便也谈谈AI吧, 我之所以不选AI, 总感觉理论性太强, 学起来不来劲, 经历了大二这一个学期的理论学习, 这AI简直是神课啊, 真是怕了, 大三到英国肯定不选AI... 其实就算在今天下午在考试我也是一直惦记着我的词法生成器... 阅读全文
posted @ 2016-05-09 23:30 内脏坏了 阅读(370) 评论(0) 推荐(0)
手撸词法生成器(1)...
摘要:这两天时间不多啊, 明天下午要考AI了, 没什么时间写这个, 今天抽空把昨天的留下的作业(用C写不下去的那个...)转移到了java上, 只完成了Thompson那一部分, 之后的两部分估计要等考试完再继续了, 因为代码还没写完就不扔github上了... 直接贴代码了 : 包结构如图... Ent 阅读全文
posted @ 2016-05-08 20:28 内脏坏了 阅读(192) 评论(0) 推荐(0)
词法分析(7)...
摘要:最后是几个个小作业 : 给定如下的正则表达式 (a|b)((c|d)*),请完成如下练习: (1)使用Thompson算法,将该正则表达式转换成非确定状态有限自动机(NFA); (2)使用子集构造算法,将该上述的非确定有限状态自动机(NFA)转换成确定状态有限自动机(DFA); (3)使用Hopcr 阅读全文
posted @ 2016-05-07 02:48 内脏坏了 阅读(366) 评论(0) 推荐(0)
词法分析(6)...
摘要:到上一篇博客为止, 词法分析器生成器内部的整个工作流程就全部结束了, 最后再提一下最终生成的DFA在具体代码上的的表现形式... 所谓的转移表, 说白了就是二位矩阵, 这是表驱动算法的代码实现... 其实这段代码中有两个重要的思想: 1. 关于字符匹配规则的一个惯例 (但实际情况也依据编程语言不同而 阅读全文
posted @ 2016-05-07 02:39 内脏坏了 阅读(320) 评论(0) 推荐(0)
词法分析(5)...
摘要:最后是最小化算法, 它的目的其实在于通过合并的方式, 减少状态数, 然后使得最终生成的代码中用来表示状态转移的数据结构尽量小, 以此节约空间和时间. DFA中运用最广泛的算法是hopcroft算法, 接下来就是对该算法的简要介绍... 这个算法的第一步是将所有的状态(也就是代码中的nodes) 划分 阅读全文
posted @ 2016-05-07 00:09 内脏坏了 阅读(151) 评论(0) 推荐(0)
词法分析(4)...
摘要:接下来的步骤就是从NFA转换为DFA...首先要思考的第一个问题是为什么要从NFA转换到DFA, 那么我们可以先来看看他们的区别, 通俗来讲, NFA就是说给定一个输入的字符, 可以有多种状态可以选择, 而DFA的话, 就只有一种状态可以选择... 由这里就可以发现, 其实DFA在代码的实现难度上是 阅读全文
posted @ 2016-05-06 23:29 内脏坏了 阅读(372) 评论(0) 推荐(0)
词法分析(3)...
摘要:之前我们说词法分析器的自动生成器能够将声明式的规范(在这里我们用的是正则表达式)转化为自动机(DFA, NFA), 所以现在我们来看看在生成器的内部到底是如何工作的.这是对于该过程的概述 : Thompson算法 : 从re到NFA 这个算法总结起来就两点 : 1. 对于基本的正则表达式直接构造 2 阅读全文
posted @ 2016-05-06 16:43 内脏坏了 阅读(223) 评论(0) 推荐(0)
词法分析(2)...
摘要:第二种词法分析的方式当然是词法分析器的自动生成器. 如lex, jlex 等等. 那么如何来让生成器知道我们想要生成的Token呢 ? 这就涉及到统一的声明式规范的问题, 换句话讲, 你将按照生成器的形式要求将声明式的规范交给生成器, 那么它就能够对其进行识别. 所以我们只需要完成声明式的规范即可完 阅读全文
posted @ 2016-05-05 17:47 内脏坏了 阅读(210) 评论(0) 推荐(0)
词法分析(1)...
摘要:从整体上看, 词法分析是编译器前段的第一个部分, 它的任务是完成从字符流到记号流的转换. 字符流 : 其实就是源代码. 那么什么是记号流, 记号其实是一种数据结构, 方便编译器后期对代码进行有效处理而产生的, 比如在java 中, 这就是记号(Token). 实现方案至少有两种 1. 手工编码 2. 阅读全文
posted @ 2016-05-05 10:56 内脏坏了 阅读(303) 评论(0) 推荐(0)
前言...
摘要:最近一直在学编译原理, 特别前几天, 整天都在看视频, 找代码, 然后总是感觉一味贪多求快, 很多概念理解不太透彻啊, 最后还是决定以视频为导向, 边看书边学习吧...博客争取做到一天一更吧... 阅读全文
posted @ 2016-05-04 23:57 内脏坏了 阅读(211) 评论(0) 推荐(0)