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

}

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

Atitit.注解解析(1)---------词法分析 attilax总结 java .net的更多相关文章

  1. atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结

    atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结 1.   应用场景:::DSL 大大提升开发效率 1 2. 2. 流程如下::: 词法分析(生成toke ...

  2. Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net

    Atitit.注解and属性解析(2)---------语法分析 生成AST  attilax总结  java .net 1. 应用场景:::因为要使用ui化的注解 1 2. 使用解释器方式来实现生成 ...

  3. Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本

    Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本 1. 框架选型的要求1 1.1. 文档多1 1.2. 跨平台1 2. html解析器特性:1 2.1. j ...

  4. Atitit.html解析器的选型&#160;jsoup&#160;nsoup&#160;,java&#160;c#&#160;.net&#160;版本号

    Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本号 1. 框架选型的要求 1 1.1. 文档多 1 1.2. 跨平台 1 2. html解析器特性: 1 2 ...

  5. atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本

    atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本 1. 去除边框思路原理 1 2. Thumbnailator 是一个用来生成图像缩略图.裁切. ...

  6. Atitit.ati dwr的原理and设计 attilax 总结 java php 版本

    Atitit.ati dwr的原理and设计 attilax 总结 java php 版本 1. dwr的优点相对于ajax来说..1 2. DWR工作原理1 3. Dwr的架构2 4. 自定义dwr ...

  7. Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持

    Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持 1. 设置 document.domain为一致  推荐1 2. Apache 反向代理 推荐1 ...

  8. Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结

    Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结 1. defer关键字1 2. try!形式存在的“不失败”机制3 3. Guard 4 4. swift的新语 ...

  9. Java注解解析-搭建自己的注解处理器(CLASS注解使用篇)

    该文章是继Java注解解析-基础+运行时注解(RUNTIME)之后,使用注解处理器处理CLASS注解的文章.通过完整的Demo例子介绍整个注解处理器的搭建流程以及注意事项,你将知道如何去搭建自己的注解 ...

随机推荐

  1. 【堆栈平衡的说明太有才了】转贴自Jim&#39;s blog

    先说明.原发者iso9001 http://www.ghoffice.com/bbs/read.php?tid-35165.html他提供的地址(当他是个指针好了:P)http://ajiannet. ...

  2. shell执行时文件命名导致的错误

    1.脚本check_nginx.sh的内容如下: #!/bin/bash count=$(ps -ef | grep nginx | grep -v grep | wc -l) echo $count ...

  3. C++keyword大总结

    register: 假设有一些变量使用频繁,则为存取变量的值少花一些时间, 能够将该局部变量的值放在CPU的寄存器中,须要时直接从寄存器 中取出參加运算,不必去内存中去存取. 由于寄存器的存取速度 远 ...

  4. 一次Dapper高并发测试报告记录. 结果....

    一直听说dapper的数据处理能力很强. 我也一直很喜欢. 不过最近的一次压力测试却出乎我的意料.... 好久没写东西,感觉自己都不知道怎么表达自己的意思了.   另外 这次的测试也是自己才开始的 . ...

  5. UTC 转本地时间

    String dateStr = "Wed Dec 10 00:00:00 UTC 0800 2014"; //Wed Dec 10 00:00:00 UTC 0800 2014 ...

  6. http响应报文,如果响应的内容比较大,客户端怎么样判断接收完了呢?

    1.   http协议有正文大小说明的content-length 2. 或者分块传输chunked的话  读到0\r\n\r\n 就是读完了 ---------------------------- ...

  7. 搭建SpringBoot服务器,在公司内网中使用

    搭建SpringBoot服务器,在公司内网中使用. 学习了:https://blog.csdn.net/z3881006/article/details/78902231 就是一个程序,托管于gith ...

  8. 更简单更全的material design状态栏

    从实际使用须要出发,以最简单的方式实现了几种类型的MD状态栏. (重点在fitsSystemWindows的使用) 0,使用前提 Theme.AppCompat.Light.DarkActionBar ...

  9. table 中,如何使得单元格的内容不换行,单元格不被撑开

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  10. 反射方式,获取出集合ArrayList类的class文件对象

    /* * 定义集合类,泛型String * 要求向集合中添加Integer类型 * * 反射方式,获取出集合ArrayList类的class文件对象 * 通过class文件对象,调用add方法 * * ...