在Python中使用Ply进行词法语法分析
关键词:。
摘 要:
缩略语清单:
1 PLY简介
PLY是Python Lex-Yacc的缩写。是用来在Python语言中中进行Lex、Yacc词法分析和语法分
析的工具,它本身也完全采用Python写成。在功能上与流行的Flex和Bison相比存在一些欠缺,但
是其非常的简单易用。下面我们就简单的介绍PLY的背景安装和使用。
Python具有良好的可扩展性,我们如果要使用Python语言来进行相关的词法语法分析,可以
使用Flex以及Bison工具、以及C语言创建Python模块,然后在Python中使用。这种做法能够极大
的发挥Flex以及Bison的强大功能,而且运行效率勿庸置疑。但是不够简单直观。 PLY的出现,使
得我们可以直接在Python语言中进行词法语法分析,并且非常方便。
首先得安装Python解释器,我这里安装的是ActivePython 2.3.2。然后到下面的网站下载PLY
的安装程序,当前版本是1.5。
http://systems.cs.uchicago.edu/ply/
下载之后解压缩,然后运行里面的setup.py,如下:
python setup.py install
那么PLY就安装到你的Python安装目录下,我们可以开始使用PLY了。
2 词法分析
PLY进行词法分析的原理和Flex相似,但是在实现上有很大的不同。下面用一个计算表达式的
例子来说明。下面的代码分析数学表达式,里面可以有圆括号,+-×/和=等赋值运算,整数,变
量名等。
import lex
tokens = (
'NAME','NUMBER',
'PLUS','MINUS','TIMES','DIVIDE','EQUALS',
'LPAREN','RPAREN',
)
#Tokens的正则表达式定义
t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
t_DIVIDE = r'/'
t_EQUALS = r'='
t_LPAREN = r'\('
t_RPAREN = r'\)'
t_NAME = r'[a-zA-Z_][a-zA-Z0-9_]*'
def t_NUMBER(t):
r'\d+'
try:
t.value = int(t.value)
except ValueError:
print "Integer value too large", t.value
t.value = 0
return t
t_ignore = " \t"
def t_newline(t):
r'\n+'
t.lineno += t.value.count("\n")
def t_error(t):
print "Illegal character '%s'" % t.value[0]
t.skip(1)
# Build the lexer
lex.lex()