2011-09-18 62 views
4

說的AST我有一個函數:獲取函數

function hi() 
    print('hi') 
end 

我希望能夠利用這個功能作爲參數,並進行分析就可以了,例如列出所有的函數調用它看到它引用的所有變量等。

請注意,我不是在談論分析源代碼;我沒有函數的源文本,我只有函數對象,即這是在運行時完成的。

我想你會這樣做的方式是獲取函數的AST。但我不知道該怎麼做。那麼,我將如何去獲取函數的AST(或者如果有更好的方法來分析它)呢?

回答

2

你可能想嘗試我lbci,一個字節碼檢查器庫

+0

對不起,但我不明白函數的返回值是否爲lbci。有沒有更好的文檔比頁面上說「沒有太多的文檔,但它簡單直觀」? –

+0

@親愛的,我很抱歉沒有文件。嘗試閱讀'test.lua'。如果你仍然有問題,請給我發電子郵件。 – lhf

0

抽象語法樹(很明顯,根據定義)是一個源代碼級的概念。

那麼你或許在非反射編譯語言尋找將是一個"decompiler"

將這項工作?

http://luadec.luaforge.net/

+0

我真正需要的是一個可以接受一個函數併爲其生成AST(或者我可以使用的一些其他表示形式)的Lua庫,如果唯一的方法是獲得然後我想這就是它的方式,但是你可以使用lua的luadec,還是隻是一個程序?這需要我把它做成一個lua擴展(真的想要逃避d)並將其與我的應用程序分發。 –

+0

那麼,如果你的源代碼是固定的,你可以在編譯時總是運行分析。然後將從分析中提取的相關數據嵌入到您的程序中。或者你可以通過這樣一種方式來設置你的代碼的風格:每個函數都有一個明確的「聲明」,並且你可以進一步風格化它,這樣只有那些函數在運行時才被調用... – HostileFork

+0

- OR-使用元語言代替:http://en.wikipedia.org/wiki/Meta-circular_evaluator – HostileFork

1

我要問。你爲什麼沒有來源?是以某種方式混淆了嗎?不管怎樣,如上所述,即使真的沒有一個在Lua中開始,AST也不能通過任何運行時機制來使用。

雖然這是很容易的,因爲它被送入嵌入式解釋或不獲取訪問在很多情況下,源(當然,除非他們只船的字節碼...

+0

我沒有源代碼,因爲這是一個我正在編寫的lua庫,而我的函數寫作只是一個函數作爲論點。 –

+0

如果你是一個受控制的人。讓他們將函數作爲字符串提交給loadstring()。真的,你可以從清單文件'luac -l' – sylvanaar

+0

中得到你想說的大部分內容。「這並不簡單,對不起。 –