代码改变世界

Lex——修改中又出现新的问题

2008-10-01 00:48  JimLiu  阅读(423)  评论(7编辑  收藏  举报

昨天费了很大的劲,重写了Lex很多代码,主要是NFA生成的部分,把原来很多在字符串级别的预处理都变成了在结点级别的,省了很多结点,大概从2900个省到了几百个吧(这么大的差距,汗一个),随之而来的还有相当明显的性能提升——2900个结点需要12s,现在几百个结点用500ms左右,对于C#来说这性能我基本上满意了,因为我同学用的C++,相同数量级下他大概100ms,而且他的NFA转DFA估计比我快不少,我又没办法优化,so,对于这个性能我基本上还是满意的,毕竟生成DFA基本上是一劳永逸的,DFA出来就可以一直用了。

同时有了新的功能,那就是[]表达式可以支持形如[^ABC]这样的式子了,结果证明通过这个功能我可以匹配"apple\""为String,而不是先前的None了。

但是郁闷的事情就出现了,就是现在的程序在基于字符驱动的不间断匹配过程当中总是找不到掐断状态,这让我非常晕,因为我不知道是预处理错、还是生成NFA错,还是epsilon闭包错,还是基于epsilon闭包的子集构造错,由于相当复杂,我没法进行大数据调试,只能调40个结点左右的小数据。但是郁闷的是小数据下我没发现问题——一切正常!

今天下午发现闭包有些隐晦的问题,修改之,觉得不会错了,好像有点效果,但是问题还是依旧。

现在被这个问题弄得头都晕了,那么多结点那么多边,要查不该有却多出来的边从哪生成的,实在太难了,我得好好想想我会错哪,并且找个调试的办法。

我坚信我这么做是正确的,因为我相信终究能找到这个终结条件的问题所在,为了那难得的性能提升(其实生成NFA还有性能提升余地,也许可以省10%左右的结点)和必须的表达式功能,就算拼了老命我也得把这问题查出来!@#¥%()