Introducción al desarrollo de intérpretes y lenguajes de programación

1

Construcción de Intérpretes en Python desde Cero

2

Programación en Platzi: Compiladores e Intérpretes en Español

Construcción del lexer o tokenizador

3

Análisis Léxico: Creación de Tokens para Léxers

4

Tipos de Datos y Tokens en Python

5

Programación: Construcción de Lexer con Test-Driven Development

6

Pruebas Regulares en Python: Implementación de un Lexer

7

Tokens y Palabras Clave en Python: Gestión Avanzada

8

Tokens y Reconocimiento de Funciones en Lexers

9

Implementación de Operadores en Lexer de Platzi

10

Operadores Lógicos en Lenguajes de Programación

11

REPL en Python: Crear, Ejecutar y Probar Lexer Básico

Construcción del parser o analizador sintáctico

12

Construcción de un AST para Lenguaje Platzi

13

Creación de Nodos Abstractos para AST en Python

14

Parser de Lenguaje: Creación de Nodos AST en Python

15

Parseo de Let Statements en Lenguaje Platzi

16

Funciones de Tokenización en Lenguaje de Programación

17

Errores comunes al programar en Python

18

Base de Datos Relacional: Diseño y Consultas Básicas

19

Parsing con Pratt: Manejo de Precedencia y Asociatividad

20

Pruebas de AST para parsers en Python

21

Parseo de Expresiones con Pratt Parsing en Python

22

Parseo de Identificadores en AST Python

23

Parseo de Identificadores: Expresiones en PlatziLang

24

Parseo de Enteros en Python: Implementación y Pruebas

25

Operadores Prefijo en Parsers: Diseño e Implementación

26

Operadores InFix: Implementación y Pruebas en Python

27

Parseo de Operadores InFix en Python

28

Expresiones Booleanas en Lenguaje Platzi: Implementación y Testeo

29

"Precedencia de Operadores en Python"

30

Parentesis en Expresiones Matemáticas en Python

31

Tipos de Datos en el Lenguaje de Programación Platzi

32

Programación de Parsers en Lenguajes de Programación

33

Parsiendo Funciones en Lenguaje Platzi: Creación y Pruebas de Nodos AST

34

Programación Funcional: Construcción y Parsing en Python

35

Parentesis: Uso y Función en Llamadas a Procedimientos

36

Precedencia de Llamadas en Parsers: Implementación en AST

37

Parseo de Expresiones en LET y RETURN Statements

38

Construcción del REPL en Python: Lexer y Parser en Sintaxis Abstracta

Evaluación o análisis semántico

39

Análisis Semántico en Lenguajes de Programación

40

Evaluación de Código: Intérpretes vs Compiladores

41

Representación de Objetos en Python: Enteros, Booleanos y Null

42

Evaluación de enteros en Python: Crear y probar evaluador recursivo

43

Diseño de Patrones Singleton en Python

44

Semántica de Prefijos en Lenguajes de Programación

45

Evaluación de Expresiones Infix en Python

46

Condicionales en Lenguajes de Programación

47

Evaluación del Statement Return en Python

48

Manejo de Errores Semánticos en Lenguajes de Programación

49

Declaración de Variables y Ambientes en Lenguajes de Programación

50

Entornos y Cláusulas en Python: Manejo y Error Handling Avanzado

51

Declaración de Procedimientos en Lenguaje Platzi

52

Implementación y uso de closures en Platzi Programming

Mejora del intérprete

53

Implementación de strings en un intérprete Python

54

Operaciones en Strings: Concatenación y Comparación

55

Construcción de Funciones Built-in en Python

56

Función Longitud en Lenguaje Platzi

Siguientes pasos

57

Creación de Listas y Diccionarios en Python Avanzado

58

Construcción de intérpretes con Python desde cero

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Entornos y Cláusulas en Python: Manejo y Error Handling Avanzado

50/58
Recursos

¿Cómo se gestiona el ambiente en un lenguaje de programación?

Los lenguajes de programación funcionan con estructuras llamadas ambientes. Un ambiente es, esencialmente, un diccionario que almacena nombres de variables y sus valores asociados. Esta estructura es fundamental para que los programas puedan acceder y modificar estos valores según sea necesario. Al definir nuevos valores o acceder a ellos, los ambientes juegan un rol crucial. En particular, cuando hablamos de funciones, estas generan su propio ambiente, conocido como closures. Este concepto está estrechamente relacionado con el scope, o el ámbito de visibilidad de variables dentro de un programa.

¿Cuáles son los errores que debemos manejar en nuestro lenguaje?

