今天撸了一个晚上终于完成了, 感觉还是要说一下体会吧... 其实之前课程本身已经提供了相关的算法伪代码, 那么在思路上应该没有问题, 那么最后我却用了一个晚上才完成最后的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