编译原理词法分析——python
1.词法分析
词法分析是计算机科学中将字符序列转换为单词序列的过程,进行词法分析的程序或者函数叫作词法分析器,也叫扫描器。在本程序中,我通过python实现了一个简单的词法分析器,该程序并不包含完整的词法分析,因为给的例子并不是很难,所以就没有添加很多,但是道理就是这样的道理。
2.需要分析的代码段
3.函数
以上为预处理函数,该函数先打开需要分析的文件(代码段),然后对多余的空格进行删除,去掉续行符,去掉注释,得到一段精简的代码。
该函数分析预处理之后的代码,并将得到的二元式表输出到文件中。
4.注释
(1). 判断运算符,在本程序中我只考虑了两种情况的运算符,一种是单独一个的运算符,例如“+”,“-”,另一种是两个运算符,例如">=","<="。整个思路是当识别到当前字符是运算符的时候,判断下一个字符是不是也是运算符,如果是运算符的话,那就连续输出两个运算符,如果不是就输出单独一个运算符,如果以为这样就结束了,那就会发现在结果中多了一些二元式,这是因为当连续输出两个运算符的时候,如果不加处理,当遍历到下一个运算符,还会再输出一次,我的解决办法就是再加一个if判断上一个字符是不是运算符,如果是,那就直接跳过,因为如果是的话,那么当前运算符肯定已经输出过了。
(2). 判断数字,在本程序中,数字分为两种,一种是给变量赋的值,另一种就是程序段之前的标号(或者GOTO之后的),通过观察发现区分两种数字的关键是后面紧跟着的是不是“:”以及前面有没有“GOTO”(在本问题中我采用的是后面紧跟着#,这样简单一些,但仅适用于本次处理的程序段简单,如果复杂的还需要在此处完善)。当读取到数字的时候,程序会先保存一下当前的i值,然后循环一次得到当前数字是几位数,以便得到最后一位数之后是冒号或者井号或者是其他来判断当前数字是标号还是常数,之所以保存了i的值,就是为了在判断完成之后,让i的值复位,然后重新循环读取整个数字。记得在读取完整个数字之后,让i-1,因为在循环遍历的时候会+1。
(3). 判断关键词和标识符,定义j来表示关键词或者标识符的长度,temp为空的字符串,当遇到空格、运算符、界符就跳出循环或者当i超出了length的范围,line[i-j:i]即为从i-j到i对应的字符串,也就是遍历遇到要么是关键词要么是标识符的字符串,如果这个字符串在key_word数组中,那么就是关键词,否则就是标识符。
5.运行得到的结果
如有错误,希望多加指正,如果你看到了这里,非常感谢。