博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之解释器
阅读量:4605 次
发布时间:2019-06-09

本文共 2083 字,大约阅读时间需要 6 分钟。

定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。

类型:行为类模式

类图:

        解释器模式是一个比较少用的模式,本人之前也没有用过这个模式。下面我们就来一起看一下解释器模式。

 

解释器模式的结构

  • 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpret()方法,称为解释操作。具体解释任务由它的各个实现类来完成,具体的解释器分别由终结符解释器TerminalExpression和非终结符解释器NonterminalExpression完成。
  • 终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。终结符一半是文法中的运算单元,比如有一个简单的公式R=R1+R2,在里面R1和R2就是终结符,对应的解析R1和R2的解释器就是终结符表达式。                                
  • 非终结符表达式:文法中的每条规则对应于一个非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,+就是非终结符,解析+的解释器就是一个非终结符表达式。非终结符表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式。
  • 环境角色:这个角色的任务一般是用来存放文法中各个终结符所对应的具体值,比如R=R1+R2,我们给R1赋值100,给R2赋值200。这些信息需要存放到环境角色中,很多情况下我们使用Map来充当环境角色就足够了。

代码实现

package com.example.zztest.jieshi.express;

//抽象表达式

public abstract class AbstractExpression {

public abstract void Interpret(MyContext con);

}

package com.example.zztest.jieshi.express;

//终结符表达式

public class TerminalExpression extends AbstractExpression{

public void Interpret(MyContext con) {

// TODO Auto-generated method stub
System.out.println("终端解释器");
}

}

package com.example.zztest.jieshi.express;

//非终结符表达式
public class NonTerminalExpression extends AbstractExpression{

@Override

public void Interpret(MyContext con) {
// TODO Auto-generated method stub
System.out.println("no终端解释器");
}

}

package com.example.zztest.jieshi.express;

public class MyContext {

private String input;

private String output;
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
public String getOutput() {
return output;
}
public void setOutput(String output) {
this.output = output;
}
}

 

调用测试:

package com.example.zztest.jieshi.express;

import java.util.ArrayList;

import java.util.List;

public class ExpClient {

public static void test(){

MyContext myc=new MyContext();
List<AbstractExpression> list=new ArrayList<AbstractExpression>();
list.add(new TerminalExpression());
list.add(new NonTerminalExpression());
list.add(new TerminalExpression());
list.add(new TerminalExpression());
for(int i=0;i<list.size();i++){
list.get(i).Interpret(myc);
}
}
}

转载于:https://www.cnblogs.com/manmanlu/p/5810200.html

你可能感兴趣的文章
[转]DELPHI——调试(1)
查看>>
JS秒数转成分秒时间格式
查看>>
xp_cmdshell 命令的开启与关闭,和状态查询
查看>>
Linux sudoers
查看>>
MySQL详解(18)-----------分页方法总结
查看>>
bzoj 4595 激光发生器
查看>>
multi cookie & read bug
查看>>
js时间转换
查看>>
(转载) Android Studio你不知道的调试技巧
查看>>
POJ2231 Moo Volume 递推 C语言
查看>>
struts2类型转换的具体流程
查看>>
Hdu 1203 I NEED A OFFER!
查看>>
php文件上传类
查看>>
CF219D Choosing Capital for Treeland
查看>>
luogu P3809 【模板】后缀排序
查看>>
JVM 调优工具
查看>>
SCTF 2014 pwn题目分析
查看>>
集合以及特殊集合
查看>>
USACO 2.2 Runaround Numbers
查看>>
Matlab画图-非常具体,非常全面
查看>>