我想了解一下,除了空格和注释之外,是否有可能改变Python的语法,使复合语句的冒号成为可选的。例如:
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
撇开前瞻性的技术问题不谈,语法肯定不会变得模棱两可:您所做的只是在任何行的末尾(在任何注释之前)插入一个
:
,这样做可以避免语法错误(因此不是在lambda
之后,在这里需要插入一个,但这是不够的)。特别是,除了使用反斜杠或括号内的字符(例如,不能在单独的逻辑行上写入for
和in
,或except
和as
),任何套件介绍都不能扩展到多行受损诊断的唯一明显候选是与三元条件表达式或生成器表达式混淆,但由于
if
/for
之前的表达式(以及后者的括号),这种混淆非常弱。可能根本不会有任何技术障碍由于python条件语句是由缩进分隔的,因此当执行块在新行中以更深的缩进表示时,:将用作冗余标记
我不确定这是否适用于同一行语句,您需要一个令牌来将条件与执行语句分开
相关问题 更多 >
编程相关推荐