- 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 lextokens = ( 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 tt_ignore = \tdef 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 lexerlex.lex()def startlex(): s = 100*(3+5/2) while True: token = lex.token() if not token: break print tokenif __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会取
您可能关注的文档
最近下载
- 2025年新疆维吾尔自治区中考英语真题含答案.pdf VIP
- 第31课 中国特色社会主义新时代和全面建成小康社会(二)(课件)-【中职专用】《中国历史》.pptx VIP
- 八大特殊作业危险告知牌全套.docx VIP
- 二年级下国学计划及教案 .pdf VIP
- 南昌大学《物理化学》2018-2019学年期末试卷.pdf VIP
- (统编2026新教材)二年级道法下册第1课《身心健康很重要》课件.pptx
- 涉诈风险账户审查表51.pdf VIP
- 第31课 中国特色社会主义新时代和全面建成小康社会(二)(配套教案)-【中职专用】《中国历史》.docx VIP
- 深度解析(2026)《GB 16423-2020金属非金属矿山安全规程》.pptx VIP
- 新人教版数学五年级下册全册课本练习题精编可编辑可打印.doc VIP
原创力文档

文档评论(0)