读龙书学编译原理 手撸词法生成器(3)...

今天撸了一个晚上终于完成了, 感觉还是要说一下体会吧... 其实之前课程本身已经提供了相关的算法伪代码, 那么在思路上应该没有问题, 那么最后我却用了一个晚上才完成最后的hopcroft 算法呢... 其实难点在于数据结构的运用, 这边图论算法熟悉的话应该会感觉轻松一些...(不幸的是我还没有系统的学过算法...) 就具体代码实现本身来讲, 第一个难点在于如何对已存在的状态进行切分, 比较说起来就是split而已, 但实际操作起来切得却是一串dfa的状态, 我刚开始准备只用一个State(用于第三问的表示状态的数据结构, 类似于第一二步中的NfaState 和 DfaState ) 在检测过程中将属于不同状态集合的节点进行保存, 然后将要导向不同状态的节点放在不同的State节点中(实际上这里的State是一串而不是一个), 在导向相同的状态的节点中用DfaState中自带的next进行保存 ,然后我却忽略了一个问题, 这个问题是我最初设计的致命缺陷, 直接导致了我长达2个小时的debug, 那就是, 如果我用这样的方式保存的话, 那么节点中next的信息会发生变化, 因为在最终状态下的State依然是靠保存第一个DfaState 同时靠该DfaState的next来连接其他DfaState 来连接整张节点图的, 那么两个地方实际都是用next来保存信息, 冲突的结果就是无限循环, 结果我在莫名其妙的无线循坏中debug了2个小时... 发现这个问题的我眼泪掉下来... 最后我使用了ArrayList 来保存我将要分割的2块节点... 另外一个难点在于, 你必须要经常在3, 4层的嵌套循环中保持清醒, 我的建议是边画图变分析边写, 不然很容易上个厕所回来自己都懵逼了... 之所以能这么快完成也得益于Java的GC机制, 感觉如果是C或者C++, 那么我这程序, 呵呵哒...

最后附上代码链接和测试结果 :

https://github.com/zhang77595103/lexerGenerator

时间: 2024-10-03 13:27:48

读龙书学编译原理 手撸词法生成器(3)...的相关文章

读龙书学编译原理 手撸词法生成器(2)...

今天AI考的还算顺利, 没有不会做的, 目前也没发现错的, 在这里顺便也谈谈AI吧, 我之所以不选AI, 总感觉理论性太强, 学起来不来劲, 经历了大二这一个学期的理论学习, 这AI简直是神课啊, 真是怕了, 大三到英国肯定不选AI... 其实就算在今天下午在考试我也是一直惦记着我的词法生成器... 6点考完, 休息了一波8点左右就开始继续写我的词法生成器的第二部分(从NFA到DFA)了, 过程的还算是顺利, 2个小时左右也就写完了, 之后刷知乎刷到了现在, 真是浪费时间啊... 明天再写一下最

读龙书学编译原理 手撸编译器(1)...

从上海回来这两天一口气看完了语义分析, 前段也就差不多了, 本来准备看代码生成的, 人突然就不想看了, 老毛病又犯了 : 很久没不敲代码, 手痒的不行, 所以决定边往前推进边实现前面的部分... 想到终于可以开始实现编译器心里就激动的不行, 那么就这么愉快的开始了... 首先当然是规定语言的词法语法, 由于第一次写编译器, 也不想搞得太过复杂, 我准备写的是一个简化版本的C语言, 大部分词法和语法都将才采用C语言标准... 首先是基本类型 : int, string,bool (这两个C语言里面

读龙书学编译原理 手撸编译器(2)...

经过一天的实践, 勉强写完了语法分析部分和词法分析的抽象语法树的生成部分... 但是也发现也昨天规定的词法和文法中出现的一些问题, 同时我根据情况进行了一些改动... prog -> func funcs | func -> type id () block block -> { stmts } stmts -> stmt stmts | stmt -> type id; | type id = judge; | id = judge; | if(judge) block |

读龙书学编译原理 手撸编译器(3)...

写到12点20勉强算是实现了, 缺陷还很多就不多说了, 具体自己上github去看, 上面我写的很清楚... 发现有任何bug随时联系我... https://github.com/zhang77595103/Simple-C

读龙书学编译原理 语法分析(12)...

那么最后我就来看看这个所谓的lr(0)分析表生成算法 : 这个算法乍一看好像又和前面脱节了, 但是如果仔细看之前的讲解, 比如下图, 仔细比较, 感受一下 ... 你会发现 : 每次产生的D其实就相当于是一个新的状态, 那么再看一下closure 和 goto的具体实现 : 不难发现closure其实就是把所有原推导式左侧点的右侧的非终结符(也就是即将探索的第一个非终结符)的推导式全部加入这个集合, 那么为什么要这样做呢 ? 因为这个算法是并行的, 比如上图, 在执行推导式0的时候, 他需要先完

读龙书学编译原理 语法翻译(3)...

接着上节讲, 我们来看如何在分析中插入合适的代码来生成语法树... 对于抽象语法树的总结 : 下面是作业 : [抽象语法树] 在这个题目中,你将完整的实现抽象语法树(包括数据结构的定义.语法树的生成等).首先,请下载我们提供的代码包: http://staff.ustc.edu.cn/~bjhua/mooc/ast.zip 代码的运行方式是: 首先生成语法分析器: $ bison exp.y 然后生成编译器: $ gcc main.c exp.tab.c ast.c 最后使用编译器编译某个源文件

读龙书学编译原理 词法分析(2)...

第二种词法分析的方式当然是词法分析器的自动生成器. 如lex, jlex 等等. 那么如何来让生成器知道我们想要生成的Token呢 ? 这就涉及到统一的声明式规范的问题, 换句话讲, 你将按照生成器的形式要求将声明式的规范交给生成器, 那么它就能够对其进行识别. 所以我们只需要完成声明式的规范即可完成词法分析部分, 到最后词法解析器自动生成器就能为我们生成对应的自动机... 那么如何来给生成器一个统一的声明式的规范呢 ? 先要了解的一个数学工具就是正则表达式, 如图所示, 这是对正则表达式的基本

读龙书学编译原理 代码生成(1)...

这两天把编译器撸到了抽象语法树环节, 准备看完第八单元一口气撸完编译器...至于翻译成什么语言, 先看看再说... 之前讨论完语法检查和符号表, 那么前端就算全部结束了, 那么我们可以把视角转移到中后端... 其结构大概是这样的... 这个阶段就是所谓的代码生成, 那么代码生成具体要完成任务是这样的... 这里提到了2个重要的任务, 那么我们首先来看第一个 : 然后是第二个 : 为了讲解这些任务的解决方案, 这是接下来要讲解的两种ISA...

读龙书学编译原理 语法分析(1)...

首先我们来分析一下语法分析器的任务 : 将由词法分析器返回的Tokens(记号流)经过检查和处理生成根据规定的语法规则来生成抽象语法树... 最终大概是这样 (两个输入 一个输出): 然后是语法树, 大概是这样 : 那么接下来看看在这一阶段所需要学习的内容 : 大概就是这样...