Atitit.注解解析(1)---------词法分析 attilax总结 java .net
Atitit.注解解析(1)---------词法分析 attilax总结 java .net
2. 流程如下::: 词法分析(生成token流) >>>>语法分析(生成ast) >>解释执行...
2
5. 单词流必须识别为保留字,标识符(变量),常量,操作符(运算符 )和界符五大类 2
5.2. 4.界符:“;”分号,“{}”大括号,单引号,双引号
3
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.自己动手开发编译器and解释器(1) ------词法分析--attilax总结
atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结 1. 应用场景:::DSL 大大提升开发效率 1 2. 2. 流程如下::: 词法分析(生成toke ...
- Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net
Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net 1. 应用场景:::因为要使用ui化的注解 1 2. 使用解释器方式来实现生成 ...
- 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 ...
- 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 ...
- atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本
atitit.验证码识别step3----去除边框---- 图像处理类库 attilax总结java版本 1. 去除边框思路原理 1 2. Thumbnailator 是一个用来生成图像缩略图.裁切. ...
- 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 ...
- Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持
Atitit.js跨域解决方案attilax大总结 后台java php c#.net的CORS支持 1. 设置 document.domain为一致 推荐1 2. Apache 反向代理 推荐1 ...
- Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结
Atitit.swift 的新特性 以及与java的对比 改进方向attilax 总结 1. defer关键字1 2. try!形式存在的“不失败”机制3 3. Guard 4 4. swift的新语 ...
- Java注解解析-搭建自己的注解处理器(CLASS注解使用篇)
该文章是继Java注解解析-基础+运行时注解(RUNTIME)之后,使用注解处理器处理CLASS注解的文章.通过完整的Demo例子介绍整个注解处理器的搭建流程以及注意事项,你将知道如何去搭建自己的注解 ...
随机推荐
- jenkins双向备份;高可用部署;
如果把一个Jenkins的整个目录赋值到另一个Jenkins的目录,则需要务必保持两个Jenkins版本是相同的,不然容易出现Jenkins插件兼容性问题. 另外使用inotify+rsync备份的时 ...
- Mahout构建图书推荐系统【一起学Mahout】
阅读导读: 1.Mahout中推荐过滤算法支持哪两种算法? 2.用java代码怎样计算男性用户打分过的图书? 3.itemEuclidean.userEuclideanNoPref各自是什么算法? 1 ...
- GPGPU OpenCL Reduction操作与group同步
Reduction操作:规约操作就是由多个数生成一个数,如求最大值.最小值.向量点积.求和等操作,都属于这一类操作. 有大量数据的情况下,使用GPU进行任务并行与数据并行,可以收到可好的效果. gro ...
- 如何配置通过Fiber Channel连接主机与存储
在一台Windows Client上, 安装免费的Cisco Fabric Manager. 笔者安装的是Fabric Manager 5.0(7). 注意, 这台Windows Client上应该安 ...
- 复习原生ajax
function ajax(url, fnSucc, fnFaild) { //1.创建 if(window.XMLHttpRequest) { var oAjax=new XMLHttpReques ...
- mongodb pymongo.errors.CursorNotFound: Cursor not found, cursor id: 82792803897
默认 mongo server维护连接的时间窗口是十分钟 默认 单次从 server获取数据是101条或者 大于1M小于16M的数据 所以默认情况下,如果10分钟内未能处理完数据,则抛出该异常. 解决 ...
- mysql的数据恢复
转载自:http://ourmysql.com/archives/1293 数据库数据被误删除是经常看到的事情,数据的恢复也就自然成为了DBA很重要的一门基本功夫,比较笨拙的办法是拉出历史的备份到另外 ...
- mahout之canopy算法简单理解
canopy是聚类算法的一种实现 它是一种快速,简单,但是不太准确的聚类算法 canopy通过两个人为确定的阈值t1,t2来对数据进行计算,可以达到将一堆混乱的数据分类成有一定规则的n个数据堆 由于c ...
- cocos2d-x 音乐与音效
1.背景音乐 要使用一个音乐,首先要预加载这个音乐,预加载的方法如下 SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic( CCF ...
- iOS 7 二维码的生成
//二维码生成 //UIImageView *theImageView = [[UIImageView alloc]init]; //[self.view addSubview:theImageVie ...