Contenido del curso
Construcción del lexer o tokenizador
- 3

Análisis Léxico: Construcción de un Léxer para Intérpretes
05:35 min - 4

Definición de Tokens en Lenguaje de Programación Platzi
11:53 min - 5

Desarrollo de un Lexer con Test-Driven Development
15:42 min - 6

Pruebas de Operadores, Delimitadores y Fin de Archivo en Lexer Python
10:01 min - 7

Lexer: Identificación de Keywords y Tokens Complejos
18:57 min - 8

Reconocimiento de Funciones en Lexer de Lenguaje de Programación
07:46 min - 9

Implementación de Operadores y Condicionales en Lexer de Platzi
12:38 min - 10

Implementación de Operadores de Dos Caracteres en Lexer
12:07 min - 11

Creación de un REPL en Python para Lenguaje de Programación
12:35 min
Construcción del parser o analizador sintáctico
- 12

Construcción de un Parser para el Lenguaje Platzi
05:22 min - 13

Definición de Nodos Abstractos para Árbol de Sintaxis (AST) en Python
09:14 min - 14

Desarrollo de un AST en Python: Creación de la Clase Programa
12:48 min - 15

Parseo de Let Statements en Lenguaje Platzi
20:21 min - 16

Implementación de funciones advanced y expected tokens
08:26 min - 17

Manejo de Errores en Parsers con Test Driven Development
11:06 min - 18

Parseo de Return Statements en Lenguaje Platzi
12:42 min - 19

Técnicas de Parsing: Top-Down y Bottom-Up
01:46 min - 20

Pruebas de AST para Let y Return Statements en Parsers
12:05 min - 21

Pratt Parsing: Implementación y Registro de Funciones en Python
11:47 min - 22

Parseo de Identificadores en Lenguajes de Programación
13:29 min - 23

Parseo de Expression Statements en Platzi Parser
16:33 min - 24

Parseo de Enteros en Lenguaje Platzi
14:03 min - 25

Implementación de Operadores Prefijo en Parsers
16:43 min - 26

Operadores InFix en Expresiones: Implementación y Pruebas
10:40 min - 27

Implementación de Operadores InFix en un Parser
20:20 min - 28

Expresiones Booleanas en el Lenguaje de Programación Platzi
13:00 min - 29

Evaluación de Precedencia y Testeo de Booleanos en Parsers
Viendo ahora - 30

Evaluación de Expresiones Agrupadas en un Parser
10:16 min - 31

Parseo de Condicionales en Lenguaje Platzi
13:50 min - 32

Implementación de Condicionales en Parser de Lenguaje
12:05 min - 33

Parsing de Funciones en Lenguaje Platzi: Creación de Nodos AST
15:51 min - 34

Construcción de nodos de función en un parser AST
15:43 min - 35

Llamadas a Funciones en Lenguajes de Programación
13:05 min - 36

Implementación de llamadas a funciones en un parser con AST
12:21 min - 37

Parseo de Expresiones en LET y RETURN Statements
07:58 min - 38

Implementación de REPL para Árbol de Sintaxis Abstracta
08:59 min
Evaluación o análisis semántico
- 39

Evaluación Semántica en Lenguajes de Programación
03:42 min - 40

Estrategias de Evaluación en Lenguajes de Programación
09:18 min - 41

Representación de Nodos AST y Objetos en Python
14:17 min - 42

Evaluación de Expresiones en JavaScript y Python
19:39 min - 43

Implementación del Patrón Singleton para Booleanos y Nulos
11:52 min - 44

Evaluación de Prefijos en Lenguaje de Programación Platzi
14:41 min - 45

Evaluación de Expresiones Infix en Lenguaje Platzi
18:07 min - 46

Evaluación de Condicionales en Lenguaje de Programación Platzi
13:50 min - 47

Evaluación y Uso del Return Statement en Programación
14:41 min - 48

Manejo de Errores Semánticos en Lenguaje Platzi
21:04 min - 49

Declaración y Gestión de Variables en Lenguajes de Programación
13:55 min - 50

