1.概念
给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。
2.适应场景
通常用在对公式或者数据的解析,从而输出符合要求的数据等。2.1优点
解释器是一个简单的语法分析工具,它最显著的优点就是扩展性,修改语法规则只需要修改相应的非终结符就可以了,若扩展语法,只需要增加非终结符类就可以了。
2.2缺点
解释器模式会引起类的膨胀,每个语法都需要产生一个非终结符表达式,语法规则比较复杂时,就可能产生大量的类文件,为维护带来非常多的麻烦。
3.应用举例
将大写的数字翻译成标准的数值。
如:九千九百九十九万九千九百零九——99999909
/**
*
* 项目名称:设计模式
* 类名称:Context
* 类描述:上下文类
* 创建人:YinXiangBing
* 创建时间:2014-12-4 下午05:02:47
* @version 1.0
*
*/
public class Context {
String input ="";
int outPut;
public Context(String str){
if(str!=null)
this.input = str;
}
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
public int getOutPut() {
return outPut;
}
public void setOutPut(int outPut) {
this.outPut = outPut;
}
}
import java.util.HashMap;
import java.util.Map;
/**
*
* 项目名称:设计模式
* 类名称:Expression
* 类描述:大写解释器抽象类
* 创建人:YinXiangBing
* 创建时间:2014-12-4 下午05:02:16
* @version 1.0
*
*/
public abstract class Expression {
Map<String, Integer> map = new HashMap<String, Integer>();
public Expression() {
map.put("一", 1);
map.put("二", 2);
map.put("三", 3);
map.put("四", 4);
map.put("五", 5);
map.put("六", 6);
map.put("七", 7);
map.put("八", 8);
map.put("九", 9);
}
public void Interpret(Context context) {
if (context.getInput().length() == 0) {
return;
}
for (String key : map.keySet()) {
if (context.getInput().endsWith(key + this.getPostfix())) {
int out = context.getOutPut();
out += map.get(key) * this.mulitiplier();
context.setOutPut(out);
context.setInput(context.getInput().substring(0, context.getInput().length() - 1 - this.getPostfix().length()));
} else if (context.getInput().endsWith("零")) {
context.setInput(context.getInput().substring(0, context.getInput().length() - 1));
}
}
}
public abstract Integer mulitiplier();
public abstract String getPostfix();
}
/**
*
* 项目名称:设计模式
* 类名称:GeExpression
* 类描述: 个位解释器
* 创建人:YinXiangBing
* 创建时间:2014-12-9 上午10:28:06
* @version 1.0
*
*/
public class GeExpression extends Expression {
@Override
public Integer mulitiplier() {
return 1;
}
@Override
public String getPostfix() {
return "";
}
}
/**
*
* 项目名称:设计模式
* 类名称:ShiExpression
* 类描述:十位解释器
* 创建人:YinXiangBing
* 创建时间:2014-12-9 上午10:30:19
* @version 1.0
*
*/
public class ShiExpression extends Expression {
@Override
public Integer mulitiplier() {
return 10;
}
@Override
public String getPostfix() {
return "十";
}
}
/**
*
* 项目名称:dab
* 类名称:BaiExpression
* 类描述: 百位解释器
* 创建人:YinXiangBing
* 创建时间:2014-12-4 下午05:03:12
* @version 1.0
*
*/
public class BaiExpression extends Expression {
@Override
public Integer mulitiplier() {
return 100;
}
@Override
public String getPostfix() {
return "百";
}
}
/**
*
* 项目名称:设计模式
* 类名称:QianExpression
* 类描述: 千位解释器
* 创建人:YinXiangBing
* 创建时间:2014-12-9 上午10:29:47
* @version 1.0
*
*/
public class QianExpression extends Expression {
@Override
public Integer mulitiplier() {
return 1000;
}
@Override
public String getPostfix() {
return "千";
}
}
import java.util.ArrayList;
import java.util.List;
/**
*
* 项目名称:设计模式
* 类名称:WanExpression
* 类描述:万位解释器
* 创建人:YinXiangBing
* 创建时间:2014-12-9 上午10:31:18
* @version 1.0
*
*/
public class WanExpression extends Expression {
@Override
public Integer mulitiplier() {
return 10000;
}
@Override
public String getPostfix() {
return "万";
}
@Override
public void Interpret(Context context) {
if (context.getInput().length() == 0) {
return;
}
if (context.getInput().endsWith(this.getPostfix())) {
List<Expression> tree = new ArrayList<Expression>();
tree.add(new GeExpression());
tree.add(new ShiExpression());
tree.add(new BaiExpression());
tree.add(new QianExpression());
int temp = context.getOutPut();
context.setOutPut(0);
context.setInput(context.getInput().substring(0,context.getInput().length() - this.getPostfix().length()));
for (Expression e : tree) {
e.Interpret(context);
}
context.setOutPut(temp + mulitiplier() * context.getOutPut());
}
}
}
/**
*
* 项目名称:设计模式
* 类名称:NumberTest
* 类描述: 大写数字测试类
* 创建人:YinXiangBing
* 创建时间:2014-12-9 上午10:27:40
* @version 1.0
*
*/
public class NumberTest {
public static void main(String[] args) {
String str = "九千九百九十九万九千九百零九";
Context context = new Context(str);
WanExpression wan = new WanExpression();
QianExpression qian = new QianExpression();
BaiExpression bai = new BaiExpression();
ShiExpression shi = new ShiExpression();
GeExpression ge = new GeExpression();
ge.Interpret(context);
shi.Interpret(context);
bai.Interpret(context);
qian.Interpret(context);
wan.Interpret(context);
System.out.println("九千九百九十九万九千九百零九:"+context.getOutPut());
}
}
运行结果:
九千九百九十九万九千九百零九:99999909