解释器模式(interpreter)

定义:一种按照规定语法进行解析的方案

类图:


角色

1.AbstractExpression抽象解释器:具体的解释任务由各个实现类完成,具体的解释器分别由TerminalExpression和
NonterminalExpression
2.TerminalExpression终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结
表达式,但有多个实例,对应不同的终结符。
3.NonterminalExpression非终结符表达式:文法中的每条规则对应于一个非终结表达式,非终结符表达式根据逻辑的
复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式
4.Context环境角色

实例:

解释乘法 3 * 2

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{
	protected Node left;  
    protected 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.interpret() * right.interpret();  
    }  
} 

public class Calculator{  
    private String statement;  
    private Node node;  
      
    public void build(String statement){  
        Node left=null,right=null;  
        Stack stack=new Stack();  
          
        String[] statementArr=statement.split(" ");  
          
        for(int i=0;i<statementArr.length;i++){      
            if(statementArr[i].equalsIgnoreCase("*")){  
                left=(Node)stack.pop();  
                int val=Integer.parseInt(statementArr[++i]);  
                right=new ValueNode(val);   
                stack.push(new MulNode(left,right));  
            }    
            else{  
                stack.push(new ValueNode(Integer.parseInt(statementArr[i])));  
            }  
        }  
        this.node=(Node)stack.pop();  
    }  
      
    public int compute() { 
        return node.interpret();  
    }  
} 

public class Client {
	public static void main(String args[]){  
        String statement = "3 * 2";  
          
        Calculator calculator = new Calculator();  
          
        calculator.build(statement);  
          
        int result = calculator.compute();  
          
        System.out.println(statement + " = " + result);      
    }  
}

运算结果



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值