摘要:设计并实现了词法分析器。读取文件中的正则表达式及其相匹配的符号,生成由NFA到DFA转移表,最终得到表格驱动的词法分析器。
词法分析器是根据一个符号表分析文本文档。符号表中有两种符号,一种是保留字,例如if、else这类,还有一种是正则表达式,例如整型和浮点型数字、普通的变量名等。词法分析器的功能就是读取原始的文本文档,将其按照符号定义分割为符号的序列。那么对外提供一个接口getToken(),每次调用,返回一个已分析的符号。整个文档分析完成后,需要有个“EOF”符号。
getToken( )的过程是读取字符,与DFA确定型有限自动机进行匹配,当遇到空格或换行时,自动机刚好是结束状态,则返回相应的符号。这里面有几个要注意的点。通常来讲,这个过程是按照正则表达式,先构建NFA,然后生成DFA。但有几个点稍微要注意。一是正则表达式无非是数字、变量名,保留字、运算符都是确定的字符串。那么,对确定的字符串就没必要生成NFA,可以直接生成DFA。二是运算符往往跟数字和变量名、保留字之间都没有空格分开。那么,就要自动将运算符和数字、变量名、保留字分割。
这里设计的几个类,首先最基本的表示自动机的NFA_State与DFA_State。其次要有表示正则表达式的RegexPattern与普通保留字的ReservedWord。最后,有个RegexParser来分析正则表达式生成NFA。
class NFA_State:
HashMap<Character,HashSet<NFA_State>> nfa_edges //字符转移的路径
HashSet<NFA_State> e_edges //e转移的路径
class DFA_State:
HashMap<Character,DFA_State> dfa_edges //字符转移的路径
class RegexPaser:
String rule; //要解析的正则表达式String
NFA_State pars