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

Reconocimiento y diferenciación entre letras y números

7/58
Recursos

Aportes 14

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Uhhh genial, básicamente lo que hace el lexer es ir leyendo caracter por caracter, en el caso de “variable cinco = 5” lo que suecede es que, el lexer lee el primer caracter y se encuentra que es una “v” y el lexer dice: “oiga, esto es una letra, esto no es ningún delimitador ni ningún caracter especial, seguro debe haber más letras” y continua leyendo y así hasta que se encuentre que el siguiente con un espacio en blanco, recordemos que este proceso lo hace read_identifier, por lo que cuando se encuentre con un espacio en blanco dejará de leer.
.
Una vez que ya tiene la palabra capturada, se va a buscar si esa palabra forma parte de las palabras reservadas de nuestro lenguaje “kewywords” y retorna el tipo de token que es 😄
.
Lo genial de esto es que a partir de aquí podemos empezar a ponernos creativos, podemos empezar a poner nuestras propias palabras reservadas, es decir, en vez de poner “variable” podemos poner “unKeywordSuperChido” para definiri variables 😄 (por favor no pongas ese keyword), pero imagina las posibilidades!
.
Yo voy agregando comentarios al código que me ayudan a entenderlo mejor, por si a alguien le sirve, les dejo mi repositorio con el commit de esta clase:
.
Adicion de la lectura de asignaciones

Es util que la función _skip_whitespace también ignore los TABS. Esto se logra así:

    def _skip_whitespace(self)-> None:
        while match(r'^[\s\t]$', self._character):
            self._read_character()

Buen video, lo que yo agregué es una funcion has_next para controlar el flujo.

Se disponibiliza con un getter has_next:

pub fn has_next(&self) -> bool {
        return self._has_next;
}

Y la asignación del valor se vuelve true si se retorna un EOF:

self._has_next = token.token_type != TokenType::EOF;

Y en los test se ejecuta un while hasta que has_next retorne false:

while lexer.has_next() {
        tokens.push(lexer.next_token());
}

El código está en lenguaje rust.

Bueno yo en esta clase tuve una dificultad en conseguir la misma cantidad de tokens que estábamos pasando en el lexer. El Lexer me estaba devolviendo 20 tokens y yo estaba esperando 6, contando el EOF.
Me di cuenta que yo a diferencia de el profe Aroesti, estaba recorriendo el source por len(source) + 1 en lugar de solo 5, o en mi caso 6 (ya que tengo en cuenta el EOF
Para solucionar esto, me mantuve con el len(source)+1 pero agregué una validación para buscar el EOF y romper el ciclo en ese momento

Aunque es mucho más fácil usar simplemente la cantidad de tokens esperados, creo que esta implementación podría ser de utilidad en el futuro cuándo hagamos revisión de más de una línea.

tamalito

Implementación de la función is_number

Implementación de la función skip_whitespace

Implementación de la función skip_whitespace

Implementación de la función lookup_token_type en Token

Implementación de la función read_identifier

Implementación de is_letter function

Definición del test_assignment

Nuevas funciones del lexer

Definición de los test que vamos a hacer en la clase