Pruebas de Operadores, Delimitadores y Fin de Archivo en Lexer Python
Clase 6 de 58 • Curso de Creación de Lenguajes de Programación: Intérpretes
Resumen
¿Cómo expandir un léxer con pruebas y operadores?
Expandir un léxer es una tarea crucial en el desarrollo de un compilador eficiente. En esta etapa, deseamos robustecer nuestra capacidad para manejar varias funciones, como operadores de un solo carácter, delimitadores y el fin del archivo. Si estás aprendiendo a través de GitHub, asegúrate de seguir en la rama adecuada para este tema específico.
¿Cómo probamos operadores de un solo carácter?
Para iniciar con los operadores simples, primero construimos una prueba. Este test se dirige a operadores de un solo carácter como asignación
y suma
. La estructura de esta prueba será similar a las anteriores:
def test_one_character_operator():
source = "=+"
lexer = Lexer(source)
tokens = [token for token in lexer]
expected_tokens = [TokenType.ASSIGN, TokenType.PLUS]
assert tokens == expected_tokens
- Inicialización del léxer: Tomamos la cadena fuente que contiene
=
y+
. - Generación de tokens esperados: Esperamos obtener
assign
yplus
. - Verificación con
assert
: Comprobamos que los tokens devueltos sean los esperados.
¿Qué hacemos si el token es ilegal?
Si los tokens encontrados no son los esperados, inicialmente el léxer los marcaba como ilegales
. Para solucionarlo, importamos el módulo de expresiones regulares re
en Python y ajustamos el método next_token
del léxer para que reconozca los operadores:
import re
def next_token(self):
if re.match(r"^=$", self.character):
return TokenType.ASSIGN, self.character
elif re.match(r"^\+$", self.character):
return TokenType.PLUS, self.character
else:
return TokenType.ILLEGAL, self.character
¿Cómo probamos el fin del archivo?
Creamos otra prueba que valida cómo el léxer maneja el final del archivo (EOF). La prueba siguiente verificará que el léxer devuelva EOF
apropiadamente:
def test_end_of_file():
source = "+"
lexer = Lexer(source)
tokens = [token for token in lexer]
expected_tokens = [TokenType.PLUS, TokenType.EOF]
assert tokens == expected_tokens
¿Por qué es imprescindible manejar delimitadores?
Los delimitadores tales como paréntesis, llaves y comas son comunes en las expresiones regulares y deben manejarse adecuadamente en nuestro léxer. El desafío final consiste en implementar un test que compruebe que nuestro léxer puede reconocer y devolver los tokens correspondientes a los delimitadores.
El test debería incluir:
def test_delimiters():
source = "( ){ } , ;"
lexer = Lexer(source)
tokens = [token for token in lexer]
expected_tokens = [TokenType.LPAREN, TokenType.RPAREN, TokenType.LBRACE, TokenType.RBRACE, TokenType.COMMA, TokenType.SEMICOLON]
assert tokens == expected_tokens
Este test sirve como una excelente oportunidad práctica para aplicar conocimientos sobre expresiones regulares y manejo de tokens dentro de un léxer. Además, motiva a seguir explorando, escribiendo y comparando su código con soluciones disponibles en GitHub para enriquecer el aprendizaje. ¡Adelante, cada avance es un paso más hacia el dominio del análisis léxico!