python实现词法分析
#请先安装Ply
# -*- coding: utf-8 -*-
#--------------------------------------------------------------------------
#Author:Jmdebugger
#email: pengkailb@gmail.com
#date: 2013-9-17
#--------------------------------------------------------------------------
import ply.lex as lex tokens = [
"TOKEN_IDENT",
"TOKEN_INT",
"TOKEN_FLOAT",
"TOKEN_STRING",
"TOKEN_OP",
"TOKEN_DELIM_COMMA", #,
"TOKEN_DELIM_OPEN_PAREN", #(
"TOKEN_DELIM_CLOSE_PAREN", #)
"TOKEN_DELIM_OPEN_BRACKET", #[
"TOKEN_DELIM_CLOSE_BRACKET",#]
"TOKEN_DELIM_OPEN_BRACE", #{
"TOKEN_DELIM_CLOSE_BRACE", #}
"TOKEN_DELIM_SEMICOLON" #; ] reserved = {
'if' : 'TOKEN_RSRVD_IF',
'else' : 'TOKEN_RSRVD_ELSE',
'true' : 'TOKEN_RSRVD_TRUE',
'false' : 'TOKEN_RSRVD_FALSE',
'while' : 'TOKEN_RSRVD_WHILE',
'break' : 'TOKEN_RSRVD_BREAK',
'continue': 'TOKEN_RSRVD_CONTINUE',
'goto' : 'TOKEN_RSRVD_GOTO',
'func' : 'TOKEN_RSRVD_FUNC',
'var' : 'TOKEN_RSRVD_VAR',
'for' : 'TOKEN_RSRVD_FOR',
'return' : 'TOKEN_RSRVD_RETURN'
} tokens += reserved .values() t_ignore = r' \t\r'
def t_COMMENT(t):
r'(/\*(.|\n)*?\*/)|(\/\/.*)'
pass def t_newline(t):
r'\n+'
t.lexer.lineno += len(t.value) def t_error(t):
print "LaunchScript error: "+repr(t.value) def t_TOKEN_IDENT(t):
r'[a-zA-Z_][a-zA-Z_0-9]*' #标识符
t.type = reserved.get(t.value , 'TOKEN_IDENT')
return t def t_TOKEN_INT(t):
r'(0x[a-fA-F0-9]+)|([0-9]+)'
return t t_TOKEN_FLOAT = r'[0-9]*\.[0-9]+'
t_TOKEN_STRING = r'(\"([^\\\r]|(\\.))*?\")' #|(\"([^\\\n]|(\\.))*?\")' only for windows
t_TOKEN_DELIM_COMMA = r'\,'
t_TOKEN_DELIM_OPEN_PAREN = r'\('
t_TOKEN_DELIM_CLOSE_PAREN = r'\)'
t_TOKEN_DELIM_OPEN_BRACKET = r'\['
t_TOKEN_DELIM_CLOSE_BRACKET = r'\]'
t_TOKEN_DELIM_OPEN_BRACE = r'\{'
t_TOKEN_DELIM_CLOSE_BRACE = r'\}'
t_TOKEN_DELIM_SEMICOLON = r'\;' def t_TOKEN_OP(t):
r'(\<\<\=)|(\>\>\=)|([\+\-\*\/\%\&\|\^\=\!\>\<]\=)|(\|\|)|(\&\&)|(\+\+)|(\-\-)|[\+\-\*\/\%\^\=\&\|\>\<\!\~]'
return t if __name__ == "__main__":
lexer = lex.lex()
f = open("./test.txt" , 'rb')
data = f.read()
f.close()
lexer.input(data) while True:
tok = lexer.token()
if not tok: break # No more input
print tok.value+"\t---->\t"+tok.type
python实现词法分析的更多相关文章
- Python源代码目录组织结构
- [py]python的继承体系-源码目录结构
python3安装目录 pip install virtualenv pip install virtualenvwrapper pip install virtualenvwrapper-win m ...
- Python 之父撰文回忆:为什么要创造 pgen 解析器?
花下猫语: 近日,Python 之父在 Medium 上开通了博客,并发布了一篇关于 PEG 解析器的文章(参见我翻的 全文译文).据我所知,他有自己的博客,为什么还会跑去 Medium 上写文呢?好 ...
- python代码是如何执行的?
解释运行程序 回忆上次内容 py 文件的程序是按照顺序 一行行挨排解释执行的 我们可以 python3 -m pdb hello.py 来对程序调试 调试的目的是去除 bug 别害怕 bug bu ...
- python成长之路【第十六篇】:JavaScript的高级知识---词法分析
一.词法分析方法 js运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数说明 二.具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active O ...
- python开发编译器
引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ...
- Python自然语言处理工具小结
Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...
- Python之路3【第一篇】Python基础
本节内容 Python简介 Python安装 第一个Python程序 编程语言的分类 Python简介 1.Python的由来 python的创始人为吉多·范罗苏姆(Guido van Rossum) ...
- Python Day02
Python 代码执行流程: 编译 --> 执行 源代码 --> 字节码 --> 机器码 --> CPU执行 python 先将自己的源代码,编译成Python 字节 ...
随机推荐
- java设计模式--结构型模式--享元模式
享元模式 概述 运用共享技术有效地支持大量细粒度的对象. 适用性 当都具备下列情况时,使用Flyweight模式: 1.一个应用程序使用了大量的对象. 2.完全由于使用大量的对象,造成很大的存储开销. ...
- back_insert_iterator和iterator用起来不一样。
先看代码: #include<iostream> #include<vector> #include<algorithm> #include<iterator ...
- nodejs学习笔记之包、模块实现
简单了解了node的安装和一些基本的常识之后,今天学习了node中很重要的包和模块的一些知识点. 首先学习一下包的规范,它由包结构和包描述两部分组成.包结构用于组织包的各种文件,包 ...
- hdu 1429 胜利大逃亡(续)(bfs+状态压缩)
Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带 ...
- Direct3D 顶点缓存
今天我们来学习下Direct3D的顶点和顶点缓存,首先我们需要在场景中绘制一些物体,物体都是由多个三角形组成,每一个三角形由三个顶点组成,我们来看下面一个NPC的模型 左图:正常的模型 ...
- Android应用程序注册广播接收器(registerReceiver)的过程分析
前 面我们介绍了Android系统的广播机制,从本质来说,它是一种消息订阅/发布机制,因此,使用这种消息驱动模型的第一步便是订阅消息:而对 Android应用程序来说,订阅消息其实就是注册广播接收器, ...
- boost::asio译文
Christopher Kohlhoff Copyright © 2003-2012 Christopher M. Kohlhoff 以Boost1.0的软件授权进行发布(见附带的LICENS ...
- [Spring入门学习笔记][maven]
什么是maven? 我的理解: 一个项目有一大堆依赖包的时候,没必要下下来,可以利用maven中的pom.xml 指定需要那些依赖包,让maven去本地中央库(如果没找到)->网上仓库库帮你调用 ...
- stm32之通用定时器TIM
STM32系列的CPU,有多达8个定时器: 1.其中TMI1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动:它们的时钟有APB2的输出产生: 2.其它6个为普通定时器,时钟由 ...
- 自由缩放属性-resize(禁止textarea的自由缩放尺寸功能)
resize:none|both|horizontal|vertical|inherit 可以用来改变元素的尺寸大小 用上这个属性后元素的有下脚会有一个小图标 拖它就可以了 但是我把resize:bo ...