parsing - ¿Busca una definición clara de lo que son "tokenizer", "parser" y "léxers" y cómo se relacionan entre sí y se utilizan?
lexer (4)
( agregando a las respuestas dadas )
- Tokenizer también eliminará cualquier comentario y solo devolverá tokens al Lexer.
- Lexer también definirá ámbitos para esos tokens (variables / funciones)
- Parser luego construirá la estructura del código / programa
Estoy buscando una definición clara de lo que son "tokenizer", "parser" y "lexer" y cómo se relacionan entre sí (por ejemplo, ¿un analizador usa un tokenizer o viceversa)? Necesito crear un programa que vaya a través de archivos fuente c / h para extraer la declaración de datos y las definiciones.
He estado buscando ejemplos y puedo encontrar algo de información, pero realmente lucho por comprender los conceptos subyacentes, como las reglas de gramática, los árboles de análisis sintáctico y el árbol sintáctico abstracto, y cómo se relacionan entre sí. Eventualmente, estos conceptos deben almacenarse en un programa real, pero 1) cómo se ven, 2) hay implementaciones comunes.
He estado buscando en Wikipedia sobre estos temas y programas como Lex y Yacc, pero nunca habiendo pasado por una clase de compilación (EE major) me resulta difícil entender completamente lo que está sucediendo.
Ejemplo:
int x = 1;
Un lexer o tokeniser lo dividirá en tokens ''int'', ''x'', ''='', ''1'', '';''.
Un analizador tomará esos tokens y los usará para entenderlos de alguna manera:
- tenemos una declaración
- es una definición de un entero
- el número entero se llama ''x''
- ''x'' debe inicializarse con el valor 1
Un tokenizador divide una secuencia de texto en tokens, generalmente buscando espacios en blanco (pestañas, espacios, nuevas líneas).
Un lexer es básicamente un tokenizador, pero generalmente adjunta contexto adicional a los tokens: este token es un número, ese token es un literal de cadena, este otro token es un operador de igualdad.
Un analizador toma la secuencia de tokens del lexer y la convierte en un árbol de sintaxis abstracta que representa el programa (generalmente) representado por el texto original.
La última vez que revisé, el mejor libro sobre el tema fue "Compiladores: Principios, técnicas y herramientas", generalmente conocido como "El libro del dragón".
Yo diría que un lexer y un tokenizer son básicamente lo mismo, y que destrozan el texto en sus partes componentes (los ''tokens''). El analizador luego interpreta los tokens usando una gramática.
Sin embargo, no me obsesionaría demasiado con el uso terminológico preciso: las personas a menudo usan ''análisis sintácticos'' para describir cualquier acción de interpretar un trozo de texto.