【发布时间】:2020-02-03 17:17:08
【问题描述】:
我想了解是否可以更改 Python 的语法,使复合语句的冒号在行尾时可选,除了空格和 cmets。例如:
if so()
print("yes")
else
print("no")
此更改会破坏现有的 Python 代码吗?会有模棱两可的结构吗?解析器在诊断某种错误方面会变得非常糟糕吗?会不会还有我现在想不到的问题?
当然,我知道冒号使代码更易于阅读的论点。我认为这是有争议的,但我绝对不想在这里讨论意见。我的问题是关于可能的技术问题。
根据syntax of compound statements in the documentation,suite 之前总是有一个":",其中suite 定义为
suite ::= stmt_list NEWLINE | NEWLINE INDENT statement+ DEDENT
以if语句为例
if_stmt ::= "if" expression ":" suite
("elif" expression ":" suite)*
["else" ":" suite]
语法显然可以这样修改:
suite ::= ":" stmt_list NEWLINE | [":"] NEWLINE INDENT statement+ DEDENT
if_stmt ::= "if" expression suite
("elif" expression suite)*
["else" suite]
在Grammar file of the CPython source code(也可用here)中,情况有些不同,并且在某些构造中冒号后面的可选type comment 有点复杂,但总而言之,在我看来它应该是可以像上面一样修改语法。
会有哪些技术障碍?
更新:对于suite,以下可能是对LL(1) 更友好的语法:
suite ::= colon_suite | indented_suite
colon_suite ::= ":" (stmt_list NEWLINE | indented_suite)
indented_suite ::= NEWLINE INDENT statement+ DEDENT
【问题讨论】:
-
立即想到的一件事,微不足道的单行词:
if so(): print("yes")解析器可能会尝试理解它,但它必须研究语义,而不仅仅是尝试理解条件:的左侧。是的,很抱歉有意见,但在那种情况下真的很难阅读。 :) -
@OndrejK。请再次阅读问题。在第一段中,我强调了你错过的部分。
-
我怀疑将
:移动到套件的定义中可能会影响语法作为 LL 语法的状态。 -
@chepner,我不这么认为,因为我认为“子句”后面的换行符不会有歧义。但我很高兴看到语法实际上存在问题。
-
非正式地,我认为您提出的
suite定义的问题在于,将:视为下一个标记不足以在stmt_list规则和statement+规则之间进行选择;至少还需要一个令牌,以查看它是NEWLINE还是最终可以开始small_stmt的令牌之一。
标签: python python-3.x syntax colon