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

Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Parseo de enteros

24/58
Recursos

Aportes 7

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Para mi caso, quise probar que al tener ambas expresiones (identificadores y enteros) se estuviera devolviendo bien la cadena, sin embargo, gracias a este test me di cuenta que en el archivo ast.py estábamos devolviendo el statement sin “;” desde el dunder methos de __str__, eso hacía que el test fallara porque “foo” era diferente de “foo;” (lo expectado), así que lo primero que hice fue arreglar el dunder method __str__ de la clase ExpressionStatement:

    def __str__(self) -> str:
        return f"{str(self.expression)};"

Y por último, ahora si puse mis tests que revisan ambas expresiones, integers e identificadores 😄

    def test_expression_statement(self) -> None:

        program: Program = Program(statements=[

            ExpressionStatement(

                token=Token(TokenType.IDENT, literal="foobar"),

                expression=Identifier(
                    token=Token(TokenType.IDENT, literal="foobar"),
                    value="foobar"
                )

            ),

            ExpressionStatement(

                token=Token(TokenType.INT, literal="5"),

                expression=Identifier(
                    token=Token(TokenType.INT, literal="5"),
                    value="5"
                )

            )

        ])

        program_str = str(program)
        self.assertEquals(program_str, "foobar;5;")

Hola a todos, esta fue mi solución al reto:

deftest_integer_expressions(self) -> None:
        program: Program = Program(statements=[
            LetStatement(
                token=Token(TokenType.LET, literal='variable'),
                name=Identifier(
                    token=Token(TokenType.IDENT, literal='cinco'),
                    value='cinco'
                ),
                value=Integer(
                    token=Token(TokenType.INT, literal='5'),
                    value=5
                )
            )
        ])

        program_str = str(program)

        self.assertEquals(program_str, 'variable cinco = 5;')

Aquí esta el reto, aunque no estoy del todo claro si lo hice bien, agradecería mucho si alguien pudiera corroborar el test que hice

    def test_intergers_in_statements(self) ->None:
        program: Program = Program(statements=[
            LetStatement(
                token = Token(TokenType.LET, literal='variable'),
                name=Identifier(
                    token = Token(TokenType.IDENT, literal='chocolates'),
                    value= 'chocolates'
                ),
                value= Identifier(
                    token = Token(TokenType.INT, literal='10'),
                    value= '10'
                ),
            ),
            ReturnStatement(
                token = Token(TokenType.RETURN, literal='regresa'),
                return_value= Identifier(
                    token = Token(TokenType.INT, literal='5'),
                    value= '5'
                ),
            )
        ])

        expected_statement: List[str] = [
            'variable chocolates = 10;',
            'regresa 5;'
        ]
        self.assertEquals(str(program.statements[0]), expected_statement[0])
        self.assertEquals(str(program.statements[1]), expected_statement[1])


LPP languaje powerfull --Pues es el curso mas “profundo” que he visto en Platzi, no se si seré capaz de entenderlo todo.

Aqui les dejo el reto, hice tres funciones para probar esto

variable mi_var = 8;
regresa 8;
8;
    def test_return_statement_with_integer(self) -> None:
        program: Program = Program(statements=[
            ReturnStatement(
                token=Token(TokenType.RETURN, literal='regresa'),
                return_value=Integer(
                    token=Token(TokenType.INT, '6'),
                    value=6
                ),
            )
        ])

        program_str = str(program)
        self.assertEquals(program_str, 'regresa 6;')

    def test_integer_expressions(self) -> None:
        program: Program = Program(statements=[
            ExpressionStatement(
                token=Token(TokenType.INT, literal='5'),
                expression=Integer(
                    token=Token(TokenType.INT, literal='5'),
                    value=5
                )
            )
        ])

        program_str = str(program)

        self.assertEquals(program_str, '5')

    def test_let_statement_with_integer(self) -> None:
        program: Program = Program(statements=[
            LetStatement(
                token=Token(TokenType.LET, literal='variable'),
                name=Identifier(
                    token=Token(TokenType.IDENT, literal='mi_var'),
                    value='mi_var'
                ),
                value=Integer(
                    token=Token(TokenType.INT, literal='8'),
                    value=8
                )
            )
        ])

        program_str = str(program)
        self.assertEquals(program_str, 'variable mi_var = 8;')

Quise pasar por aquí como hice para crear un tipo de token float, pero parece que escribí mucho y no se publicó, así que pasó el link del repo donde lo estoy subiendo para los que se quieran guiar. Aqui

Yo lo hice de esta forma

def test_integer_in_let_and_return_statement(self) -> None:
        program: Program = Program(statements=[
            LetStatement(
                token=Token(
                    TokenType.LET,
                    literal="var"
                ),
                name=Identifier(
                    token=Token(TokenType.IDENT, literal="mi_num"),
                    value="mi_num"
                ),
                value=Integer(
                    token=Token(TokenType.INT, literal="5"),
                    value=5
                )
            ),
            ReturnStatement(
                token=Token(TokenType.RETURN, literal="regresa"),
                return_value=Identifier(
                    token=Token(TokenType.IDENT, literal="mi_num"),
                    value="mi_num"
                )
            )
        ])

        program_str = str(program)

        self.assertEquals(program_str, 'var mi_num = 5;regresa mi_num;')