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

目标

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

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

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

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

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

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

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

在给不同词添加上识别码

在用excel表打印出来。

代码实现

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

#保留字

key_word = ['abstract','assert','boolean','break','byte',

'case','catch','char','class','const',

'continue','default','do','double','else',

'enum','extends','final','finally','float',

'for','goto','if','implements','import',

'instanceof','int','interface','long','native',

'new','package','private','protected','public',

'return','short','static','strictfp','super',

'switch','synchronized','this','throw','throws',

'transient','try','void','volatile','while']

2.用列表创建一个运算符表。

#运算符

operator = ['+','-','*','/','%','++','--','+=','-=','+=','/=',#算术运算符

'==','!=','>','=','<=',#关系运算符

'&','|','^','~','<>','>>>',#位运算符

'&&','||','!',#逻辑运算符

'=','+=','-=','*=','/=','%=','<<=','>>=','&=','^=','|=',#赋值运算符

'?:']#条件运算符

3. 用列表创建一个界符表。

#界符

delimiters = ['{','}','[',']','(',')','.',',',':',';']

4.预处理

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

#预处理

def filterResource(file,new_file):

f2 = open(new_file,'w+')

txt = ''.join(open(file,'r').readlines())

deal_txt = re.sub(r'\/\*[\s\S]*\*\/|\/\/.*','',txt)

for line in deal_txt.split('\n'):

line = line.strip()

line = line.replace('\\t','')

line = line.replace('\\n','')

if not line:

continue

else:

f2.write(line+'\n')

f2.close()

return sys.path[0]+'\\'+ new_file

5.逐行扫描

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

def Scan(file):

lines = open(file,'r').readlines()

for line in lines:

word = ''

word_line = []

i = 0

while i

word +=line[i]

if line[i]==' ' or line[i] in delimiters or line[i] in operator:

if word[0].isalpha() or word[0]=='$' or word[0]=='_':

word = word[:-1]

if searchReserve(word):

# 保留字

word_line.append({word[:-1]:key_word.index(word)})

else:

# 标识符

identifier.append({word:-2})

word_line.append({word:-2})

# 常数

elif word[:-1].isdigit():

word_line.append({word:-1})

#else:

#error_word.append(word)

# 字符是界符

if line[i] in delimiters:

word_line.append({line[i]:len(key_word)+delimiters.index(line[i])})

# 字符是运算符

elif line[i] in operator:

s = line[i] +line[i+1]

if s in operator:

word_line.append({s:len(key_word)+len(delimiters)+operator.index(s)})

i +=1

else:

word_line.append({line[i]:len(key_word)+len(delimiters)+operator.index(line[i])})

word = ''

i+=1

token.append(word_line)

6.根据单词返回是什么类型

按照保留字--界符--运算符--常数的顺序来当识别码。常数识别码是-1,标识符识别码是-2

def check(number):

hanzi = ''

q = len(key_word)

w = len(delimiters)

e = len(operator)

if 0

hanzi = '保留字'

elif q

hanzi = '界符'

elif q+w

hanzi = '运算符'

elif number == -1:

hanzi ='常数'

elif number == -2:

hanzi ='标识符'

return hanzi

7. 用thinker写一个简单的界面

导入

from tkinter import *

from tkinter.filedialog import askdirectory,askopenfilename

root = Tk()

root.title('词法分析')

root.resizable(0, 0)

path = StringVar()

Label(root,text = "目标路径:").grid(row = 0, column = 0)

Entry(root, textvariable = path).grid(row = 0, column = 1)

Button(root, text = "路径选择", command = openfiles).grid(row = 0, column = 2)

Button(root,text='词法分析',command= open_excel).grid(row = 0,column = 3)

root.mainloop()

打开文件

def openfiles():

fname = askopenfilename(title='打开文件', filetypes=[('All Files', '*')])

path.set(fname)

简单的界面

8.导入到excel表中

需要安装包xwings

pip install xwings

导入

import xlwings as xw

把token里的单词,按照 单词 ---- 识别码 ---类型 打印到excel表中

def open_excel():

# 预处理

row,col=0,0

if path.get()!='':

txt = java_analysis.filterResource(path.get(),new_file)

print(txt)

#扫描

java_analysis.Scan(txt)

app = xw.App(visible=True,add_book=False)

wb =app.books.open(sys.path[0]+'\\'+'test.xlsx')

sheet = wb.sheets.active

sheet.clear()

print(java_analysis.token)

for i in range(len(java_analysis.token)):

sheet[row,0].value = '第'+str(i+1)+'行'

row +=1

for word in java_analysis.token[i]:

for k,w in word.items():

sheet[row,3].value = k

sheet[row,5].value = w

sheet[row,7].value = java_analysis.check(w)

