用python做一个类c编译器——词法分析器
程序创建一个词法类——classword_list,在使用类构造一个示例对象时需传入一个文件名参数。
而后,对象的初始化函数对该源代码进行切割,并返回一个字典,存放单词和单词所在的行号。
接着,初始化函数调用单词分类函数(creat_table)对每个单词进行分类,并且进行括号匹配
最后将分类的单词放进对象的四个成员变量中,也就是四个表。
我的词法分析思维导图
¶单词类别序号和表序号
输出单词结点有类别,序号等信息
¶运算符表
y_list = ["+","-","*","/","<","<=",">",">=","=","==","!=","^",",","&","&&","|","||","%","~","<<",">>","!"] |
¶分隔符表
f_list = [";","(",")","[","]","{","}", ".",":",""","#","","","?"] |
¶关键字表
k_list = [ |
¶括号配对判断
kuo_cp = {{:}, [:], (:)} |
说明:每个关键字的id定义为它在该关键字表中的索引位置,运算符表与分隔符表也是如此
¶代码注释部分
由//
开始的行注释,和/*
开始*/
结束的段注释,对程序没有影响,也忽略.
¶词法分析程序的功能
输入:所给文法的源程序字符串。
输出:一个自定义的词法类
该词法类定义如下
# 词法分析器输出对象 |
- 成员变量:输出的单词表,源代码中的分隔符表,运算符表,变量表,关键字表
- 成员方法:将源代码字符切割并存入对应表中
其中,word_list(输出单词列表)中包含所有答源代码单词,其他表中存放着细分的单词(考虑到后面的程序会用到)
¶词法分析器由两个python文件组成
- Cmp.py 为分析器主函数
- Function.py 存放我写的一些单词处理函数,并在cmp.py中导入调用
import re |
¶词法分析程序的主要算法思想
程序创建一个词法类——classword_list,在使用类构造一个示例对象时需传入一个文件名参数。
而后,对象的初始化函数对该源代码进行切割,并返回一个字典,存放单词和单词所在的行号。
接着,初始化函数调用单词分类函数(creat_table)对每个单词进行分类,并且进行括号匹配
最后将分类的单词放进对象的四个成员变量中,也就是四个表。
¶测试用例
- 测试一(正确用例):
|
输出单词表如下
Line:行号,type:类型,word:单词
{line: 1, type: separator, word: #} |
输出变量表如下
{line: 1, id: 0, value: 0.0, name: include} |
其他两个表不再累赘输出
¶报错处理
括号匹配处理
测试2(错误代码)
#include <stdio.h> |
¶非法变量名处理
测试3(错误代码)
#include <stdio.h> |
¶词法分析器程序
源代码见源文件
源文件结构:
- cmp.py 为分析器主函数
- function.py 存放我写的一些单词处理函数,并在cmp.py中导入调用
实验环境
- 编译环境: python3.6
- 使用库: re
源码见我的GitHub兰州小红鸡

最近文章