在Python中使用Ply进行词法语法分析.docVIP

  • 55
  • 0
  • 约6.21千字
  • 约 10页
  • 2017-12-12 发布于河南
  • 举报
在Python中使用Ply进行词法语法分析

在Python中使用Ply进行词法语法分析 关键词:Python Lex Yacc Ply 词法分析 语法分析。 摘 要:本文描述了如何在Pyhont中使用Ply进行词法分析和语法分析。 缩略语清单: 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。 /ply/ 下载之后解压缩,然后运行里面的setup.py,如下: python setup.py install 那么PLY就安装到你的Python安装目录下,我们可以开始使用PLY了。 词法分析 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() def startlex(): s = 100*(3+5/2) while True: token = lex.token() if not token: break print token if __name__==__main__: startlex() PLY利用了Python的自省机制(introspection)。上面的代码中首先定义了tuple类型变量tokens,其元素是各个记号的名字。然后下面就是各个记号的正则表达式规则定义,有两种方式来定义。一是通过t_tokenname的形式来定义字符串,另一种就是t_tokenname的形式来定义函数。一般情况下,如果记号不作为语法分析的输入(比如注释),或者要求对记号属性做一些变化,那么就采用函数的形式来定义正则表达式;其他情况下采用字符串来定义。采用函数定义的时候,函数的documeng string,就是记号的正则表达式,比如上面例子中的t_NUMBER。 函数具有固定的形式: def t_TOKENNAME( t ) 如果该记号不作为语法分析的输入,那么就不要返回任何值(例如t_newline)。否则,必须返回t(例如t_NUMBER)。其中t是一个LexToken类型的对象。 和Flex类似,PLY也对记号进行排序,按照优先级对字符串进行解析。以函数形式定义的记号,先定义的具有更高的优先级;以字符串形式定义的记号,正则表达式更长的,具有更高的优先级。例如,等号“=”和逻辑相等“==”。后者的优先级就比较高,当输入流中出现两个连续的等号的时候,PLY会取

文档评论(0)

1亿VIP精品文档

相关文档