阅读 Lua 接口。

在lua中,有没有什么方法可以读取接口文件以提取名称/方法/参数?

我有一个类似于这样的.idl文件:

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

这相当于下面的代码(更易读):

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

我可以读取文件,将其作为字符串载入并使用gmatch解析以提取信息,但是是否有任何简单的模式可以解析此信息?

最后我想要的是接口名称,其方法,结果类型和参数(例如表)。只是为了知道我正在使用的接口。

点赞
用户1633117
用户1633117

Lua 有几种处理代码块的方法。那就是 dofileloadfileloadstring. 幸运的是,您的输入文件几乎是有效的 Lua 代码(假设这些花括号是匹配的)。唯一有问题的是 interface {

以上所有函数都会有效地创建一个包含文件或字符串内容的函数对象,其中 dofile 立即执行该函数,而其他函数返回一个函数,您可以在需要时调用该函数。因此,如果您可以自由更改文件,请将第一行中的 interface 替换为 return。然后您可以执行:

local interface = dofile("input.idl")

interface 会是一个很好的表格,就像你在文件中指定的那样。如果您无法以自己的方式更改这些文件,则必须将文件加载到字符串中,进行一些字符串操作(具体来说,用 return 替换第一个 interface),然后使用 loadstring 代替:

io.input("input.idl")
local input = io.read("*all")
input = string.gsub(input, "^interface", "return") -- ^ 标记了字符串的开头
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 不认识的名称,它不会抱怨,但在这种情况下,您也无法获得该字段。

2013-04-18 18:28:06