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. [Android Studio] Android Studio移除的Module如何恢复(转载)

    如果你执行了从module列表中移除module的操作,但是没有执行delete module文件夹的操作,那如何恢复被移除掉的module呢. 关于如何移除请戳这:Android Studio如何删 ...

  2. #include &lt;NOIP2008 Junior&gt; 双栈排序 ——using namespace wxl;

    题目描述 Tom最近在研究一个有趣的排序问题.如图所示,通过2个栈S1和S2,Tom希望借助以下4种操作实现将输入序列升序排序. 操作a 如果输入序列不为空,将第一个元素压入栈S1 操作b 如果栈S1 ...

  3. 1644 免费馅饼 题解(c++)

    1644 免费馅饼(巴蜀oj上的编号) 题面:          SERKOI最新推出了一种叫做"免费馅饼"的游戏.         游戏在一个舞台上进行.舞台的宽度为W格,天幕的 ...

  4. 利用WMI检测电脑硬件信息,没办法显示cpu的信息

    但你要给某些系统或软件加密时,需要了解到服务器的硬件信息时,系统和软件会利用WMI检测硬件信息, 而有时我们会遇到检测不到CPU的型号信息,如图 此时的解决方法: 1.确定“服务”里启动了WMI 2. ...

  5. http://www.cnblogs.com/nick-huang/p/4848843.html

    http://www.cnblogs.com/nick-huang/p/4848843.html

  6. mysql的日志管理

    日志操作是数据库维护中最重要的手段之一,日志文件会记录MySQL服务器的各种信息,所以当MySQL服务器遭到意外损坏时,不仅可以通过日志文件来查看出错的原因,而且还可以通过日志文件进行数据恢复. MY ...

  7. luigi操作hive表

    关于luigi框架下查询hive表的操作 class JoinQuery(HiveQueryTask): date=luigi.DateParameter() def hiveconfs(self): ...

  8. Logon database Tiger引起DataGuard不同步问题

    当DataGuard升级CPU后.发现主备库不能同步了,日志报错,所以在主库的运行的升级的后脚本"@catbundle.sql cpu apply"不能同步到备库 现象: brok ...

  9. QPS、RT、PV、UV之间的关系

    QPS: 每秒查询率(Query Per Second) ,每秒的响应请求数,也即是最大吞吐能力. QPS = req/sec = 请求数/秒 QPS统计方式 [一般使用 http_load 进行统计 ...

  10. DIV CSS布局中绝对定位和浮动用法

    转自:http://developer.51cto.com/art/201009/223337_1.htm 你对DIV CSS布局中绝对定位和浮动的概念及使用是否熟悉,这里和大家分享一下,CSS中,实 ...