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. client怎样调用IBinder接口对象

    代码: public void funclick(View view){ Intent _intent = new Intent(MainActivity.this,MyService.class); ...

  2. ASPNET CORE初探

    ASP.NET Core 开发-中间件(Middleware)   ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件 ...

  3. python对字符串的操作

    去空格及特殊符号 s.strip().lstrip().rstrip(',') 复制字符串 #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sStr2 = sStr1 sS ...

  4. [Android Studio] Android Studio如何提示函数用法

    Eclipse有一个很好的功能,就是当你代码调用某个android API时,鼠标移到对应的函数或者方法上,就会自动有一个悬 浮窗提示该函数的说明(所包含的参数含义,该方法功能).迁移到Android ...

  5. #include &lt;NOIP2010 Junior&gt; 三国游戏 ——using namespace wxl;

    题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有 N 位武将(N为偶数且不小于 4),任意两个武将之 ...

  6. java.io.FileNotFoundException: ***(Too many open files)

    http://yizhilong28.iteye.com/blog/1154098 在linux下跑一个多线程读取文件的程序,待读取文件有数十万个.程序读取过程中抛出如下异常*****(Too man ...

  7. iOS:提示框(警告框)控件UIActionSheet的详解

    提示框(警告框)控件2:UIActionSheet 功能:当点击按钮或标签等时,弹出一个提示框,显示必要的提示,然后通过添加的按钮完成需要的功能.它与导航栏类似,它继承自UIView.   风格类型: ...

  8. zedboard--基于zedboard的demo系统的boa服务器搭建(二十一)

    zedboard提供的demo系统很迷你,但是也能移植嵌入式Web服务器的.这里就移植boa服务器. 1.下载Boa服务器源代码(安装好了交叉编译器) http://www.boa.org/,选择最后 ...

  9. XMPPFrameWork IOS 开发(四)消息和好友上下线

    原始地址:XMPPFrameWork IOS 开发(四) 消息 //收到消息 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XM ...

  10. HTML-<a>标签添加下划线

    <a href="ddrb/090630.asp" target="_blank" style="text-decoration:underli ...