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例子介绍整个注解处理器的搭建流程以及注意事项,你将知道如何去搭建自己的注解 ...
随机推荐
- Andorid之Annotation框架初使用(五)
注入res文件夹的资源: @StringRes @EActivity public class MyActivity extends Activity { @StringRes(R.string.he ...
- node最简单的升级
1.安装n插件 npm install -g n //全局安装 2.升级 n stable //升级 3.packjson升级 npm i -g npm-upgrade 4.升级 npm-upgrad ...
- MsChart<3> 饼状图
MsChart,饼状图 1 <asp:Chart ID="Chart1" runat="server" BorderlineDashStyle=" ...
- GIF 屏幕录制工具
LICEcap是一款屏幕录制工具,支持导出 GIF 动绘图片格式,轻量级.使用简单,录制过程中能够任意改变录屏范围. .捕捉屏幕的区域并保存为.GIF动画(便于网络公布)或.L ...
- iOS:CoreData数据库的使用四(数据库和UITableViewController以及NSFetchedResultsController一起使用)
CoreData数据库虽然可以和tableview或者UITableViewController一起使用将数据显示在表格上,但是在准备数据的时候,这种方式需要用一个可变数组来装从数据库一次性取出来的所 ...
- Symfony安装及使用
安装Symfony,使用 brew install homebrew/php/symfony-installer 开始一直下载不了包,我手动浏览器下载了几个,发现好像都是Permission问题,运行 ...
- longest-palindrome
https://leetcode.com/problems/longest-palindrome/ public class Solution { public int longestPalindro ...
- go语言基础之普通函数的调用流程
函数调用流程:先调用后返回,先进后出,函数递归,函数调用自己本分,利用此物点 1.普通函数的调用流程 package main //必须 import "fmt" func fun ...
- Cognos清除本地高速缓存的利与弊
场景:在开发报表初期,往往我们遇到过这种问题,我们手工修改了DB中的测试数据,但是返回报表看,数据还没有更新,难道是设计出问题了?NO,不要慌,这是因为Cognos为了查询效率设计了高速缓存的选项. ...
- html 中几次方,平方米,立方米.
m的n次方表示法:mn m<sup>n</sup> 10<sup>6</sup> m的n次方表示法:mn m<sub>n</sub&g ...