python实现词法分析器


Posted in Python onJanuary 31, 2019

简单Python词法分析器实现,供大家参考,具体内容如下

词法分析器状态转换图:

python实现词法分析器

词法分析器总流程图:

python实现词法分析器

预处理程序:

python实现词法分析器

词法分析器:

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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python执行get提交的方法
Apr 29 Python
CentOS6.5设置Django开发环境
Oct 13 Python
python 创建弹出式菜单的实现代码
Jul 11 Python
Python实现的科学计算器功能示例
Aug 04 Python
利用pandas读取中文数据集的方法
Jul 25 Python
Python 获取命令行参数内容及参数个数的实例
Dec 20 Python
python装饰器的特性原理详解
Dec 25 Python
python3中的logging记录日志实现过程及封装成类的操作
May 12 Python
简单介绍一下pyinstaller打包以及安全性的实现
Jun 02 Python
opencv 实现特定颜色线条提取与定位操作
Jun 02 Python
Python爬虫爬取博客实现可视化过程解析
Jun 29 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
Feb 07 Python
使用Python 统计高频字数的方法
Jan 31 #Python
python3正则提取字符串里的中文实例
Jan 31 #Python
python统计中文字符数量的两种方法
Jan 31 #Python
解决python写入带有中文的字符到文件错误的问题
Jan 31 #Python
在Python中居然可以定义两个同名通参数的函数
Jan 31 #Python
Python的条件表达式和lambda表达式实例
Jan 31 #Python
OpenCV+Python识别车牌和字符分割的实现
Jan 31 #Python
You might like
PHP中使用mktime获取时间戳的一个黑色幽默分析
2012/05/31 PHP
解析WordPress中的post_class与get_post_class函数
2016/01/04 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
PHP实现简单计算器小程序
2020/08/28 PHP
了解jQuery技巧来提高你的代码
2010/01/08 Javascript
前端开发部分总结[兼容性、DOM操作、跨域等](持续更新)
2010/03/04 Javascript
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
使用按钮控制以何种方式打开新窗口的属性介绍
2012/12/17 Javascript
js 跳出页面的frameset框架示例介绍
2013/12/23 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
跟我学习javascript解决异步编程异常方案
2015/11/23 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
详解react使用react-bootstrap当轮子造车
2017/08/15 Javascript
使用InstantClick.js让页面提前加载200ms
2017/09/12 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
javascript如何使用函数random来实现课堂随机点名方法详解
2020/07/28 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
Python异常处理总结
2014/08/15 Python
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
Python实用技巧之利用元组代替字典并为元组元素命名
2018/07/11 Python
基于matplotlib xticks用法详解
2020/04/16 Python
django自带的权限管理Permission用法说明
2020/05/13 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
整个世界的设计师家具在哈恩:Designathome
2019/03/25 全球购物
荷兰最大的鞋子、服装和运动折扣店:Bristol
2021/01/07 全球购物
会计专业应届生求职信
2013/11/24 职场文书
工作中个人的自我评价
2013/12/31 职场文书
走群众路线剖析材料
2014/10/09 职场文书
2015员工年度考核评语
2015/03/25 职场文书
交通事故调解协议书
2015/05/20 职场文书
2015年大学生暑期实习报告
2015/07/13 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
小学生节约用水倡议书
2019/08/12 职场文书