python实现词法分析器
作者:追_梦_者 发布时间:2022-09-12 15:03:18
标签:python,词法分析器
简单Python词法分析器实现,供大家参考,具体内容如下
词法分析器状态转换图:
词法分析器总流程图:
预处理程序:
词法分析器:
词法分析器程序详细设计
详细代码实现:
#!/usr/bin/env python3.4
# coding=utf-8
import sys
import string
keywards = {}
# 关键字部分
keywards['False'] = 101
keywards['class'] = 102
keywards['finally'] = 103
keywards['is'] = 104
keywards['return'] = 105
keywards['None'] = 106
keywards['continue'] = 107
keywards['for'] = 108
keywards['lambda'] = 109
keywards['try'] = 110
keywards['True'] = 111
keywards['def'] = 112
keywards['from'] = 113
keywards['nonlocal'] = 114
keywards['while'] = 115
keywards['and'] = 116
keywards['del'] = 117
keywards['global'] = 118
keywards['not'] = 119
keywards['with'] = 120
keywards['as'] = 121
keywards['elif'] = 122
keywards['if'] = 123
keywards['or'] = 124
keywards['yield'] = 125
keywards['assert'] = 126
keywards['else'] = 127
keywards['import'] = 128
keywards['pass'] = 129
keywards['break'] = 130
keywards['except'] = 131
keywards['in'] = 132
keywards['raise'] = 133
# 符号
keywards['+'] = 201
keywards['-'] = 202
keywards['*'] = 203
keywards['/'] = 204
keywards['='] = 205
keywards[':'] = 206
keywards['<'] = 207
keywards['>'] = 208
keywards['%'] = 209
keywards['&'] = 210
keywards['!'] = 211
keywards['('] = 212
keywards[')'] = 213
keywards['['] = 214
keywards[']'] = 215
keywards['{'] = 216
keywards['}'] = 217
keywards['#'] = 218
keywards['|'] = 219
keywards[','] = 220
# 变量
# keywards['var'] = 301
# 常量
# keywards['const'] = 401
# Error
# keywards['const'] = 501
signlist = {}
# 预处理函数,将文件中的空格,换行等无关字符处理掉
def pretreatment(file_name):
try:
fp_read = open(file_name, 'r')
fp_write = open('file.tmp', 'w')
sign = 0
while True:
read = fp_read.readline()
if not read:
break
length = len(read)
i = -1
while i < length - 1:
i += 1
if sign == 0:
if read[i] == ' ':
continue
if read[i] == '#':
break
elif read[i] == ' ':
if sign == 1:
continue
else:
sign = 1
fp_write.write(' ')
elif read[i] == '\t':
if sign == 1:
continue
else:
sign = 1
fp_write.write(' ')
elif read[i] == '\n':
if sign == 1:
continue
else:
fp_write.write(' ')
sign = 1
elif read[i] == '"':
fp_write.write(read[i])
i += 1
while i < length and read[i] != '"':
fp_write.write(read[i])
i += 1
if i >= length:
break
fp_write.write(read[i])
elif read[i] == "'":
fp_write.write(read[i])
i += 1
while i < length and read[i] != "'":
fp_write.write(read[i])
i += 1
if i >= length:
break
fp_write.write(read[i])
else:
sign = 3
fp_write.write(read[i])
except Exception:
print(file_name, ': This FileName Not Found!')
def save(string):
if string in keywards.keys():
if string not in signlist.keys():
signlist[string] = keywards[string]
else:
try:
float(string)
save_const(string)
except ValueError:
save_var(string)
def save_var(string):
if string not in signlist.keys():
if len(string.strip()) < 1:
pass
else:
if is_signal(string) == 1:
signlist[string] = 301
else:
signlist[string] = 501
def save_const(string):
if string not in signlist.keys():
signlist[string] = 401
def save_error(string):
if string not in signlist.keys():
signlist[string] = 501
def is_signal(s):
if s[0] == '_' or s[0] in string.ascii_letters:
for i in s:
if i in string.ascii_letters or i == '_' or i in string.digits:
pass
else:
return 0
return 1
else:
return 0
def recognition(filename):
try:
fp_read = open(filename, 'r')
string = ""
sign = 0
while True:
read = fp_read.read(1)
if not read:
break
if read == ' ':
if len(string.strip()) < 1:
sign = 0
pass
else:
if sign == 1 or sign == 2:
string += read
else:
save(string)
string = ""
sign = 0
elif read == '(':
if sign == 1 or sign == 2:
string += read
else:
save(string)
string = ""
save('(')
elif read == ')':
if sign == 1 or sign == 2:
string += read
else:
save(string)
string = ""
save(')')
elif read == '[':
if sign == 1 or sign == 2:
string += read
else:
save(string)
string = ""
save('[')
elif read == ']':
if sign == 1 or sign == 2:
string += read
else:
save(string)
string = ""
save(']')
elif read == '{':
if sign == 1 or sign == 2:
string += read
else:
save(string)
string = ""
save('{')
elif read == '}':
if sign == 1 or sign == 2:
string += read
else:
save(string)
string = ""
save('}')
elif read == '<':
save(string)
string = ""
save('<')
elif read == '>':
save(string)
string = ""
save('>')
elif read == ',':
save(string)
string = ""
save(',')
elif read == "'":
string += read
if sign == 1:
sign = 0
save_const(string)
string = ""
else:
if sign != 2:
sign = 1
elif read == '"':
string += read
if sign == 2:
sign = 0
save_const(string)
string = ""
else:
if sign != 1:
sign = 2
elif read == ':':
if sign == 1 or sign == 2:
string += read
else:
save(string)
string = ""
save(':')
elif read == '+':
save(string)
string = ""
save('+')
elif read == '=':
save(string)
string = ""
save('=')
else:
string += read
except Exception as e:
print(e)
def main():
if len(sys.argv) < 2:
print("Please Input FileName")
else:
pretreatment(sys.argv[1])
recognition('file.tmp')
for i in signlist.keys():
print("(", signlist[i], ",", i, ")")
if __name__ == '__main__':
main()
来源:https://blog.csdn.net/IT_DREAM_ER/article/details/53485583


