词法分析)。
词法分析器在英语中一般称为Tokenizer。
有一种称为有限自动机(Finite-state Automaton,FSA )或有限状态自动机(Finite-state Machine,FSM )的计算模型。
状态机可以区分标识符和数字字面的量
正则表达式也可以用于描述词法规则。 这种描述方法我们称为正则语法(Regular Grammar )。
IntLiteral : [0-9]; //至少有一个数字
Id : [A-Za-z][A-Za-z0-9]*; //以字母开头,后面可以是字符或数字
词法分析器使用许多词法规则,每个词法规则采用“Token类型:正则表达式”的形式来匹配一个Token
词法规则中必须有优先顺序。 例如,上位字句规则的优先顺序更高
手写词法分析器的步骤太麻烦了。 只要写词法规则,就能自动生成对应的有限自动机吗? 当然可以。 实际上,正则表达式工具就是这样做的。 另外,词法分析器生成工具lex (以及GNU版本的flex ),也可以根据规则自动生成词法分析器。 具体的想法是,将一个正则表达式翻译成NFA,将NFA转换成DFA。
DFA,这是“Deterministic Finite Automaton”的缩写,是确定的有限自动机。 其特点是该状态机在任何状态下,都能根据输入的文字,实现确定的状态转移。
NFA,这是“nondeterministicfiniteautomaton”的缩写,是不确定的有限自动机。 其特点是该状态机存在某种状态,对某些输入不能进行确定性的转换。
NFA,这又细分为两种情况。 对于一个输入,可以转换两种状态。 如果存在-转换器,即,没有字符输入,那么NFA还可从一个状态转变到另一个状态。
所有正则表达式都可以转换为NFA或DFA; 所有NFA或DFA也可以转换为正则表达式。
识别s*的NFA
也可以基于NFA,实现词法分析器。 但是,算法与基于DFA的算法不同。 如果状态中存在多个转换路径,请首先尝试其中的一个。 如果不匹配,则回来并尝试其他路径。 这种试探不顺利而返回的过程称为回溯跟踪。
分析int关键字、标识符和数字字面量的过程:
虽然NFA的执行可能会导致大量的回溯,但是能否将NFA转换成DFA的算法是子集构建方法。
如果有正确的正则表达式,就可以根据算法自动生成匹配字符串的程序。 这是正则表达式工具的基本原理,也是ANTLR和flex等部分工具可以自动生成词法分析器的原理。