Introducción al desarrollo de intérpretes y lenguajes de programación

1

Aprende a desarrollar lenguajes de programación con intérpretes

2

Desarrolla LPP o Lenguaje de Programación Platzi

Construcción del lexer o tokenizador

3

¿Qué es análisis léxico? Funcionamiento del lexer y tokens

4

Estructura y definición de tokens en Python

5

Lectura de caracteres y tokens

6

Tokens ilegales, operadores de un solo carácter y delimitadores

7

Reconocimiento y diferenciación entre letras y números

8

Declaración y ejecución de funciones

9

Extensión del lexer: condicionales, operaciones y booleanos

10

Operadores de dos caracteres

11

Primera versión del REPL con tokens

Construcción del parser o analizador sintáctico

12

¿Qué es un parser y AST?

13

Estructura y definición de nodos del AST en Python

14

Parseo del programa o nodo principal

15

Parseo de assignment statements

16

Parseo de let statements

17

Parseo de errores

18

Parseo del return statement

19

Técnicas de parsing y pratt parsing

20

Pruebas del AST

21

Implementación del pratt parser

22

Parseo de Identifiers: testing

23

Parseo de Identifiers: implementación

24

Parseo de enteros

25

Prefix operators: negación y negativos

26

Infix operators y orden de las operaciones: testing

27

Infix operators y orden de las operaciones: implementación

28

Parseo de booleanos

29

Desafío: testing de infix operators y booleanos

30

Parseo de expresiones agrupadas

31

Parseo de condicionales: testing y AST

32

Parseo de condicionales: implementación

33

Parseo de declaración de funciones: testing

34

Parseo de declaración de funciones: AST e implementación

35

Parseo de llamadas a funciones: testing y AST

36

Parseo de llamadas a funciones: implementación

37

Completando los TODOs o pendientes del lexer

38

Segunda versión del REPL con AST

Evaluación o análisis semántico

39

Significado de símbolos

40

Estrategias de evaluación para intérpretes de software

41

Representación de objetos

42

Evaluación de expresiones: enteros

43

Evaluación de expresiones: booleanos y nulos

44

Evaluación de expresiones: prefix

45

Evaluación de expresiones: infix

46

Evaluación de condicionales

47

Evaluación del return statement

48

Manejo de errores

49

Ambiente

50

Bindings

51

Evaluación de funciones

52

Llamadas a funciones

Mejora del intérprete

53

Implementación de strings

54

Operaciones con strings

55

Built-in functions: objeto y tests

56

Built-in functions: evaluación

Siguientes pasos

57

Retos para expandir tu intérprete

58

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

Parseo de assignment statements

15/58
Recursos

Aportes 7

Preguntas 0

Ordenar por:

Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.

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

tio, no sé como sobrevives sin autocompletado🗿

Implementación _parse_statement

Implementación _parse_let_statement

implementación de la clase Identifier

Implementación de la clase LetStatement

Implementación del test_let_statements