基于 FSM 的词法分析器
手动编写有限状态机 (FSM) 词法分析器,循环输入中的字符并使用两级 switch 语句进行处理:
- 外层switch语句是开启状态;
- 内部 switch 语句正在打开读取的字符。
这是处理令牌的有限状态机的实现。这样做的缺点是维护起来可能会变得复杂,尤其是在有许多状态来处理每个令牌的情况下。好处是更容易重构以利用有限状态机(例如,使用转换表而不是 switch 语句)。
转换表类似于 switch 语句:行定义状态,列定义数据值,单元格定义要转换到的下一个状态(使用 -1 之类的东西发出停止处理的信号)。通过这种方法,可以使用最终状态来确定令牌类型。在这里,您将拥有一个 token_type tokens[N_STATES]; 数组,然后您可以执行 token = tokens[current_state] 来获取令牌。
非 FSM 词法分析器
另一种方法是打开第一个字符,然后读取该标记中的其余字符作为该 case 语句的一部分。这可以更容易阅读和更简单的编写。
您还可以将字符分成不同的类别(例如数字、字母、减号和小于号),您可以将其定义为 256 项查找表。这可以简化 case 语句。
正则表达式
正如您所指出的,使用大的正则表达式是有问题的,因为您无法获得令牌类型。这里的一种方法是拥有一个与令牌匹配的正则表达式列表,并将其与令牌类型相关联。例如在python中:
_tokens = [
(re.compile('\\s+'), WhiteSpace),
(re.compile('[a-zA-Z_][a-zA-Z0-9_]*'), Identifier),
(re.compile('[0-9]+'), Integer),
]
您需要正确排序(例如,将关键字匹配放在标识符之前)。