码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-10 02:13:13      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

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

https://github.com/zhang77595103/lexerGenerator

这是测试结果...

技术分享

 

谈谈这一部分的心得, 感觉难点不在于算法, 而在于围绕算法如何合理的使用数据结构,比如我在DfaState里面使用了一个Hashset来管理这个DfaState里面的NfaState, 目的其实是在新生产了一个DfaState的时候判断该个状态是否早就加入到了State中, 因为java默认Hashset已经改写过equals()方法, 只要里面的元素相等, 则两个Hashset相等. 当然也可以直接在Dfa这个结构里面将State改成HashSet也是可以的, 同时在子集构造的时候的workList我使用了栈, 目的是不重复扫描DfaState, 想想这些数据结构如果你用C的话, 全要自己搞, 工程量增大了不是一点两点... 另外还有一些小细节可能会导致无线循环, 比如说用你在将NfaState加入DfaState的时候, 必须要现将NfaState.next 赋值为null(因为你会发现其实在NfaState中是保存着在上一过程中残留下来的节点的), 不这样的话结果错了不说而且可能会死循环...

 

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

标签:

原文地址:http://www.cnblogs.com/nzhl/p/5476029.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!