本节我们的目的是,在给定正则表达式后,将其转换为非确定性有限状态自动机数据结构,后者会进一步生成一个跳转表,从而实现字符串匹配的功能。我们首先看输入,输入是一个后缀名为lex的文件,基本内容如下:
%{
FCON = 1
ICON = 2
%}
D [0-9]
%%
(e{D}+)?
%%
在编译器开发中有一系列工具链,链条中第一个叫lex, 它的作用是你可以将字符串识别对应的正则表达式输入到一个文件中,例如上面那样,然后执行lex,后者读入文件,然后输出基于C语言的代码文件,这个代码文件实际上讲正则表达式转换成了对应的可执行的C代码,我们将生成的代码编译后就可以得到可执行的,能够识别特定字符串的程序。
我们这次要实现的lex要基于python语言,首先在lex文件中分为若干部分,第一部分由%{ %}组成,它实际上是一段python代码,通常是变量定义之类,lex程序会将这部分内容直接拷贝到给定目标文件,假设我们把目标文件命名为output.py,那么语句:
FCON = 1
ICON = 2
就会直接拷贝到output.py的顶部,具体内容我们后面再详细解读。接下来的部分是宏定义,也就是%} 到 %%这部分,这里对应的语句是:
D [0-9]
这里类似于C语言的宏定义,上面字符串表明字符D表示输入是0到9这十个数字。最后一部分介于两个%%之间,这部分定义正则表达式的具体形式,对应上面内容就是:
(e{D}+)?
我们完成的代码将会读取这条语句,然后逐个解析其中的字符,最