某机器人控制程序包含一些简单的英文指令,其文法规则如下:

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++实现解释器模式---机器人控制程序的更多相关文章

  1. JAVA设计模式之解释器模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述解释器(Interpreter)模式的: 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个 ...

  2. 折腾Java设计模式之解释器模式

    解释器模式 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 意图 给定一个语言,定义它的文法表 ...

  3. 20.java设计模式之解释器模式

    基本需求 实现四则运算,如计算a+b-c+d的值 先输入表达式的形式,如a+b-c+d,要求表达式正确 再分别输出a,b,c,d的值 最后求出结果 传统方案 编写一个方法,接收表达式的形式,根据用户输 ...

  4. 简单的介绍一下Java设计模式:解释器模式

    目录 定义 意图 主要解决问题 优缺点 结构 示例 适用情况 定义 解释器模式是类的行为型模式,给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器,客户端可以使用这个解释器来 ...

  5. JAVA 设计模式 解释器模式

    用途 解释器模式 (Interpreter) 定义一个语言,定义它的文法的一种表示. 并定义一个解释器,这个解释器使用该表示来解释语言中的句子. 解释器模式是一种行为型模式. 结构

  6. Java进阶篇设计模式之九----- 解释器模式和迭代器模式

    前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...

  7. 设计模式之解释器模式——Java语言描述

    解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式.这种模式实现了一个表达式接口,该接口解释一个特定的上下文.这种模式被用在SQL解析.符号处理引擎等 介绍 意图 给定一个语言,定义它的文 ...

  8. Java设计模式学习记录-解释器模式

    前言 这次介绍另一个行为模式,解释器模式,都说解释器模式用的少,其实只是我们在日常的开发中用的少,但是一些开源框架中还是能见到它的影子,例如:spring的spEL表达式在解析时就用到了解释器模式,以 ...

  9. Java设计模式之九 ----- 解释器模式和迭代器模式

    前言 在上一篇中我们学习了行为型模式的责任链模式(Chain of Responsibility Pattern)和命令模式(Command Pattern).本篇则来学习下行为型模式的两个模式, 解 ...

随机推荐

  1. KETTLE使用中的错误集锦

    1.违反唯一主键约束条件:问题是表中有俩个主键,将备用主键替换成真正的主 键或者是没有对数据做出处理加这句话and cft.DEL_FLAG!='1'或者要到的库有此数据 2.field 某列 is ...

  2. JZ-027-字符串的排列

    字符串的排列 题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和c ...

  3. 线上| 10万奖金!Greaterwms/DVAdmin插件开发者现金激励活动

    为激励广大开发者创作精神,Greaterwms/DVadmin插件开发者现金激励活动现已上线! 什么是GreaterWMS 完全开源仓储管理软件,遵循Apache License 2.0协议,前后端分 ...

  4. CDN网络科普小文(小说版)

    引言 作为公司 cdn 小组的一名小码仔,我为写一篇 cdn 的科普文章准备了好一段时间(大概有一个多月没有更新我的社交账号了). 在我刚进入公司,培训完,进入小组,了解到我们做的是 cdn 相关的工 ...

  5. linux文件目录权限操作

    设置修改文件的属主或修改文件属组 [root@localhost ~]# ll test.txt -rw-r--r--. 1 root root 0 Oct 21 12:01 test.txt [ro ...

  6. php 23种设计模型 - 单例模式

    单例模式(Singleton) 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一 ...

  7. Mysql8.0.17忘记密码情况下重置密码

    1.以管理员身份打开命令窗口cmd,输入命令: net stop mysql 2.开启跳过密码验证登录的mysql服务,输入命令 mysqld --console --skip-grant-table ...

  8. 29 面向对象编程 static 关键字

    补充:static 代码 // static public class Student{ private static int age; // 静态的变量 多线程 private double sco ...

  9. 盘点十大GIS相关算法

    1.道格拉斯-普克算法(Douglas–Peucker) 道格拉斯-普克算法(Douglas–Peucker algorithm,亦称为拉默-道格拉斯-普克算法.迭代适应点算法.分裂与合并算法)是将曲 ...

  10. VMware15安装 CentOS7 步骤