猜你喜欢
- 由于XML本身的诸多优点,XML技术已被广泛的使用,目前的好多软件技术同XML紧密相关,比如微软的.net 平台对xml提供了强大的支持,提
- 0x00:事先说明你已经攻陷了对方主机且获得了最高权限。对方的本地防火墙会丢弃所有的外来数据包。这个后门不会仅绑定在某一个端口上。这段代码很
- JavaScript 中的并没有提供像 VBScript 里的 DateAdd 方法用于日
- K近邻算法(或简称kNN)是易于理解和实现的算法,而且是你解决问题的强大工具。什么是kNNkNN算法的模型就是整个训练数据集。当需要对一个未
- 1、网页在加载时,页面代码中的js文件引用(如下)都会向服务器产生http请求,因为在body.onload事件之前加载的文件(这里我称之为
- 人工神经网络的许多算法已在智能信息处理系统中获得广泛采用,尤为突出是是以下4种算法:ART网络、LVQ网络、Kohonen网络Hopfiel
- 在web开发中常常要使用js,为了提高效率一般都会制作js的类文件。这样在使用中更新复用都很方便。下面按照我工作中的一个案例,介绍如何定义j
- 这篇文章主要介绍了Python中join()函数多种操作代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 最近经常需要出一些临时性的报表,于是就用python 的smtplib 和email 两模块写了个小程序,当数据处理完后通过邮箱把报表文件从
- 1.创建xml字段在表xmlTest内创建一个字段,命名_x,设置数据类型为xml。2.写入xmlinsert into xmlTest (
- keras模型可视化:model:model = Sequential()# input: 100x100 images with 3 ch
- qqbot 是一个用 python 实现的、基于腾讯 SmartQQ 协议的 QQ 机器人框架,可运行在 Linux 、 Windows 和
- 在良好的数据库设计基础上,能有效地使用索引是SQL Server取得高性能的基础,SQL Server采用基于代价的优化模型,它对每一个提交
- re.findall()方法及re.compile()re.findall()在字符串中找到正则表达式所匹配的所有子串,并返回一个列表;如果
- Pandas 中的resample函数用于各种频率的转换工作。resample的参数如下:参数描述freq转换频率axis=0重采样的轴cl
- Mysql自连接1、在日常对数据库的操作中,我们很熟悉使用INNER JOIN,LEFT JOIN 把一个表和另外一个表连接起来,潜意识里会
- 利用python,可以实现填充网页表单,从而自动登录WEB门户。(注意:以下内容只针对python3)环境准备:(1)安装python (2
- 前言写 Python 的经常要写一些命令行工具,虽然标准库提供有命令行解析工具 Argparse,但是写起来非常麻烦,我很少会使用它。命令行
- CSS Type set是一款在线字体调整工具。你可以使用它来对字型进行排版调整并实时的看到CSS代码。在下图中,其中,你可以设置文本的字体
- 如何做一个自己的QQ?这不是什么新鲜的东西,看看代码:refresh.htm<HTML><HEAD><titl