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 utiliza 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 información, pero realmente me cuesta entender los conceptos subyacentes como las reglas gramaticales, los árboles de análisis y el árbol de sintaxis abstracta y cómo se interrelacionan entre sí. Finalmente, 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 he asistido a una clase de compilador (EE mayor). Me resulta difícil entender completamente lo que está sucediendo.
Ejemplo:
Un lexer o tokeniser lo dividirá en tokens 'int', 'x', '=', '1', ';'.
Un analizador tomará esos tokens y los usará para comprender de alguna manera:
fuente
Diría que un lexer y un tokenizer son básicamente lo mismo, y que rompen el texto en sus partes componentes (los 'tokens'). El analizador 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' para describir cualquier acción de interpretación de un fragmento de texto.
fuente
( agregando a las respuestas dadas )
fuente