¿Busca una definición clara de lo que son “tokenizer”, “parser” y “léxers” y cómo se relacionan entre sí y se utilizan?

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 progtwig que vaya a través de archivos fuente c / h para extraer la statement 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 progtwig real, pero 1) cómo se ven, 2) hay implementaciones comunes.

He estado buscando en Wikipedia sobre estos temas y progtwigs como Lex y Yacc, pero nunca habiendo pasado por una clase de comstackción (EE major) me resulta difícil entender completamente lo que está sucediendo.

Un tokenizador divide una secuencia de texto en tokens, generalmente buscando espacios en blanco (tabs, 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 syntax abstracta que representa el progtwig (generalmente) representado por el texto original.

La última vez que revisé, el mejor libro sobre el tema fue “Comstackdores: Principios, técnicas y herramientas”, generalmente conocido como “El libro del dragón”.

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 statement
  • es una definición de un entero
  • el número entero se llama ‘x’
  • ‘x’ debe inicializarse con el valor 1

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.

( 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 / progtwig