Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net
来源:互联网 发布:网络直播行业报告 编辑:程序博客网 时间:2024/06/05 19:52
Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net
1. 应用场景:::因为要使用ui化的注解 1
2. 使用解释器方式来实现生成AST 1
3. 识别TerminalExpression和NonterminalExpression2
1.1. 单词流必须识别为保留字,标识符(变量),常量,操作符(运算符 )和界符五大类 2
1.2. 操作符(运算符 )::: 2
4. 生成括号操作符表达式 2
5. 逗号操作符表达式 5
6. 等号表达式and 基本元素表达式 6
7. AST 可视化显示 6
1. 应用场景:::因为要使用ui化的注解
String s = "@QueryAdptr(sqlwhere=\" clo1='@p' \",prop2=\"v2\") @Nofilt";
网上马,,子能嘎自实现兰.
作者:: 老哇的爪子 Attilax 艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.net/attilax
2. 使用解释器方式来实现生成AST
Context存储的全局上下文环境,AbstractExpression是所有表达式必须继承的接口,TerminalExpression和NonterminalExpression是两个实现。
3. 识别TerminalExpression和NonterminalExpression
1.1. 单词流必须识别为保留字,标识符(变量),常量,操作符(运算符 )和界符五大类
1.2. 操作符(运算符 ):::
() [] -> .
? :
条件
由右向左
() [] -> .
括号(函数等),数组,两种结构成员访问
由左向右
,
逗号(顺序)
+ -
加,减
由左向右
括号,纺括号,等号
参考
编译器DIY——词法分析 - GodLike - 博客频道 - CSDN.NET.htm
操作符要使用一个状态来描述的...
4. 生成括号操作符表达式
// 构造函数传参,并解析
public Client(String expStr) throws CantFindRitBrack {
// 定义一个堆栈,安排运算的先后顺序
Stack<AbstractExpression> stack = ctx.stack;
// 表达式拆分为字符数组
List<Token> tokenList = (List<Token>) fsmx.getTokenList();
// 运算
//AbstractExpression left = null;
//AbstractExpression right = null;
for (int i =0; i < tokenList.size(); i++) {
Token tk = tokenList.get(i);
switch (tk.value) {
case "(": // comma exp
AbstractExpressionleft3 = stack.pop();
int nextRitBrackIdx=getnextRitBrackIdx(i,tokenList);
List sub=tokenList.subList(i+1, nextRitBrackIdx);
AbstractExpressioncenter = new BracktItemExpression(sub,ctx);
center=stack.pop();
stack.push(new BracktExpression(left3, center));
i=nextRitBrackIdx;
break;
case ",": // comma exp
AbstractExpressionleft = stack.pop();
AbstractExpressionright = new CommaItemExpression(new AttrNameExpression(
tokenList.get(++i).value), new EqxlExpression(
tokenList.get(++i).value), new AttValExpression(
tokenList.get(++i).value));
stack.push(new CommaExpression(left, right));
break;
default: // var in gonsi 公式中的变量
AbstractExpression left2 =new AnnoExpression(tokenList.get(i).value);
stack.push(left2);
}
}
// 把运算结果抛出来
this.expression = stack.pop();
}
private int getnextRitBrackIdx(int start, List<Token> tokenList) throws CantFindRitBrack {
for (int i=start;i<tokenList.size();i++) {
if(tokenList.get(i).value.equals(")"))
return i;
}
throw new CantFindRitBrack("");
}
// start calc开始运算
public Object run() {
System.out.println("--");
//CommaExpression ce=(CommaExpression) expression;
AbstractExpression AST=new ASTrootExpress(expression,new AnnoExpression("tt"));
System.out.println(JSONObject.fromObject(AST).toString(15));
//json
//System.out.println(JsonUtil4jackjson.buildNormalBinder().toJson(
//ce));
return this.expression.interpret(this.ctx);
}
5. 逗号操作符表达式
public class BracktItemExpression extends AbstractExpression {
public BracktItemExpression(List sub2, Context ctx) {
Stack<AbstractExpression> stack = ctx.stack;
List<Token> tokenList = sub2;
for (int i = 0; i < tokenList.size(); i++) {
Token tk = tokenList.get(i);
switch (tk.value) {
case ",": // comma exp
AbstractExpression left = stack.pop();
AbstractExpression right = new CommaItemExpression(
new AttrNameExpression(tokenList.get(++i).value),
new EqxlExpression(tokenList.get(++i).value),
new AttValExpression(tokenList.get(++i).value));
stack.push(new CommaExpression(left, right));
break;
default: // var in gonsi 公式中的变量
AbstractExpression left2 = new CommaItemExpression(
new AttrNameExpression(tokenList.get(i).value),
new EqxlExpression(tokenList.get(++i).value),
new AttValExpression(tokenList.get(++i).value));
stack.push(left2);
}
}
}
6. 等号表达式and 基本元素表达式
7. AST 可视化显示
使用json 缩进15来显示...马个好的tree型显示,都是树放的,马个亘放的...牙马个好的pic lib 输出层次...
{"rootExp": {
"centerExp": {
"leftComma": {
"leftComma": {
"attNameExp": {"attname": "at1"},
"attValExp": {"val": "v1"},
"eqExp": {}
},
"rightCommaExp": {
"attNameExp": {"attname": "at2"},
"attValExp": {"val": " v2 abc "},
"eqExp": {}
}
},
"rightCommaExp": {
"attNameExp": {"attname": "at3"},
"attValExp": {"val": "v3"},
"eqExp": {}
}
},
"nameExp": {"value": "@qu"}
}}
- Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net
- Atitit.注解解析(1)---------词法分析 attilax总结 java .net
- atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结
- Atitit. 构造ast 语法树的总结attilax oao
- Atitit. 构造ast 语法树的总结attilax v2 q0f
- Atitit.http httpclient实践java c# .net php attilax总结
- Atitit 图片 验证码生成attilax总结
- Atitit.java图片图像处理attilax总结
- Atitit.遍历图像像素点rgb java attilax总结
- Atitit.java的浏览器插件技术 Applet japplet attilax总结
- atitit.javascript调用java in swt attilax 总结
- Atitit 图像处理 调用opencv 通过java api attilax总结
- Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
- atitit.LimeSurvey 安装 attilax 总结
- Atitit 软件工程概览attilax总结
- Atitit 转移特效attilax总结
- Atitit 财政支出学习心得 attilax总结
- Atitit diy战略 attilax总结
- 刷题前动员
- Spring管理事物应用到实际的项目中--编程式事物
- C语言从stdin读取一行字符串的几种方法
- 文档 ID 457926.1
- ARM汇编之合法立即数的快速判断方法
- Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net
- HDU 2005 第几天?
- 第十三周项目4-数组的排序
- 对设备进行了CLI配置后的三种处理操作
- 运用javase写一个最简单的服务器...
- Apache 配置虚拟主机三种方式
- openssl
- gtk2-devel安装 gdk-2.0.pc
- ASCII和转义字符的区别与联系