Atitit.注解解析(1)---------词法分析 attilax总结 java .net

Atitit.注解解析(1)---------词法分析 attilax总结  java .net

 

1. 应用场景:::因为要使用ui化的注解 1

2. 流程如下::: 词法分析(生成token) >>>>语法分析(生成ast) >>解释执行... 2

3. 词法分析的框架,antlr 2

4. Fsm 状态机/// switch 2

5. 单词流必须识别为保留字,标识符(变量),常量,操作符(运算符 )和界符五大类 2

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

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

6. 定义context 3

7. 注解名 AtState 处理 4

8. 分割符处理DoubleQuoeState 5

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

10. 调用结果,输出token 6

11. Github开放源码项目AtiAnnoInterpreter 7

 

1. 应用场景:::因为要使用ui化的注解

 

String s = "@QueryAdptr(sqlwhere=\" clo1='@p' \",prop2=\"v2\") @Nofilt";

// 创建环境

 

所以,要解析注解...

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

要是java 源码中的注解能使用java api读取了...

html中的注解嘎自实现兰.

 

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

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

 

 

2. 流程如下::: 词法分析(生成token) >>>>语法分析(生成ast) >>解释执行...

 

3.  词法分析的框架,antlr

使用累挂,困难..子好,自己写兰...

 

4. Fsm 状态机/// switch

使用Fsm 式来取代switch方式...

Oo语言还能使用state模式来做了...

 

 

5. 单词流必须识别为保留字,标识符(变量),常量,操作符(运算符 )和界符五大类

 

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

() [] -> .

? :

条件

由右向左

 

() [] -> .

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

由左向右

 

,

逗号(顺序)

+ -

加,减

由左向右

 

括号,纺括号,等号

参考

编译器DIY——词法分析 - GodLike - 博客频道 - CSDN.NET.htm

操作符要使用一个状态来描述的...

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

 

界符在处理的时候儿,林吧过滤...

 

 

6. 定义context

设计描述:::使用keystate来定义操作state,,,keystate的更改有state内部实现

State使用来描述每字符的状态..,这个state的修改有context来实现..

 

 

class AnnoPaserContext  extends Context {

 //持有一个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(sampleParameterthis);

     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(sampleParameterthis);

    }

 

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++;

}

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();

 

}

 

10. 调用结果,输出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 );

}

 

11. Github开放源码项目AtiAnnoInterpreter 

 

posted @ 2014-11-29 10:56  attilaxAti  阅读(230)  评论(0编辑  收藏  举报