Aquí les dejo la mi solución al bug
Y como pueden ver con esto ya puede reconocer números como parte de una variable
Aquí el link al repositorio:
https://github.com/FabianVegaA/sigmaF/tree/dev
😃
Introducción al desarrollo de intérpretes y lenguajes de programación
Aprende a desarrollar lenguajes de programación con intérpretes
Desarrolla LPP o Lenguaje de Programación Platzi
Construcción del lexer o tokenizador
¿Qué es análisis léxico? Funcionamiento del lexer y tokens
Estructura y definición de tokens en Python
Lectura de caracteres y tokens
Tokens ilegales, operadores de un solo carácter y delimitadores
Reconocimiento y diferenciación entre letras y números
Declaración y ejecución de funciones
Extensión del lexer: condicionales, operaciones y booleanos
Operadores de dos caracteres
Primera versión del REPL con tokens
Construcción del parser o analizador sintáctico
¿Qué es un parser y AST?
Estructura y definición de nodos del AST en Python
Parseo del programa o nodo principal
Parseo de assignment statements
Parseo de let statements
Parseo de errores
Parseo del return statement
Técnicas de parsing y pratt parsing
Pruebas del AST
Implementación del pratt parser
Parseo de Identifiers: testing
Parseo de Identifiers: implementación
Parseo de enteros
Prefix operators: negación y negativos
Infix operators y orden de las operaciones: testing
Infix operators y orden de las operaciones: implementación
Parseo de booleanos
Desafío: testing de infix operators y booleanos
Parseo de expresiones agrupadas
Parseo de condicionales: testing y AST
Parseo de condicionales: implementación
Parseo de declaración de funciones: testing
Parseo de declaración de funciones: AST e implementación
Parseo de llamadas a funciones: testing y AST
Parseo de llamadas a funciones: implementación
Completando los TODOs o pendientes del lexer
Segunda versión del REPL con AST
Evaluación o análisis semántico
Significado de símbolos
Estrategias de evaluación para intérpretes de software
Representación de objetos
Evaluación de expresiones: enteros
Evaluación de expresiones: booleanos y nulos
Evaluación de expresiones: prefix
Evaluación de expresiones: infix
Evaluación de condicionales
Evaluación del return statement
Manejo de errores
Ambiente
Bindings
Evaluación de funciones
Llamadas a funciones
Mejora del intérprete
Implementación de strings
Operaciones con strings
Built-in functions: objeto y tests
Built-in functions: evaluación
Siguientes pasos
Retos para expandir tu intérprete
Continúa con el Curso de Creación de Compiladores de Software
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Aportes 6
Preguntas 1
Aquí les dejo la mi solución al bug
Y como pueden ver con esto ya puede reconocer números como parte de una variable
Aquí el link al repositorio:
https://github.com/FabianVegaA/sigmaF/tree/dev
😃
En los lenguajes de programación, las variables normalmente pueden contener números pero no pueden iniciar con ellos. Es esto se basa el bug.
.
Las soluciones propuestas por Fabián Vega Alcota y por RitaxMaster (ambas) validan bien. Aunque prefiero la de Fabián porque la de Ritax me parece redundante.
.
Ahh!! Y hablando de validar… Aquí les dejo mi test para validar no entienda como identificar una expresión que no comience con número.
def test_identifier_cant_start_with_number(self) -> None:
source: str = '1_foo;'
lexer: Lexer = Lexer(source)
tokens: List[Token] = []
for i in range(3):
tokens.append(lexer.next_token())
expected_tokens: List[Token] = [
Token(TokenType.IDENTIFIER, '1_foo'),
Token(TokenType.SEMICOLON, ';'),
Token(TokenType.EOF, ''),
]
self.assertIsNot(tokens, expected_tokens)
self.assertEqual(len(tokens), 3)
Vale, yo solucioné el problema de los números en los nombres de variables de esta forma:
Simplemente a la función _read_identifier
le puse una validación para que el primer caracter sea una letra y ya depués puede leer letras y números, y funciona 😄
def _read_identifier(self) -> str:
initial_position = self._position
if self._is_letter(self._character):
while self._is_letter(self._character) or self._is_number(self._character):
self._read_character()
return self._source[initial_position:self._position]
Implementación del start_repl función
Mi solución al bug:
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?
o inicia sesión.