到上一篇博客为止,  词法分析器生成器内部的整个工作流程就全部结束了, 最后再提一下最终生成的DFA在具体代码上的的表现形式...

 

所谓的转移表, 说白了就是二位矩阵, 这是表驱动算法的代码实现...

 

其实这段代码中有两个重要的思想:

1. 关于字符匹配规则的一个惯例 (但实际情况也依据编程语言不同而不同)----> 最长匹配. 所谓最长匹配就是说就算到达了接受状态, 如果还能继续接受输入的字符, 就继续接受直至不能接受为止.

2. 你会发现算法中每次都将最新遇到的可接受状态压入栈中, 然后在之后碰到新的接受状态时在清空栈然后把新的接受状态压入, 这样做的原因在于这个算法总是尝试读入更多的字符, 但是如果失败的话, 需要将这些多读的字符回滚然后回到最近的一个接受状态返回, 那么这种用新栈替换之前栈的做法恰好能满足这一需求...

下面是另外一种DFA的状态表示, 跳转表(他的基本思想在于 : 把每个状态变成一段代码, 然后把每次状态转移变成代码中的跳转)..

 

注意 : 右上角表格实际上并不需要出现在跳转表中, 只是为了便于讲解...

跳转表相对于转移表而言, 最大的优点是省空间, 提高了效率 (不需要维护右上角那个表格, 实际上也就是一个数组), 但是代码量大, 代码不如转移表简洁.

 

posted on 2016-05-07 02:39  内脏坏了  阅读(313)  评论(0编辑  收藏  举报