`
wdt1988520
  • 浏览: 15504 次
社区版块
存档分类
最新评论

解释器Interpreter

 
阅读更多

所谓解释器模式就是定义一个语言的文法,并建立一个解释器来解释该语言中的句子!

比如:taglib标签,正则表达式都是采用的解释器。

 

解释器不仅仅只定义一种语法语义,更可以使用一个抽象语法树定义一个语言实例。

解释器角色:

    AbstractExpression: 抽象表达式。声明一个抽象的解释操作,该接口为抽象语法树中所有的节点共享。

   TerminalExpression: 终结符表达式。实现与文法中的终结符相关的解释操作。实现抽象表达式中所要求的方法。文法中每一个终结符都有一个具体的终结表达式与之相对应。

   NonterminalExpression: 非终结符表达式。为文法中的非终结符相关的解释操作。

   Context: 环境类。包含解释器之外的一些全局信息。

   Client: 客户类。  抽象语法树描述了如何构成一个复杂的句子,通过对抽象语法树的分析,可以识别出语言中的终结符和非终结符类。 在解释器模式中由于每一种终结符表达式、非终结符表达式都会有一个具体的实例与之相对应,所以系统的扩展性比较好。


 


  下面用解释器处理上面的例子: 5*6/3%4

  

 

 

//抽象表达式
public interface Node{
    public int interpret();
}

//非终结表达式实现
public class ValueNode implements Node{
    private int value;
    
    public ValueNode(int value){
        this.value=value;
    }
        
    public int interpret(){
        return this.value;
    }
}

     

//抽象终结表达式
public abstract class SymbolNode implements Node{
    public Node left;
    public Node right;

    public  SymbolNode(Node left,Node right){
       this.left=left;
       this.right=right;
    }
}

 

//乘法
public class MulNode extends SymbolNode{
   public MulNode(Node left,Node right){
       super(left,right);
   }
  
   public int interpret(){
       return left*right;
   }
}

//除法
public class DevNode extends SymbolNode{
   public DevNode(Node left,Node right){
        super(left,right);
   }

   public int interpret(){
        return left/right;
   }
}

//取模
public class MolNode extends SymbolNode{
    public MolNode(Node left,Node right){
         super(left,right);
    }

    public int interpret(){
         return left%right;
    }
}

 

public class Calculator{
    public int result;
    public Calculator(String expStr) {  
        // 定义一个堆栈,安排运算的先后顺序  
        Stack<Node> stack = new Stack<Node>();  
        // 表达式拆分为字符数组  
        char[] charArray = expStr.toCharArray();  
        // 运算  
        Node left = null;  
        Node right = null;  
        for (int i = 0; i < charArray.length; i++) {  
            switch (charArray[i]) {  
            case '*': //  
                // 结果放到堆栈中  
                left = stack.pop();  
                right =new ValueNode( Integer.parseInt(String.valueOf(charArray[++i])));  
                stack.push(new MulNode(left, right));  
                break;  
            case '/':  
                left = stack.pop();  
                right = new ValueNode( Integer.parseInt(String.valueOf(charArray[++i])));  
                stack.push(new DevNode(left, right));  
                break;  
             case '%':  
                left = stack.pop();  
                right =  new ValueNode(Integer.parseInt(String.valueOf(charArray[++i])));   
                stack.push(new MolNode(left, right));  
                break;
            default: // 公式中的变量  
                        stack.push(new ValueNode(Integer.parseInt(String.valueOf(charArray[++i])))); 
            }  
      this.result=stack.pop();
  }

  public int getResult(){
      return this.result;
  }
}
  

 

//客户端
main(){
   String express="5*6/3%4";
   Calculator  c=new Calculator (express);
   System.out.print(c.getResult());
}

 

 

解释器模式扩展性强,能处理表达式中重复出现的问题,但是应用场景少。

  • 大小: 88.4 KB
分享到:
评论

相关推荐

    Interpreter(解释器)模式.doc

    Interpreter(解释器)模式是一种行为设计模式,它提供了一种方式来表示一种语言的文法,并创建一个解释器来解释语言中的句子。这种模式主要用于解析简单的语言或表达式,例如计算表达式、配置文件等。在计算机科学...

    Interpreter 解释器模式

    解释器模式是一种行为设计模式,它允许我们定义一个语言的语法,并提供一种方式来解析该语言的表达式。在C#中,解释器模式通常用于处理简单的语言结构或执行基于特定规则的运算。这种模式的核心在于创建一个抽象语法...

    设计模式之解释器模式(Interpreter)

    **解释器模式(Interpreter)**是一种行为设计模式,它允许我们定义一种语言并为其创建一个解释器。在软件工程中,这种模式常用于处理简单的语言或表达式,例如配置文件、计算公式或者简单的脚本语言。通过使用解释...

    解释器模式(Interpreter)原理图

    解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义一个语言的文法,并解析语言中的表达式。具体来说,解释器模式通过定义一个解释器来解释语言中的表达式,从而实现对语言的解析和执行。 在解释...

    设计模式之解释器模式(Interpreter Pattern)

    **设计模式之解释器模式(Interpreter Pattern)** 解释器模式是一种行为设计模式,它提供了一种方式来表示语言的语法,并实现一个解释器用于解析这种语法的语句。这种模式通常用于小型、特定领域的语言(DSL)实现,...

    JS-Interpreter, 在JavaScript中,沙箱JavaScript解释器.zip

    JS-Interpreter, 在JavaScript中,沙箱JavaScript解释器 js解释器JavaScript中的沙箱JavaScript解释器。 独立执行任意的JavaScript代码行并安全。现场演示:https://neil.fraser.name/software/JS-Interpreter/文档...

    c++-设计模式之解释器模式(Interpreter)

    解释器模式(Interpreter Pattern)是一种行为型设计模式,用于为特定语言的句法定义一个解释器。它通过定义一个语言的文法表示以及解释器的实现来解析和执行表达式。这种模式通常用于设计语言、脚本或规则引擎。 ...

    OpenAI的代码解释器:open-interpreter

    项目标签:[人工智能] [LLM] [代码解释器] [自然语言处理] 推荐理由:一个允许在您的终端本地运行OpenAI的代码解释器的项目。它为开发者提供了一种便捷的方式来解释和执行OpenAI生成的代码,使其在本地环境中更易于...

    (行为型模式) Interpreter 解释器模式

    C#面向对象设计模式 (行为型模式) Interpreter 解释器模式 视频讲座下载

    解释器(Interpreter),自定义语法(类C)

    给一个自定义语法的语言写一个解释器(Interpreter),首先写了Parser,然后存入剖析树(Parse Tree)对象中,最后根据Parse Tree的结构执行程序,计算出结果。 语法如下: &lt;prog&gt; ::= program &lt;decl seq&gt; ...

    [inside hotspot] 汇编模板解释器(Template Interpreter)和字节码执行1

    ### 汇编模板解释器(Template Interpreter)与字节码执行详解 #### 知识点一:HotSpot中的解释器架构概述 在Java虚拟机(JVM)中,HotSpot是广泛使用的JVM实现之一,它采用了多层解释器的设计来平衡性能与灵活性。...

    BASIC_jieshiqi.rar_basic_basic interpreter_basic解释器_visual c_解释器

    而"BASIC的一个解释器"可能是实际的BASIC解释器源代码,对于理解BASIC解释器的内部工作原理非常有帮助。 **应用和扩展** BASIC解释器不仅仅局限于教学环境,也可以应用于快速原型开发、嵌入式系统和游戏制作等领域...

    基于Linux的命令解释器_CommandInterpreter.zip

    基于Linux的命令解释器_CommandInterpreter

    arduino GCode_Interpreterdc G代码解释器 也可以当做c语言参考

    Arduino GCode Interpreter是一款专为Arduino平台设计的G代码解释器,它允许用户通过G代码来控制Arduino硬件,比如3D打印机、CNC机器或其他需要精确运动控制的项目。G代码是一种通用的编程语言,用于指示这些设备...

    PHP设计模式之解释器(Interpreter)模式入门与应用详解

    本文实例讲述了PHP设计模式之解释器(Interpreter)模式。分享给大家供大家参考,具体如下: 解释器模式,它是什么呢? 意思就是,给定一个语言, 定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来...

    php设计模式 Interpreter(解释器模式)

    在文件的另一部分,定义了核心的解释器类`Interpreter`。在这个类中,定义了一个`execute`方法,它接受一个字符串参数。该方法通过遍历输入字符串中的每个字符,并根据字符的类型创建不同的表达式对象。字符如果是...

    C#面向对象设计模式纵横谈(16):(行为型模式) Interpreter 解释器模式 (Level 300)

    解释器模式是一种行为设计模式,它提供了一种方式来表示语言的语法,并允许你使用该表示来解释语言中的句子。在C#中,解释器模式常用于构建自定义的编程语言或者解析特定格式的数据,例如配置文件、表达式计算等。 ...

    Linux环境下模拟实现简单命令解释器_Command-Interpreter.zip

    Linux环境下模拟实现简单命令解释器_Command-Interpreter

    java调用python中的自定义函数函数

    // 关闭解释器 interpreter.cleanup(); } } ``` 这段Java代码首先创建了一个`PythonInterpreter`实例,然后使用`execfile`方法加载了`addition.py`文件。接着,通过`get`方法获取了Python的`add`函数,并使用`__...

Global site tag (gtag.js) - Google Analytics