Manejo de Ambientes y Variables en Lenguajes de Programación
11:56 min - 51

Declaración de Funciones en Lenguaje de Programación Platzi
12:26 min - 52

Implementación de Llamadas a Funciones en PlatziLang
23:55 min
Mejora del intérprete
Siguientes pasos
Evaluación de Precedencia y Testeo de Booleanos en Parsers
Resumen
Dominar las precedencias de operadores y ampliar la cobertura de tests con booleanos son dos pasos fundamentales para construir un parser robusto. Aquí se desglosan los retos planteados para que puedas poner a prueba tu comprensión del AST, el orden de evaluación y la forma en que los nodos se agrupan internamente.
¿Por qué importa la precedencia de operadores en el parser?
La precedencia determina el orden en que el parser agrupa las expresiones dentro del AST [0:10]. Si la precedencia no es correcta, cuando llegues al evaluador los resultados serán erróneos porque las ramas del árbol estarán mal organizadas.
Para verificar esto se crea un test llamado test_operator_precedence que utiliza una lista de tuplas con tres elementos [1:14]:
- El programa inicial como string de entrada.
- El resultado esperado, que muestra cómo se agrupan las operaciones con paréntesis.
- Un entero que indica cuántos statements debe contener el programa.
¿Cómo se aplica PEMDAS en los tests?
El concepto de PEMDAS (el orden de evaluación matemática: paréntesis, exponentes, multiplicación, división, adición y sustracción) es central en estos tests [2:08]. Algunos ejemplos concretos:
-A * B: primero se aplica el operador de prefijo negativo aA, y luego se multiplica porB. Resultado esperado:((-A) * B).!-A: primero se vuelve negativoAporque tiene mayor precedencia, y después se aplica la negación lógica. Resultado:(!(- A)).A + B / C: se evalúa primeroB / Cy después se sumaA. Resultado:(A + (B / C))[2:16].
Si sumaras A + B antes de dividir entre C, estarías violando PEMDAS y obtendrías un resultado incorrecto.
¿Cómo se prueban múltiples statements?
Un programa puede contener varios statements separados por punto y coma [3:10]. Por ejemplo, 3 + 4; -5 * 5 genera dos statements independientes, cada uno con su propia precedencia interna. Al convertir el programa en string, los paréntesis reflejan exactamente el orden de evaluación.
El loop del test desempaqueta cada tupla en source, expected y cantidad de statements, ejecuta el setup con el lexer y el parser, y finalmente compara el resultado con lo esperado [3:22].
El primer reto consiste en inventar al menos diez tests adicionales con expresiones variadas: operadores aritméticos, booleanos, operadores de comparación y cualquier combinación que se te ocurra [4:24].
¿Cómo incorporar booleanos a los tests existentes?
Ahora que el parser ya sabe manejar nodos booleanos, es momento de extender tres tests [4:48]:
- Test de expresiones prefijo (
test_prefix_expressions): hasta ahora solo se evaluaban valores como5y-15. El reto es añadir casos como!verdaderoo!falso, ajustando la cantidad de statements y los valores esperados [5:02]. - Test de expresiones infijo (
test_infix_expressions): se pueden agregar comparaciones booleanas comoverdadero == verdaderoofalso != verdadero[5:20]. - Preparar tests para la fase de evaluación: cuando llegues al evaluador, estos booleanos también deberán funcionar correctamente [5:36].
¿Qué papel juegan los tests en la calidad del parser?
No existe una única forma correcta de escribir tests. A mayor cantidad de pruebas, mayor confianza en que el programa no tiene bugs [5:50]. Sin embargo, incluso con muchos tests pueden aparecer errores. La estrategia es clara:
- Identificar el bug.
- Crear un test que lo reproduzca.
- Asegurarse de que ese test pase.
Esto no garantiza la ausencia total de errores, pero sí que ese bug específico no volverá a ocurrir [6:08]. Tu test suite crecerá de forma natural conforme el programa evolucione.
Las soluciones de referencia están disponibles en GitHub, pero cada implementación puede ser diferente. Comparte tus propias versiones en los comentarios para enriquecer la discusión.