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声明早些时候,它显然并不需要的情况发生,所以我会说这是一个实现细节。