A számítógép programozásban az értelmező minta egy tervezési minta, mely meghatározza, hogyan értékeljen ki mondatokat egy nyelv. Az alap ötlet az volt, hogy legyen egy osztály minden szimbólumra (terminális és nem terminális) egy erre specializált nyelvben. Egy nyelvben a mondat szintaxis fája egy példánya az összetétel mintának, és a mondat megértésére használja a kliens. Lásd még összetétel minta.
Értelmező mintát használók
Speciális adatbázis lekérdező nyelvek, mint például az SQL
Speciális programozási nyelvek, amelyek általában kommunikációs protokollok leírására használnak.
A legtöbb általános célú programozási nyelv valójában magába foglal néhány más speciális nyelvet.
Virtuális gép Javához és szkript nyelvekhez.
Struktúra
Az értelmező minta az alábbi struktúrával írható le:
Példák
BNF, C# és JAVA nyelveken.
BNF
A következő "Backus-Naur-Formula" (BNF) példa illusztrálja az interpreter mintát. A nyelvtan:
expression ::= plus | minus | variable | number
plus ::= expression expression '+'
minus ::= expression expression '-'
variable ::= 'a' | 'b' | 'c' | ... | 'z'
digit = '0' | '1' | ... | '9'
number ::= digit | digit number
Definiál egy nyelvet, amellyel a fordított lengyel jelöléssel lehet kifejezéseket megadni. Például az alábbiakat:
a b +
a b c + -
a b + c a - -
C#
Ez a strukturális kód bemutatja az értelmező mintát, amely egy definiált nyelvtant alkalmaz.
//IVSR: Interpreter design patternnamespaceIVSR.DesignPaterns.Interpreter{// "Context"classContext{}// "AbstractExpression"abstractclassAbstractExpression{publicabstractvoidInterpret(Contextcontext);}// "TerminalExpression"classTerminalExpression:AbstractExpression{publicoverridevoidInterpret(Contextcontext){Console.WriteLine("Called Terminal.Interpret()");}}// "NonterminalExpression"classNonterminalExpression:AbstractExpression{publicoverridevoidInterpret(Contextcontext){Console.WriteLine("Called Nonterminal.Interpret()");}}classMainApp{staticvoidMain(){Contextcontext=newContext();// Usually a treeArrayListlist=newArrayList();// Populate 'abstract syntax tree'list.Add(newTerminalExpression());list.Add(newNonterminalExpression());list.Add(newTerminalExpression());list.Add(newTerminalExpression());// Interpretforeach(AbstractExpressionexpinlist){exp.Interpret(context);}// Wait for userConsole.Read();}}}
Java
A következő példa egy értelmező minta megvalósítását mutatja be, ahol minden nyelvtani szabályra van egy osztály.
importjava.util.Map;interfaceExpression{publicintinterpret(Map<String,Expression>variables);}classNumberimplementsExpression{privateintnumber;publicNumber(intnumber){this.number=number;}publicintinterpret(Map<String,Expression>variables){returnnumber;}}classPlusimplementsExpression{ExpressionleftOperand;ExpressionrightOperand;publicPlus(Expressionleft,Expressionright){leftOperand=left;rightOperand=right;}publicintinterpret(Map<String,Expression>variables){returnleftOperand.interpret(variables)+rightOperand.interpret(variables);}}classMinusimplementsExpression{ExpressionleftOperand;ExpressionrightOperand;publicMinus(Expressionleft,Expressionright){leftOperand=left;rightOperand=right;}publicintinterpret(Map<String,Expression>variables){returnleftOperand.interpret(variables)-rightOperand.interpret(variables);}}classVariableimplementsExpression{privateStringname;publicVariable(Stringname){this.name=name;}publicintinterpret(Map<String,Expression>variables){if(null==variables.get(name))return0;//Either return new Number(0).returnvariables.get(name).interpret(variables);}}importjava.util.Map;importjava.util.Stack;classEvaluatorimplementsExpression{privateExpressionsyntaxTree;publicEvaluator(Stringexpression){Stack<Expression>expressionStack=newStack<Expression>();for(Stringtoken:expression.split(" ")){if(token.equals("+")){ExpressionsubExpression=newPlus(expressionStack.pop(),expressionStack.pop());expressionStack.push(subExpression);}elseif(token.equals("-")){// it's necessary remove first the right operand from the stackExpressionright=expressionStack.pop();// ..and after the left oneExpressionleft=expressionStack.pop();ExpressionsubExpression=newMinus(left,right);expressionStack.push(subExpression);}elseexpressionStack.push(newVariable(token));}syntaxTree=expressionStack.pop();}publicintinterpret(Map<String,Expression>context){returnsyntaxTree.interpret(context);}}
Végül értékeli a kifejezést : "w x z - +" with w = 5, x = 10, and z = 42.
importjava.util.Map;importjava.util.HashMap;publicclassInterpreterExample{publicstaticvoidmain(String[]args){Stringexpression="w x z - +";Evaluatorsentence=newEvaluator(expression);Map<String,Expression>variables=newHashMap<String,Expression>();variables.put("w",newNumber(5));variables.put("x",newNumber(10));variables.put("z",newNumber(42));intresult=sentence.interpret(variables);System.out.println(result);}}
Ez a szócikk részben vagy egészben az Interpreter pattern című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.