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例子介绍整个注解处理器的搭建流程以及注意事项,你将知道如何去搭建自己的注解 ...
随机推荐
- rsync进行不同服务器之间的数据同步
2台服务器上都要安装rsync,sudo yum install rsync. 把远程的数据备份到本机: rsync -rP --rsh=ssh root@IP:/data/tmp /data/tmp ...
- Tomcat与Servlet工作流程
什么是Tomcat? Tomcatserver是一个免费的开放源码的Web 应用server,属于轻量级应用server. 什么是Servlet? Servlet是在server上执行的小程序.,说白 ...
- OpenCV学习(7) 分水岭算法(1)
分水岭算法主要用于图像分段,通常是把一副彩色图像灰度化,然后再求梯度图,最后在梯度图的基础上进行分水岭算法,求得分段图像的边缘线. 下面左边的灰度图,可以描述为右边的地 ...
- Python下科学计算包numpy和SciPy的安装【原创】
Python下大多数工具包的安装都很简单,只需要执行 "python setup.py install"命令即可.然而,由于SciPy和numpy这两个科学计算包的依赖关系较多,安 ...
- 字符编码(ASCII,Unicode和UTF-8) 和 大小端(zz)
本文包括2部分内容:“ASCII,Unicode和UTF-8” 和 “Big Endian和Little Endian”. 第1部分 ASCII,Unicode和UTF-8 介绍 1. ASCII码 ...
- hadoop源代码组织结构与阅读技巧
本文将介绍在 Eclipse 下阅读 Hadoop 源代码的一些技巧, 比如如何查看一个基类有哪些派生类. 一个方法被其他哪些方法调用等. 本文地址:http://www.cnblogs.com/ar ...
- hadoop常见问题总结1
本文地址:http://www.cnblogs.com/archimedes/p/hadoop-problem1.html,转载请注明源地址. 问题1:http://localhost:50030 H ...
- [置顶] All about control file in Oracle Database
--数据库实例启动的三个阶段: NOMOUNT(START):打开初始化参数文件 MOUNT:打开控制文件 OPEN:打开数据文件和日志文件 --控制文件 控制文件的作用:管理数据库的状态和描述数据库 ...
- win7无法启动telnet服务
右键我的电脑 —> 管理 —>服务,找到服务telnet, 右键—>属性—>依赖关系 就可以看到其他服务的依赖关系,打开相关依赖的服务即可解决服务不能启动的情况
- GMM高斯混合模型 学习(2)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHpxMjAwODExMjExMDc=/font/5a6L5L2T/fontsize/400/fill/I0 ...