宝哥软件园

javascript设计模式解释器模式说明

编辑:宝哥软件园 来源:互联网 时间:2021-11-07

什么是“解释器模式”?首先转到《GOF》,看看Definition:给定一种语言,定义它的语法的表示,定义一个解释器,解释器使用这个表示来解释语言中的句子。在开篇之前,我们要普及几个概念:抽象语法树:解释器模式没有说明如何创建抽象语法树。它不涉及解析。抽象树可以由表驱动的解析器完成,也可以由手写(通常是递归下降)解析器创建,或者由客户端直接提供。Parser:指的是解析描述客户端调用需求的表达式以形成抽象语法树的程序。解释器:指解释抽象语法树并执行各节点对应功能的程序。要使用解释器模式,一个重要的先决条件是定义一组语法规则,也称为语法。不管这个语法的规则是简单的还是复杂的,它们都必须存在,因为解释器模式是根据这些规则解释的,并执行相应的功能。我们先来看看解释器模式的结构图和描述:

抽象表达式:定义解释器的接口,指定解释器的解释操作。TerminalExpression:终止符解释器,用于实现语法规则中与终止符相关的操作,不包含其他解释器。如果用组合模式构造抽象语法树,就相当于组合模式中的一个叶子对象,可以有多种终止符解释器。非终结符解释器:非终结符解释器用于实现语法规则中与非终结符相关的操作。通常,一个解释器对应一个语法规则,可以包含其他解释器。如果抽象语法树是由组合模式构造的,那么它就相当于组合模式中的组合对象。可以有各种各样的非终结符解释器。上下文:Context,通常包含每个解释器或公共函数所需的数据。客户端:客户端是指使用解释器的客户端。通常,根据语言的语法做出的表达式被转换成解释器对象描述的抽象语法树,然后调用解释操作。让我们通过一个xml例子来理解解释器模式:首先,我们应该为表达式设计一个简单的语法。为了通用性,根用来表示元素,abc用来表示元素。一个简单的xml如下:如下复制代码。Xml版本=' 1.0 '编码=' utf-8 '根id=' rootid ' a c name=' test c ' 12345/c d id=' 1 ' D1/d d id=' 2 ' D2/d d d id=' 3 ' D3/d d d id=' 4 ' D4/d例如,表达式“root/a/b/c”的意思是获取根元素、a元素、b元素下c元素的值。2.获取单个元素的属性值:当然有很多。要获取值的属性必须是表达式最后一个元素的属性。添加" "然后添加属性的名称。例如,表达式“root/a/b/c.name”表示获取根元素、a元素和b元素下c元素的name属性的值。3.得到相同元素名称的值,当然有很多。要获取值的元素必须是表达式的最后一个元素,并在最后一个元素后添加“$”。例如,表达式“根/a/b/d$”意味着获取根元素、a元素和b元素下多个d元素的值集。4.获取属性值的元素名称相同的属性当然也有很多:获取属性值的元素必须是表达式的最后一个元素,并在最后一个元素后加上' $ '。例如,表达式“root/a/b/d$。id$ "意味着获取根元素、a元素和b元素下多个d元素的id属性值集。上面的xml,对应的抽象语法树,可能有以下结构:

下面我们来看看具体的代码:1。定义上下文:复制的代码如下:/***上下文,用来包含解释器需要的一些全局信息* @ param { String } file pathname[要读取的xml的路径和名称]*/函数上下文(file pathname){//最后处理的元素是this.preEle=nullXML的Document对象是this.document=xmlutil.getroot(文件路径名);}Context.prototype={//重新初始化上下文reinit : function(){ this . preele=null;}、/* * *各种Expression *常用的方法根据父元素和当前元素的名称获取当前元素* @ param { Element } pEle[父元素]* @ param { String } eleName[当前元素名称]* @ return { Element | null }[找到当前。

更多资讯
游戏推荐
更多+