前面一篇文章介绍了小型编译器实现的准备工作,这篇我们就要动手开始写代码啦!相信通过前边的设计,大家是不是已经胸有成竹了呢?下面我们就来一个模块一个模块的分析,实现各个击破,fighting!
三、详细设计
该部分基于总体设计中描述的编译器的架构和功能流程,针对每个功能模块(词法分析、语法分析、语义分析、目标代码生成),进行详细的原理分析和模块设计,具体如下:
1. 词法分析模块(LEX.py)
1.1 目标
对输入的单词进行识别,并切出目标词。
1.2 要求
- 对形如//(单行注释)和/**/(跨行长注释)进行处理,即跳过注释。
- 按照词法规则识别出各类单词,识别的形式为经过处理后的文法。
- 将识别出来的单词加入单词识别表,返回识别的单词或是错误信息
1.3 功能模块
针对上述要求,设计词法分析LEX.py程序完成词法分析。由于python中含有对正则表达式进行处理的库(re),并且每个单词的构成法则符合正则表达式,所以,采用python正则表达式匹配的方法来实现此法分析,具体如下:
(1)定义单词存储结构
每个单词元组(类似于结构体):
Token = collections.namedtuple('Token', ['typ', 'value', 'line', 'column'])
针对每个单词,存储单词所属类别、单词的值、单词所在的行、单词所在的列
(2)定义单词识别规则
token_regulate = [ # 正则表达式规则构成(用来识别出一个个的单词)
('START', r'(/*)|(//)'),
('ID', r'[a-zA-Z]+[a-zA-z0-9]*'), # 匹配id
('NUM', r'd+'), # 匹配整型数字
('RANGE', r'[,;#(){}]'), # 匹配 ;
('OP', r'(==)|(>=)|(<=)|(!=)|[-+*/><]'),
('ASSIGN', r'='), # 匹配 =
('NEWLINE', r'n'), # 匹配换行
('SKIP', r'[ t]+') # 匹配空格或tab键
]
(3)生成单词识别的正则表达式规则
tok_regex = '|'.join('(?P<%s>%s)' % pair for pair in token_regulate)
get_token = re.compile(tok_regex).match
(4)词法分析总