按照课本上,词法分析器应当使用状态自动机,而石油大的课本把状态机讲的七零八落的,老师讲的课……根本没抓到重点,因此还是要自己动手,丰衣足食。
词法分析的重点应当是把输入的代码转化成单词和符号以便于语法分析,因此不需要进行语法的检测(包括括号是否成对等)。
所以我们需要读取的单词【1】主要如下:标识符(包含保留字,变量等),运算符号,分割符号(括号,逗号,分号等等),常量(包括数常量和字符、字符串常量)。网上很多代码都是使用读取一整句然后进行分析的方法,这样可以解决大部分问题但是有少数的问题比如/**/注释可能为多行,特殊处理的话会有些麻烦。再有些使用空白字符分割单词,认为输入的单词之间都用空格符分割,而这样在处理字符串常量的时候会导致失真(“123 4”可能会被分割为【“123】【4”】两个单词)。
因此在吸纳了各种好的思想之后,我发现还是单个字符读入进行处理比较简单,并且可以更深一步的认识状态自动机。
不同的类型的单词的初始状态不同,比如标识符的初始状态是字母或者下划线,数字常量的初始状态是数字,字符串的初始状态是引号等等,之后这一个复杂的问题就可以划分为许多不同的问题。我的思路是先定义了一个未定义的状态(大概是UNDEFINED),在开始或者每一个状态结束的时候,将状态返回到UNDEFINED状态,有些状态返回的时候需要多读一位才能确认状态结束(比如读入一个标识符,发现新读的字符不是标识符的构成成分才能确认标识符结束),但是我们