El interpreter es un patrón de diseño que, dado un lenguaje, define una representación para su gramática junto con un intérprete del lenguaje.
Se usa para definir un lenguaje para representar expresiones regulares que representen cadenas a buscar dentro de otras cadenas. Además, en general, para definir un lenguaje que permita representar las distintas instancias de una familia de problemas.
Ejemplos
Java
El siguiente ejemplo en Java muestra como un lenguaje de propósito general podría interpretar un lenguaje más especializado, aquí la Notación polaca inversa.
La salida es:
'42 2 1 - +' equals 43
importjava.util.*;interfaceExpression{publicvoidinterpret(Stack<Integer>s);}classTerminalExpression_NumberimplementsExpression{privateintnumber;publicTerminalExpression_Number(intnumber){this.number=number;}publicvoidinterpret(Stack<Integer>s){s.push(number);}}classTerminalExpression_PlusimplementsExpression{publicvoidinterpret(Stack<Integer>s){s.push(s.pop()+s.pop());}}classTerminalExpression_MinusimplementsExpression{publicvoidinterpret(Stack<Integer>s){inttmp=s.pop();s.push(s.pop()-tmp);}}classParser{privateArrayList<Expression>parseTree=newArrayList<Expression>();// only one NonTerminal Expression herepublicParser(Strings){for(Stringtoken:s.split(" ")){if(token.equals("+"))parseTree.add(newTerminalExpression_Plus());elseif(token.equals("-"))parseTree.add(newTerminalExpression_Minus());// ...elseparseTree.add(newTerminalExpression_Number(Integer.valueOf(token)));}}publicintevaluate(){Stack<Integer>context=newStack<Integer>();for(Expressione:parseTree)e.interpret(context);returncontext.pop();}}classInterpreterExample{publicstaticvoidmain(String[]args){System.out.println("'42 2 1 - +' equals "+newParser("42 2 1 - +").evaluate());}}