¿Cómo se expresan los comentarios en las gramáticas del lenguaje de programación?

8

Estoy aprendiendo cómo construir analizadores usando gramáticas, pero me quedé atrapado tratando de expresar comentarios, porque pueden aparecer en casi cualquier lugar.

Esto indica que los comentarios se pueden quitar de la secuencia de tokens antes de que se realice el análisis.

¿Es esa la práctica estándar, o los comentarios se especifican alguna vez en las gramáticas?


fuente
"Pueden aparecer casi en todas partes" es algo exagerado. Hay bastantes idiomas que solo permiten comentarios entre declaraciones.
MSalters
1
Como ejemplo de un lenguaje que NO elimina los comentarios antes de analizar, vea TCL: los comentarios son parte de la gramática y si los coloca en el lugar equivocado, puede esperar que el analizador le grite.
Michael Kohne
@Michael Sin embargo, no puedo encontrar una gramática para TCL: esta página parece indicar que no hay una estática.
1
@MattFenwick - buena salsa. No sabía que era tan maleable. Según lo que eso dice, no se puede tener una gramática TCL, no tiene sentido. No tenía idea, perdón por la falsa pista.
Michael Kohne

Respuestas:

2

Es muy común tratarlo como una forma de espacio en blanco. De la misma manera que las nuevas líneas en lenguajes de punto y coma como C.

Una vez que se trata de algún tipo de espacio en blanco, con frecuencia simplemente lo ignora más arriba en el analizador.


fuente
17

Por lo general no lo son.

El lexer los elimina cuando el código fuente se transforma de caracteres a tokens.

Luego, el analizador obtendrá tokens y creará un AST. Cuando el analizador hace su trabajo, los comentarios ya no están, por lo que no tienen que aparecer en la gramática.

deadalnix
fuente
5

Respuesta corta rápida

Sí, es la práctica estándar, detectar comentarios en el "lexer" o el "analizador"

A veces, el "analizador" tiene un "lexer" incorporado o se mezcla con el "analizador" como una herramienta única ("analizador-lexer").

Respuesta Extendida

Solo estoy trabajando en ese caso.

La mayoría de los "escáneres" (también conocidos como "tokenizadores" o "lexers") detectan comentarios, pero se eliminan al devolver los tokens al "analizador".

A veces, un lenguaje de programación utiliza algunos comentarios con un significado especial, como "directivas del compilador" o "documentación".

Ejemplo de comentario estándar:

/*
 This function does something cool.
*/
int doSomething()
{
  return 0;
}

Ejemplo de comentario directivo:

/*
 ##override
*/
int doSomething()
{
  return 0;
}

Comentario para el generador de documentación Ejemplo:

/*
 @description: This Function text will be turn,
  into an external pdf file, togheter with other
  similar comments.
*/
int doSomething()
{
  return 0;
}

La mayoría de las herramientas relacionadas con el compilador detectan estos comentarios especiales, con un analizador o un preprocesador, que no es el principal lezxer o analizador, e incluso tiene un pequeño lexer propio.

Salud.

umlcat
fuente
0

Algunos analizadores que retienen comentarios y / o entradas ilegales en el AST los agregan como propiedades a todos los nodos del AST.

Podrías echar un vistazo al proyecto de Microsoft Roslyn que hace eso si recuerdo correctamente.

Patricio
fuente