2010-10-01 20 views
8

Tengo una pregunta de tarea de compilador que quiere que dibuje un DFA para los comentarios de Pascal, pero nunca (y probablemente nunca lo haré) uso Pascal. La pregunta no especifica si deberíamos usar ANSI Pascal o Turbo Pascal, así que iba a hacer uno para ambos.¿Se supone que los comentarios Pascal anidan?

Algunas búsquedas de Google me mostraron que Turbo Pascal permite comentarios anidados, siempre que el mismo delimitador no se utiliza, por lo {(*comment*)} está bien y lo que es (*{comment}*), pero {{comment}} o (*(*comment*)*) no están bien. Mi pregunta aquí es si un comentario como {(*{comment}*)} o (*{(*comment*)}*) está bien ya que los mismos delimitadores no se utilizan en una fila.

También busqué en Google para ver si ANSI Pascal permitió comentarios anidados, pero no he encontrado una respuesta definitiva. Si ANSI Pascal permite comentarios anidados, ¿cuáles son las reglas?

En una nota lateral, no me preocupa la extraña convención de comentarios de diferentes delimitadores de inicio y final, una convención que está permitida en ANSI Pascal.

ACTUALIZACIÓN:

me gustaría dejar claro que no estoy realmente preocupado con la forma compiladores específica tramitación de observaciones Pascal, estoy preocupado con la forma de un compilador DEBE tramitación de observaciones Pascal si ese compilador adherido 100 % a los estándares ANSI o TURBO Pascal.

+1

Esto parece una pregunta que usted debe preguntar a su instructor. Revisa tu libro de texto, también. –

+0

@Rob Kennedy, mi instructor y yo hablamos sobre esto antes de publicar la pregunta, y ya tengo el problema resuelto a su gusto. El libro no buscaba que profundizáramos en el tema, pero me gusta ser minucioso. Además, como indiqué en la pregunta, el libro no es específico sobre qué versión de Pascal se debe considerar, y dado que el libro es un libro de compilación y no un libro de Pascal, las convenciones de comentario del lenguaje no están explícitamente definidas, y eso es lo que estoy buscando en mi pregunta y definición explícita. – ubiquibacon

Respuesta

11

ISO 7185:1990 dice esto sobre los comentarios en § 6.1.8:

Cuando un comentario será cualquier secuencia de caracteres y separaciones de las líneas, que no contiene ni tampoco} *), el constructo

('{' | '(*') comentario ('*)' | '}')

