Atitit.linq java的原理与实现 解释器模式

来源:互联网 发布:最后的幸存者小说知临 编辑:程序博客网 时间:2024/05/19 00:17

Atitit.linq java的原理与实现 解释器模式

 

 

1Linq  from  where 的实现1

2Where expr 的实现1

3Attilax的一点变化2

4解释器模式的结构2

5Code3

5.1. EqExpression3

5.2. LikeExpression4

5.3. AndExpression4

5.4. AExpression5

6参考5

 

 

 

1. Linq  from  where 的实现

Map rowfrom(ColumnsDefs).where(eq("COLUMN_NAME"key)).exe().get(0);

 

2. Where expr 的实现

 

大概有15expr。。。  关系(大小比较),逻辑expr。。。In like 等。。

 

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

 

 

3. Attilax的一点变化

没使用终结符号的概念..两个数据类型..express类型,common data..

要是express类型..就是可以计算的express...  贝儿走普通的数据..

 

Note::checkSuitOk should  use  interpreter

 

4. 解释器模式的结构

· 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpret()方法,称为解释操作。具体解释任务由它的各个实现类来完成,具体的解释器分别由终结符解释器TerminalExpression和非终结符解释器NonterminalExpression完成。

· 终结符表达式:实现与文法中的元素相关联的解释操作,通常一个解释器模式中只有一个终结符表达式,但有多个实例,对应不同的终结符。终结符一半是文法中的运算单元,比如有一个简单的公式R=R1+R2,在里面R1R2就是终结符,对应的解析R1R2的解释器就是终结符表达式。                                

· 非终结符表达式:文法中的每条规则对应于一个非终结符表达式,非终结符表达式一般是文法中的运算符或者其他关键字,比如公式R=R1+R2中,+就是非终结符,解析+的解释器就是一个非终结符表达式。非终结符表达式根据逻辑的复杂程度而增加,原则上每个文法规则都对应一个非终结符表达式。

 

仅有两类元素:运算元素和运算符号,运算元素就是指abc等符号,需要具体赋值的对象,也叫做终结符号,为什么叫终结符号呢?因为这些元素除了需要赋值外,不需要做任何处理,所有运算元素都对应一个具体的业务参数,这是语法中最小的单元逻辑,不可再拆分;运算符号就是加减符号,需要我们编写算法进行处理,每个运算符号都要对应处理单元,否则公式无法运行,运算符号也叫做非终结符号

 

们就可以先画一个简单的类图,如图27-1所示。

5. Code

5.1. EqExpression 

package com.attilax.linq;

 

import java.util.Map;

 

public class EqExpression extends AExpression {

 

public EqExpression(String leftCol, Object ritVal) {

this.left=leftCol;

this.rit=ritVal;

}

public boolean interpreter(Map row) {

//LikeExpression le=(LikeExpression) whereExpressAst;

 

if(row.get(this.left.toString()).toString().equals(this.rit.toString()))

return true;

else

return false;

}

 

5.2. LikeExpression 

package com.attilax.linq;

 

import java.util.Map;

 

public class LikeExpression extends AExpression{

 

 

public LikeExpression(String col, String val) {

this.left=col;

this.rit=val;

}

public boolean checkSuitOk(Map row) {

//LikeExpression le=(LikeExpression) whereExpressAst;

if(row.get(this.left.toString()).toString().contains(this.rit.toString()))

return true;

else

return false;

}

 

}

5.3. AndExpression 

package com.attilax.linq;

 

import java.util.Map;

 

public class AndExpression extends AExpression {

 

public AndExpression(AExpression whereExpressAst, AExpression eq) {

this.left=whereExpressAst;

this.rit=eq;

}

public boolean checkSuitOk(Map row) {

//LikeExpression le=(LikeExpression) whereExpressAst;

AExpression lft_exp=(AExpression) this.left;

AExpression rit_exp=(AExpression) this.rit;

return  lft_exp.checkSuitOk(row) && rit_exp.checkSuitOk(row);

}

 

}

5.4. AExpression 

package com.attilax.linq;

 

import java.util.Map;

 

public class AExpression {

public Object left;

public Object rit;

 

public boolean checkSuitOk(Map row) {

throw new RuntimeException("no imp in base aexp class");

}

 

}

 

 

6. 参考

Atitit.linq api 兼容性草案 v2.docx

23种设计模式(14):解释器模式 卡奴达摩的专栏 博客频道 - CSDN.NET.htm

解释器模式 详解 疯狂程序员 博客频道 - CSDN.NET.htm

0 0