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

參考:



相關文章
相關標籤/搜索