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
Viendo ahora - 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
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
Implementación de Operadores de Dos Caracteres en Lexer
Resumen
Construir un lexer capaz de leer operadores de un solo carácter es apenas el primer paso. Cuando tu lenguaje necesita distinguir entre asignación (=) e igualdad (==), o entre negación (!) y desigualdad (!=), el lexer debe aprender a mirar hacia adelante antes de decidir qué token emitir. Aquí se explica exactamente cómo lograrlo usando dos funciones clave: peek character y make two character token.
¿Por qué el lexer necesita ver el siguiente carácter?
Hasta este punto, el lexer lee carácter por carácter y produce tokens individuales. El problema aparece con los operadores de dos caracteres [0:10]: cuando el lexer encuentra un =, no sabe si se trata de una asignación o del inicio de un == (igualdad). Lo mismo ocurre con !, que puede ser negación o el comienzo de != (desigualdad).
En lenguajes como JavaScript o Python, el doble igual (==) representa el test de igualdad, mientras que el igual simple (=) es asignación. El lexer debe replicar esa distinción.
Para resolverlo, se aprovechan las dos variables que ya existen en el lexer: position y read position [0:40]. La primera indica dónde estamos; la segunda apunta al carácter que viene después. Ahora se entiende por qué eran necesarias ambas variables desde el diseño inicial.
¿Cómo implementar el test para operadores de dos caracteres?
Siguiendo la metodología de desarrollo guiado por pruebas, se crea un test llamado test_two_character_operator [1:16]. El source de entrada es:
10 == 10; 10 != 9;
La lista de tokens esperados contiene ocho elementos:
INT(10),EQUALS,INT(10),SEMICOLON.INT(10),NOT_EQUALS,INT(9),SEMICOLON.
Antes de ejecutar el test, es necesario agregar los nuevos token types al archivo de token [2:18]:
EQUALSse ubica en orden alfabético.NOT_EQUALSse coloca después deNEGATION.
Al correr el test sin más cambios, el lexer reporta que esperaba un EQUALS pero encontró un ASSIGN [2:38]. Esto confirma que el lexer aún no sabe leer dos caracteres seguidos.
¿Cómo funcionan peek character y make two character token?
Dentro del archivo lexer.py se modifica la lógica para los símbolos = y ! [2:55].
¿Qué hace peek character?
La función peek_character no recibe parámetros y retorna un string [4:02]. Su lógica es directa:
python def peek_character(self) -> str: if self.read_position >= len(self.source): return '' return self.source[self.read_position]
- Si
read_positionsupera la longitud del source, ya no hay nada que leer y devuelve una cadena vacía. - En caso contrario, devuelve el carácter en
read_positionsin avanzar la posición actual.
¿Qué hace make two character token?
Esta función recibe un token_type como parámetro y retorna un token compuesto [4:36]:
python def make_two_character_token(self, token_type: TokenType) -> Token: prefix = self.character self.read_character() suffix = self.character return Token(token_type, f'{prefix}{suffix}')
- Guarda el carácter actual como prefijo.
- Llama a
read_character()para avanzar al siguiente carácter. - Guarda el nuevo carácter actual como sufijo.
- Concatena ambos y crea el token con el tipo correspondiente.
La llamada a read_character() en medio es fundamental: permite que el lexer se posicione correctamente para la siguiente iteración [5:00].
¿Cómo se conecta todo en el lexer?
Cuando el lexer encuentra =:
- Usa
peek_character()para ver si el siguiente también es=. - Si lo es, genera un token
EQUALSconmake_two_character_token. - Si no, genera un token
ASSIGNnormal.
La misma lógica aplica para !:
- Si el siguiente carácter es
=, generaNOT_EQUALS. - Si no, genera
NEGATION.
Tras corregir un pequeño error tipográfico en la línea 114 detectado por los propios tests [5:28], todas las pruebas pasan correctamente.
¿Qué puede hacer ahora el lexer completo?
Con esta implementación, el lexer ya reconoce [5:42]:
- Operadores de un carácter: asignación, negación, suma, resta.
- Operadores de dos caracteres: igualdad y desigualdad.
- Keywords:
si,si_no,variable,regresa,verdadero,falso,procedimiento. - Delimitadores: paréntesis, llaves, comas, puntos y comas.
- Literales: enteros e identificadores.
El siguiente paso será construir un REPL (Read-Eval-Print Loop) para interactuar directamente con el intérprete, enviándole statements y expresiones en tiempo real [6:25]. ¿Ya modificaste algo en tu propio lenguaje? Comparte cómo va tu lexer y qué se siente programar en español.