怎么用python写词法分析器

  介绍

这篇文章主要介绍怎么用python写词法分析器,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

编译原理老师要求写一个java的词法分析器,想了想决定用python写一个。

<强>目标

能识别出变量,数字,运算符,界符和关键字,用excel表打印出来。

有了目标,想想要怎么实现词法分析器。

1。先进行预处理,把注释,多余的空格,空行去掉。

2。一行一行扫描,行里逐字扫描,把界符和运算符当做分割符,遇到就先停下开始判断。

<李>

若是以英文字母,美元,下划线开的头,则可能是变量和关键字,在判断是关键字还是变量。

<李>

若是数字开头,则判断下一位是不是也是数字,直到遇到非数字停止,在把数字取出来。

<李>

再来判断分割符是什么类型,是界符还是运算符。

在给不同词添加上识别码

在用excel表打印出来。

代码实现

, <强> 1。用列表创建一个关键字表,java关键字有50个。

#保留字   key_word =,[& # 39;抽象# 39;& # 39;维护# 39;,& # 39;布尔# 39;,& # 39;打破# 39;,& # 39;字节# 39;,   ,,,,,& # 39;案例# 39;& # 39;抓住# 39;,& # 39;char # 39; & # 39;类# 39;,& # 39;const # 39;   ,,,,,& # 39;继续# 39;& # 39;默认# 39;,& # 39;做# 39;& # 39;双# 39;,& # 39;其他# 39;   ,,,,,& # 39;enum # 39; & # 39;延伸# 39;,& # 39;最后# 39;& # 39;最后# 39;,& # 39;浮动# 39;   ,,,,,& # 39;为# 39;& # 39;goto # 39;, & # 39;如果# 39;& # 39;实现# 39;,& # 39;进口# 39;   ,,,,,& # 39;instanceof # 39; & # 39; int # 39;, & # 39;界面# 39;& # 39;长# 39;,& # 39;本地# 39;   ,,,,,& # 39;新# 39;& # 39;包# 39;,& # 39;私人# 39;& # 39;保护# 39;,& # 39;公共# 39;   ,,,,,& # 39;返回# 39;& # 39;短# 39;,& # 39;静态# 39;& # 39;strictfp& # 39;, & # 39;超级# 39;   ,,,,,& # 39;开关# 39;& # 39;同步# 39;,& # 39;这个# 39;& # 39;把# 39;,& # 39;把# 39;   ,,,,,& # 39;瞬态# 39;& # 39;尝试# 39;,& # 39;空白# 39;& # 39;挥发性# 39;,& # 39;而# 39;]

<强> 2。用列表创建一个运算符表。

#运算符   operator =,[& # 39; + & # 39; & # 39; & # 39;, & # 39; * & # 39;, & # 39;/& # 39;, & # 39; % & # 39;, & # 39; + + & # 39;, & # 39;——& # 39;, & # 39; +=& # 39;, & # 39; -=& # 39;, & # 39; +=& # 39;, & # 39;/=& # 39;, #算术运算符   ,,,,,& # 39;==& # 39;& # 39;!=& # 39;& # 39;& # 39;,& # 39;& lt; & # 39; & # 39;=& # 39;, & # 39; & lt;=& # 39; #关系运算符   ,,,,,& # 39;,& # 39;& # 39;| & # 39;& # 39;^ & # 39;& # 39;~ & # 39;& # 39;& lt; & lt; & # 39; & # 39;在祝辞& # 39;& # 39;在祝辞& # 39;,#位运算符   ,,,,,& # 39;,,& # 39;& # 39;| | & # 39;& # 39;! & # 39;#逻辑运算符   ,,,,,& # 39;=& # 39;& # 39;+=& # 39;& # 39;-=& # 39;& # 39;*=& # 39;& # 39;/=& # 39;& # 39;%=& # 39;& # 39;& lt; & lt;=& # 39; & # 39;祝辞=& # 39;,& # 39;,=& # 39;& # 39;^=& # 39;& # 39;|=& # 39;#赋值运算符   ,,,,,& # 39;? & # 39;):#条件运算符

<强> 3。用列表创建一个界符表。

#界符   delimiters =,(& # 39;{& # 39; & # 39;} & # 39;, & # 39;[& # 39; & # 39;] & # 39;, & # 39;(& # 39; & # 39;) & # 39;, & # 39;强生# 39;,& # 39;,& # 39;,& # 39;:& # 39;,& # 39;;& # 39;]

<强> 4。预处理

用正则表达式把注释去掉,在把多余的空行去掉

#预处理   new_file def  filterResource(文件):   f2 =,开放才能(new_file & # 39; w + & # 39;)   时间=txt 才能;& # 39;& # 39;. join(打开(文件,& # 39;" # 39;). readlines ())   deal_txt 才能=,re.sub (" # 39; \/\ * [\ s \ s] * * \ \ | \/\/. * & # 39;, & # 39; & # 39;(三),   for 才能;line 拷贝deal_txt.split (& # 39; \ n # 39;):   ,,,,,line =, line.strip ()   ,,,,,line =, line.replace (& # 39; \ \ t # 39;, & # 39; & # 39;)   ,,,,,line =, line.replace (& # 39; \ \ n # 39;, & # 39; & # 39;)   ,,,,,if  not 线:   ,,,,,,,继续   ,,,,,其他的:   ,,,,,,,f2.write(线+ & # 39;\ n # 39;)   f2.close才能()   return 才能sys.path [0] + & # 39; \ \ & # 39; +, new_file

<强> 5。逐行扫描

按照刚刚的思路进行判断,把每一行的单词,添加到word_line列表中,最后在把每一行添加到令牌列表中。

def 扫描(文件):   lines =,才能打开(文件,& # 39;" # 39;). readlines ()   for 才能;line 拷贝:   ,,,word =, & # 39; & # 39;   ,,,word_line =, []   ,,,小姐:=0   ,,,while 小姐:& lt; len(线):   ,,,,,word  +=线[我]   ,,,,,if 行[我]==& # 39;,& # 39;,或行[我],拷贝delimiters 或是行[我],接线员:拷贝   ,,,,,,,if 词[0].isalpha(),或是字[0]==& # 39;$ & # 39;,趁机词[0]==& # 39;_ # 39;:   ,,,,,,,,,word =,词(:1)   ,,,,,,,,,if  searchReserve(词):   ,,,,,,,,,,,#,保留字   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

怎么用python写词法分析器