• 解释器模式


    1、模式定义

    解释器模式(Interpreter Pattern) :定义语言的文法,而且建立一个解释器来解释该语言中的句子。这里的“语言”意思是使用规定格式和语法的代码,它是一种类行为型模式。

    2、模式结构
    解释器模式包括例如以下角色:
    AbstractExpression: 抽象表达式
    TerminalExpression: 终结符表达式
    NonterminalExpression: 非终结符表达式
    Context: 环境类
    Client: 客户类

    3、模式分析
    解释器模式描写叙述了怎样为简单的语言定义一个文法,怎样在该语言中表示一个句子,以及怎样解释这些句子。


    文法规则实例:
    expression ::= value | symbol
    symbol ::= expression '+' expression | expression '-' expression
    value ::= an integer //一个整数值
    在文法规则定义中能够使用一些符号来表示不同的含义。如使用“|”表示或。使用“{”和“}”表示组合。使用“*”表示出现0次或多次等,当中使用频率最高的符号是表示或关系的“|” 。

    抽象语法树描写叙述了怎样构成一个复杂的句子,通过对抽象语法树的分析。能够识别出语言中的终结符和非终结符类。 
    在解释器模式中,每一种终结符和非终结符都有一个详细类与之相应,正由于使用类来表示每个语法规则,使得系统具有较好的扩展性和灵活性。

     

    典型的抽象表达式类实现代码:

    public abstract class AbstractExpression
    {
    	public abstract void interpret(Context ctx);
    } 
    典型的终结符表达式类实现代码:

    public class TerminalExpression extends AbstractExpression
    {
    	public void interpret(Context ctx)
    	{
    		//对于终结符表达式的解释操作
    	}
    } 

    典型的非终结符表达式类实现代码:

    public class NonterminalExpression extends AbstractExpression
    {
    	private AbstractExpression left;
    	private AbstractExpression right;
    	
    	public NonterminalExpression(AbstractExpression left,AbstractExpression right)
    	{
    		this.left=left;
    		this.right=right;
    	}
    	
    	public void interpret(Context ctx)
    	{
    		//递归调用每个组成部分的interpret()方法
    		//在递归调用时指定组成部分的连接方式。即非终结符的功能
    	}	
    } 
    

    典型的环境类实现代码:

    public class Context
    {
        private HashMap map = new HashMap();
        public void assign(String key, String value)
        {
            //往环境类中设值
        }
    public String lookup(String key)    
    {
            //获取存储在环境类中的值
        }
    } 
    

    4、模式优缺点
    解释器模式的长处
    易于改变和扩展文法。
    易于实现文法。
    添加了新的解释表达式的方式。

    解释器模式的缺点
    对于复杂文法难以维护。
    运行效率较低。
    应用场景非常有限

    5、模式适用环境
    在下面情况下能够使用解释器模式:
    能够将一个须要解释运行的语言中的句子表示为一个抽象语法树。
    一些反复出现的问题能够用一种简单的语言来进行表达。
    文法较为简单。

     
    效率不是关键问题。

  • 相关阅读:
    如何搜索 git 提交记录
    使用Mongo进行分页
    mongodb 数据自动备份
    linux 添加环境变量
    centos7安装bbr
    centos7安装node
    [shell]输出内容到剪切板
    centos 7 已经开启 22 端口但无法连接
    一些有趣的 js 包
    机房选择
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6780674.html
Copyright © 2020-2023  润新知