Приведенная грамматика не идентична собственно грамматике (хотя каждый надеется, что они имеют одинаковый эффект); вы можете увидеть грамматику, фактически используемую для генерации парсера CPython в Chapter 10 справочного руководства. Две грамматики не отличаются исключительно именами нетерминалов, поэтому не совсем очевидно, какие производные коды кода соответствуют указанным правилам.
В широком смысле разница между цитируемыми двумя постановками семантическая, а не синтаксическая; обе постановки дают точно такой же набор действительных предложений. Семантическая разница заключается в обработке одного нестационарного выражения без конечной запятой; первая альтернатива:
starred_expression ::= expression | (starred_item ",")* [starred_item]
Было бы также можно вывести expresion
из второй альтернативы, путем сопоставления нулевых повторений (starred_item ",")
, а затем одну starred_item
, используя первую альтернативу starred_item
. Тем не менее, по-видимому, избыточное чередование задается, потому что две альтернативы имеют различную семантику:
(x)
является простым выражением в скобках, в то время как
(x ,)
является одним элементом кортеж. Это различие необходимо только в том случае, если список выражений окружен скобками; если он окружен скобками или фигурными скобками, между этими двумя случаями нет семантического различия: [ x ]
семантически идентичен [ x , ]
и аналогично { x }
и { x , }
. Это отражено в грамматике; в производстве, которые могли бы производить либо выражение в скобках или кортеж, starred_expression
используется:
parenth_form ::= "(" [starred_expression] ")"
В других литералов синтаксисов, мы видим starred_list
, который не включает в себя избыточную альтернативу:
list_display ::= "[" [starred_list | comprehension] "]"
set_display ::= "{" (starred_list | comprehension) "}"
. .. Нет, потому что 'starred_list' production не включает' expression' напрямую ... –
Пока 'starred_item :: = выражение | "*" or_expr' предоставляет 'выражение' для' starred_list'. –
Но он не обрабатывает дополнительную запятую. –