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

1

Construcción de Intérpretes de Software en Python 3.8

2

Creación de Compiladores e Intérpretes con Lenguaje Platzi

Construcción del lexer o tokenizador

3

Análisis Léxico: Construcción de un Léxer para Intérpretes

4

Definición de Tokens en Lenguaje de Programación Platzi

5

Desarrollo de un Lexer con Test-Driven Development

6

Pruebas de Operadores, Delimitadores y Fin de Archivo en Lexer Python

7

Lexer: Identificación de Keywords y Tokens Complejos

8

Reconocimiento de Funciones en Lexer de Lenguaje de Programación

9

Implementación de Operadores y Condicionales en Lexer de Platzi

10

Implementación de Operadores de Dos Caracteres en Lexer

11

Creación de un REPL en Python para Lenguaje de Programación

Construcción del parser o analizador sintáctico

12

Construcción de un Parser para el Lenguaje Platzi

13

Definición de Nodos Abstractos para Árbol de Sintaxis (AST) en Python

14

Desarrollo de un AST en Python: Creación de la Clase Programa

15

Parseo de Let Statements en Lenguaje Platzi

16

Implementación de funciones advanced y expected tokens

17

Manejo de Errores en Parsers con Test Driven Development

18

Parseo de Return Statements en Lenguaje Platzi

19

Técnicas de Parsing: Top-Down y Bottom-Up

20

Pruebas de AST para Let y Return Statements en Parsers

21

Pratt Parsing: Implementación y Registro de Funciones en Python

22

Parseo de Identificadores en Lenguajes de Programación

23

Parseo de Expression Statements en Platzi Parser

24

Parseo de Enteros en Lenguaje Platzi

25

Implementación de Operadores Prefijo en Parsers

26

Operadores InFix en Expresiones: Implementación y Pruebas

27

Implementación de Operadores InFix en un Parser

28

Expresiones Booleanas en el Lenguaje de Programación Platzi

29

Evaluación de Precedencia y Testeo de Booleanos en Parsers

30

Evaluación de Expresiones Agrupadas en un Parser

31

Parseo de Condicionales en Lenguaje Platzi

32

Implementación de Condicionales en Parser de Lenguaje

33

Parsing de Funciones en Lenguaje Platzi: Creación de Nodos AST

34

Construcción de nodos de función en un parser AST

35

Llamadas a Funciones en Lenguajes de Programación

36

Implementación de llamadas a funciones en un parser con AST

37

Parseo de Expresiones en LET y RETURN Statements

38

Implementación de REPL para Árbol de Sintaxis Abstracta

Evaluación o análisis semántico

39

Evaluación Semántica en Lenguajes de Programación

40

Estrategias de Evaluación en Lenguajes de Programación

41

Representación de Nodos AST y Objetos en Python

42

Evaluación de Expresiones en JavaScript y Python

43

Implementación del Patrón Singleton para Booleanos y Nulos

44

Evaluación de Prefijos en Lenguaje de Programación Platzi

45

Evaluación de Expresiones Infix en Lenguaje Platzi

46

Evaluación de Condicionales en Lenguaje de Programación Platzi

47

Evaluación y Uso del Return Statement en Programación

48

Manejo de Errores Semánticos en Lenguaje Platzi

49

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

50

Manejo de Ambientes y Variables en Lenguajes de Programación

51

Declaración de Funciones en Lenguaje de Programación Platzi

52

Implementación de Llamadas a Funciones en PlatziLang

Mejora del intérprete

53

Implementación de Strings en un Intérprete de Lenguaje de Programación

54

Operaciones de Concatenación y Comparación de Strings en Intérprete

55

Implementación de Funciones Built-in en Python

56

Implementación de Built-ins en el Lenguaje Platzi

Siguientes pasos

57

Desarrollo de Lenguaje de Programación y Estructuras de Datos en Python

58

Construcción de un Intérprete en Python desde Cero

No tienes acceso a esta clase

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

Operaciones de Concatenación y Comparación de Strings en Intérprete

54/58
Recursos

¿Cómo trabajar con strings en un intérprete?

