Python抽象语法:检测语法错误''

时间:2013-08-22 20:03:34

标签: python python-3.x abstract-syntax-tree

是否可以通过一次迭代检测多个python语法错误?

Python文件,包含2个语法错误 test.py

print 'hello'
test =-
b = 1 + 1
test =+
print 'world'

此代码仅获取第2行的第一个语法错误,而不是第4行的错误:

import parser
parser.suite(open('test.py').read())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<string>", line 2
    test =-

如何检测* .py文件的所有语法错误?(不仅是第一个)

谢谢!

4 个答案:

答案 0 :(得分:1)

不,你不能,因为在一次语法错误之后,代码结构的其余部分不再可恢复。

以缺少的括号为例;是一个缺少的括号,还是一个逗号?函数是否在下一行调用表达式的部分错误,是否?如果缺少逗号,则下一行可能缺少括号。如果缺少括号,则下一行可能会有一个括号太多。这是两个非常不同的语法错误依赖以前的语法错误。

一个地方的语法错误使代码的其余部分无效,继续解析没有意义,至少不需要生成有效字节码的Python。

您可以使用Python linter;许多可以与您选择的文本编辑器集成。 Python IDE或linter不必生成字节码,并且可以更灵活地处理语法错误(继续检查后续行),并且可以告诉您其他问题,例如丢失或未使用的导入和变量。

答案 1 :(得分:0)

通过pylintpychecker 标记可能会出现多个问题,但更正其中任何一个可能会对以后的问题产生重大影响 - BTW 定期运行代码中的一个或两个 高度

答案 2 :(得分:0)

尝试pyflakes

sudo pip install pyflakes

我的test.py只是:

a
a

pychecker test.py输出:

test.py:1: undefined name 'a'
test.py:2: undefined name 'a'

我不保证这是完美的。它可能会像C / C ++那样陷入困境并继续抛出错误的错误,但任何工具都是如此。

答案 3 :(得分:0)

考虑

'+func(1,2

可能只有一种语法错误:

'+func(1,2'

或者可能有2个语法错误:一个parethesis和一个引号:

''+func(1,2)

由于有很多方法可以修复SyntaxErrors,因此没有规范方法可以识别所有语法错误。