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. rsync进行不同服务器之间的数据同步

    2台服务器上都要安装rsync,sudo yum install rsync. 把远程的数据备份到本机: rsync -rP --rsh=ssh root@IP:/data/tmp /data/tmp ...

  2. Tomcat与Servlet工作流程

    什么是Tomcat? Tomcatserver是一个免费的开放源码的Web 应用server,属于轻量级应用server. 什么是Servlet? Servlet是在server上执行的小程序.,说白 ...

  3. OpenCV学习(7) 分水岭算法(1)

            分水岭算法主要用于图像分段,通常是把一副彩色图像灰度化,然后再求梯度图,最后在梯度图的基础上进行分水岭算法,求得分段图像的边缘线.         下面左边的灰度图,可以描述为右边的地 ...

  4. Python下科学计算包numpy和SciPy的安装【原创】

    Python下大多数工具包的安装都很简单,只需要执行 "python setup.py install"命令即可.然而,由于SciPy和numpy这两个科学计算包的依赖关系较多,安 ...

  5. 字符编码(ASCII,Unicode和UTF-8) 和 大小端(zz)

    本文包括2部分内容:“ASCII,Unicode和UTF-8” 和 “Big Endian和Little Endian”. 第1部分 ASCII,Unicode和UTF-8 介绍 1. ASCII码 ...

  6. hadoop源代码组织结构与阅读技巧

    本文将介绍在 Eclipse 下阅读 Hadoop 源代码的一些技巧, 比如如何查看一个基类有哪些派生类. 一个方法被其他哪些方法调用等. 本文地址:http://www.cnblogs.com/ar ...

  7. hadoop常见问题总结1

    本文地址:http://www.cnblogs.com/archimedes/p/hadoop-problem1.html,转载请注明源地址. 问题1:http://localhost:50030 H ...

  8. [置顶] All about control file in Oracle Database

    --数据库实例启动的三个阶段: NOMOUNT(START):打开初始化参数文件 MOUNT:打开控制文件 OPEN:打开数据文件和日志文件 --控制文件 控制文件的作用:管理数据库的状态和描述数据库 ...

  9. win7无法启动telnet服务

    右键我的电脑 —> 管理 —>服务,找到服务telnet, 右键—>属性—>依赖关系 就可以看到其他服务的依赖关系,打开相关依赖的服务即可解决服务不能启动的情况

  10. GMM高斯混合模型 学习(2)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHpxMjAwODExMjExMDc=/font/5a6L5L2T/fontsize/400/fill/I0 ...