En el diseño de un lenguaje de programación, es crucial manejar adecuadamente las situaciones en las que ocurren errores. Existen dos tipos principales de errores que debemos considerar:

  1. Manejo de errores por identificador desconocido: Ocurre cuando intentamos acceder a una variable que no está registrada en nuestro ambiente. Es esencial tener un mecanismo para detectar y gestionar este tipo de error.
  2. Declaración de variables y expresiones: Todas las expresiones deben estar presentes y ser válidas dentro del ambiente. Esto asegura que el programa pueda ejecutarse correctamente y que las variables tengan un significado en su contexto.

¿Cómo implementamos errores y declaraciones en el código?

La implementación de errores y la declaración de variables se logra mediante una serie de pasos en el código. Vamos a explorar cómo estructurar esto en Python:

# Declaramos un nuevo tipo de error para identificadores desconocidos
def error_identifier_desconocido(identificador):
    return f"Identificador no encontrado: {identificador}"

# Evaluación de nodos let statement
def evaluar_let_statement(nodo, ambiente):
    if nodo.tipo == 'ASTLetStatement':  # Verificamos el tipo de nodo
        valor_evaluado = evaluar(nodo.valor, ambiente)  # Evaluación recursiva del valor
        nombre_variable = nodo.nombre
        ambiente[nombre_variable] = valor_evaluado  # Guardamos el valor en el ambiente

# Evaluación de nodos identifier
def evaluar_identifier(nodo, ambiente):
    try:
        return ambiente[nodo.nombre]  # Intentamos obtener el valor del ambiente
    except KeyError:
        raise error_identifier_desconocido(nodo.nombre)  # Manejamos el error si no existe

¿Cómo realizar operaciones y gestionar múltiples líneas en el REPL?

El Read-Eval-Print Loop (REPL) es una herramienta fantástica para ejecutar código interactivo. Sin embargo, un REPL funcional debe manejar adecuadamente múltiples líneas de código. Para ello, ajustamos el REPL para recordar y procesar líneas anteriores, permitiendo la ejecución de programas más complejos:

# Inicializamos una lista para escanear
scan = []

# Función para manejar múltiples líneas
def manejar_multilineas_entrada(source, scanner):
    scanner.append(source)  # Almacenamos el source actual
    return "\n".join(scanner)

# Uso en REPL
while True:
    entrada = input(">> ")
    programa_completo = manejar_multilineas_entrada(entrada, scan)
    resultado = execute(programa_completo)
    print(resultado)

Este código nos permite declarar variables, realizar operaciones aritméticas y almacenar resultados. Ahora, el REPL puede operar de manera efectiva con múltiples líneas y manejar variables a través de sesionas, mejorando significativamente la experiencia de codificación.

¿Qué sigue en la construcción del lenguaje?

Nuestra aventura en la creación de un lenguaje de programación aún no termina. Aunque hemos logrado declarar variables, hacer operaciones aritméticas y manejar condiciones, aún falta un elemento esencial: las funciones. Las funciones nos permitirán reutilizar código y estructuras lógicas más complejas. Esto lo abordaremos en la próxima clase, llevando nuestro lenguaje a un nuevo nivel de funcionalidad.

Si tienes preguntas, comentarios o simplemente deseas compartir cómo va tu progreso, te invitamos a expresarlo. Construir un lenguaje de programación no es tarea fácil, y cada paso es un gran logro. ¡Sigue aprendiendo y explorando este apasionante mundo!

Aportes 6

Preguntas 0

Ordenar por:

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

Ahhhhh!!! ¡Ya tiene vida SigmaF! 😱

Me emocioné mucho cuando vi el multilínea funcionando, pero después me di cuenta de que si metes un error y quieres continuar, aunque o que escribas ahora esté bien, el error anterior sigue ahí.

¡Siiiiiiiiiii! Ahhhhhh que emocionanteeeeee, y creo que lo más emocionante es saber cómo funciona por dentro, y lo aún más emocionante es saber que puedo modificarlo y meterle cosas nuevas!!!
.
Pero mira que hermoso se ve, mira que bonito se ven todos esos tests pasando 🥺❤
.

Me siento como el meme de megamente “lo logre” jajajaja. Estoy ansioso de saber aun mas cosas para enriquecer el lenguaje de programación! =)

En el momento que escribí variable a = 5; variable b = 10; variable c = a + b; c; y le di enter y vi un 15. Dije ¡Whoaa! Tuve la sensación de que todos los esfuerzos realizados hasta este punto habrían valido la pena.

Uuuuh, que emoción ver como todo va funcionando correctamente