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
Viendo ahora - 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
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
Desarrollo de un AST en Python: Creación de la Clase Programa
Resumen
Construir un lenguaje de programación desde cero exige una pieza fundamental: el parser. Aquí se muestra cómo dar el primer paso concreto, creando el nodo raíz del Abstract Syntax Tree (AST) llamado Program y escribiendo el primer unit test que valida su existencia. Todo el proceso sigue la metodología de test-driven development (TDD): primero el test, después la implementación mínima para que pase.
¿Qué representa el nodo Program dentro del AST?
El AST se compone de dos grandes familias de nodos: expresiones y statements. El nodo Program es el nodo raíz que contiene una lista de statements; es el punto de entrada de todo el árbol. Sin él, no hay estructura donde almacenar lo que el parser interprete.
Para definirlo se crea una clase Program que hereda de ASTNode [1:40]:
python from typing import List
class Program(ASTNode):
def __init__(self, statements: List[Statement]) -> None: self.statements = statements def token_literal(self) -> str: if len(self.statements) > 0: return self.statements[0].token_literal() return '' def __str__(self) -> str: out: List[str] = [] for statement in self.statements: out.append(str(statement)) return ''.join(out)
token_literaldevuelve el token literal del primer statement; sirve exclusivamente para debugging.- El dunder method
__str__concatena todos los statements convertidos a string, permitiendo visualizar el programa completo como texto. - Se importa
Listdesdetypingporque la clase necesita tipar la lista de statements.
¿Cómo se escribe el primer test del parser con TDD?
Antes de implementar cualquier lógica, se crean dos archivos: parser.py y parser_test.py dentro de la carpeta de tests [0:34]. El test se diseña imaginando la interfaz ideal, sin que exista aún el código que la soporte.
python from unittest import TestCase from lpp.ast import Program from lpp.lexer import Lexer from lpp.parser import Parser
class ParserTest(TestCase):
def test_parse_program(self) -> None: source: str = 'variable x = 5;' lexer: Lexer = Lexer(source) parser: Parser = Parser(lexer) program: Program = parser.parse_program() self.assertIsNotNone(program) self.assertIsInstance(program, Program)
Las dos assertions validan que:
- El resultado no sea
None. - El resultado sea una instancia de
Program.
Al ejecutar este test por primera vez, falla indicando que ni Parser ni Program existen [1:10]. Cada error nuevo señala el siguiente paso a implementar.
¿Por qué los errores progresivos son una buena señal?
En TDD, conforme cambia el mensaje de error, significa que avanzas [4:20]. Primero el test dice que Parser no existe; luego, que parse_program no está definido; finalmente, que el programa retornado es None. Cada iteración acerca el código a una solución funcional.
¿Cómo se implementa el parser mínimo para que el test pase?
El archivo parser.py arranca con la estructura más simple posible [3:30]:
python from lpp.ast import Program from lpp.lexer import Lexer
class Parser:
def __init__(self, lexer: Lexer) -> None: self._lexer = lexer def parse_program(self) -> Program: program: Program = Program(statements=[]) return program
- El constructor recibe un
Lexery lo almacena en una variable privada_lexer. parse_programretorna unProgramcon una lista vacía de statements.
Esta implementación es deliberadamente mínima. Su único objetivo es hacer pasar el test actual [5:00]. Más adelante, al agregar tests para el let statement y otros nodos, parse_program crecerá incorporando lógica real de parseo.
¿Qué ventaja ofrece esta suite de tests a futuro?
Cada test funciona como un colchón de seguridad. Si en algún momento parse_program deja de retornar un Program válido —por un cambio accidental o un refactor— el test fallará de inmediato [5:20]. Esto permite detectar regresiones antes de que se propaguen.
Si tienes dudas sobre la estructura del AST o la implementación del parser, comparte tus preguntas en los comentarios para que la comunidad pueda apoyarte.