Trabajar con strings en un intérprete puede parecer simple en la superficie, pero en realidad involucra varias etapas claves de procesamiento, desde la declaración de tokens hasta la evaluación de objetos. Ahora bien, una vez que se tiene esta base, es hora de realizar operaciones reales con los strings. La operación más importante y comúnmente utilizada es la concatenación, que permite unir varios strings según las necesidades. Además, la comparación de strings es igualmente esencial para verificar si un string es igual o distinto de otro. Aquí exploraremos cómo implementar estas operaciones de concatenación y comparación, especialmente en contextos donde las operaciones son infixas. También es crucial el manejo de errores semánticos en situaciones donde, a pesar de que la sintaxis sea correcta, la operación carezca de sentido.

¿Cómo manejar las operaciones de strings y errores semánticos?

En el desarrollo de un lenguaje de programación, es fundamental diferenciar entre sintaxis y semántica. Operaciones como sumar dos strings significan concatenación, mientras que restar dos strings carece de sentido semántico. Nuestro intérprete debe reconocer estas diferencias y lanzar errores cuando una operación no válida se intente ejecutar. Por ejemplo, aunque la sintaxis de foo - bar sea correcta, semánticamente no significa nada. Manejar estos errores ayuda a crear un lenguaje robusto y confiable.

¿Qué pruebas son necesarias para garantizar las operaciones correctas?

Es esencial realizar pruebas para garantizar que las operaciones implementadas funcionen como se espera. Aquí te dejo algunas pruebas críticas a considerar:

  1. Pruebas de concatenación de strings: Un test clave es unir strings como foo + bar y verificar que el resultado sea foobar. También podemos evaluar concatenaciones más complejas, como hello + " " + world, que debería dar hello world.
def test_string_concatenation():
    # Concatenamos strings y verificamos el resultado
    resultado = evaluar('foo + bar')  # Esperamos 'foobar'
    assert resultado == 'foobar'

    resultado = evaluar('hello + " " + world')
    assert resultado == 'hello world'
  1. Pruebas de comparación de strings: Comparar a == a debe ser verdadero, mientras que a != a es falso. Comparaciones como a == b deben devolver falso y a != b verdadero. Las comparaciones son esenciales para el control lógico dentro del intérprete.
def test_string_comparison():
    assert evaluar('a == a') is True
    assert evaluar('a != a') is False
    assert evaluar('a == b') is False
    assert evaluar('a != b') is True

¿Cómo integrar las funciones de evaluación de strings?

Después de establecer las pruebas, se debe modificar el evaluador para incluir estas operaciones. Aprovechamos el método evaluate_infix_expression para procesar las operaciones entre strings. Allí identificamos los tipos y, dependiendo del operador, decidimos la acción:

  • Para la suma (+), concatenamos los strings.
  • Para igualdad (==) o desigualdad (!=), devolvemos un objeto booleano verdadero o falso.
def evaluate_string_infix_expression(operator, left, right):
    left_val = left.value
    right_val = right.value

    if operator == "+":
        return StringObject(value=left_val + right_val)
    elif operator == "==":
        return BooleanObject(value=left_val == right_val)
    elif operator == "!=":
        return BooleanObject(value=left_val != right_val)
    else:
        # Genera un error para operadores desconocidos
        return ErrorObject(message=f"Unknown infix operator: {operator}")

Este enfoque asegura que nuestro intérprete procese correctamente las operaciones sobre strings y refuerza un control lógico robusto al manejar errores semánticos. Mantente motivado y sigue explorando cómo estas funciones pueden expandirse con nuevas características, como las librerías estándares o los built-ins, que estaremos explorando en siguientes etapas. ¡El conocimiento es un viaje interminable, y cada paso te acerca más a ser un experto en programación y diseño de lenguajes!

Aportes 3

Preguntas 0

Ordenar por:

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

Jajajaja que broma ni que nada, ¡arriba Platzi! #BestEscuelaEver
.

.
No puedo creer que haya hecho un lenguaje de programación xD Está genial jaja

Profe, eso no era un chiste, eran hechos
¡Arriba Platzi!

Estuve media hora buscando como solucionar un error que me salía en los tests y me di cuenta que solo era que había puesto en los test de comparación que “a” == “a”, False jajajaja. Pero bueno, valió la pena, ahora tenemos operaciones con strings BJ