parsing - python3 - grun antlr
¿Diferencia práctica entre las reglas del analizador y las reglas del lexer en ANTLR? (2)
Jen escribió :
... ¿cuáles son las diferencias prácticas entre estas dos afirmaciones en ANTLR ...
MY_RULE
se utilizará para tokenizar su fuente de entrada. Representa un bloque de construcción fundamental de su idioma.
my_rule
se llama desde el analizador, consta de cero o más reglas o tokens de otro analizador producidos por el lexer.
Esa es la diferencia.
Jen escribió :
¿Resultan en diferentes árboles AST? Diferente rendimiento? ...
El analizador construye el AST utilizando tokens producidos por el lexer, por lo que las preguntas no tienen sentido (para mí). Un lexer simplemente "alimenta" al analizador con un flujo de tokens de una dimensión.
Entiendo la teoría detrás de la separación de las reglas del analizador y las reglas del lexer en teoría, pero cuáles son las diferencias prácticas entre estas dos afirmaciones en ANTLR:
my_rule: ... ;
MY_RULE: ... ;
¿Resultan en diferentes árboles AST? Diferente rendimiento? ¿Posibles ambigüedades?
Esta publicación puede ser útil:
El lexer es responsable del primer paso, y el único trabajo es crear una "secuencia de token" a partir del texto. No es responsable de comprender la semántica de su idioma, solo está interesado en comprender la sintaxis de su idioma.
Por ejemplo, la sintaxis es la regla de que un identificador solo debe usar caracteres, números y guiones bajos, siempre que no comience con un número. La responsabilidad del lexer es entender esta regla. En este caso, el lexer aceptaría la secuencia de caracteres "asd_123" pero rechazaría los caracteres "12dsadsa" (suponiendo que no hay otra regla en la que este texto sea válido). Al ver el ejemplo de texto válido, puede emitir un token en la secuencia del token como IDENTIFICADOR (asd_123).
Tenga en cuenta que dije "identificador", que es el término general para cosas como nombres de variables, nombres de funciones, nombres de espacios de nombres, etc. El analizador sería lo que entendería el contexto en el que aparece ese identificador, para que luego especifique más esa ficha como el nombre de una cosa determinada.
(Nota: el token es solo un nombre único dado a un elemento de la secuencia del token. El lexema es el texto con el que se hizo coincidir el token. Escribo el lexema entre paréntesis junto al token. Por ejemplo, NUMBER (123). En este caso, este es un token de NÚMERO con un lexema de ''123''. Sin embargo, con algunos tokens, tales como operadores, omito el lexeme ya que es redundante. Por ejemplo, escribiría SEMICOLON para el token de punto y coma, no SEMICOLON ( ;)).
De ANTLR: ¿CUÁNDO UTILIZAR LAS REGLAS DE PARSER VERSUS A LAS REGLAS DE LEXER?