我正在编写一个Python解析器来学习Flex和Bison,并试图找出为什么只有第一个程序是有效的Python。
a.py
:
\
# This is valid Python
不会产生错误。
b.py
:
产生此错误:
File "b.py", line 1
\
^
IndentationError: unexpected indent
和c.py
:
if True:
pass
\
# This is not valid Python
产生此错误:
File "c.py", line 4
# This is not valid Python
^
SyntaxError: invalid syntax
我在linux2(Ubuntu10.04)上使用的是Python2.6.5(r265:790632010年4月16日,13:09:56)[gcc4.4.3];但是,testing on ideone.com表明在Python3上的行为是相同的。
这是一个细节。在
下面是几种不同的实现如何响应您的代码:
我对Python语言参考的Exlplicit Line Joining部分的理解是,这三个示例都可以视为有效:
如果CPython被更改为接受这三个示例都是有效的,我怀疑它的用户会注意到它,改变语言的字符,或者破坏任何代码。在
\
可以加入,EOL,EOF所以这是有效的
但在这里
^{pr2}$在
\
之后,解析器正在查找不存在的缩进行。在史蒂文的话很贴切,但仍然不能直接解释这种情况。在
我认为关键的一点是,行延续字符使Python将一行视为而不仅仅是空白。在
a.py
:它似乎把第一行当作空白。它是而不是;一旦到达行延续字符,它和换行符都将被删除,因此,由于该行上没有其他内容,因此它不存在于解析目的——您只需要一行带有注释的行。注意:jython2.5.2基本上和预期的一样;有效的Python代码应该在后面的一行中出现。b.py
:永远不要将其添加到注释中,一旦行的连续字符到达,并且该行不再只是空白,缩进就变成一个错误。c.py
:注释又是不相关的,任何空格和/或下一行的注释都会出现相同的错误。您需要将实际的Python代码放在行继续符的后面。相关问题 更多 >
编程相关推荐