10.9

实验17:解释器模式选作

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 

1、理解解释器模式的动机,掌握该模式的结构;

2、能够利用解释器模式解决实际问题。

 

[实验任务一]:解释器模式

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

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个单位

实验要求:

1. 提交类图;

2. 提交源代码;

3. 注意编程规范。

 

 

复制代码
#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;
}
复制代码

 

posted @   奶油冰激凌  阅读(1)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示