Python синтаксис: могут ли двоеточия быть необязательными в конце строки? - PullRequest
2 голосов
/ 03 февраля 2020

Я хотел бы понять, можно ли изменить синтаксис Python, сделав необязательные двоеточия составных операторов , когда они находятся в конце строки , кроме пробелов и комментариев. Например:

if so()
    print("yes")
else
    print("no")

Будет ли это изменение нарушать существующий Python код? Будут ли неоднозначные конструкции? Станет ли парсер чрезвычайно плохим в диагностике какой-либо ошибки? Будет ли еще одна проблема, о которой я не могу думать сейчас?

Конечно, я знаю аргумент, что двоеточие облегчает чтение кода. Я думаю, что это спорно, но я абсолютно не хочу обсуждать мнения здесь. Мой вопрос о возможных технических проблемах.

В соответствии с синтаксисом составных операторов в документации перед 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]

В Файл грамматики исходного кода CPython (также доступен здесь ) немного отличается и немного усложняется необязательным комментарием типа после двоеточие в некоторых конструкциях, но в целом мне кажется, что можно изменить синтаксис аналогично приведенному выше.

Какие технические препятствия будут иметь место?


Обновление: ниже может быть более LL (1) -дружественный синтаксис для suite:

suite ::=  colon_suite | indented_suite
colon_suite ::=  ":" (stmt_list NEWLINE | indented_suite)
indented_suite ::=  NEWLINE INDENT statement+ DEDENT

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Если оставить в стороне технические детали, грамматика определенно не станет двусмысленной: все, что вы делаете, это интерполируете : в конце любой строки (перед любым комментарием), где это позволяет избежать синтаксической ошибки (поэтому не после * 1002). *, где это было бы необходимо, но не достаточно). В частности, ни одно введение набора не может быть расширено на несколько строк, за исключением обратной косой черты или символов в скобках (например, нельзя писать for и in или except и as, например, на отдельных логических строках) .

Единственными очевидными кандидатами на нарушение диагноза c будет путаница с троичным условным или генеративным выражением, но оно очень слабое из-за выражения перед if / for (и скобок для последнего). Вероятно, не будет никаких технических препятствий вообще.

0 голосов
/ 04 февраля 2020

Поскольку условные операторы python разделены отступами, то:: будет служить избыточным токеном, когда блок выполнения выражен в новой строке с более глубоким отступом.

Я не уверен, как кто-то сказал, работает ли это для операторов той же строки, где вам нужен токен, чтобы отделить условие от операторов выполнения

...