zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    MapBox TileMill
    优秀电影
    Mapnik 编译安装过程
    Debian 入门安装与配置2
    学习opengl十大网站(转载)
    PostgresSQL 学习资料记录处
    c++模板编程-异质链表
    Linux-统一事件源
    三组I/O复用模型的比较
    ZigZag-LeetCode
  • 原文地址:https://www.cnblogs.com/attilax/p/5963788.html
Copyright © 2011-2022 走看看