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

T茅cnicas de parsing y pratt parsing

19/58

Lectura

驴Cu谩les son las t茅cnicas m谩s populares de parsing?

Seg煤n c贸mo se construya nuestro parsing tree, la estructura de datos en donde almacenaremos los Tokens que se generan al hacer el An谩lisis l茅xico de nuestro c贸digo fuente o Source Code, tendremos dos grandes tipos de t茅cnicas de Parseo com煤nmente utilizadas.

  1. Top-Down Parsing (de arriba hacia abajo).

  2. Bottom-Up Parsing (de abajo hacia arriba).

驴Para qu茅 nos sirve un Parser?

Nos sirve para:

  • Realizar un an谩lisis de la sintaxis sin importar el contexto.
  • Guiar el an谩lisis que s铆 ser谩 sensitivo al contexto.
  • Generar c贸digo intermedio.
  • Reportar errores de sintaxis en caso de existir.
  • Intentar corregir los errores (en caso que se desee).

En este curso utilizaremos un Top Down Parser, en combinaci贸n con la t茅cnica Pratt Parsing.

驴Qu茅 es pratt parsing?

Esta es una t茅cnica que fue originalmente descrita por el Computer Scientist, Vaughn Pratt, en 1973. Cuando est谩s construyendo un Parser, usar la t茅cnica de 鈥淩ecursive Descent鈥 o descenso recursivo es una de las m谩s f谩ciles opciones que puedes tener y funciona de maravilla cuando puedes saber qu茅 hacer despu茅s con base en el bloque de c贸digo que est谩s parseando. Esto, por ejemplo, con los statements de tu lenguaje, cuando cuentas con un identificador 煤nico, if, for, while, etc.

Sin embargo, se puede complicar cuando llegas a las expresiones, cuando utilizas operadores como +, ++, --, etc. Puede ser dif铆cil de definir qu茅 tipo de expresi贸n est谩s parseando hasta que ya has avanzado bastante.

Esto lo puedes hacer utilizando descenso recursivo siempre y cuando crees una funci贸n 煤nica para la operaci贸n que busques, como cuando escribes un if para cada posible caso en tu programa. Puede ser tedioso.

Tambi茅n lo podr铆as hacer a trav茅s de bucles hasta que termines de parsear una expresi贸n entera y con esto saber qu茅 har谩s con ella, esto tambi茅n es tedioso.

Y justo este es el problema que resolvi贸 Pratt (de hecho, es usado, por ejemplo, en JSLint, la brillante herramienta de an谩lisis de c贸digo que revisa si el c贸digo fuente en JavaScript que est谩 analizando cumple con ciertas reglas a seguir, ya sabes funciona lo que antes de tomar estos cursos conoc铆as como magia de tu Visual Studio Code).

En pocas palabras (y al ser algo que aprender谩s a crear en las pr贸ximas clases) te dir茅 lo que es:
es un tipo de parsing que utiliza tanto bucles como recursividad para permitirnos manejar asociatividad y precedencia del objeto que estemos analizando.

Aportes 3

Preguntas 0

Ordenar por:

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

Vale, lo poco que entend铆 de Pratt Parsing es que b谩sicamente es una t茅cnica de parsing en el cual usamos recursividad y bucles para 鈥渄ar contexto鈥 a ciertas expresiones 馃 Esto porque seg煤n entiendo, al toparte con ciertos operadores no tienes la seguridad de cu谩l es la expresi贸n completa que debes parsear hasta que logras tener un panorama m谩s amplio, y para obtener ese panorama es cuando se aplica la recursividad, es complicado de explicar pero imagino que van por ah铆 los tiros jaja

En este momento solo se me ocurre que Pratt Parsing puede funcionar en expresiones como el FOR cuando le indicamos de la forma 鈥渃l谩sica鈥 como va a funcionar es decir for(int i = 0; i < 3; i++) { } en donde tenemos que saber que el ++ se aplica incrementando en 1 a 鈥榠鈥 luego de ejecutada una iteraci贸n del FOR y en caso ++i seria previo a esta iteraci贸n. Pero no se del todo si mi intuici贸n va por buen camino

Uuuy, que interesante, me gusta como suena eso