Python 以什么顺序查找语法错误?

Nic*_*ley 14 python syntax parsing syntax-error python-3.x

致力于为学生创建语法调试练习。我们有以下例子。

def five():
    print('five')
return 5

def hello();
   print('hello')
Run Code Online (Sandbox Code Playgroud)

但是在运行文件时,语法错误是

def hello();
           ^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

我已经看遍了,但无法弄清楚为什么编译器 [原文如此] 不抱怨函数外部的 return 关键字,而是首先找到它下面的分号错误。

Python以什么顺序检查文件语法?这是规范的一部分还是实现定义?

che*_*ner 14

涉及(至少)两个阶段:首先,根据语法规则解析令牌流以生成解析树。一个return说法是金flow_stmt规则,其本身并不局限于一个内部使用def的语句。有一个裸语句不是解析错误return。一些从语法中选择的相关规则:

single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE
file_input: (NEWLINE | stmt)* ENDMARKER
stmt: simple_stmt | compound_stmt

simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt |
         import_stmt | global_stmt | nonlocal_stmt | assert_stmt)
flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt
return_stmt: 'return' [testlist_star_expr]
Run Code Online (Sandbox Code Playgroud)

下一阶段涉及将解析树转换为语法树。此时,在return语句之外查找def语句会产生语法错误。


;另一方面,A不是的定义的一部分funcdef,因此;:构建解析树时代替预期会立即触发错误。

funcdef: 'def' NAME parameters ['->' test] ':' [TYPE_COMMENT] func_body_suite
Run Code Online (Sandbox Code Playgroud)

虽然它可能是可能的报告裸return声明早些时候,它显然并不需要的情况发生,所以我会说这是一个实现细节。

  • 非常感谢你,这完全有道理。 (3认同)