Vale, trataré de explicar con mis propias palabras este código para ver si entendí bien 🤔
.
Como dije en un aporte anterior, parse_program
es el que se encargará de empezar a crear nuestro AST, primero creará el nodo principal (el programa) que básicamente es un wrapper de todos nuestros staments, básicamente un statement es cada acción de nuestro programa, por ejemplo, el conjunto de palabras que declaran una variable: variable platzi = 10;
eso sería un statement.
.
Después de inicializar el programa, parse_program
empezará a buscar los diferentes tokens (recordemos que aquí ya hablamos de tokens porque el Lexer que hicimos ya nos está dando los tokens de nuestro programa)
.
La condición de: while self._current_token.token_type != TokenType.EOF
lo único que está diciendo es que mientras aún hayan tokens, se va a mandar a generar un statement. Básicamente sabemos que el token que finaliza nuestro programa es el EOF
(End Of File).
.
Ahora, hablando de la generación de statements dentro de la función parse_statement
… en primera, dentro de nuestro programa podemos tener varios tipos de statements (aunque según el profesor, dentro de LPP solo habrán dos), un ejemplo de ellos son los let statements (o statements de declaración de variables para que se entienda), es por eso que verificamos que si el token actual es LET
significa que el usuario quiere declarar una variable, así que tenemos que empezar a verificar que la sintaxis de declaración sea correcta, pero esa tarea se la delegamos a _parse_let_satatement
.
.
Entonces, básicamente _parse_let_satatement
obtiene una instancia de la clase LetStatement
(ubicada en ast.py
) y empieza a validar, en teoría, la función _expected_token
debería determinar cuál es el siguiente token que arrojó el Lexer y comparar si el token arrojado es un IDENT
(recordemos que el token IDENT
define el nombre de la variable, en el statement variable platzi = 10;
, platzi sería el token IDENT
).
.
En dado caso que el token no sea un IDENT
significa que hay un error de sintaxis, por ahora devolvemos “None”, esto provocará que _parse_statement
retorne None y a su vez, dentro de parse_program
la variable statement
que está dentro del while acabará siendo None, por lo que por la condición que está debajo no dejará que este statement mal programado entre a la lista de statements de nuestro programa 😄
.
En dado caso que el expected token sí haya sido un IDENT, procederemos a crear una instancia de Identifier
con este identificador, después seguimos revisando la sintaxis, después del identificador debe haber un “=”, así que comparamos que el siguiente token sea uno de asignación, si no lo es, misma historia, hay un error de sintaxis así que retornamos None, si sí lo es, entonces continuamos revisando los tokens hasta que encontremos el “;”
.
Ya que todo se terminó de revisar correctamente, se retorna el statement, lo que provocará que _parse_statement
retorne un statement provocando que dentro parse_program
acabe retornándose un statement también, y debido a que este sí es un statement de verdad, el if
que está ahí sí dejará guardar ese statement dentro de nuestro Program 😄
.
Así es como entiendo que funciona este código, traté de describirlo lo mejor posible xD
Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.