2010-02-22 5 views
17

Muchos lenguajes de programación permiten comas en su gramática siguiendo el último elemento de una lista. Supuestamente, esto se hizo para simplificar la generación automática de código, lo que es comprensible.Historial de coma que se arrastra en las gramáticas del lenguaje de programación

A modo de ejemplo, la siguiente es una inicialización de la matriz perfectamente legal en Java (JLS 10.6 Array Initializers):

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

Tengo curiosidad por si alguien sabe qué idioma fue el primero en permitir que se arrastra comas como estos. Aparentemente C lo tenía as far back as 1985.

Además, si alguien conoce otras "peculiaridades" de la gramática de los lenguajes de programación modernos, estaría muy interesado en escuchar acerca de eso también. Leí que Perl y Python, por ejemplo, son aún más liberales al permitir comas finales en otras partes de su gramática.

+0

Si mal no recuerdo, cuando aprendí C del K & R original (pre-ANSI) en 1983, se permitieron las comillas finales. Esto fue intencional para permitir una generación automática de código más sencilla (por herramientas como YACC). – Ralph

+0

También ayuda cuando (como en una definición de 'enum') cada elemento está en su propia línea: agregar un nuevo valor al final es simplemente una línea adicional (que no requiere un cambio de la penúltima línea), evitando potencialmente una dependencia en/por cualquier cambio a la penúltima línea. – jhfrontz

Respuesta

4

yo no soy un experto en las comas, pero sé que Pascal estándar era muy persnickity sobre puntos y comas siendo comunicado separadores, no terminadores. Eso significaba que tenías que tener mucho cuidado con dónde colocar uno si no querías que te gritara el compilador.

Más tarde, los lenguajes de Pascal-esque (C, Modula-2, Ada, etc.) tenían sus estándares escritos para aceptar el punto y coma adicional sin comportarse como si hubieras orinado en la mezcla de tortas.

+1

Hablando de punto y coma, me interesaría ver un gráfico sobre la frecuencia de uso de punto y coma en la historia humana. Según Wikipedia, el primer uso general es en 1591. Sospecho que hay un salto en su uso con cada nuevo lenguaje de programación de estilo de brazalete inventado. Probablemente también haya un bache cuando la gente se dé cuenta de que puede usarlo para guiñar a las personas ';)' – polygenelubricants

+6

En serio; No creo que haya alterado la frecuencia con que los uso; –

+0

Es interesante observar que en BASIC, el colon se usa mucho más a menudo que el punto y coma, y ​​que en el Commodore Vic-20 y derivados (C64, C128, etc.) la fila del medio termina con J, K, L, colon (en lugar de J, K, L, punto y coma). – supercat

4

Acabo de descubrir que un compilador Fortran g77 tiene la bandera -fugly-commaUgly Null Arguments, aunque es un poco diferente (y como su nombre lo indica, bastante feo).

La opción -fugly-comma permite el uso de una sola coma final para significar “pasar una detrás de argumento nulo extra” en una lista de argumentos reales a un procedimiento externo, y el uso de una lista vacía de argumentos a un procedimiento de este tipo de significa "pasar un solo argumento nulo".

Por ejemplo, CALL FOO(,) significa "pasar dos argumentos nulos", en lugar de "pasar un argumento nulo". Además, CALL BAR() significa "pasar un argumento nulo".

no estoy seguro de qué versión del lenguaje de esta apareció por primera vez en el, sin embargo.

+0

EEEwwwwww. Asqueroso. –

+10

Es esa option-type-f: feo-coma, o es solo "coma fugly". Realmente quiero creer que es lo último. –

2

[¿Alguien sabe] otra gramática "peculiaridades" de los lenguajes de programación modernos?

Uno de mis favoritos, Modula-3, fue diseñado en 1990 con la bendición de Niklaus Wirth como el entonces reciente idioma en la "familia Pascal". ¿Alguien más recuerda esas horribles peleas sobre dónde el punto y coma debería ser un separador o un terminador? ¡En Modula-3, la elección es tuya! La EBNF para una secuencia de instrucciones es

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

Del mismo modo, al escribir las alternativas en un comunicado CASE, Modula-3 le permiten usar la barra vertical   | ya sea como un separador o un prefijo.Así se podría escribir

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

o se puede dejar fuera de la barra inicial, tal vez porque prefiere escribir OF en esa posición.

Creo que lo que me gustó tanto como el diseño en sí fue la conciencia de los diseñadores de que había una guerra religiosa y su persistencia en encontrar una manera de apoyar a ambas partes. ¡Deje que el programador elija!


P.S. El objetivo de Caml permite el uso permisivo de | en expresiones de casos, mientras que el dialecto ML anterior y estrechamente relacionado no lo hace. Como resultado, las expresiones de casos a menudo son más feas en el código ML estándar.


EDITAR: Después de ver la respuesta de TED he comprobado la gramática Modula-2 y que es correcta, Modula-2 y coma también apoyado como terminador, pero a través del dispositivo de la sentencia vacía, lo que hace cosas por el estilo

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

legal. Supongo que eso no es malo. Modula-2 no permitió el uso flexible del separador de caja |, sin embargo; que parece haberse originado con Modula-3.

+0

Correcto. Esa es también la manera en que C solucionó el problema, creo. La solución de Ada está más cerca de Modula-3, por lo que esa cosa de punto y coma feo no sería legal. Si desea una "declaración vacía" por alguna razón extraña en Ada, debe decir 'nulo;' –

+0

Usar el punto y coma como una declaración vacía no es legal en el clásico Modula-2 de Wirth, se agregó en el Modula-2 ISO después mucho debate, no todos estaban contentos con eso.Modula-2 R10 se adhiere al enfoque de Wirth pero agrega un procedimiento ficticio incorporado llamado TODO que toma un carácter literal como argumento que se imprime como una advertencia de tiempo de compilación en el modo DEPURAR, o un error en el modo de compilación de producción. – trijezdci

2

Algo que siempre me ha irritaba sobre C es que aunque permite una coma final extra en una lista intializer, lo hace no permiten una coma final extra en un empadronador lista (para la definición de los literales de un tipo de enumeración). Esta pequeña inconsistencia me ha mordido en el culo más veces de lo que me gustaría admitir. ¡Y sin ninguna razón!

+1

Creo que estás atrasado en eso. Creo que la razón era que la presencia de un elemento adicional al final de una definición enumerativa no afectará nada (a menos que su nombre colisione con otro identificador), mientras que agregar un elemento adicional al final de un inicializador podría afectar el tamaño de la matriz asignada. – supercat

Cuestiones relacionadas