История запятой в грамматиках языка программирования - PullRequest
17 голосов
/ 22 февраля 2010

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

В качестве примера ниже приведена совершенно легальная инициализация массива в Java ( Инициализаторы массивов JLS 10.6 ):

int[] a = { 1, 2, 3, };

Мне любопытно, если кто-нибудь знает, какой язык был первым, чтобы разрешить запятые, такие как эти. Видимо, у С это было еще в 1985 .

Кроме того, если кто-нибудь знает другие грамматические "особенности" современных языков программирования, мне было бы очень интересно услышать и о них. Я читал, что Perl и Python, например, еще более либеральны в разрешении запятых в других частях их грамматики.

Ответы [ 4 ]

4 голосов
/ 22 февраля 2010

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

В более поздних языках, подобных Паскалю (C, Modula-2, Ada и т. Д.), Были написаны стандарты, позволяющие принимать нечетную лишнюю точку с запятой, не ведя себя так, как если бы вы просто писали в смеси тортов.

4 голосов
/ 22 февраля 2010

Я только что узнал, что компилятор g77 Fortran имеет флаг -fugly-comma Ugly Null Arguments , хотя он немного другой (и, как следует из названия, довольно уродливо).

Опция -fugly-comma позволяет использовать одну конечную запятую для обозначения «передать дополнительный завершающий нулевой аргумент» в списке фактических аргументов внешней процедуре, а также использовать пустой список аргументов для такой процедуры, чтобы обозначать «Передать один нулевой аргумент».

Например, CALL FOO(,) означает «передать два нулевых аргумента», а не «передать один нулевой аргумент». Также CALL BAR() означает «передать один нулевой аргумент».

Я не уверен, на какой версии языка это впервые появилось.

2 голосов
/ 23 февраля 2010

Что меня всегда раздражало в C, так это то, что хотя он допускает дополнительную запятую в списке intializer , он не допускает дополнительную запятую в запятой перечислитель список (для определения литералов типа перечисления). Это небольшое несоответствие укусило меня в задницу больше раз, чем я хочу признаться. И без причины!

2 голосов
/ 23 февраля 2010

[Кто-нибудь знает] другие грамматические "особенности" современных языков программирования?

Один из моих любимых, Modula-3 , был разработан в 1990 году с благословения Никлауса Вирта как последнего тогда языка в «семье Паскаля». Кто-нибудь еще помнит эти ужасные бои о том, где точка с запятой должна быть разделителем или терминатором ? В Modula-3 выбор за вами! EBNF для последовательности утверждений

stmt ::= BEGIN [stmt {; stmt} [;]] END

Аналогично, при написании альтернатив в выражении CASE, Modula-3 позволяет использовать вертикальную черту | в качестве разделителя или префикса. Чтобы вы могли написать

CASE c OF
| 'a', 'e', 'i', 'o', 'u' => RETURN Char.Vowel
| 'y' => RETURN Char.Semivowel
ELSE RETURN Char.Consonant
END

или вы можете оставить начальный бар, возможно, потому что вы предпочитаете писать OF в этой позиции.

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


P.S. Objective Caml позволяет разрешительное использование | в выражениях падежа, тогда как более ранний и тесно связанный диалект Standard ML не допускает. В результате в стандартном коде ML выражения регистра часто бывают ужаснее.


EDIT : Увидев ответ TED, я проверил грамматику Modula-2 и он правильный, Modula-2 также поддерживает точку с запятой в качестве терминатора, но через устройство пустого оператора, что делает такие вещи, как

x := x + 1;;;;;; RETURN x

юридическое. Я полагаю, это не плохо. Однако Modula-2 не позволила гибко использовать разделитель корпуса |; Похоже, что это произошло от Modula-3.

...