row +=1

sheet.autofit()#整个sheet自动调整

#wb.save()

最后就像这样

效果

代码很烂,不过也算是大致明白词法分析器了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

python写词法分析器_[宜配屋]听图阁相关推荐

  1. python 内推_[宜配屋]听图阁

    本文实例为大家分享了网易有道2017内推编程题:洗牌,供大家参考,具体内容如下 ''' [编程题] 洗牌 时间限制:1秒 空间限制:32768K 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程 ...

  2. python中控脚本_[宜配屋]听图阁

    由于考勤机与OA对接,OA会在每天定时取考勤机数据,但是需要考勤机是连接状态,所以搜索了下相关教程,写了个脚本自动连接.完全是个Python小白,代码烂,仅作为笔记. 理论上支持所有程序的每天自动开启 ...

  3. 怎么用python打印照片_[宜配屋]听图阁

    这篇文章主要介绍了Python如何使用字符打印照片,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1. 前言 第一次在学校机房里见到计算机,还是上古 ...

  4. python 判断节假日_[宜配屋]听图阁

    不废话,直接上代码Python3.6 签到代码,只需修改url,账号,密码即可,此处是登录时无验证登录,有验证码的自行补充 # -*- coding:utf-8 -*- import json imp ...

  5. python文件传输模块_[宜配屋]听图阁 - python 使用poster模块进行http方式的文件传输到服务器的方法...

    这几天帮内部人员做一个文件传输的小工具,要用http的方式,在用django搭建了个小框架之后,如何进行传输,特别是大文件的传输,成为主要问题.经过查资料,最后选择了通过poster这个模块来进行文件 ...

  6. python计算方位角_[宜配屋]听图阁

    知道两点坐标,怎么计算两点方向的方位角? 答:首先计算坐标增量dx,dy(两个对应坐标分量相减,终点的减始点的). 若dx,dy中有一个为零时,根据另一个的正负决定方位角(0,90,180,270这四 ...

  7. 用python画雨滴_[宜配屋]听图阁

    本文实例为大家分享了python实现雨滴下落到地面效果的具体代码,供大家参考,具体内容如下 本程序在Windows 64位操作系统下,安装的是Anaconda3-4.2.0 import numpy ...

  8. python 艺术照片滤镜_[宜配屋]听图阁 - Python实现PS滤镜Fish lens图像扭曲效果示例...

    本文实例讲述了Python实现PS滤镜Fish lens图像扭曲效果.分享给大家供大家参考,具体如下: 这里实现 PS 滤镜中的一种几何变换– Fish lens, 对图像做扭曲,感觉就像通过一个凸镜 ...

  9. python写抽奖转盘_[宜配屋]听图阁

    本文实例为大家分享了python实现转盘效果的具体代码,供大家参考,具体内容如下 #抽奖 面向对象版本 import tkinter import time import threading clas ...

最新文章

  1. 安装rpm的mysql_linux下安装rpm格式的mysql
  2. 视觉直观感受7种常用排序算法
  3. java hashmap 输出_JAVA如何把HashMap内容输出到文本文件
  4. $unit编译单元声明
  5. 到底谁应该对软件开发的质量负责?
  6. 处理之后的图像句柄传到显示框_PS基本原理,图像变换与变形操作,移动图像小技巧...
  7. erlang的运算符
  8. 北京大学Cousera学习笔记--7-计算导论与C语言基础--基本数据类型变量常量
  9. 如何彻底关闭windows10自动更新
  10. Mac OS 使用终端连接到Linux
  11. 分析Redis集群原理
  12. xmapp下mysql的密码更改
  13. PS基础入门(二、快速选择工具和魔棒的使用)
  14. 局域网联通公网小部分知识点
  15. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Incorrect database name ‘dongdong_1
  16. ajax怎么会突然出现401,当jquery ajax遇上401请求
  17. Win10环境下caffe安装与编译
  18. 怎样在word中批量替换文字?Word替换文字这一招你会吗?
  19. password MD5加密方法
  20. 洲际酒店集团发布全新奢华精选品牌Vignette Collection

热门文章

  1. 【无标题】fatal: refusing to merge unrelated histories
  2. 启航——三十而立四十不惑的程序员
  3. [渝粤教育] 西南科技大学 经济法学 在线考试复习资料
  4. 产品经理转行基础篇—方向选择的重要性
  5. 华为国际快递被转运至美国 联邦快递致歉:误送
  6. Spring Security是什么?(一)
  7. 2010级信管毕业生实习总结汇编版(共29份)
  8. sumproduct()学习
  9. Docker与k8s的恩怨情仇(二)—用最简单的技术实现“容器”
  10. 自己搭建网红直播带货平台源码该怎么做