读取lua接口



在lua中,是否有任何方法读取接口文件以提取名称/方法/参数?

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

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

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

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

我可以读取文件,加载为字符串和解析与gmatch例如提取信息,但是否有任何简单的模式来解析这个信息?

最后,我想要一些带有接口名称,它们的方法,结果类型和参数的东西(例如表)。只是为了了解我正在工作的界面

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

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

local interface = dofile("input.idl")

和interface将是一个很好的表,就像您在文件中指定的那样。如果不能按照自己的喜好更改这些文件,则必须将文件加载到字符串中,执行一些字符串操作(具体而言,将第一个interface替换为return),然后使用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是不会抱怨的,但在这种情况下,你也不会得到字段

最新更新