##language:zh #pragma section-numbers off ##含有章节索引导航的 ZPyUG 文章通用模板 <> ## 默许导航,请保留 <> ##startInc = php2python第一弹:词法分析 = {{{ 阿暖 sender-time Sent at 18:22 (GMT+08:00). Current time there: 6:54 PM. ✆ reply-to python-cn@googlegroups.com to python-cn@googlegroups.com date Mon, Apr 12, 2010 at 18:22 }}} subject [CPyUG] php2python第一弹:还是自己写个语法分析器吧 * python在国内还是太小众,好多国内的api都没有python的封装,如果能把php的资源直接转换过来就能用,那就方便多了,所以要写这个php2python 语法分析器我第一个想到是antlr 因为GAE用的就是antlr 而且添加到他的第三方库里 ,python之父也对antlr赞不绝口,更重要的是java有一个php2java的项目用的就是antlr.果然很方便就找到一个antlr解析php的语法文件. * 但是可能是版本的问题我用了一下并不成功,接下来读文档,发现python的antlr文档少得可怜,而且官方的python文档就明确指出antlr对python的支持时间还很短,如果发现bug请不要感到意外. 大汗,转用[[http://www.dabeaz.com/ply/|PLY]](Python Lex Yacc)一个纯python的Lex Yacc. 找了个例子,发现特好用,一目了然,但是语法细节还是要读文档.这就是通用语法分析器不爽的地方. * 作为一个pythoner,能不能自己写一个语法分析器呢? * `能!` * 不仅能而且很简单 用一个正则就搞得定 * 语法你可以根据自己的习惯.爱怎么写就怎么写,像我只想写一个文本到文本的解析器ply好多东西是用不到的 == 四则运算的解析器 == 这就是我写的一个四则运算的解析器(用以前学数据结构做的练习改的) {{{#!python #coding:utf-8 def parser(s): #词法分析 token=[ r'\d+',#数值 r'[\(\)\+\-\*\/]',#运算符 ] import re rule="((?:"+")|(?:".join(token)+"))" rule=re.compile(rule) #语法分析 op=['(']#运算符栈 value=[]#数值栈 d={ '+':1, '-':1, '*':2, '/':2, '(':0, }#运算符优先级 def _calc(): l=value.pop() r=eval(value.pop()+op.pop()+l) value.append(str(r)) def _right_par(): if op[-1]=='(': op.pop() return else: _calc() _right_par() def _parser(m): i=m.group(1) if i in '+-*/': if d[op[-1]]>d[i] :_calc() op.append(i) elif i=='(': op.append(i) elif i==')': _right_par() else: value.append(i) rule.sub(_parser,s) _right_par() return value[0] while 1: try: s = raw_input('calc > ') except EOFError: break print parser(s) }}} ##endInc ---- '''反馈''' 创建 by -- ZoomQuiet [<>]