首页 > 其他分享 >解释器模式

解释器模式

时间:2024-12-30 22:44:35浏览次数:1  
标签:distance direction String AbstractNode 解释器 模式 action public

实验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. 提交源代码;

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);  

    }

 

}

 

 

标签:distance,direction,String,AbstractNode,解释器,模式,action,public
From: https://www.cnblogs.com/Christmas77/p/18642622

相关文章

  • 中介者模式
    实验19:中介者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解中介者模式的动机,掌握该模式的结构;2、能够利用中介者模式解决实际问题。 [实验任务一]:虚拟聊天室在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,要求如下:1.新的具......
  • 观察者模式
    实验21:观察者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解观察者模式的动机,掌握该模式的结构;2、能够利用观察者模式解决实际问题。 [实验任务一]:股票提醒当股票的价格上涨或下降5%时,会通知持有该股票的股民,当股民听到价格上涨的消息时会买股票,当价......
  • 备忘录模式
    实验 20:备忘录模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解备忘录模式的动机,掌握该模式的结构;2、能够利用备忘录模式解决实际问题。 [实验任务一]:多次撤销改进课堂上的“用户信息操作撤销”实例,使得系统可以实现多次撤销(可以使用HashMap、ArrayLis......
  • 策略模式
    实验23:策略模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解策略模式的动机,掌握该模式的结构;2、能够利用策略模式解决实际问题。 [实验任务一]:旅行方式的选择旅游的出行方式有乘坐飞机旅行、乘火车旅行和自行车游,不同的旅游方式有不同的实现过程,客户可......
  • 状态模式
    实验 22:状态模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解状态模式的动机,掌握该模式的结构;2、能够利用状态模式解决实际问题。 [实验任务一]:银行账户用Java代码模拟实现课堂上的“银行账户”的实例,要求编写客户端测试代码模拟用户存款和取款,注意账......
  • 访问者模式
    实验25:访问者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解访问者模式的动机,掌握该模式的结构;2、能够利用访问者模式法解决实际问题。 [实验任务一]:打包员在我们课堂上的“购物车”的例子中,增加一个新的访问者:打包员,负责对购物车中货物装包。实验要......
  • 模板方法模式
    实验24:模板方法模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解模板方法模式的动机,掌握该模式的结构;2、能够利用模板方法模式解决实际问题。 [实验任务一]:数据库连接对数据库的操作一般包括连接、打开、使用、关闭等步骤,在数据库操作模板类中我们定义......
  • 建造者模式
    实验5:建造者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解建造者模式的动机,掌握该模式的结构;2、能够利用建造者模式解决实际问题。 [实验任务一]:计算机组装使用建造者模式,完成下述任务:计算机组装工厂可以将CPU、内存、硬盘、主机等硬件设备组装在一起......
  • 单例模式
    实验7:单例模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解单例模式的动机,掌握该模式的结构;2、能够利用单列模式解决实际问题。 [实验任务一]:学号的单一仿照课堂的身份证的例子,实现每个同学仅有一个学号这一问题。实验要求:1. 画出对应的类图; 2. ......
  • 适配器模式
    实验8:适配器模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解适配器模式的动机,掌握该模式的结构;2、能够利用适配器模式解决实际问题。 [实验任务一]:双向适配器实现一个双向适配器,使得猫可以学狗叫,狗可以学猫抓老鼠。实验要求:1. 画出对应的类图; 2.......