# Propósito
El patrón Interpreter (Intérprete) proporciona una manera de evaluar sentencias en un lenguaje, permitiendo interpretar dichas sentencias dentro del programa.
De forma simple: Como un traductor que toma instrucciones complicadas y las convierte en pasos simples que podemos seguir.
# Problema
Necesidad de procesar lenguajes o expresiones definidos por reglas gramaticales (compiladores, motores de reglas, etc.).
# Solución
Implementar una clase por cada regla gramatical. Cada regla es una expresión que puede ser interpretada para evaluar la sentencia.
# Ãrbol de Sintaxis Abstracta (AST)
Representación clave de la estructura de una expresión.
-
Nodos Hoja: Valores u operandos (números).
-
Nodos Internos: Operadores (+, -).
# Estructura
# Participantes
- AbstractExpression: Declara la operación interpretativa.
- TerminalExpression: Interpretación para símbolos finales.
- NonTerminalExpression: Reglas gramaticales complejas.
- Context: Información global de la interpretación.
- Client: Construye el AST e invoca la interpretación.
# Cuándo Usarlo
-
Lenguajes representables como árboles de sintaxis abstracta.
-
Interpretar notaciones simples o DSLs.
# Ventajas
-
verified
Flexibilidad: Nuevos tipos de expresiones.
-
verified
Extensibilidad: Fácil de ampliar la gramática.
# Desventajas
-
warning
Complejidad: Difícil para gramáticas pesadas.
-
warning
Rendimiento: Interpretación menos eficiente que compilación.
# Ejemplo: Expresiones Matemáticas
Interpretación de "1 + 2". Descomposicion en partes: constante, operador, constante.
# Código Java
interface Expression { int interpret(); }
class NumberExpression implements Expression {
private int number;
public int interpret() { return number; }
}
class AddExpression implements Expression {
private Expression left, right;
public int interpret() { return left.interpret() + right.interpret(); }
}
# Mapeo Participantes
- Expression: AbstractExpression.
- NumberExpression: TerminalExpression.
- AddExpression: NonterminalExpression.
- Client: Evaluador.
# Conclusiones
Proporciona flexibilidad para construir sistemas que necesitan "entender" entradas estructuradas dinámicamente.
# Patrones relacionados
Composite
Para construir el árbol de sintaxis abstracta.
Flyweight
Para compartir instancias de TerminalExpression.