有限状态机
关于词法记号的识别可以用有限状态机来描述
有限状态机以转化图的形式描述状态的转化
比如对于正规式d->a
其中初始状态为0,匹配到a之后,到达状态1,1的双圈表示最终状态;类似地
正规式d->ab
正规式d->a|b
正规式d->a*
该状态表示可以匹配零个a到达最终状态0,也可以匹配无数个a到达最终状态0
正规式d->a?
表示a出现0次或1次,因此有两个最终状态
因此我们可以将独立地正规式加以组合处理来解决复杂的正规式
比如对关系运算符的匹配
其中诸如 *return...的结果表示指针回退一位,吐出多读入的other字符
再比如标识符的匹配id ->letter (letter | digit )*
其中匹配过程可以概括为三步
-
检查关键字表,如果在表中发现该词法单元则返回相应的记号并退出,否则转向2
-
该词法单元是标识符,在符号表中查找,若找到该词法单元则返回该条目的指针并退出,否则执行3
-
在符号表中建立一个新的条目,把该词法单元填入,并返回此新条目的指针
对于无符号数num ->digit+ (.digit+)? (E (+ | -)? digit+)?
这个就稍微有点复杂了,因此直接通过正规式有些很难写出状态转化图,因此我们需要借助中间手段来实现这一过程
一般的流程如下图所示