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. Mac配置PHP开发环境

    安装环境如下: Mac OS 10.10.1 Apache 2.4.9 PHP 5.5.14 MySQL 5.6.22 Apache配置 在Mac OS 10.10.1中是自带Apache软件的,我们 ...

  2. python的with和__enter__ 、 __exit__

    __enter__(): 在使用with语句时调用,会话管理器在代码块开始前调用,返回值与as后的参数绑定 __exit__():   会话管理器在代码块执行完成好后调用,在with语句完成时,对象销 ...

  3. [gevent源代码分析] 深度分析gevent执行流程

    一直对gevent执行流程比較模糊,近期看源代码略有所得.不敢独享.故分享之. gevent是一个高性能网络库,底层是libevent,1.0版本号之后是libev.核心是greenlet.geven ...

  4. java获取系统进程号

    public static final int jvmPid() { try { RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean( ...

  5. C#的四个基本技巧

    1.如果可能尽量使用接口来编程 .NET框架包括类和接口,在编写程序的时候,你可能知道正在用.NET的哪个类.然而,在这种情况下如果你用.NET支持的接口而不是它的类来编程时,代码会变得更加稳定.可用 ...

  6. Apache多站点配置教程

    看见这个版关于网络程序方面的文章还比较少,下面来一发~实践证明,本教程适用于Apache 2.2.22,其他版本相差应该不大 我的博客:http://wislab.net/,希望跟大家多多交流噢 Ap ...

  7. Open War I: 野王复活与视野,望远镜视野,近距离射击,远程狙击

    Below demos For: 1- 野王复活与视野,近距离射击. 2- 野王视野之外,无法近距离射击,实现望远镜视野, 远程狙击 Share the source codes with your ...

  8. javascript - 字符串比较

    1. sort是排序根据字符的ASCIll码排序的,不分字符串或其它元素(仅适用于数组) 2. split是将字符串转为数组形式 3. join是将数组转为字符串形式 4. indexOf找到元素后返 ...

  9. PHP Filter函数

    PHP Filter 函数 PHP Filter 简介 PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. 安装 Filter 函数是 PHP 核心的组成部分.无需安装即可使用这 ...

  10. Visual studio中后期生成事件命令使用

    在做项目是总要把发布后的一些dll拷贝的根网站的bin目录下,为了避免每次都需要手动拷贝可以在 项目的生成事件中写入bat命令,下面的命令只在项目使用的发布配置时执行拷贝, (在生成->配置管理 ...