Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net
Atitit.注解and属性解析(2)---------语法分析 生成AST attilax总结 java .net
3. 识别TerminalExpression和NonterminalExpression
2
1.1. 单词流必须识别为保留字,标识符(变量),常量,操作符(运算符 )和界符五大类 2
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.注解解析(1)---------词法分析 attilax总结 java .net 1. 应用场景:::因为要使用ui化的注解 1 2. 流程如下::: 词法分析(生成token流) & ...
- atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结
atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结 1. 应用场景:::DSL 大大提升开发效率 1 2. 2. 流程如下::: 词法分析(生成toke ...
- 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】
官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...
- Spring源码解析 – @Configuration配置类及注解Bean的解析
在分析Spring 容器创建过程时,我们知道容器默认会加载一些后置处理器PostPRocessor,以AnnotationConfigApplicationContext为例,在构造函数中初始化rea ...
- Spring注解式事务解析
#Spring注解式事务解析 增加一个Advisor 首先往Spring容器新增一个Advisor,BeanFactoryTransactionAttributeSourceAdvisor,它包含了T ...
- Spring注解开发-全面解析常用注解使用方法之生命周期
本文github位置:https://github.com/WillVi/Spring-Annotation/ 往期文章:Spring注解开发-全面解析常用注解使用方法之组件注册 bean生命周期 ...
- 使用Spring注解注入属性
本文介绍了使用Spring注解注入属性的方法.使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@Pos ...
- 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 ...
- (转)用@Resource注解完成属性装配
http://blog.csdn.net/yerenyuan_pku/article/details/52858878 前面我们讲过spring的依赖注入有两种方式: 使用构造器注入. 使用属性set ...
随机推荐
- matlab strel
>>se3 = strel('square',3)Neighborhood: 1 1 1 1 1 1 1 1 1 >> se3 = strel('line',3 , 45)Ne ...
- iOS:转载:IOS谓词--NSPredicate
IOS谓词--NSPredicate 分类: IOS应用2013-02-19 17:24 6792人阅读 评论(1) 收藏 举报 Cocoa 提供了NSPredicate 用于指定过滤条件,谓词是指在 ...
- M1卡说明及使用proxmark3破解方法
看了网上写的一些关于M1卡的文章,多数有些误导之嫌.首先谈谈M1卡的规格,M1卡的容量为1KB,好多网上写8KB,这里其实是有个误区,应该是8K位.1Byte=1B=8位.其实也就是说8k位想到于1K ...
- go语言基础之闭包的特点
所谓闭包就是一个函数“捕获”了和它在同一作用域的其它常量和变量.这就意味着当闭包被调用的时候,不管在程序什么地方调用,闭包能够使用这些常量或者变量.它不关心这些捕获了的变量和常量是否已经超出了作用域, ...
- OkHttp 使用案例 文档翻译 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Android -- 消息处理机制源码分析(Looper,Handler,Message)
android的消息处理有三个核心类:Looper,Handler和Message.其实还有一个Message Queue(消息队列),但是MQ被封装到Looper里面了,我们不会直接与MQ打交道,因 ...
- 那些年困扰我们的Linux 的蠕虫、病毒和木马
虽然针对Linux的恶意软件并不像针对Windows乃至OS X那样普遍,但是近些年来,Linux面临的安全威胁却变得越来越多.越来越严重.个中原因包括,手机爆炸性的普及意味着基于Linux的安卓成为 ...
- C# 中如何将List<string>里的集合转换成字符串并按指定的字符进行分隔?
代码: using System; using System.Collections.Generic; publicclassMyClass { publicstaticvoidMain() { Li ...
- RS中的关系引用不明确以及行列自动添加了追溯
问题1:由于在FM模型的物理层是自己新建了查询主题,查询主题采用对已经存在的表进行sql处理然后重命名, 使用的是sql类型的数据源,sql类型设置的查询类型是默认的cognos类型,而语法是本地的结 ...
- OpenCV学习笔记(四十)——再谈OpenCV数据结构Mat详解
原文:http://blog.csdn.net/yang_xian521/article/details/7107786 我记得开始接触OpenCV就是因为一个算法里面需要2维动态数组,那时候看cor ...