Java/C++实现解释器模式---机器人控制程序
某机器人控制程序包含一些简单的英文指令,其文法规则如下:
expression ::= direction action distance | composite
composite ::= expression and expression
direction ::= ‘up’ | ‘down’ | ‘left’ | ‘right’
action ::= ‘move’ | ‘run’
distance ::= an integer //一个整数值
如输入:up move 5,则输出“向上移动5个单位”;输入:down run 10 and left move 20,则输出“向下移动10个单位再向左移动20个单位”。
类图:

Java代码:
import java.util.Stack;
public abstract class AbstractNode {
public abstract String interpret();
} public class ActionNode extends AbstractNode{
private String action; public ActionNode(String action) {
this.action = action;
} //动作(移动方式)表达式的解释操作
public String interpret() {
if (action.equalsIgnoreCase("move")) {
return "移动";
}
else if (action.equalsIgnoreCase("run")) {
return "快速移动";
}
else {
return "无效指令";
}
}
} public class AndNode extends AbstractNode{
private AbstractNode left; //And的左表达式
private AbstractNode right; //And的右表达式 public AndNode(AbstractNode left, AbstractNode right) {
this.left = left;
this.right = right;
} //And表达式解释操作
public String interpret() {
return left.interpret() + "再" + right.interpret();
}
} public class DirectionNode extends AbstractNode{
private String direction; public DirectionNode(String direction) {
this.direction = direction;
} //方向表达式的解释操作
public String interpret() {
if (direction.equalsIgnoreCase("up")) {
return "向上";
}
else if (direction.equalsIgnoreCase("down")) {
return "向下";
}
else if (direction.equalsIgnoreCase("left")) {
return "向左";
}
else if (direction.equalsIgnoreCase("right")) {
return "向右";
}
else {
return "无效指令";
}
}
} public class DistanceNode extends AbstractNode{
private String distance; public DistanceNode(String distance) {
this.distance = distance;
} //距离表达式的解释操作
public String interpret() {
return this.distance;
}
} public class InstructionHandler {
private String instruction;
private AbstractNode node;
public void handle(String instruction) {
AbstractNode left = null, right = null;
AbstractNode direction = null, action = null, distance = null;
Stack stack = new Stack(); //声明一个栈对象用于存储抽象语法树
String[] words = instruction.split(" "); //以空格分隔指令字符串
for (int i = 0; i < words.length; i++) {
//本实例采用栈的方式来处理指令,如果遇到“and”,则将其后的三个单词作为三个终结符表达式连成一个简单句子SentenceNode作为“and”的右表达式,而将从栈顶弹出的表达式作为“and”的左表达式,最后将新的“and”表达式压入栈中。
if (words[i].equalsIgnoreCase("and")) {
left = (AbstractNode)stack.pop(); //弹出栈顶表达式作为左表达式
String word1= words[++i];
direction = new DirectionNode(word1);
String word2 = words[++i];
action = new ActionNode(word2);
String word3 = words[++i];
distance = new DistanceNode(word3);
right = new SentenceNode(direction,action,distance); //右表达式
stack.push(new AndNode(left,right)); //将新表达式压入栈中
}
//如果是从头开始进行解释,则将前三个单词组成一个简单句子SentenceNode并将该句子压入栈中
else {
String word1 = words[i];
direction = new DirectionNode(word1);
String word2 = words[++i];
action = new ActionNode(word2);
String word3 = words[++i];
distance = new DistanceNode(word3);
left = new SentenceNode(direction,action,distance);
stack.push(left); //将新表达式压入栈中
}
}
this.node = (AbstractNode)stack.pop(); //将全部表达式从栈中弹出
} public String output() {
String result = node.interpret(); //解释表达式
return result;
}
} public class SentenceNode extends AbstractNode{
private AbstractNode direction;
private AbstractNode action;
private AbstractNode distance; public SentenceNode(AbstractNode direction,AbstractNode action,AbstractNode distance) {
this.direction = direction;
this.action = action;
this.distance = distance;
} //简单句子的解释操作
public String interpret() {
return direction.interpret() + action.interpret() + distance.interpret();
}
} public class Client { public static void main(String[] args) {
// TODO Auto-generated method stub
String instruction1 = "up move 5 and down run 10 and left move 5";
String instruction2="down run 10 and left move 20";
InstructionHandler handler = new InstructionHandler();
handler.handle(instruction1);
String outString;
outString = handler.output();
System.out.println(outString);
handler.handle(instruction2);
outString = handler.output();
System.out.println(outString);
} }
C++代码:
#include<iostream>
#include<stack>
#include <sstream>
#include<string>
using namespace std;
class AbstractNode {
public:
virtual string interpret()=0;
};
class ActionNode:public AbstractNode{
private:
string action;
public:
ActionNode(string action) {
this->action = action;
}
string interpret() {
if (action=="move") {
return "移动";
}
else if (action=="run") {
return "快速移动";
}
else {
return "无效指令";
}
}
};
class AndNode:public AbstractNode{
private:
AbstractNode *left; //And的左表达式
AbstractNode *right; //And的右表达式
public:
AndNode(AbstractNode *left, AbstractNode *right) {
this->left = left;
this->right = right;
}
//And表达式解释操作
string interpret() {
return left->interpret() + "再" + right->interpret();
}
};
class DirectionNode :public AbstractNode{
private:
string direction;
public:
DirectionNode(string direction) {
this->direction = direction;
}
//方向表达式的解释操作
string interpret() {
if (direction=="up") {
return "向上";
}
else if (direction=="down") {
return "向下";
}
else if (direction=="left") {
return "向左";
}
else if (direction=="right") {
return "向右";
}
else {
return "无效指令";
}
}
};
class DistanceNode:public AbstractNode{
private:
string distance;
public:
DistanceNode(string distance) {
this->distance = distance;
}
//距离表达式的解释操作
string interpret() {
return this->distance;
}
};
class SentenceNode:public AbstractNode{
private:
AbstractNode *direction;
AbstractNode *action;
AbstractNode *distance; public:
SentenceNode(AbstractNode *direction,AbstractNode *action,AbstractNode *distance) {
this->direction = direction;
this->action = action;
this->distance = distance;
}
//简单句子的解释操作
string interpret() {
return direction->interpret() + action->interpret() + distance->interpret();
}
};
class InstructionHandler {
private:
string instruction;
AbstractNode *node;
public:
void handle(string instruction) {
AbstractNode *left = NULL, *right = NULL;
AbstractNode *direction = NULL, *action = NULL, *distance = NULL;
stack<AbstractNode*> stack; //声明一个栈对象用于存储抽象语法树
istringstream str1(instruction);
istringstream str2(instruction);
string out;
int j=0,k=0;
int n;
//以空格分隔指令字符串
while (str1 >> out) {
j++;
}
n=j;
string words[n];
string out2;
while (str2 >> out2) {
words[k]=out2;
k++;
}
for (int i = 0; i <n; i++) {
//本实例采用栈的方式来处理指令,如果遇到“and”,则将其后的三个单词作为三个终结符表达式连成一个简单句子SentenceNode作为“and”的右表达式,而将从栈顶弹出的表达式作为“and”的左表达式,最后将新的“and”表达式压入栈中。
if (words[i]=="and") {
left = stack.top(); //弹出栈顶表达式作为左表达式
stack.pop();
string word1= words[++i];
direction = new DirectionNode(word1);
string word2 = words[++i];
action = new ActionNode(word2);
string word3 = words[++i];
distance = new DistanceNode(word3);
right = new SentenceNode(direction,action,distance); //右表达式
stack.push(new AndNode(left,right)); //将新表达式压入栈中
}
//如果是从头开始进行解释,则将前三个单词组成一个简单句子SentenceNode并将该句子压入栈中
else {
string word1 = words[i];
direction = new DirectionNode(word1);
string word2 = words[++i];
action = new ActionNode(word2);
string word3 = words[++i];
distance = new DistanceNode(word3);
left = new SentenceNode(direction,action,distance);
stack.push(left); //将新表达式压入栈中
}
}
this->node = stack.top(); //将全部表达式从栈中弹出
stack.pop();
} string output() {
string result = node->interpret(); //解释表达式
return result;
}
};
int main(){
string instruction1 = "up move 5 and down run 10 and left move 5";
string instruction2="down run 10 and left move 20";
InstructionHandler *handler = new InstructionHandler();
handler->handle(instruction1);
string outString;
outString = handler->output();
cout<<outString<<endl;
handler->handle(instruction2);
outString = handler->output();
cout<<outString<<endl;
}
运行结果:


Java/C++实现解释器模式---机器人控制程序的更多相关文章
- JAVA设计模式之解释器模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述解释器(Interpreter)模式的: 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个 ...
- 折腾Java设计模式之解释器模式
解释器模式 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 意图 给定一个语言,定义它的文法表 ...
- 20.java设计模式之解释器模式
基本需求 实现四则运算,如计算a+b-c+d的值 先输入表达式的形式,如a+b-c+d,要求表达式正确 再分别输出a,b,c,d的值 最后求出结果 传统方案 编写一个方法,接收表达式的形式,根据用户输 ...
- 简单的介绍一下Java设计模式:解释器模式
目录 定义 意图 主要解决问题 优缺点 结构 示例 适用情况 定义 解释器模式是类的行为型模式,给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器,客户端可以使用这个解释器来 ...
- JAVA 设计模式 解释器模式
用途 解释器模式 (Interpreter) 定义一个语言,定义它的文法的一种表示. 并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 解释器模式是一种行为型模式. 结构
- Java进阶篇设计模式之九----- 解释器模式和迭代器模式
前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...
- 设计模式之解释器模式——Java语言描述
解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文.这种模式被用在SQL解析.符号处理引擎等 介绍 意图 给定一个语言,定义它的文 ...
- Java设计模式学习记录-解释器模式
前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...
- Java设计模式之九 ----- 解释器模式和迭代器模式
前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...
随机推荐
- Java 类方法和类变量
目录 一.类变量 1.如果定义类变量 2.如何访问类变量 3.类变量的使用注意事项和细节 二.类方法 1.类方法的形式 2.类方法的调用 3.类方法经典使用场景 4.类变量和类方法 三.main方法 ...
- JZ-046-圆圈中最后剩下的数
圆圈中最后剩下的数 题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏. 其中,有个游戏是这样的:首先,让小朋友们围成一 ...
- JAVA基础01----第1章Java开发环境搭建
一. Java开发环境中涉及的名词:JDK,JRE,JVM A:什么是JVM JVM是java虚拟机(JVM Java Virtual Machine),java程序需要运行在虚拟机上,不同平台有自己 ...
- 5. Java方法
5.Java方法 1.何谓方法 Java方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则:方法 ...
- tp6微信公众号开发者模式基础消息
官方文档 https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages ...
- Linux服务器 I/O 原理和流程
计算机I/OI/O在计算机中指Input/Output,IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一.IOPS是指单位时间 ...
- 【黑马程序员C++ STL】学习记录
黑马程序员 2017 C++ STL 教程(STL 部分已完结) 基于黑马STL课程整理:黑马程序员2017C++STL教程 视频链接 专栏:本STL专栏目录 文章目录 黑马程序员 2017 C++ ...
- margin 塌陷bug 触发bfc
1.bfc block format context 2.如何触发一个盒子的bfc position:absolute; display: inline-block float:left/right; ...
- Java案例——统计字符串中各种字符出现的次数
/*案例:统计各种字符在字符串中出现的次数 分析:只考虑三种字符类型的情况下(大写字母,小写字母,数字) 1.使用Scanner 类获取字符串数据 2.遍历字符串得到每一个字符 3.判断每一个字符是那 ...
- javascript 实现富文本框选中对齐
需求: 一个可编辑(contenteditable=true)的div,对齐选中内容,左.中,右 ,其实质是:对选中的末梢节点,找到块属性的父元素,设置text-algin:center: MDN:t ...