será un comentario si ni el ni el {(* ocurre dentro de un personaje-s tring o dentro de un comentario.

NOTAS

  1. Un comentario puede así comenzará con { y terminan con *), o comenzará con (* y terminan con }.
  2. La secuencia (*) no puede aparecer en un comentario aunque la secuencia {) sí.

De acuerdo con eso, no hay esencialmente sólo un tipo de comentario. Aunque puede comenzar un comentario con { o (*, no puede usar diferentes conjuntos de caracteres para "ajustar" otros comentarios. Turbo Pascal, por otro lado, tiene dos tipos de comentarios, los que usan llaves y los que usan paréntesis.

Si usted tiene un comentario de estilo corsé y lo encierran en un comentario de estilo paréntesis para crear (*{}*), ISO dice el comentario es (*{} con *) de sobra, que será un error de sintaxis en el código, mientras que el Turbo Pascal dice el comentario es (*{}*) sin texto.

Ninguno de los dos estilos permite envolver un comentario ya incluido en otro conjunto de delimitadores de comentarios. Eso es porque una vez que envuelve un comentario, el comentario "interno" deja de tratarse como un comentario. Es solo texto ordinario. Si tiene {(**)} y desea envolverlo en un comentario al estilo de paréntesis para hacer (*{(**)}*), ISO y Turbo Pascal dicen que el comentario es (*{(**) con }*) sobrantes.

En los modos fpc y objfpc, Free Pascal admite comentarios anidados, por lo que mi ejemplo más reciente sería aceptado como un comentario válido sin texto sobrante. The FPC documentation on the matter en realidad no demuestra eso, sin embargo. Se da seis ejemplos de los comentarios supuestamente anidados:

 
{ Comment 1 (* comment 2 *) } 
(* Comment 1 { comment 2 } *) 
{ comment 1 // Comment 2 } 
(* comment 1 // Comment 2 *) 
// comment 1 (* comment 2 *) 
// comment 1 { comment 2 } 

Pero Turbo Pascal (o Delphi, para las dos últimas líneas), que ya hemos establecido no anidación de apoyo, aceptaría todo de esos como comentarios perfectamente válidos! FPC realmente admite comentarios anidados, pero esos ejemplos no lo ilustran. Estos son algunos ejemplos de comentarios anidados:

 
{ Comment 1 { comment 2 } } 
(* Comment 1 (* comment 2 *) *) 
{ Comment 1 (* comment 2 { comment 3 } *) } 

incluso yo diría que los ejemplos tercero y cuarto de FPC son en realidad contraejemplos a la afirmación de que es compatible con FPC comentarios anidados. Esas dos líneas no deben ser comentarios completos en absoluto. El // en el medio de la línea presenta un comentario que no finaliza hasta el final de la línea (EOL). El EOL viene después de} y *), por lo que el comentario interno de estilo barra no puede haber terminado antes de que lleguemos a los paréntesis o los delimitadores entre paréntesis. Del mismo modo que <a> <b> </a> </b> es un XML incorrectamente anidado, hemos anidado incorrectamente los comentarios: { // } EOL.

Después de más experimentación, concluyo que en FPC, solo comentarios del mismo tipo nido. Por ejemplo, una vez que abre un comentario con {, los caracteres (* dejan de ser especiales. FPC no abrirá un comentario al estilo de paréntesis dentro del comentario al estilo corsé.Si lo hiciera, entonces {(*} sería un error de sintaxis debido al comentario de paréntesis sin terminar. Podríamos explicar esto diciendo que la terminación de los comentarios internos es opcional cuando los comentarios son heterogéneos, pero es una explicación más simple decir que el comentario interno no se detecta como un comentario. Una vez que abre un comentario de tipo corsé, solo los corchetes tienen un significado. Además, // en realidad no inicia un comentario de estilo barra cuando está dentro de llaves. Esa es una explicación más simple que decir que FPC permite que los comentarios estilo barra estén anidados incorrectamente. Puede decir que los comentarios de estilo de barra no anidan en absoluto, o que los comentarios de estilo de barra anidados en otros comentarios de barra de corte comparten un único terminador de EOL.

Su tarea probablemente signifique que debe usar el estilo de Turbo Pascal, donde los delimitadores de comentarios deben coincidir. Definitivamente no esperaba que utilizara el estilo de Free Pascal, ya que hubiera imposibilitado completar la tarea: un DFA no puede aceptar construcciones anidadas arbitrariamente.

+2

Ahora que has resumido toda * * comentando, me gustaría añadir con respecto de la cuestión de que, en [1993] (http://en.wikipedia.org/wiki/Pascal_%28programming_language% 29 # Estándares) el estándar ANSI ha dejado de existir en nombre de la norma ISO. Mientras que TURBO, es [considerado] (http://pascal-central.com/extpascal.html#anchor-6) en lugar de Pascal no estándar. No estándar o no, parece que no hay una especificación publicada de él. –

+0

gracias por la respuesta muy descriptiva! Eso hizo las cosas mucho más claras. Una cosa, sin embargo, en la que dices "incluso diría que el FPC ..." Me pregunto si eso es correcto o no. Usaré su propio argumento contra usted que 'los delimitadores de comentarios difieren de las muñecas matryoshka en que cambian la interpretación de lo que hay dentro de ellos '. ¿El delimitador de comentario inicial del ejemplo 3 y 4 '" cambia la interpretación "' del comentario interno de doble barra '//'? – ubiquibacon

+0

@Sertac Akyuz buen descubrimiento sobre el estándar ANSI que ahora es el estándar ISO y sobre Turbo Pascal siendo un dialecto en lugar de un estándar. – ubiquibacon

2

Al menos Delphi no permitirá {(*{comment}*)} porque la primera llave de cierre cerrará la primera abrazadera de apertura y no la última. Lo mismo aplica a su otra muestra.

+0

FPC no tienen ningún problema con ninguno de los ejemplos, sino que también parece permitir anidar el mismo símbolo, es decir '{{comment}}'. Los [documentos] (http://www.freepascal.org/docs-html/ref/refse2.html) dicen que hay alguna dependencia del modo del compilador. –

+0

@Sertac Akyuz Probé varios comentarios en el editor de texto SciTE y me dice que '{{comment}}' no es válido. Sin embargo, no sé cuánto puedo confiar. Supongo que lo que es y lo que no está permitido todo se reduce al compilador de todos modos, pero me pregunto más sobre los estándares (TURBO y ANSI) en lugar de lo que un compilador específico permite o no. – ubiquibacon

+0

@typo - Muy bien. Si le gusta echar un vistazo a [Pascal ISO 7185: 1990] (http://www.moorecad.com/standardpascal/iso7185.pdf) estándar. Ese es el único documento oficial al que me refiero. –

0

Creo que en la versión de turbo pascal utilicé, comentarios anidados no eran compatibles, tanto de estos sería compilar:

{(* } 

{{ } 

Algunas búsquedas de Google me mostraron que Turbo Pascal permite comentarios anidados, siempre y cuando el mismo delimitador no se utiliza

Efectivamente, los comentarios anidados son "compatibles", porque la sintaxis alternativa es ignorada por el compilador.

Puede download a pascal compiler y escribir su dfa para admitir lo que ese compilador admite. Use uno de sus programas de ejemplo y vea si los comentarios anidados se compilarán.

+2

Creo que eso significa que los comentarios anidados * no * son compatibles. No puedes anidar comentarios; un comentario termina en el * primer * carácter de final de comentario, sin importar cuántos personajes comenzaran antes. –

+1

@Rob Kennedy No creo que sea 100% cierto para Turbo Pascal porque '{(* comment *)}' es válido y también lo es '(* {comment} *)'. El comentario INNER terminaría en su delimitador correspondiente en Turbo Pascal, y el comentario OUTER terminaría en su delimitador coincidente. Eso es porque Turbo Pascal NO permite comentarios hechos con delimitadores sin igual como '(* comment}' o '{comment *)'. – ubiquibacon

+1

Pero @Typoknig, eso no significa que los comentarios estén anidados. Dentro de un comentario, * todos * otros caracteres son ignorados. El hecho de que algunos de esos personajes parezcan los otros personajes de comentarios de Pascal es irrelevante. Una vez que tiene un comentario "externo", el comentario "interno" * deja de ser un comentario en absoluto *. Es solo texto claro allí. –

0

en FPC (Pascal libre): // ... (...) {...}

Cuestiones relacionadas