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例子介绍整个注解处理器的搭建流程以及注意事项,你将知道如何去搭建自己的注解 ...
随机推荐
- client怎样调用IBinder接口对象
代码: public void funclick(View view){ Intent _intent = new Intent(MainActivity.this,MyService.class); ...
- ASPNET CORE初探
ASP.NET Core 开发-中间件(Middleware) ASP.NET Core开发,开发并使用中间件(Middleware). 中间件是被组装成一个应用程序管道来处理请求和响应的软件组件 ...
- python对字符串的操作
去空格及特殊符号 s.strip().lstrip().rstrip(',') 复制字符串 #strcpy(sStr1,sStr2) sStr1 = 'strcpy' sStr2 = sStr1 sS ...
- [Android Studio] Android Studio如何提示函数用法
Eclipse有一个很好的功能,就是当你代码调用某个android API时,鼠标移到对应的函数或者方法上,就会自动有一个悬 浮窗提示该函数的说明(所包含的参数含义,该方法功能).迁移到Android ...
- #include <NOIP2010 Junior> 三国游戏 ——using namespace wxl;
题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有 N 位武将(N为偶数且不小于 4),任意两个武将之 ...
- java.io.FileNotFoundException: ***(Too many open files)
http://yizhilong28.iteye.com/blog/1154098 在linux下跑一个多线程读取文件的程序,待读取文件有数十万个.程序读取过程中抛出如下异常*****(Too man ...
- iOS:提示框(警告框)控件UIActionSheet的详解
提示框(警告框)控件2:UIActionSheet 功能:当点击按钮或标签等时,弹出一个提示框,显示必要的提示,然后通过添加的按钮完成需要的功能.它与导航栏类似,它继承自UIView. 风格类型: ...
- zedboard--基于zedboard的demo系统的boa服务器搭建(二十一)
zedboard提供的demo系统很迷你,但是也能移植嵌入式Web服务器的.这里就移植boa服务器. 1.下载Boa服务器源代码(安装好了交叉编译器) http://www.boa.org/,选择最后 ...
- XMPPFrameWork IOS 开发(四)消息和好友上下线
原始地址:XMPPFrameWork IOS 开发(四) 消息 //收到消息 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XM ...
- HTML-<a>标签添加下划线
<a href="ddrb/090630.asp" target="_blank" style="text-decoration:underli ...