zoukankan      html  css  js  c++  java
  • 解释器模式

    给定一种语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器

     


    1)      抽象表达式角色:声明一个抽象的解释操作,这个接口为所有具体表达式角色(抽象语法树中的节点)都要实现的。

    2)      终结符表达式角色:具体表达式。

    3)      非终结符表达式角色:具体表达式。

    4)      上下文(环境)角色:包含解释器之外的一些全局信息。

     

    //上下文(环境)角色,使用HashMap来存储变量对应的数值

    class Context
    {
     private Map valueMap = new HashMap();
     public void addValue(Variable x , int y)
     {
      Integer yi = new Integer(y);
      valueMap.put(x , yi); 

    }

     public int LookupValue(Variable x)
     {
      int i = ((Integer)valueMap.get(x)).intValue();
      return i ;
     }
    }

    //
    抽象表达式角色,也可以用接口来实现

    abstract class Expression
    {
     public abstract int interpret(Context con);
    }

    //
    终结符表达式角色

    class Constant extends Expression
    {
     private int i ;
     public Constant(int i)
     {
      this.i = i;
     }

     public int interpret(Context con)
     {
      return i ;
     }
    }

    class Variable extends Expression
    {
     public int interpret(Context con)
     {
      //this为调用interpret方法的Variable对象
      return con.LookupValue(this);
     }
    }

    //
    非终结符表达式角色

    class Add extends Expression
    {
     private Expression left ,right ;
     public Add(Expression left , Expression right)
     {
      this.left = left ;
      this.right= right ;
     }

     public int interpret(Context con)
     {
      return left.interpret(con) + right.interpret(con);
     }
    }

    class Subtract extends Expression
    {
     private Expression left , right ;
     public Subtract(Expression left , Expression right)
     {
      this.left = left ;
      this.right= right ;
     }

     public int interpret(Context con)
     {
      return left.interpret(con) - right.interpret(con);
     }

    }

    class Multiply extends Expression
    {
     private Expression left , right ;
     public Multiply(Expression left , Expression right)
     {
      this.left = left ;
      this.right= right ;
     }
     public int interpret(Context con)
     {
      return left.interpret(con) * right.interpret(con);
     }
    }

    class Division extends Expression
    {
     private Expression left , right ;
     public Division(Expression left , Expression right)
     {
      this.left = left ;
      this.right= right ;
     }

     public int interpret(Context con)
     {
      try{
       return left.interpret(con) / right.interpret(con);
      }catch(ArithmeticException ae)
      {
       System.out.println("被除数为0");
       return -11111;
      }
     }
    }

    //
    测试程序,计算 (a*b)/(a-b+2)

    public class Test
    {
     private static Expression ex ;
     private static Context con ;
     public static void main(String[] args)
     {
      con = new Context();
      //设置变量、常量
      Variable a = new Variable();
      Variable b = new Variable();
      Constant c = new Constant(2);
      //为变量赋值
      con.addValue(a , 5);
      con.addValue(b , 7);
      //运算,对句子的结构由我们自己来分析,构造
      ex = new Division(new Multiply(a , b), new Add(new Subtract(a , b) , c));
      System.out.println("运算结果为:"+ex.interpret(con));
     }
    }

  • 相关阅读:
    关于WM_CTLCOLOREDIT的处理的一些问题
    Duilib非官方更新贴~
    一个非常简单的返回局部字符数组的C语言程序, 请问其输出结果?
    更改Windows控制台默认缓冲区行数和宽度
    最新版Duilib在VS2012下编译错误的解决方法
    记C语言浮点数运算处理 "坑" 一则
    修改stb_image.c以让Duilib直接支持Ico格式的图标显示
    一个通过网络转换Ico到Png图片的小小程序(Ico2Png)
    编程调节Win7/Win8系统音量的一种方法
    分享一个最近研究的手机QQ3.0的协议(版本1.4)
  • 原文地址:https://www.cnblogs.com/jinzhengquan/p/1935895.html
Copyright © 2011-2022 走看看