二. 用到解释器方式来兑现生成AST,三. 单词流必须识别为保留字

Atitit. 解释器情势框架选型 and应用场景attilax计算 oao

Atitit.注明and属性剖判(二)———语法分析 生成AST  attilax计算  java .net

Atitit.注明深入分析(壹)———词法深入分析 attilax总计  java .net

 

澳门威尼斯人网址, 

 

一. 解释器格局社团描述

一. 施用场景:::因为要利用ui化的申明一

1. 采用场景:::因为要动用ui化的讲明壹

贰. 哪些落成(轻易的解释器格局,仅仅通过词法深入分析就能够兑现,而没有需求token流进行处理。

贰. 运用解释器形式来完成生成AST
1

2. 流程如下::: 词法分析(生成token流) >>>>语法深入分析(生成ast) >>解释实践…

三. 单词流必须识别为保留字,标志符(变量),常量,操作符(运算符 )和界符中国共产党第五次全国代表大会类
2

3. 识别TerminalExpression和NonterminalExpression
2

三. 词法剖析的框架,antlr
2

3.1. 操作符(运算符 ):::
2

一.一. 单词流必须识别为保留字,标记符(变量),常量,操作符(运算符 )和界符中国共产党第五次全国代表大会类

4. Fsm 状态机/// switch
2

3.2. 4.界符:“;”分号,“{}”大括号,单引号,双引号
3

1.2. 操作符(运算符 ):::
2

五. 单词流必须识别为保留字,标志符(变量),常量,操作符(运算符 )和界符中国共产党第五次全国代表大会类

四. TerminalExpression和NonterminalExpression是四个落到实处。

4. 生成括号操作符表明式

5.1. 操作符(运算符 ):::
2

5. 施用场景

5. 逗号操作符表明式
5

5.2. 4.界符:“;”分号,“{}”大括号,单引号,双引号
3

五.一. 中中原人民共和国字转化为数字

陆. 等号表达式and 基本要素表明式
6

6. 定义context
3

5.2. Sql,hql,Criteria 转换hibernate
3

柒. AST 可视化突显六

7. 注解名 AtState 处理
4

伍.3. 表明式深入分析四

 

8. 分割符管理DoubleQuoeState

伍.肆. 翻译词典

一. 应用场景:::因为要选用ui化的讲授

 

String s = “@QueryAdptr(sqlwhere=\” clo1=’@p’ \”,prop2=\”v2\”) @Nofilt”;

网络马,,子能嘎自实现兰.

 

笔者:: 老哇的爪子 Attilax 艾龙,  EMAIL:14665一九八四玖@qq.com

转发请声明来源: http://blog.csdn.net/attilax

 

 

9. 操作符(运算符 ):的处理LeftBrackt
5

6. 解释器框架选型

二. 施用解释器方式来落到实处生成AST

 

Context存储的大局上下文景况,AbstractExpression是富有表明式必须承继的接口,TerminalExpression和NonterminalExpression是三个落到实处。

 

10. 调用结果,输出token流
6

 

3. 识别TerminalExpression和NonterminalExpression

11. Github开放源码项目AtiAnnoInterpreter
7

一. 解释器格局协会描述 

 

Context存储的全局上下文情况,AbstractExpression是兼具表明式必须延续的接口,TerminalExpression和NonterminalExpression是八个实现。

       除了上述用于表示表明式的类以外,平时在解释器格局中还提供了三个情况类Context,用于存款和储蓄一些大局新闻,平日在Context中带有了二个HashMap或ArrayList等品类的集结对象(也可以平昔由HashMap等集结类充当蒙受类),存款和储蓄①多元公共音讯,如变量名与值的映射关系(key/value)等,用于在进展具体的解说操作时从中获得相关音讯。其至高无上代码片段如下:

class Context {

     private HashMap map = new HashMap();

     public void assign(String key, String value) {

         //往环境类中设值

     }

public String  lookup(String key) {

         //获取存储在环境类中的值

     }

}

       当系统无须提供全局公共消息时得以大约情形类,可根据实际情形调整是还是不是需求情形类。

 

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519829@qq.com

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

 

壹.一. 单词流必须识别为保留字,标记符(变量),常量,操作符(运算符 )和界符中国共产党第五次全国代表大会类

 

 

二. 什么样贯彻(轻便的解释器格局,仅仅通过词法剖判就可以兑现,而没有供给token流进行管理。

 

事实上,有些轻便的解释器情势,仅仅经过词法深入分析就能够达成,成效能够写在气象改造函数中,而不须求对产生的token流举行拍卖。

 

1.2. 操作符(运算符 ):::

() [] -> .

? :

条件

由右向左

 

() [] -> .

括号(函数等),数组,两种结构成员访问

由左向右

 

,

逗号(顺序)

+ –

加,减

由左向右

 

括号,纺括号,等号

参考

编写翻译器DIY——词法深入分析 – GodLike – 博客频道 – CSDN.NET.htm

操作符要使用三个场所来叙述的…

 

一. 用参预景:::因为要选用ui化的注释

 

String s = “@QueryAdptr(sqlwhere=\” clo1=’@p’ \”,prop2=\”v2\”) @Nofilt”;

// 创制情状

 

由此,要分析声明…

网络马,,子能嘎自实现兰….

设若java 源码中的评释能运用java api读取了…

html中的注明嘎自达成兰.

 

小编:: 老哇的爪子 Attilax 艾龙,  EMAIL:14665一9八4玖@qq.com

转载请评释来源: http://blog.csdn.net/attilax

 

 

三. 单词流必须识别为保留字,标志符(变量),常量,操作符(运算符 )和界符中国共产党第五次全国代表大会类

 

肆. 生成括号操作符表明式

// 构造函数字传送参,并深入分析

 

public Client(String expStr) throws CantFindRitBrack {

 

// 定义一个仓房,陈设运算的先后顺序

 

Stack<AbstractExpression> stack = ctx.stack;

 

// 表明式拆分为字符数组

 

List<Token> tokenList = (List<Token>) fsmx.getTokenList();

 

// 运算

 

//AbstractExpression left = null;

 

//AbstractExpression right = null;

 

for (int i =0; i < tokenList.size(); i++) {

Token tk = tokenList.get(i);

switch (tk.value) {

 

case “(“: // comma exp

 

    AbstractExpressionleft3 = stack.pop();

int nextRitBrackIdx=getnextRitBrackIdx(i,tokenList);

List sub=tokenList.subList(i+1, nextRitBrackIdx);

AbstractExpressioncenter = new BracktItemExpression(sub,ctx);

center=stack.pop();

stack.push(new BracktExpression(left3, center));

i=nextRitBrackIdx;

break;

case “,”: // comma exp

 

AbstractExpressionleft = stack.pop();

 

AbstractExpressionright = new CommaItemExpression(new AttrNameExpression(

tokenList.get(++i).value), new EqxlExpression(

tokenList.get(++i).value), new AttValExpression(

tokenList.get(++i).value));

 

stack.push(new CommaExpression(left, right));

 

break;

 

default: // var in gonsi 公式中的变量

AbstractExpression left2 =new AnnoExpression(tokenList.get(i).value);

 

stack.push(left2);

 

}

 

}

 

// 把运算结果抛出来

 

this.expression = stack.pop();

 

}

 

private int getnextRitBrackIdx(int start, List<Token> tokenList) throws CantFindRitBrack {

 for (int i=start;i<tokenList.size();i++) {

if(tokenList.get(i).value.equals(“)”))

return i;

}

 throw new CantFindRitBrack(“”);

}

 

// start calc开头运算

 

public Object run() {

System.out.println(“–“);

//CommaExpression ce=(CommaExpression) expression;

AbstractExpression  AST=new ASTrootExpress(expression,new AnnoExpression(“tt”));

System.out.println(JSONObject.fromObject(AST).toString(15));

//json

//System.out.println(JsonUtil4jackjson.buildNormalBinder().toJson(

//ce));

return this.expression.interpret(this.ctx);

 

}

 

 

2. 流程如下::: 词法剖判(生成token流) >>>>语法解析(生成ast) >>解释实行…

 

3.1. 操作符(运算符 ):::

() [] -> .

? :

条件

由右向左

 

() [] -> .

括号(函数等),数组,两种结构成员访问

由左向右

 

,

逗号(顺序)

+ –

加,减

由左向右

 

括号,纺括号,等号

参考

编写翻译器DIY——词法解析 – GodLike – 博客频道 – CSDN.NET.htm

操作符要使用两个境况来说述的…

五. 逗号操作符表明式

public class BracktItemExpression extends AbstractExpression {

 

public BracktItemExpression(List sub2, Context ctx) {

Stack<AbstractExpression> stack = ctx.stack;

List<Token> tokenList = sub2;

 

for (int i = 0; i < tokenList.size(); i++) {

Token tk = tokenList.get(i);

switch (tk.value) {

 

 

case “,”: // comma exp

 

AbstractExpression left = stack.pop();

 

AbstractExpression right = new CommaItemExpression(

new AttrNameExpression(tokenList.get(++i).value),

new EqxlExpression(tokenList.get(++i).value),

new AttValExpression(tokenList.get(++i).value));

 

stack.push(new CommaExpression(left, right));

 

break;

 

 

default: // var in gonsi 公式中的变量

AbstractExpression left2 = new CommaItemExpression(

new AttrNameExpression(tokenList.get(i).value),

new EqxlExpression(tokenList.get(++i).value),

new AttValExpression(tokenList.get(++i).value));

 

stack.push(left2);

 

}

}

 

}

 

3.  词法剖判的框架,antlr

利用累挂,困难..子好,自身写兰…

 

3.2. 4.界符:“;”分号,“{}”大括号,单引号,双引号

 

界符在拍卖的时候儿,林吧过滤…

 

陆. 等号表明式and 基本成分表明式

4. Fsm 状态机/// switch

应用Fsm 式来代表switch格局…

Oo语言还是能运用state形式来做了…

 

 

四. TerminalExpression和NonterminalExpression是多少个得以实现。

习认为常来讲,操作符(运算符 )要运用NonterminalExpression来促成,创设1个class 来实现,

一个op一个class

 

 

 

 

柒. AST 可视化彰显

动用json  缩进一五来突显…马个好的tree型彰显,都以树放的,马个亘放的…牙马个好的pic lib 输出档期的顺序…

 

 

 

 

 

 

{“rootExp”: {

               “centerExp”:                {

                              “leftComma”:                               {

                                             “leftComma”:                                              {

                                                            “attNameExp”: {“attname”: “at1”},

                                                            “attValExp”: {“val”: “v1”},

                                                            “eqExp”: {}

                                             },

                                             “rightCommaExp”:                                              {

                                                            “attNameExp”: {“attname”: “at2”},

                                                            “attValExp”: {“val”: ” v2 abc “},

                                                            “eqExp”: {}

                                             }

                              },

                              “rightCommaExp”:                               {

                                             “attNameExp”: {“attname”: “at3”},

                                             “attValExp”: {“val”: “v3”},

                                             “eqExp”: {}

                              }

               },

               “nameExp”: {“value”: “@qu”}

}}

 

 

 

 

 

 

5. 单词流必须识别为保留字,标记符(变量),常量,操作符(运算符 )和界符中国共产党第五次全国代表大会类

 

5. 应用场景

 

5.1. 操作符(运算符 ):::

() [] -> .

? :

条件

由右向左

 

() [] -> .

括号(函数等),数组,两种结构成员访问

由左向右

 

,

逗号(顺序)

+ –

加,减

由左向右

 

括号,纺括号,等号

参考

编写翻译器DIY——词法解析 – GodLike – 博客频道 – CSDN.NET.htm

操作符要使用1个气象来讲述的…

5.一. 汉字转化为数字

的类型中,随着须要深入分析的汉字数据进一步大,须要分析方法能够跟着管理更加大品级的数码(万,亿…),通过扩充Express类,发生可以分析新扩大的级其余管理办法

5.2. 4.界符:“;”分号,“{}”大括号,单引号,双引号

 

界符在拍卖的时候儿,林吧过滤…

 

 

5.2. Sql,hql,Criteria 转换hibernate  

Criteria 2sql  能够选择hb的api

 

6. 定义context

规划描述:::使用keystate来定义操作state,,,keystate的改观有state内部贯彻

State使用来说述每字符的状态..,这一个state的修改有context来完成..

 

 

class AnnoPaserContext  extends Context {

 //持有1个State类型的目的实例

    public State state;

    public State lastKeystate; 

public Object rzt;

public Token curToken=new Token();

public List<Token> tokenList=new ArrayList<Token>();

public char curchar;

public char[] charArr;

public int   curcharIndex;

    public void setState(State state) {

        this.state = state;

    }

    /**

     * 用户感兴趣的接口方法

     */

    public void request(String sampleParameter) {

    state=new NormalState();

    if(curcharIndex>=sampleParameter.length())

    {

    state=new FinishState();

      state.handle(sampleParameter, this);

     return;

     

    }

     

    curchar=charArr[curcharIndex];

    //def todox if to swithc oao

    

    if(curchar==’@’)   //keyword

    state=new AtState();

    if(curchar=='”‘)   //splittor word

    state=new DoubleQuoeState();

    if(curchar=='(‘)  //op word

    state=new LeftBrackt();

    if(curchar==’)’)

    state=new RightBrackt();

    if(curchar==’=’)

    state=new EqxState();

    

     if(curchar==’,’)

     state=new commaState();

     

    

        //转调state来处理

        state.handle(sampleParameter, this);

    }

 

5.三. 表明式分析

7. 注解名 AtState 处理

AtState implements State {

 

 

@Override

public void handle(String sampleParameter, Context context) {

AnnoPaserContext ctt=(AnnoPaserContext) context;

    char curchar=ctt.curchar;

   

    if(ctt.lastKeystate instanceof iniState || ctt.lastKeystate instanceof RightBrackt)

    {

    Token tk=new Token();

    tk.value=ctt.curToken.value;

    ctt.tokenList.add(tk); 

    ctt.curToken=new Token();

    ctt.lastKeystate=new AtState();

    }

    

    ctt.curToken.value+=curchar;

    ctt.curcharIndex++;

}

5.四. 翻译词典

 

 

8. 分割符管理DoubleQuoeState 

 

DoubleQuoeState implements State {

 

@Override

public void handle(String sampleParameter, Context context) {

AnnoPaserContext ctt=(AnnoPaserContext) context;

    char curchar=ctt.curchar;

    Token tk=new Token();

    tk.value=ctt.curToken.value;

    ctt.tokenList.add(tk);

//    ctt.tokenList.add(new Token(){{ this.value=”,” ; }});

    ctt.curToken=new Token();

    

 //   ctt.curToken.value+=curchar;

    ctt.curcharIndex++;

    ctt.lastKeystate=new DoubleQuoeState();

 

}

 

六.  解释器框架选型

 

 

9. 操作符(运算符 ):的处理LeftBrackt 

 LeftBrackt implements State {

 

 

 

 

@Override

public void handle(String sampleParameter, Context context) {

AnnoPaserContext ctt=(AnnoPaserContext) context;

    char curchar=ctt.curchar;

    Token tk=new Token();

    tk.value=ctt.curToken.value;

    ctt.tokenList.add(tk);

    ctt.tokenList.add(new Token(){{ this.value=”(” ; }});

    ctt.curToken=new Token();

    

 //   ctt.curToken.value+=curchar;

    ctt.curcharIndex++;

    ctt.lastKeystate=new LeftBrackt();

 

}

 

陆.0.1.一. 特级实行

      解释器方式在其实的系统开发中使用的相当少,因为它会挑起功用、品质以及保证等主题素材,一般在大中型的框架型项目能够找到它的身影,譬喻一些数额分析工具、 报表设计工具、科学总结工具等等,若您确实遇见“壹种特定项指标主题素材发出的频率丰盛高”的景况,盘算利用解释器形式时,能够思量一下 Expression肆J、MESP(Math Expression String Parser)、Jep等开源的深入分析工具包(那八个开源产品都能够百度、谷歌(Google)中搜索到,请读者自行查询),效能都特别强硬,而且特别轻松使用,效 率也还不易,完成许多的数学生运动算完全未有的时候,自身并无需从头初叶编写解释器,有人曾经确立了一条康庄大道,何必再走自身的泥泞小路呢? 

 

Expression4J   百度28个

MESP  解释器   20个

参考

自定义语言的兑现——解释器形式(叁) – 刘伟先生技能博客 – 博客频道 – CSDN.NET.htm

 

十. 调用结果,输出token流

@QueryAdptr

(

sqlwhere

=

clo1=’@p’

,

prop2

=

v2

)

@Nofilt

 

fsmx {

 

public static void main(String[] args) {

 

String s = “@QueryAdptr(sqlwhere=\” clo1=’@p’ \”,prop2=\”v2\”) @Nofilt”;

// 创制情状

AnnoPaserContext context = new AnnoPaserContext();

// 将状态设置到条件中

// 创造状态

com.attilax.interpreter.fsm.State state = new iniState();

context.setState(state);

context.lastKeystate=new iniState();

context.charArr=s.toCharArray();

context.curcharIndex=0;

 

int n=0;

while(!( context.state instanceof FinishState))

{

//System.out.println(n);

// 请求

context.request(s);

n++;

if(n>200)

break;

}

for (Token tk : context.tokenList) {

if(tk.value.trim().length()>0)

System.out.println(tk.value+””);

}

//System.out.println(context.rzt );

}

 

1一. Github开放源码项目AtiAnnoInterpreter 

 

相关文章