Operaciones de Concatenación y Comparación de Strings en Intérprete
Clase 54 de 58 • Curso de Creación de Lenguajes de Programación: Intérpretes
Resumen
¿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:
- Pruebas de concatenación de strings: Un test clave es unir strings como
foo + bar
y verificar que el resultado seafoobar
. También podemos evaluar concatenaciones más complejas, comohello + " " + world
, que debería darhello 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'
- Pruebas de comparación de strings: Comparar
a == a
debe ser verdadero, mientras quea != a
es falso. Comparaciones comoa == b
deben devolver falso ya != 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!