`
clq9761
  • 浏览: 592499 次
  • 性别: Icon_minigender_1
  • 来自: 福建
社区版块
存档分类
最新评论

解释器模式

阅读更多

 解释器模式:给定一个语言,定义它的文法的一种表示。并定义一个解释器,这个解释器使用该表示来解释

                    语言中的句子。


1.如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。
   这样就可以构造一个解释器,该解释器通过解释这些句子来解决该问题。
 2.当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。
 3.使用解释器模式时,可以很容易地改变和扩展文法,因为该模式使用类来表示文法规则,

    可使用继承来改变或扩展该文法。  也比较容易实现文法,因为定义抽象语法树中各个节点的类的实现大体类似,

    这些类都易于直接编写。
 4.抽象语法树的每一个节点都代表一个语句,而在每个节点上都可以执行解释方法。这个解释方法的
    执行就代表这个语句被解释。
 5.一般系统中很多类使用相似的语法,可以使用一个解释器来代替为每一个规则实现一个解释器。
 6.不足:解释器模式为文法中的每一条规则至少定义了一个类,因此包含许多规则的文法可能难以管理和维护。
     建议当文法非常复杂时,使用其它的技术如语法分析程序或编译器生成器来处理。

 

/**
 * 抽象表达式,声明一个抽象的解释操作,这个接口为抽象语法树中的所有节点所共享。
 */
public abstract class AbstractExpression {
	
	public abstract void interpret(Context context);

}

 

/**
 * 终结符表达式,实现与文法中的终结符相关联的解释操作。
 * 文法中每一个终结符都有一个具体的终结表达式与之相对应。
 */
public class TerminalExpression extends AbstractExpression{
	@Override
	public void interpret(Context context) {		
		System.out.println("终端解释器");
	}
}

 

/**
 * 非终结符表达式,为文法中的非终结符实现解释操作。
 * 对文法中的每一条规则R1,R2...Rn都需要一个具体的非终结符表达式类。
 * 解释操作以递归方式调用上面所提到的代表R1,R2....Rn中的各个符号的实例变量。
 */
public class NonTerminalExpression extends AbstractExpression{

	@Override
	public void interpret(Context context) {		
		System.out.println("非终端解释器");
	}
}

 

/**
 * 包含解释器之外的一些全局信息。
 */
public class Context {
	
	private String intput;
	
	private String output;
	
	public String getIntput() {
		return intput;
	}
	public void setIntput(String intput) {
		this.intput = intput;
	}
	public String getOutput() {
		return output;
	}
	public void setOutput(String output) {
		this.output = output;
	}
}

 

public class Main {

	public static void main(String[] args) {

		// 构建表示该文法定义的语言中一个特定的句子的抽象语法树,调用解释操作。
		Context context = new Context();
		List<AbstractExpression> list = new ArrayList<AbstractExpression>();
		list.add(new TerminalExpression());
		list.add(new NonTerminalExpression());
		list.add(new TerminalExpression());
		list.add(new TerminalExpression());
		
		for(AbstractExpression expression:list){
			expression.interpret(context);
		}
	}
}

 

 解释器模式示例:音乐解释器事例(音符,音阶,音速等) 

 

 

 

/**
 * 演奏内容类
 */
public class PlayContext {
	
	// 演奏文本
	private String text;

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}
}

 

/**
 * 表达式类
 */
public abstract class Expression {
	
	//解释器
	public void interpret(PlayContext context){
		
		if(context.getText().length()==0){
			return;
		}else{
			
			// 获取playKey和playValue
			//(例:"O 3 E 0.5 G 0.5 A 3 "playKey为O,playValue为3)
			char playKey = context.getText().substring(0,1).charAt(0);
			context.setText(context.getText().substring(2));
			Double playValue = Double.parseDouble(context.getText()
									 .substring(0,context.getText().indexOf(" ")));
			
			// 获得playKey和playValue后,将其从演奏文本中移除
			// (例:"O 3 E 0.5 G 0.5 A 3 "变成"E 0.5 G 0.5 A 3 ")
			context.setText(context.getText().substring(context.getText().indexOf(" ")+1));
			
			execute(playKey, playValue);
		}
	}
	// 执行,抽象方法执行不同的文法子类,有不同的执行处理。
	public abstract void execute(char key,Double value);
}

 

 

/**
 * 音符类,终结符表达式
 */
public class Note extends Expression{

	@Override
	public void execute(char key, Double value) {
		
		String note = "";
		// 如果获得的key是C则演奏1(do),D则演奏2(Re)
		switch(key){		
			case 'C':
				note = "1";
				break;
			case 'D':
				note = "2";
				break;
			case 'E':
				note = "3";
				break;
			case 'F':
				note = "4";
				break;
			case 'G':
				note = "5";
				break;
			case 'A':
				note = "6";
				break;
			case 'B':
				note = "7";
				break;			
		}		
		System.out.print(note+" ");
	}
}

 

/**
 * 音阶类,终结符表达式
 */
public class Scale extends Expression{

	@Override
	public void execute(char key, Double value) {
		
		String scale = "";
		
		// 如果获得的key是O并且value是1则演奏低音,2则是中音,3则是高音
		switch(value.intValue()){		
			case 1:
				scale = "低音";
				break;
			case 2:
				scale = "中音";
				break;
			case 3:
				scale = "高音";
				break;
			
		}		
		System.out.print(scale+" ");
	}
}

 

/**
 * 音速类,终结符表达式
 */
public class Speed extends Expression{

	@Override
	public void execute(char key, Double value) {
		
		// T 1000 表示每节拍一秒,T 500 表示每节拍半秒
		String speed = "";
		if(value<500){
			speed = "快速";
		}else if(value>=1000){
			speed = "慢速";
		}else{
			speed = "中速";
		}
		System.out.print(speed+" ");
	}
}

 

public class Main {


	public static void main(String[] args) {

		PlayContext context = new PlayContext();
		System.out.println("上海滩:");
		context.setText("T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3");
	
		Expression expression = null;
		
		try{
			while (context.getText().length()>0){
				char str = context.getText().substring(0,1).charAt(0);
				switch (str){				
					case 'O':
						// 当首字母是O时,表达式实例化为音阶
						expression  = new Scale();
						break;
					case 'T':
						// 当首字母是T时,表达式实例化为音速
						expression  = new Speed();
						break;
					case 'C':
					case 'D':
					case 'E':
					case 'F':
					case 'G':	
					case 'A':
					case 'B':				
					case 'P':
						// 当首字母是CDEFGAB以及休止符P时,表达式实例化为音符
						expression  = new Note();
						break;
				}				
				expression.interpret(context);					
			}
		}catch(Exception e){
			e.printStackTrace();
		}	
	}
}

 

 输出结果如下:

 

上海滩:
中速 中音 3 5 6 3 5 5 2 3 5 6 高音 1 中音 6 5 1 3 

 

  • 大小: 74.9 KB
  • 大小: 44.7 KB
分享到:
评论

相关推荐

    设计模式之解释器模式Java版本实现

    解释器模式是一种行为设计模式,它允许我们定义一个语言的语法,并提供一个解释器来解析该语言中的句子。在Java中实现解释器模式,我们可以创建一个抽象表达式接口,然后为每种特定的语法结构创建一个具体表达式类。...

    解释器模式例子

    解释器模式是一种设计模式,它允许我们为特定的语言或表达式定义一个解析规则,并通过这个规则来解释执行这些语言或表达式。在本例子中,我们将深入探讨如何使用解释器模式来实现一个能够理解并执行机器人指令的系统...

    设计模式之解释器模式(Interpreter Pattern)

    **设计模式之解释器模式(Interpreter Pattern)** 解释器模式是一种行为设计模式,它提供了一种方式来表示语言的语法,并实现一个解释器用于解析这种语法的语句。这种模式通常用于小型、特定领域的语言(DSL)实现,...

    设计模式之解释器模式(Interpreter)

    **解释器模式(Interpreter)**是一种行为设计模式,它允许我们定义一种语言并为其创建一个解释器。在软件工程中,这种模式常用于处理简单的语言或表达式,例如配置文件、计算公式或者简单的脚本语言。通过使用解释...

    解释器模式代码示例

    解释器模式是一种设计模式,它允许我们为特定的语言或表达式定义一个解析规则,并提供一个解释器来执行这些规则。这种模式在处理简单的语言或结构化表达式时特别有用,例如配置文件、简单的数学表达式或者编程语言的...

    设计模式----解释器模式

    解释器模式(Interpreter Pattern)是25种经典设计模式之一,主要应用于创建一个解析语言或者表达式的方式。在本篇文章中,我们将深入探讨解释器模式的概念、结构以及其在实际开发中的应用。 解释器模式是一种行为...

    [行为型模式] 解释器模式的理解

    **行为型模式——解释器模式** 解释器模式是一种设计模式,它允许我们为特定语言创建一个解析器。这种模式在处理简单的语言或表达式时特别有用,例如配置文件、简单的编程语言或者数学表达式。解释器模式的核心在于...

    第十七讲:解释器模式

    解释器模式是一种设计模式,它允许我们为特定的语言或表达式定义一个解析规则。在软件工程中,这种模式常用于构建简单的语言解释器或者执行基于某种规则的逻辑。本讲将深入探讨解释器模式的原理、结构以及在实际开发...

    设计模式-解释器模式(讲解及其实现代码)

    **解释器模式**是一种行为设计模式,它提供了一种方式来表示语言的语法,并通过类和对象解析这种语法。在编程领域,解释器模式常用于创建简单的语言或表达式解析器,例如配置文件、计算器应用或者SQL查询的简化版本...

    72丨解释器模式:如何设计实现一个自定义接口告警规则功能?1

    解释器模式是一种设计模式,用于创建能解析特定语言或规则集的解释器。这种模式的核心在于定义一个表达式的抽象语法树(AST),并提供一个解释器来遍历这棵树,执行与之相关的操作。在 GoF 的《设计模式》书中,解释...

    Ansy.rar_C语言解释器_解释 语言_解释器_解释器模式_语言解释器

    《C语言解释器的实现与解释器模式解析》 在编程世界中,编译器和解释器是两种关键的工具,它们将高级编程语言转换为机器可以理解的指令。本篇我们将聚焦于“C语言解释器”的实现,以及在设计过程中所采用的“解释器...

    第19章_解释器模式.ppt

    如果在系统中某一特定类型的问题发生的频率很高,此时可以考虑将这些问题的实例表述为一个语言中的句子,因此可以构建一...解释器模式描述了如何构成一个简单的语言解释器,主要应用在使用面向对象语言开发的编译器中。

    Android解释器模式简单Demo

    Android解释器模式简单Demo,通过实现计算器四则运算,加减的逻辑,来领悟解释器这种模式的设计,同步博文:http://blog.csdn.net/qq_28690547/article/details/50707916

    c++设计模式-行为型模式-解释器模式

    c++设计模式-行为型模式-解释器模式;qt工程;c++简单源码; 解释器(Interpreter)模式的定义:给分析对象定义一个语言,并定义该语言的文法表示,再设计一个解析器来解释语言中的句子。也就是说,用编译语言的方式...

    解释器模式案例源码Demo

    解释器模式,也被称为解析器模式,是一种设计模式,它允许我们定义一套语言的文法,并为这个语言提供解释器。这种模式常用于构建小型、特定领域的语言,比如配置文件、简单的脚本或计算器等。在Java、Python等面向...

    解释器模式(Interpreter)原理图

    解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义一个语言的文法,并解析语言中的表达式。具体来说,解释器模式通过定义一个解释器来解释语言中的表达式,从而实现对语言的解析和执行。 在解释...

    【Java设计模式】解释器模式

    该应用程序使用Java中的解释器模式来解析和评估算术表达式,如“5 + 3 * 2”。在这里,解释器将表达式的每个部分转换为表示数字和操作的对象。这些对象遵循定义的语法,使应用程序能够根据算术规则正确理解和计算...

Global site tag (gtag.js) - Google Analytics