Atitit.注解and属性解析(2)---------语法分析 生成AST  attilax总结  java .net

1. 应用场景:::因为要使用ui化的注解 1

2. 使用解释器方式来实现生成AST 1

3. 识别TerminalExpression和NonterminalExpression
2

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的更多相关文章

  1. Atitit.注解解析(1)---------词法分析 attilax总结 java .net

    Atitit.注解解析(1)---------词法分析 attilax总结  java .net 1. 应用场景:::因为要使用ui化的注解 1 2. 流程如下::: 词法分析(生成token流) & ...

  2. atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结

    atitit.自己动手开发编译器and解释器(1) ------词法分析--attilax总结 1.   应用场景:::DSL 大大提升开发效率 1 2. 2. 流程如下::: 词法分析(生成toke ...

  3. 【lombok】lombok---帮你简化生成必要但臃肿的java代码工具 【映射注解和lombok注解同时使用 以及 映射注解放在属性和get方法上的区别】

    官方地址:https://projectlombok.org/ GitHub:https://github.com/rzwitserloot/lombok 指导说明文档:http://jnb.ociw ...

  4. Spring源码解析 – @Configuration配置类及注解Bean的解析

    在分析Spring 容器创建过程时,我们知道容器默认会加载一些后置处理器PostPRocessor,以AnnotationConfigApplicationContext为例,在构造函数中初始化rea ...

  5. Spring注解式事务解析

    #Spring注解式事务解析 增加一个Advisor 首先往Spring容器新增一个Advisor,BeanFactoryTransactionAttributeSourceAdvisor,它包含了T ...

  6. Spring注解开发-全面解析常用注解使用方法之生命周期

    本文github位置:https://github.com/WillVi/Spring-Annotation/ 往期文章:Spring注解开发-全面解析常用注解使用方法之组件注册 bean生命周期 ​ ...

  7. 使用Spring注解注入属性

    本文介绍了使用Spring注解注入属性的方法.使用注解以前,注入属性通过类以及配置文件来实现.现在,注入属性可以通过引入@Autowired注解,或者@Resource,@Qualifier,@Pos ...

  8. 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 ...

  9. (转)用@Resource注解完成属性装配

    http://blog.csdn.net/yerenyuan_pku/article/details/52858878 前面我们讲过spring的依赖注入有两种方式: 使用构造器注入. 使用属性set ...

随机推荐

  1. 适配高分辨率的图片High DPI Images for Variable Pixel Densities

    用最高的效率与性能提供最好的图片质量. 本文内容来至http://www.html5rocks.com/en/mobile/high-dpi/.是在这篇文章的翻译的基础上进行了总结和说明. 眼下面临的 ...

  2. MyEclipse for Linux版下载

    最近看到很多网友都在找MyEclipse for Linux版下载,费了很大劲也没有找到.1.建议通过代理到官方网站下载. 2.用迅雷下载.设置迅雷使用代理下载(我用的就是这种方式). MyEclip ...

  3. xheditor

    完整按钮表 |:分隔符 /:强制换行 Cut:剪切 Copy:复制 Paste:粘贴 Pastetext:文本粘贴 Blocktag:段落标签 Fontface:字体 FontSize:字体大小 Bo ...

  4. Pydoc 本地 HTML 形式查看

    Pydoc 本地 HTML 形式查看 我们在编写Python代码时,常常会去查询某些模块及函数的使用,会选择 dir() 及 help() 函数.或查看 CHM 格式的Python帮助文档.或查看Py ...

  5. SMTP用户枚举原理简介及相关工具

    前言 SMTP是安全测试中比较常见的服务类型,其不安全的配置(未禁用某些命令)会导致用户枚举的问题,这主要是通过SMTP命令进行的.本文将介绍SMTP用户枚举原理以及相关工具. SMTP SMTP命令 ...

  6. Informatica 常用组件Source Qualifier之五 User Defined Join

    User defined join :      输入用户定义的联接与输入自定义 SQL 查询类似.但是,只需输入 WHERE 子句的内容,而不是整个查询. 添加用户定义的联接时,源限定符转换包括默认 ...

  7. c#如何操作ppt的播放 【转】

    C#控制ppt的代码 包括打开ppt文件.读取幻灯页,插入幻灯片,自动播放等 using System.Collections.Generic; using System.Linq; using Sy ...

  8. 如何通过.reg文件来修改注册表键和子键以及键值

    无废话, 直接上例子, 自己运行一下便知. 然后根据自己需要改改就可以随便用了.   添加key, subkey, 和设置键值的例子. ==================== Windows Reg ...

  9. popupWindow 用法总结 控制位置

    android中的dialog,以及activiy形式的dialog均是模态对话框,对话框不消失时,不能对其他页面进行操作,也就是其他页面不能获得焦点.而PopupWindow是非模态对话框,对话框显 ...

  10. 用CSS hack技术解决浏览器兼容性问题

    什么是CSS Hack? 不同的浏览器对CSS的解析结果是不同的,因此会导致相同的CSS输出的页面效果不同,这就需要CSS Hack来解决浏览器局部的兼容性问题.而这个针对不同的浏览器写不同的CSS ...