我需要逐行解析python代码。代码:python中的python代码解析器
ast.parse("""if True:
print 'Yes' """)
返回AST对象,但此行不:
ast.parse("if True:")
有没有方法来解析,不知怎的? (除了RE文本解析)
我需要这由线的Python代码用户交互式输入之后修改Python代码,线。
我需要逐行解析python代码。代码:python中的python代码解析器
ast.parse("""if True:
print 'Yes' """)
返回AST对象,但此行不:
ast.parse("if True:")
有没有方法来解析,不知怎的? (除了RE文本解析)
我需要这由线的Python代码用户交互式输入之后修改Python代码,线。
我觉得这里的唯一方法是正则表达式。
后的Python代码用户交互式输入。
好像Python代码实际上只是文本对象,而不是Python代码...
为什么正则表达式不适合你吗?
对不起,这么晚的回复,我没有从SO的电子邮件通知(BTW,它应该是默认的)。正则表达式没问题,只是重新发明了轮子。我必须通过regex重新分析所有的python表达式。 –
只能解析一个完整有效的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 = []
谢谢弗朗西斯。你的解决方案很好,只是不适合我的软件。我需要实时地逐行解析。就程序设计语言来说,“如果是真的:”是不正确的,但是就人们理解而言是这样。 –
你要求的是不可能的。你不能得到语法错误的抽象语法树,并且“如果为真:'本身就是一个语法错误。也许你应该退后一步并重申你的更广泛的问题,因为你不能一行一行,只能按语句声明或逐个表达式,并且很难想象你想要什么样的AST操作做一行一行! –
那么,他可以得到的是一个解析器,它希望阅读更多的内容(正如来自其词法分析器的ReadLine调用所证明的),但尚未发布投诉。这实际上是“逐行解析”。它甚至会读取第一行,而不是抱怨,读取第二行,并检查它。他不能轻易地这样做是额外的语义检查;可能会出现一个函数调用与具有5个参数的函数一致的行,但是检查指定的函数是否存在,更不用说接受5个参数了,更不用说会接受参数的类型了吗? –
您只能解析一个完整的有效python语句或表达式。 '如果为真:'不完整:如果你试图解析它,你会得到一个语法错误。 –