【问题标题】:Getting the AST of a function获取函数的 AST
【发布时间】:2011-11-19 20:22:59
【问题描述】:

假设我有一个函数:

function hi()
    print('hi')
end

我希望能够将此函数作为参数并对其进行分析,例如列出其中的所有函数调用,查看它引用的所有变量等。

请注意,我不是在谈论分析源代码;我没有函数的源文本,我只有函数对象,即这是在运行时完成的。

我认为您这样做的方法是获取函数的 AST。但我不知道该怎么做。那么我将如何获取函数的 AST(或者如果有更好的方法则对其进行分析)?

【问题讨论】:

    标签: function lua analysis abstract-syntax-tree decompiler


    【解决方案1】:

    抽象语法树(几乎按照定义)是源级概念。

    所以您可能在非反射编译语言中寻找的是"decompiler"

    这行得通吗?

    http://luadec.luaforge.net/

    【讨论】:

    • 我真正需要的是一个 Lua 库,它可以接受一个函数并为其生成 AST(或我可以使用的其他表示形式)。如果这样做的唯一方法是获取函数的源然后将源传递给分析器,那么我想这就是它的方式。但是你可以使用lua中的luadec,还是它只是一个程序?那将需要我将其设为 lua 扩展(真的想避免这种情况)并将其与我的应用程序一起分发。
    • 好吧,如果你的源代码是固定的,你总是可以在编译时运行分析。然后将从分析中提取的相关数据嵌入到您的程序中。或者你可以对你的代码进行风格化,使每个函数注册一个明确的“公告”,然后你可以进一步对其进行风格化,以便在运行时只允许调用这些函数......跨度>
    • -或- 改用元循环语言:en.wikipedia.org/wiki/Meta-circular_evaluator
    【解决方案2】:

    我得问问。怎么没有源码?是否以某种方式被混淆了?

    无论如何,如前所述,AST - 即使在 Lua 中确实没有一开始的,也不能通过任何运行时机制使用。

    虽然在许多情况下很容易获得对源代码的访问,因为它是否被馈送到嵌入或不嵌入的解释器中(当然,除非它们只发送字节码......

    【讨论】:

    • 我没有源码,因为这是我正在写的一个lua库,而我正在写的函数只是将一个函数作为参数。
    • 如果你是控制者。让他们将他们的函数作为字符串提交给 loadstring()。真的,你可以从列表文件luac -l 中得到你想要的大部分内容
    • '恐怕没那么简单,抱歉。
    • 好吧,那时总会有 debug 库。抱歉,我无法提供更多帮助。
    • 你怎么能用调试库做到这一点?
    【解决方案3】:

    你可能想试试我的lbci,一个字节码检查器库。

    【讨论】:

    • 抱歉,我不明白 lbci 函数的返回值是什么。有没有比“文档不多但简单直观”的页面更好的文档?
    • @Seth,很抱歉没有文档。尝试阅读test.lua。如果您仍有疑问,请给我发送电子邮件。
    猜你喜欢
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2016-06-11
    • 1970-01-01
    • 2016-10-21
    • 2014-03-25
    • 2011-08-04
    • 2013-11-10
    相关资源
    最近更新 更多