2012-06-25 54 views
0

我需要逐行解析python代码。代码:python中的python代码解析器

ast.parse("""if True: 
print 'Yes' """) 

返回AST对象,但此行不:

ast.parse("if True:") 

有没有方法来解析,不知怎的? (除了RE文本解析)

我需要这由线的Python代码用户交互式输入之后修改Python代码,线。

+2

您只能解析一个完整的有效python语句或表达式。 '如果为真:'不完整:如果你试图解析它,你会得到一个语法错误。 –

回答

0

我觉得这里的唯一方法是正则表达式。

后的Python代码用户交互式输入。

好像Python代码实际上只是文本对象,而不是Python代码...

为什么正则表达式不适合你吗?

+0

对不起,这么晚的回复,我没有从SO的电子邮件通知(BTW,它应该是默认的)。正则表达式没问题,只是重新发明了轮子。我必须通过regex重新分析所有的python表达式。 –

3

只能解析一个完整有效的Python语句或表达。 if True:是不完整的:如果你试图解析它,你会得到一个语法错误。

解决的办法是首先确定,如果你有一个完整的陈述或表达;如果你不这样做,缓冲行并继续阅读新行,直到遇到语法错误或完整表达式。然后在你的缓冲输入上使用ast。

compile_command函数可以区分可能不完整而不正确的代码字符串。如果代码看起来不完整,则返回None;否则它会返回一个代码对象(如果有效)或引发一个SyntaxError

我们可以使用这个功能来确定是否缓冲或解析线。未经测试的代码如下:

linebuffer = [] 
while True: 
    line = raw_input() 
    linebuffer.append(line) 
    try: 
     compiled = code.compile_command(''.join(linebuffer)) 
    except SyntaxError: 
     linebuffer = [] 
    else: 
     if compiled is not None: 
      tree = ast.parse(''.join(linebuffer)) 
      linebuffer = [] 
+0

谢谢弗朗西斯。你的解决方案很好,只是不适合我的软件。我需要实时地逐行解析。就程序设计语言来说,“如果是真的:”是不正确的,但是就人们理解而言是这样。 –

+0

你要求的是不可能的。你不能得到语法错误的抽象语法树,并且“如果为真:'本身就是一个语法错误。也许你应该退后一步并重申你的更广泛的问题,因为你不能一行一行,只能按语句声明或逐个表达式,并且很难想象你想要什么样的AST操作做一行一行! –

+0

那么,他可以得到的是一个解析器,它希望阅读更多的内容(正如来自其词法分析器的ReadLine调用所证明的),但尚未发布投诉。这实际上是“逐行解析”。它甚至会读取第一行,而不是抱怨,读取第二行,并检查它。他不能轻易地这样做是额外的语义检查;可能会出现一个函数调用与具有5个参数的函数一致的行,但是检查指定的函数是否存在,更不用说接受5个参数了,更不用说会接受参数的类型了吗? –