Atitit.注解解析(1)---------词法分析 attilax总结 java .net
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相关推荐
- Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持
Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持 1.设置 document.domain为一致 推荐1 2.Apache 反向代理 推荐1 3. ...
- java 解析注解_Java知识点总结(注解-解析注解)
Java知识点总结(注解-解析注解) @(Java知识点总结)[Java, 注解] 通过反射获取类.函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑. 使用注解步骤: 定义注解 类中使用注 ...
- 【Java 注解】自定义注解 ( 注解解析 )
文章目录 一.定义注解 二.使用注解 三.解析注解 四.通过注解对象获取注解属性的原理 在 [Java 注解]自定义注解 ( 注解属性定义与赋值 ) 博客中讲解了 注解属性 ; 在 [Java 注解] ...
- java自定义注解解析及自定义注解
jdk1.5之后提供了注解(Annotation)这一种语法.其主要作用是编译检查(比如@override)和代码分析(通过代码中添加注解,利用注解解析器对添加了注解的代码进行分析,获取想要的结果,一 ...
- java中注解的解析_【Java】中的注解与注解解析器
/** * 该注解描述了作用范围 * java RetentionPolicy.SOURCE * java+class RetentionPolicy.CLASS * java+class+jvm R ...
- Java注解解析-搭建自己的注解处理器(CLASS注解使用篇)
该文章是继Java注解解析-基础+运行时注解(RUNTIME)之后,使用注解处理器处理CLASS注解的文章.通过完整的Demo例子介绍整个注解处理器的搭建流程以及注意事项,你将知道如何去搭建自己的注解 ...
- Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结
Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结 1. defer关键字1 2. try!形式存在的"不失败"机制3 3. Guard 4 4 ...
- java 自定义注解 解析_java自定义注解
1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...
- 深入理解Java:注解(Annotation)基本概念、自定义注解、注解解析器
深入理解Java:注解(Annotation)基本概念 什么是注解(Annotation): Annotation(注解)就是Java提供了一种元程序中的元素关联任何信息和着任何元数据(metadat ...
- Atitit xml框架类库选型 attilax总结
Atitit xml框架类库选型 attilax总结 1. 1. XML类库可以分成2大类.标准的.这些类库通常接口和实现都是分开的1 2. Jdom 和dom4j1 2.1. 5.1. jdom1 ...
最新文章
- 桌面计算机硬盘打不开,我电脑的磁盘打不开,是什么问题?
- 我也不知道该咋分类--莫队算法
- uva 10254——The Priest Mathematician
- java组合与继承始示例_排列组合:用公式示例解释的差异
- Golang Web入门(3):如何优雅的设计中间件
- 简述 Linux 文件系统的目录结构
- 使用百度编辑器--ueditor,后台接收提交编辑的内容,HTML不见了, 赋值不了,赋值之后,html暴露出来了??...
- Winform界面中实现菜单列表的动态个性化配置管理
- bzoj3545: [ONTAK2010]Peaks 主席树合并
- python QQ自动添加好友
- 浪漫的表白(C语言)
- 小程序中点击二维码图片预览、长按转发、保存、识别图中二维码
- ie浏览器点击无法打开问题【亲测有效哦】
- 计算机网络 如何算 子网号,已知Ip地址子网掩码如何计算子网号、主机号.doc
- 怎样辨别光模块的真假?
- 中水处理设备可提高水资源利用率说明
- 你真的知道面向过程和面向对象的区别吗?
- PTC贴片保险的测试
- 操作系统(四)操作系统的主要功能
- Shopee大规模毁约offer,今年的大厂装都不装了