词法分析器的实现
实现前的准备
- 明确词法分析器的接口
明确词法分析和语法分析之间的关联
接口的两种表现形式:
- 词法分析作为编译器的单独一遍扫描
- 词法分析程序作为语法分析程序的一个子程序
- 确定单词的token结构
举例:
类型+内容二元组
标识符索引表,常量索引表,保留字特殊符号表
具体实现
实现流程:
-
单词DFA描述
-
token生成
注意的问题
-
保留字的识别
识别保留字的实现方法可分为两大类:- 一类是设置保留字表
- 另一类是用自动机单独来识别.
用自动机单独来识别保留字的主要思想是在自动机中加入识别各个保留字的状态,即把保留字和一般标识符分开来识别而不统一识别.
设置保留字表方法的主要思想是事先构造好所谓的保留字表,在进行词法分析时,把保留字也当作一般标识符来识别,然后查保留字表,若有,则把它作为保留字来处理;若没有,则按一般标识符来处理.
两种方法的比较:
不用保留字表的优点是能提高速度,但它使得自动机的状态数随着保留字个数的增多而急剧变大. -
复合单词的识别
在程序设计语言中,有一类单词是由两个或者两个以上的符号组成的,这类单词的前缀部分也可以是一个独立的单词,如“:=”,在处理到“:”时,还不能断定这个单词是“:”,还是“:=”的前缀,这取决于“:”的下一个字符,如果下一个字符是“=”,则该单词为“:=”,否则为“:”.在处理这类单词时要特别加以注意. -
数的转换
词法分析程序应该把数字字符串转换成数,如“123”应该转换成123. -
向前看若干个字符的处理
在有些语言里,为了识别出一个单词需要向前看好几个字符. -
控制字符的处理
控制字符,如空格、Tab和回车换行等.这些字符将占用很大的空间,而且一般来说,它们只有词法意义而没有语法和语义上的意义(字符串内的控制字符例外).若Tab和空格符用来分隔源程序中不同的单词,则直接将它们删除.回车换行本身并没有实际意义,但是对于错误处理起着重要的作用,因此回车换行不能直接删除. -
注释的处理
源程序中的注释没有任何语法和语义上的意义,因此在进行词法分析时可以直接将注释删除,而不必生成其TOKEN.