• 9. JEB 1.5插件编写一




    2.0之后好像新增加了很多API,有所区别
    本文采用Java+Eclipse作为开发环境

    插件支持的语言 


    文档:
    jeb-1.5/doc/index.html


    一.Hello World工程
    1. Eclipse插件开发环境配置

    新建Java工程->工程目录下新建lib目录->右键->add to build path

    配置JavaDoc 这样写代码的时候 有实时的文档可以看


    2. 编写代码
    import jeb.api.IScript;  
    import jeb.api.JebInstance;
    public class Hello implements IScript {
        protected JebInstance mJebInstance;
        
        @Override
        public void run(JebInstance jebInstance) {
            jebInstance.print("Hello World");
        }
    }  

    IScript即为统一接口, 

    3.JEB中执行代码
    File->Run Script->选择刚刚的java文件就好



    二. 文档介绍
    1.主要的包




    2. AST API结构
    所有的AST Element实现jeb.api.ast.IElement
    要么继承于jeb.api.ast.NonStatement,要么继承于jeb.api.ast.Statement


    IElement定义了getSubElements,但不同类型的实现和返回结果也不同,例如:
    1. 对Method进行getSubElements返回
            函数的参数定义语句
            函数体block
    2. IfStmt会返回
            判断使用的Predicate
            每一个if/else/ifelse语句块
    3. Assignment语句返回
            左右IExpression操作数
            Operator操作符
    具体编写脚本中我们通常并不使用这个函数,而根据具体类型定义的更细致的函数,例如Assignment提供的getLeft和getRight.



    NonStatement与Expression的区别在于,NonStatement包含了一些高阶结构,例如jeb.api.ast.Class, jeb.api.ast.Method这些并不会出现在语句中的AST结构体,他们分别代表一个Class结构和Method结构,注意不要与反射语句中使用的Class和Method混淆


    Statement顾名思义就代表了一个语句,但值得注意的是这里的语句并不代表单个语句,
    继承于Compound的Statement中也可能包含其他的Statement

    非Compound的Statement是最基本的语句结构,它的子节点只会由Expression构成而不会包含block. 例如Assignment,可以通过getLeft和getRight调用获得左右两边的操作对象,分别为ILeftExpression和IExpression.ILeftExpression代表可以做左值的Expression,例如变量.而常量显然不实现ILeftExpression接口

    Compound代表多个语句集合的语法块集合,每一个语法块以Block(也是Compound的子类)呈现,通过getBlocks调用获得.所有分支语句均继承Compound

    如下例子所示:

    继承于Compound的IfStm,也就是Statement
    我们通过getBranchPredicate(idx)获取Predict,也就是ztz.isDead()这个Expression,而这个Expression真正的类型是子类Call.
    我们可以通过getBranchBody(idx)获取if和if-else中的Block,通过getDefaultBlock获取else的Block


    IExpression代表了最基本的AST节点,其实现关系如下图



    IExpression接口的实现者Expression类代表了算术和逻辑运算的语句片段,例如a+b, "162" + ztz.toString(), !ztz, redrain*(ztz-162)等等,同时Predicate类是Expression类的直接子类,譬如在if(ztz162)中,该语句的Predicate左值为ztz162这个identifier,右值为null.

    以ztz.test(1) + ”height" + 162这个Expression为例,其结构组成和各节点类型如下:

    Expression是从右到左的结构
    Call没有提供获取caller的API,不过可以通过getSubElements()获取,返回顺序为 
            callee method
            calling instance (if instance call)
            calling arguments, one by one

    参考:





  • 相关阅读:
    进程间通信:命名管道FIFO(2)
    进程间通信:管道(1)
    POSIX线程学习
    进程与信号学习
    堆栈的区别与联系
    浅读《构建之法:现代软件工程》有感
    CSS学习成长记
    jquery学习成长记(一)
    html学习成长记
    Razor视图
  • 原文地址:https://www.cnblogs.com/bingghost/p/5792972.html
Copyright © 2020-2023  润新知