2016-12-13 2 views
0

Вот документально contents:В чем разница между правилами EBNF между «starred_list» и «starred_expression»?

starred_list  ::= starred_item ("," starred_item)* [","]    
starred_expression ::= expression | (starred_item ",")* [starred_item] 

Я не могу сказать, разница между ними, не так ли эквивалентные правила?

+0

. .. Нет, потому что 'starred_list' production не включает' expression' напрямую ... –

+0

Пока 'starred_item :: = выражение | "*" or_expr' предоставляет 'выражение' для' starred_list'. –

+0

Но он не обрабатывает дополнительную запятую. –

ответ

1

Приведенная грамматика не идентична собственно грамматике (хотя каждый надеется, что они имеют одинаковый эффект); вы можете увидеть грамматику, фактически используемую для генерации парсера 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) "}" 
+0

@wowyoo: Как я уже сказал в своем ответе, они синтаксически идентичны, но имеют смысловую разницу. Вот что говорит первое предложение второго абзаца. – rici

+0

Мне нужно больше времени изучать документацию. Спасибо за вашу помощь. –

+0

Если кто-то может заменить другое синтаксически, зачем нам нужно два? Одно правило достаточно. –

Смежные вопросы