Lexer: Identificación de Keywords y Tokens Complejos
Clase 7 de 58 • Curso de Creación de Lenguajes de Programación: Intérpretes
Contenido del curso
- 3

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

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

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

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

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

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

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

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

Creación de un REPL en Python para Lenguaje de Programación
12:35
- 12

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

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

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

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

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

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

Parseo de Return Statements en Lenguaje Platzi
12:42 - 19
Técnicas de Parsing: Top-Down y Bottom-Up
01:46 - 20

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

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

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

Parseo de Expression Statements en Platzi Parser
16:34 - 24

Parseo de Enteros en Lenguaje Platzi
14:03 - 25

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

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

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

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

Evaluación de Precedencia y Testeo de Booleanos en Parsers
08:39 - 30

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

Parseo de Condicionales en Lenguaje Platzi
13:50 - 32

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

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

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

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

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

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

Implementación de REPL para Árbol de Sintaxis Abstracta
08:59
- 39

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

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

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

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

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

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

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

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

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

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

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

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

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

Implementación de Llamadas a Funciones en PlatziLang
23:55
¿Cómo implementar tokens más complejos en un lexer?
En la creación de analizadores léxicos o 'lexers', la habilidad de reconocer tokens más complejos, como palabras clave, asignaciones, funciones e identificadores, es esencial para desarrollar un intérprete de lenguajes de programación más completo y funcional. En este contexto, el desarrollo de pruebas específicas para estos tokens y la implementación de funciones auxiliares es fundamental.
¿Qué son los tokens y cómo se generan?
Un token es una unidad de significado en la programación de lenguajes que representa elementos como variables, operadores, palabras clave, etc. Para generar tokens complejos, se requieren varias pruebas:
- Asignación: Probar cómo se asigna un valor a una variable, como en el ejemplo
variable a = 5. - Declaración de funciones: Verificar la correcta declaración con palabras clave como
procedimiento. - Llamada a funciones: Examinar cómo se ejecuta una llamada a una función.
¿Qué funciones auxiliares son necesarias?
Para implementar estas pruebas, es necesario desarrollar varias funciones auxiliares, entre las principales figuran:
-
Identificación de letras y números: Funciones que determinan si un carácter es una letra o un número para poder leer identificadores o números completos.
-
Ignorar espacios en blanco: En muchos lenguajes de programación, los espacios en blanco no tienen significado y deben ser ignorados.
-
Determinación de keywords vs identificadores: Funciones que identifican si una palabra es una palabra clave específica, como
variableo un simple identificador.
¿Cómo se aplica una metodología de desarrollo guiado por pruebas (TDD)?
Para implementar y verificar estas funciones, se sigue un enfoque de Desarrollo Guiado por Pruebas (TDD). Los pasos típicos incluyen:
- Iniciar un nuevo branch y asegurarse de que el código base esté limpio.
- Definir qué tokens se esperan que regresen de nuestro lexer.
- Escribir casos de prueba que fallen inicialmente al ejecutarse, lo que indicará qué funciones y características deben implementarse a continuación.
Ejemplo de implementación de funciones en Go
La implementación en Go para lograr los objetivos arriba mencionados considera lo siguiente:
func isLetter(ch byte) bool {
return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') || ch == '_'
}
func readIdentifier() string {
position := l.position
for isLetter(l.ch) {
l.readChar()
}
return l.input[position:l.position]
}
func readNumber() string {
position := l.position
for isDigit(l.ch) {
l.readChar()
}
return l.input[position:l.position]
}
func isDigit(ch byte) bool {
return '0' <= ch && ch <= '9'
}
func (l *Lexer) skipWhitespace() {
for l.ch == ' ' || l.ch == '\t' || l.ch == '\n' || l.ch == '\r' {
l.readChar()
}
}
A través de estas funciones, se configura un lexer capaz de navegar por caracteres, reconocer tipos de tokens según el contexto y omitir eficientemente el espacio innecesario.
Continúa tu aprendizaje
Implementar un lexer es una tarea desafiante pero gratificante que sienta las bases para la creación de interpretadores y compiladores más avanzados. Siguiendo ejemplos y prácticas de TDD, puedes avanzar en el desarrollo de estas herramientas, aprendiendo y mejorando continuamente. Mantente enfocado en desarrollar tus habilidades de programación, y cada desafío superado será un gran paso en tu viaje de desarrollo de software.