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

Primera versi贸n del REPL con tokens

11/58
Recursos

Aportes 6

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

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
馃槂

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]

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)
Te quiero mucho David

Implementaci贸n del start_repl funci贸n

Mi soluci贸n al bug: