0

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

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

返回 AST 对象,但此行不是:

ast.parse("if True:")

有没有办法以某种方式解析它?(使用 RE 进行文本解析除外)

我需要这个来修改python代码,在用户交互式输入python代码后逐行修改。

4

2 回答 2

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 = []
于 2012-06-25T15:04:20.870 回答
0

我认为这里唯一的方法是正则表达式。

在用户交互输入 python 代码之后。

看起来您的 python 代码实际上只是文本对象,而不是 python 代码......

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

于 2012-06-25T14:45:08.117 回答