정의
인터프리터 모델은 클래스의 행동 모델입니다. 언어가 주어지면 인터프리터 모델은 문법 표현을 정의하고 동시에 통역사를 제공 할 수 있습니다. 클라이언트는이 인터프리터를 사용하여 언어로 문장을 해석 할 수 있습니다.
의향
언어가 주어지고 문법적 표현을 정의하고 인터프리터를 정의하면이 인터프리터는 식별자를 사용하여 언어로 문장을 해석합니다.
주로 문제 해결
고정 된 문법에 대한 문장을 설명하는 인터프리터 구성
장점과 단점
이점:
- 우수한 확장 성과 유연성
- 표현을 해석하는 새로운 방법 추가
- 간단한 문법을 쉽게 구현
단점 :
- 적은 사용 시나리오
- 복잡한 문법을 유지하기가 더 어렵습니다.
- 클래스 확장을 유발합니다.
- 재귀 호출 방식을 사용하여 효율성이 낮음
구조
관련된 역할 :
- 추상 표현 (Expression) 역할 : 모든 구체적인 표현 역할이 구현해야하는 추상 인터페이스를 선언합니다.이 인터페이스는 주로 해석 작업이라고하는 해석 방법입니다.
- TerminalExpression (TerminalExpression) 역할 : 이것은 특정 역할입니다.
- 주로 인터 프리트 메서드 인 추상 표현의 역할에 필요한 인터페이스 구현
- 문법의 각 터미널 기호에는 해당하는 특정 터미널 표현식이 있습니다.
- 비 터미널 표현식 (NonterminalExpression) 역할 : 특정 역할입니다.
- 문법 R = R1R2 ... Rn의 각 규칙에는 특정 비 터미널 표현식 클래스가 필요합니다.
- R = R1R2 ... Rn의 각 기호는 정적 유형 표현식의 인스턴스 변수를 보유합니다.
- 해석 연산의 해석 방법을 구현하고 해석 연산은 R1R2 ... Rn의 심볼을 나타내는 위에서 언급 한 인스턴스 변수를 재귀 적으로 호출합니다.
- 클라이언트 역할 : 추상 구문 트리 구축, 통화 해석 작업
- 컨텍스트 역할 : 변수의 실제 값 등과 같은 인터프리터 외부의 일부 전역 정보를 제공합니다.
예
추상 표현 역할 :
/**
* 这个抽象类代表终结类和非终结类的抽象化
*/
public abstract class Expression {
/** 以环境类为准,本方法解释给定的任何一个表达式 */
public abstract boolean interpret(Context ctx);
/** 检验两个表达式在结构上是否相同 */
public abstract boolean equals(Object o);
/** 返回表达式的hashCode */
public abstract int hashCode();
/** 将表达式转换为字符串 */
public abstract String toString();
}
최종 표현식 역할 :
상수 객체는 부울 상수를 나타냅니다.
public class Constant extends Expression {
private boolean value;
public Constant(boolean value) {
this.value = value;
}
/** 解释操作 */
@Override
public boolean interpret(Context ctx) {
return value;
}
/** 检验两个表达式在结构上是否相同 */
@Override
public boolean equals(Object o) {
if (o != null && o instanceof Constant) {
return this.value = ((Constant)o).value;
}
return false;
}
/** 返回表达式的hashCode */
@Override
public int hashCode() {
return (this.toString()).hashCode();
}
/** 将表达式转换为字符串 */
@Override
public String toString(){
return new Boolean(value).toString();
}
}
Variable 객체는 명명 된 변수를 나타냅니다.
public class Variable extends Expression {
private String name;
public Variable(String name) {
this.name = name;
}
/** 解释操作 */
@Override
public boolean interpret(Context ctx) {
return ctx.lookup(this);
}
/** 检验两个表达式在结构上是否相同 */
@Override
public boolean equals(Object o) {
if (o != null && o instanceof Variable) {
return this.name.equals(((Variable)o).name);
}
return false;
}
/** 返回表达式的hashCode */
@Override
public int hashCode() {
return (this.toString()).hashCode();
}
/** 将表达式转换为字符串 */
@Override
public String toString() {
return name;
}
}
비 터미널 식 역할 :
두 부울 식의 논리적 AND 연산으로 새 부울 식을 제공하는 작업을 나타냅니다.
public class And extends Expression {
private Expression left, right;
public And(Expression left, Expression right) {
this.left = left;
this.right = right;
}
/** 解释操作 */
@Override
public boolean interpret(Context ctx) {
return left.interpret(ctx) && right.interpret(ctx);
}
/** 检验两个表达式在结构上是否相同 */
@Override
public boolean equals(Object o) {
if (o != null && o instanceof And) {
return this.left.equals(((And)o).left) && this.right.equals(((And)o).right);
}
return false;
}
/** 返回表达式的hashCode */
@Override
public int hashCode() {
return (this.toString()).hashCode();
}
/** 将表达式转换为字符串 */
@Override
public String toString() {
return "(" + left.toString() + " AND " + right.toString() + ")";
}
}
두 개의 부울 식에 의한 논리 OR 연산으로 새 부울 식을 제공하는 작업을 나타냅니다.
public class Or extends Expression {
private Expression left, right;
public Or(Expression left, Expression right) {
this.left = left;
this.right = right;
}
/** 解释操作 */
@Override
public boolean interpret(Context ctx) {
return left.interpret(ctx) || right.interpret(ctx);
}
/** 检验两个表达式在结构上是否相同 */
@Override
public boolean equals(Object o) {
if (o != null && o instanceof Or) {
return this.left.equals(((Or)o).left) && this.right.equals(((Or)o).right);
}
return false;
}
/** 返回表达式的hashCode */
@Override
public int hashCode() {
return (this.toString()).hashCode();
}
/** 将表达式转换为字符串 */
@Override
public String toString() {
return "(" + left.toString() + " OR " + right.toString() + ")";
}
}
논리 부정을 통해 부울식이 제공하는 새 부울 식의 연산을 나타냅니다.
public class Not extends Expression {
private Expression exp;
public Not(Expression exp) {
this.exp = exp;
}
/** 解释操作 */
@Override
public boolean interpret(Context ctx) {
return !exp.interpret(ctx);
}
/** 检验两个表达式在结构上是否相同 */
@Override
public boolean equals(Object o) {
if (o != null && o instanceof Not) {
return this.exp.equals(((Not)o).exp);
}
return false;
}
/** 返回表达式的hashCode */
@Override
public int hashCode() {
return (this.toString()).hashCode();
}
/** 将表达式转换为字符串 */
@Override
public String toString() {
return "(Not " + exp.toString() + ")";
}
}
환경 클래스는 변수에서 부울 값으로의 매핑을 정의합니다.
public class Context {
private HashMap map = new HashMap();
public void assign(Variable var, boolean value) {
map.put(var, new Boolean(value));
}
public boolean lookup(Variable var) {
Boolean value = (Boolean) map.get(var);
if (value == null) {
throw new IllegalArgumentException();
}
return value.booleanValue();
}
}
클라이언트 역할 :
public class Client {
private static Context ctx;
private static Expression exp;
public static void main(String[] args) {
ctx = new Context();
Variable x = new Variable("x");
Variable y = new Variable("y");
Constant c = new Constant(true);
ctx.assign(x, false);
ctx.assign(y, true);
exp = new Or(new And(c, x), new And(y, new Not(x)));
System.out.println("x= " + x.interpret(ctx));
System.out.println("y= " + y.interpret(ctx));
System.out.println(exp.toString() + " = " + exp.interpret(ctx));
}
}
적용 가능한 상황
- 시스템에는 설명 할 간단한 언어가 있습니다.
- 일부 반복되는 문제는이 간단한 언어로 표현할 수 있습니다.
- 효율성은 주요 고려 사항이 아닙니다.