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
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
Viendo ahora - 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
Manejo de Errores Semánticos en Lenguaje Platzi
Resumen
Cuando la sintaxis de un programa es correcta pero su significado no tiene sentido, aparecen los errores semánticos. Saber identificarlos y detener la ejecución a tiempo es fundamental para construir un lenguaje de programación robusto. Aquí se explica cómo implementar este mecanismo paso a paso, desde los tests hasta la propagación del error en el evaluador.
¿Qué es un error semántico y por qué difiere de un error de sintaxis?
Un error semántico ocurre cuando una expresión tiene la estructura correcta —paréntesis bien cerrados, puntos y comas en su lugar— pero carece de significado dentro del lenguaje [0:18]. Por ejemplo, expresiones como verdadero + falso o 5 + verdadero no representan operaciones válidas.
Este tipo de errores se conoce como type mismatch (discrepancia de tipos) cuando los operandos no son compatibles, o como unknown operator (operador desconocido) cuando la operación no está definida para ciertos tipos [0:42]. Es importante recordar que tú decides las reglas: si quisieras que -verdadero evaluara a falso, podrías hacerlo. Cada decisión define la semántica de tu lenguaje.
¿Cómo se diseñan los tests para errores semánticos?
La estrategia sigue el enfoque test-driven: primero se escriben los tests y después la implementación [1:38]. Se generan múltiples programas inválidos y se verifica que cada uno devuelva el mensaje de error correcto:
5 + verdadero→ type mismatch: entero más booleano.-verdadero→ operador prefijo desconocido para booleanos.verdadero + falso→ operador infijo desconocido.verdadero - falso→ operador desconocido.- Expresiones con
*o/entre booleanos → operador desconocido.
Una característica clave es que el error detiene la ejecución [2:22]. Si una línea produce un error, las líneas siguientes no deben evaluarse. Esto se valida incluyendo expresiones válidas después del error y comprobando que nunca se alcancen.
¿Cómo se implementa la clase error?
El objeto Error es sencillo: hereda de la clase base Object e implementa los métodos type e inspect [4:28]. Su constructor recibe un mensaje como string.
python class Error(Object): def init(self, message: str): self.message = message
def type(self) -> ObjectType: return ObjectType.ERROR def inspect(self) -> str: return f"Error: {self.message}"
Además, se añade ERROR como nuevo valor en el enum ObjectType [5:02].
¿Cómo funciona la función new error y las constantes de mensajes?
Se definen tres constantes que actúan como plantillas de mensaje [5:38]:
- TYPE_MISMATCH: discrepancia de tipos con formato
tipo operador tipo. - UNKNOWN_PREFIX_OPERATOR: operador prefijo desconocido con formato
operador tipo. - UNKNOWN_INFIX_OPERATOR: operador infijo desconocido con formato
tipo operador tipo.
La función new_error recibe el mensaje plantilla y una lista variable de argumentos [6:30]. Utiliza unpacking (*args) para formatear el string dinámicamente:
python def new_error(message: str, *args) -> Error: return Error(message.format(*args))
Este patrón es equivalente al operador spread (...) en JavaScript: extrae todos los valores de la lista y los pasa como argumentos individuales al método format.
¿Dónde se propagan los errores dentro del evaluador?
La propagación es el paso más delicado. Cada punto donde antes se retornaba None ahora debe devolver una instancia de Error [7:10]:
- En
evaluate_prefix_expression: si el operador no es válido para el tipo, se retorna unknown prefix operator. - En
evaluate_minus_operator_expression: si el operando no es entero, se retorna unknown prefix operator con el operador-[9:15]. - En
evaluate_integer_infix_expression: si el operador no está soportado, se retorna unknown infix operator. - En
evaluate_infix_expression: si los tipos de ambos lados no coinciden, se retorna type mismatch [8:18].
¿Cómo se detiene la ejecución al encontrar un error?
En dos lugares estratégicos se verifica si el resultado es un error para interrumpir la evaluación [8:44]:
- evaluate_block_statement: si el tipo del resultado es
RETURNoERROR, se deja de recorrer los statements del bloque. - evaluate_program: si el resultado es un error, se retorna inmediatamente sin continuar con el resto del programa.
Este comportamiento garantiza que un error semántico corte la ejecución de forma limpia, sin evaluar código posterior que ya no tendría sentido.
Si quieres llevar esto más lejos, un buen reto es modificar el objeto Error para que incluya el número de línea donde ocurrió el problema [10:18]. Para lograrlo, necesitarías capturar la posición en cada token durante el análisis léxico y pasar esa información al error. ¿Te animas a implementarlo?