阅读lua界面

时间:2013-04-18 13:52:28

标签: lua luasocket

在lua中,有没有办法读取一个接口文件来提取name / methods / args?

我有一个像这样的.idl文件:

interface
{
    name = myInterface,
    methods = {
        testing = {
            resulttype = "double",
            args = {{direction = "in",
            type = "double"},
        }
    }
}

这等于下面的代码(更容易阅读):

interface myInterface {
  double testing (in double a);
};

我可以读取文件,加载为字符串并使用gmatch解析例如提取信息,但是有没有简单的模式来解析这些信息?

最后,我想要一些东西(例如一个表),其中包含接口名称,方法,结果类型和args。只是想知道我正在使用的界面。

1 个答案:

答案 0 :(得分:2)

Lua有几个解释代码块的工具。即,dofileloadfileloadstring。幸运的是,您的输入文件几乎有效的Lua代码(假设这些大括号是匹配的)。唯一有问题的是interface {

所有上述函数都有效地创建了一个函数对象,其中包含文件或字符串的内容作为其代码。 dofile立即执行该函数,而其他函数返回一个函数,您可以随时调用该函数。因此,如果您可以随意更改文件,请将第一行中的interface替换为return。然后你可以这样做:

local interface = dofile("input.idl")

接口将是一个很好的表,就像你在文件中指定它一样。如果您无法根据自己的喜好更改这些文件,则必须将文件加载到字符串中,执行一些字符串操作(具体而言,将第一个interface替换为return),然后使用{{1}而不是:

loadstring

在这两种情况下,这都是你得到的:

io.input("input.idl")
local input = io.read("*all")
input = string.gsub(input, "^interface", "return") -- ^ marks beginning of string
local f = loadstring(input)
local interface = f()

修改

我刚刚意识到,在您的示例中,输入> require"pl.pretty".dump(interface) { name = "myInterface", methods = { testing = { args = { { type = "double", direction = "in" } }, resulttype = "double" } } } > print(interface.methods.testing.args[1].type) double 未包含在myInterface中,因此不是正确的字符串。这也是输入文件中的错误或者文件实际上是什么样的?在后一种情况下,您还需要更改它。 Lua不会抱怨它是否是一个它不知道的名字,但在这种情况下你也不会得到这个字段。