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
Viendo ahora - 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
08:39 min - 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
Pruebas de AST para Let y Return Statements en Parsers
Resumen
Cuando construimos un parser, no basta con saber que reconoce sentencias correctamente. También necesitamos verificar que la estructura de datos interna —el AST— sea exactamente la que esperamos. Esta técnica complementaria permite construir manualmente el árbol de sintaxis abstracta y compararlo con el programa que el parser debería generar, ofreciendo una visión clara de cómo se representan las instrucciones en memoria.
¿Qué significa probar el AST de forma inversa?
Hasta ahora, las pruebas del parser partían de un string con código fuente y verificaban que se generara cierta estructura. La técnica que se presenta aquí invierte ese flujo: se construye primero el AST con sus nodos y luego se compara contra el string que esa estructura debería producir [01:20].
Esto es posible porque cada nodo del AST implementa el método __str__ (dunder string), que define su representación textual. Al llamar str(program), Python recorre el árbol y devuelve el programa original reconstruido.
- Se construye una instancia de
Programcon su lista de statements. - Se compara el resultado de
str(program)con el código esperado. - Si no coinciden, el test falla y sabemos exactamente dónde está el problema.
¿Cómo se estructura un test para el let statement?
Para preparar el archivo de pruebas, se crea ast_test.py dentro del folder de tests [02:30]. Los imports necesarios son:
TestCasedel módulounittest.Identifier,LetStatementyProgramdel módulolpp/ast.TokenyTokenTypedel módulolpp/token.
El programa que se quiere representar es variable mi_var = otra_variable;. Para construir este AST manualmente, el nodo raíz es un Program, que contiene una lista de statements [03:45].
¿Qué nodos componen un let statement?
Un LetStatement requiere tres elementos:
- Un token de tipo
TokenType.LETcon literal"variable". - Un name que es un
Identifier, inicializado con un token de tipoTokenType.IDENTy literal"mi_var", cuyo valor también es"mi_var". - Un value que en este caso es otro
Identifier, con token de tipoTokenType.IDENT, literal"otra_variable"y valor"otra_variable"[05:10].
El value de un LetStatement puede ser cualquier expresión: un entero, una función o, como en este ejemplo, otro identificador. Esa flexibilidad es fundamental para representar asignaciones complejas.
¿Cómo se ejecuta la verificación?
Una vez armado el árbol, se convierte a string y se compara:
python program_str = str(program) self.assertEqual(program_str, 'variable mi_var = otra_variable;')
Si se modifica el string esperado, por ejemplo añadiendo un carácter de negación, el test falla inmediatamente, confirmando que el AST solo produce la representación exacta del programa original [07:00].
¿Cómo se ve la estructura completa del árbol?
La jerarquía resultante es clara:
- Program → contiene una lista de statements.
- LetStatement → tiene un token (
let), un name (Identifier) y un value (expresión).- Identifier (name) → token de tipo
IDENT, valor"mi_var". - Identifier (value) → token de tipo
IDENT, valor"otra_variable".
- Identifier (name) → token de tipo
- LetStatement → tiene un token (
Si el programa tuviera más instrucciones, simplemente se agregarían más elementos a la lista de statements. Por ejemplo, un ReturnStatement sería otro nodo dentro de esa misma lista [08:30].
Esta forma de visualizar el AST refuerza un concepto importante: el parser transforma texto plano en una estructura de datos jerárquica que luego puede ser evaluada, optimizada o transformada.
El reto propuesto consiste en implementar la prueba equivalente para un ReturnStatement, aplicando exactamente la misma lógica: construir el árbol, convertirlo a string y verificar que coincida con el código fuente esperado. Comparte tu solución y cualquier duda en los comentarios para enriquecer el proceso de aprendizaje colectivo.