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

Quedan menos de 24 hrs para aprender Ingl茅s, AI y m谩s a precio especial.

Antes: $249

Currency
$209
Suscr铆bete

Termina en:

0 D铆as
21 Hrs
58 Min
2 Seg

Segunda versi贸n del REPL con AST

38/58
Recursos

Aportes 2

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Para modificar el formato de salida del REPL hay que modificar los dunder __str__ methods para cambiar su formato, pero hacer esto puede llevar a muchos fallos en los tests xD Adem谩s ya quiero empezar con el evaluador que es lo que m谩s me da curiosidad OwO!!!
.
Por cierto, algo cursiodi es que en nuestro REPL no podemos usar las flechas de izquierda y derecha porque se imprimen caracteres raros, tampoco podemos navegar a trav茅s de la historia de los comandos que hemos escrito, muchos REPL鈥檚 si lo permiten usar.
.
Si quieren agregar este feature al REPL (que lo hace muuuuucho m谩s elegante), solo tienen que agregar esto al inicio de repl.py:

import readline

Con eso ya pueden usar las flechitas del teclado y navegar entre todas las l铆neas de c贸digo que han escrito en su REPL usando las flechitas de 鈥渁rriba鈥 y 鈥渁bajo鈥.

Otra cosa importante dentro de cualquier REPL es poder limpiar la pantalla, para hacer eso, yo agregu茅 esta funci贸n al repl.py:

from os import system, name 

def clear(): 

    # for windows 
    if name == 'nt': 
        _ = system('cls') 

    # for mac and linux(here, os.name is 'posix') 
    else: 
        _ = system('clear') 

...

while (source := input(">> ")) != "salir()":

        if source == "limpiar()":
        	clear()

        else:

        	lexer: Lexer = Lexer(source)
		...

Y simplemente en el REPL en ejecuci贸n escribes limpiar() y se limpia la pantalla 馃槃
.
Aqu铆 dejo mi REPL completo hasta ahorita por si lo quieren copiar:
.
Adicion de clear y uso de flechas dentro del REPL

Como menciona RetaxMaster, posiblemente realizar una buena implementaci贸n puede llevar realizar demasiadas modificaciones al c贸digo.

Pero invirtiendo unos minutos en el repl y trabajando el programa (de una manera no muy eficiente) se puede tabular los par茅ntesis para que facilite la lectura

	    str_program: str = program.__str__()
            statement: str = ''
            count_paremt = 0
            for i, caracter in enumerate(str_program):
                if caracter == '(':
                    _print_statement(caracter,count_paremt)
                    count_paremt +=1
                elif caracter == ')':
                    if statement != '':
                        _print_statement(statement,count_paremt)
                    count_paremt -=1
                    _print_statement(caracter,count_paremt)
                    statement = ''
                elif caracter == ';':
                    statement += caracter
                    if statement != '':
                        _print_statement(statement,count_paremt)
                    statement = ''
                else:
                    if not (statement == '' and caracter == ' '):
                        statement += caracter
                
            _print_statement(statement,count_paremt)

el resultado es algo como esto

((5 + (6 * 9)) + 8)
(

(
(
5 + 6 * 9
)
)

  • 8
    )