定义:给定一个语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子
类比:学习一门新语言,你需要知道它的语法和词汇,然后用这些规则去理解和翻译这门语言。
应用场景
- 解释一种特定语言或语法
- 将一个复杂的表达式分解成更简单的表达式并逐步求值时
优缺点
- 优点
- 易于实现简单文法的解释器
- 易于扩展新的文法规则
- 缺点
- 复杂文法的解释器难以维护
- 性能可能较低,因为每个文法规则通常需要一个类
实现代码
// 抽象表达式接口
interface AbstractExpression {
interpret(context: string): string;
}
// 终结符表达式
class TerminalExpression implements AbstractExpression {
private data: string;
constructor(data: string) {
this.data = data;
}
public interpret(context: string): string {
if (context.includes(this.data)) {
return `TerminalExpression: ${this.data} is found in ${context}`;
}
return `TerminalExpression: ${this.data} is not found in ${context}`;
}
}
// 非终结符表达式
class OrExpression implements AbstractExpression {
private expr1: AbstractExpression;
private expr2: AbstractExpression;
constructor(expr1: AbstractExpression, expr2: AbstractExpression) {
this.expr1 = expr1;
this.expr2 = expr2;
}
public interpret(context: string): string {
return `${this.expr1.interpret(context)} OR ${this.expr2.interpret(context)}`;
}
}
// 客户端代码
const expr1 = new TerminalExpression('Hello');
const expr2 = new TerminalExpression('World');
const orExpr = new OrExpression(expr1, expr2);
console.log(orExpr.interpret('Hello JavaScript'));
console.log(orExpr.interpret('Python World'));
console.log(orExpr.interpret('Java Programming'));