上编译原理课时,老师说可以用同学们可以使用不同的语言写一个词法分析器,于是首先我想到的是python。本来的思路是写一个自动机,用一个指针来表示当前读取的字符,另一个指针往后读,通过不同读取字符的状态用自动机来确定是哪种类别。后面由于python指针好像只要那个seek(),tell()函数好像不是很好操作,于是就想到另一种方法就是使用正则来匹配我们的文件内容,找出我们需要识别的词,同时输出单词的类别!(仅仅提供参考,个人也是个菜鸡!)
题目就是如下:
需要识别的词
- 关键字:if、int、for、while、do、return、break、continue;单词种别码为1。
- 标识符;单词种别码为2。
- 常数为无符号整形数;单词种别码为3。
- 运算符包括:+、-、*、/、**、=、:=、<=、<>、<、>=、>单词种别码为4。
- 分隔符包括:,、; 单词种别码为5
代码如下:
import re def cal_character(longtext): string_list=re.findall(r'[_a-zA-Z][_a-zA-Z0-9]*',longtext)#匹配出字符串 keywords=['if','int','for','while','do','return','break','continue'] for string in string_list: if string in keywords: print("(1,"+string+")") else: if string=="": continue else: print("(2,"+string+")") def cal_number(longtext): number_list=re.findall(r'[\d]*',longtext) for number in number_list: if number!="": print("(3,",number+")") def cal_operator(longtext): operators=['+','-','*','/','**','=',':=','<=','<>','<','>=','>'] for operator in operators: try: if re.search(f'{operator}',longtext): print("(4,",operator+")") else: continue except Exception as e: continue def cal_delimiters(longtext): delimiters=[",",":",";","{","}","[","]",'(',')'] for delimiter in delimiters: try : if re.search(f'[{delimiter}]',longtext): print("(5,",delimiter+")") else: continue except Exception as E: continue #以上模块均可以通过正则表达式进行匹配 if __name__ == '__main__': with open("cpp.txt",'r')as f: text=f.read() print(text) cal_character(text) cal_number(text) cal_operator(text) cal_delimiters(text)
其实上述代码就是通过定义不同匹配单词类型的函数,如1.字符串类(包含了标识符和关键字)正则匹配到之后可以先判断是否为关键字,剩下的就是标识符。2.数字类,就直接正则匹配就好
3.运算符类,4。界符类
这里用到的都是c语言的关键字.
这里提供一个文本文件.