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 Pro] Android 必知必会-使用 supportV4 的 RoundedBitmapDrawable 实现圆角

    RoundedBitmapDrawable 是 supportV4 下的一个类,有了它,显示圆角和圆形图片的情况下就不需要额外的第三方类库了,还能和各种图片加载库配合使用. 背景 今天无意间看到一段实 ...

  2. 使用R语言和XML包抓取网页数据-Scraping data from web pages in R with XML package

    In the last years a lot of data has been released publicly in different formats, but sometimes the d ...

  3. ChartView与LineSeries搭配实现曲线局部缩放功能

    效果图: 上一篇文章实现的时候还不知道有QtChart这个模块......好好看了下资料就想做个例子实现一下这功能,比较了下代码量...恩,直接看代码: Rectangle { id: view_re ...

  4. M1卡说明及使用proxmark3破解方法

    看了网上写的一些关于M1卡的文章,多数有些误导之嫌.首先谈谈M1卡的规格,M1卡的容量为1KB,好多网上写8KB,这里其实是有个误区,应该是8K位.1Byte=1B=8位.其实也就是说8k位想到于1K ...

  5. Mysql命令和mysqldump的一些操作

    mysql -h localhost -P5100 -ua -pb -e 'use xxx; SELECT * FROM `order_info` WHERE pay_time >= 14726 ...

  6. Linux 查看当前时间和修改系统时间

    一.查看和修改Linux的时区 1. 查看当前时区 命令: date -R 2. 修改设置Linux服务器时区 方法 A 命令 : tzselect 方法 B 仅限于RedHat Linux 和 Ce ...

  7. 那些年困扰我们的Linux 的蠕虫、病毒和木马

    虽然针对Linux的恶意软件并不像针对Windows乃至OS X那样普遍,但是近些年来,Linux面临的安全威胁却变得越来越多.越来越严重.个中原因包括,手机爆炸性的普及意味着基于Linux的安卓成为 ...

  8. 解决Asp输出乱码问题

    在一个Asp页面中页面正常的中文字符都没有问题,但如果用Asp程序输出的话就显示为乱码 终于在百度经验上找到解决方案: 1.将文件编码更改为Utf-8 2.在页头添加"<%@LANGU ...

  9. ejs和swig对比的问题之一

    本来想测试下两者在nodejs中得执行速度,设置了一个测试数据,如下 var testData = { title:'测试标题', description: '<p>这是一个描述,里面用很 ...

  10. 算法笔记_045:币值最大化问题(Java)

    目录 1 问题描述 2 解决方案 2.1 动态规划法   1 问题描述 给定一排n个硬币,其面值均为正整数c1,c2,...,cn,这些整数并不一定两两不同.请问如何选择硬币,使得在其原始位置互不相邻 ...