我照着《engineering a compiler》中词法分析部分的内容做了一个正则表达式引擎,仅支持实现基本的连接,并联,闭包操作,和单字母字符集。
按照书中的内容,我选择的做法是先把正则表达式用Thompson构造法解析成ε-NFA,然后再用子集构造法转换为DFA,再用Brzozowski 算法最小化DFA。
1.Thompson构造法
这一步骤是用于将正则表达式解析成ε-NFA,具体实现上我用了两个栈,字符栈和符号栈,然后优先级设置为括号>闭包>连接>并联。然后根据thompson构造法的构造方法去连接状态节点。就能得到初步的带ε的非确定性有限自动机。
2.子集构造法
子集构造法的作用是将我们刚刚得到的ε-NFA转换为确定性的DFA。
这个过程要怎么实现呢?
这个转换过程的目的是去掉状态图中不确定状态转移边ε,要怎么去掉呢?这个问题有一点复杂,我们慢慢分析。
首先先看非确定性有限自动