【问题标题】:Read lua interface读取lua接口
【发布时间】:2013-04-11 16:21:26
【问题描述】:

在lua中,有没有办法读取接口文件来提取名称/方法/参数?

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

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

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

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

我可以读取文件、加载为字符串并使用 gmatch 进行解析以提取信息,但是有什么简单的模式可以解析这些信息吗?

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

【问题讨论】:

  • An example of IDL-file from microsoft site 看起来很不一样。
  • 那双 {{ 应该是单 { 吗?在这种情况下,您可以在interface 和开头的{ 之间插入一个=,然后将文件加载为lua 代码并简单地运行它。这会给你一个表格(称为interface),里面有你需要的所有数据,不是吗?
  • 叶戈尔,看起来不一样。但我认为 lua 可以理解这段代码(我认为 xD 哈哈哈)。如果没有,我可以像你在链接上说的那样创建一个接口文件。但我必须知道如何解析接口
  • buettner,这个双精度不是单个参数(这是你的问题吗?我不知道我是否理解)。实际上接口可以有多个参数。而且我不知道如何加载此信息并提取此信息
  • @BrenoRiba 我说的是你的牙套不匹配。你有 5 个开场 {,只有 4 个闭场 }。我猜你错过了一个右括号。当然有更优雅的方法可以做到这一点,但如果你写了interface = { ... } 并修复了大括号不匹配,这将是完全有效的 Lua 代码,所以你可以做 interface.nameinterface.methods.testing.args[0].type 或任何你想要的。

标签: lua luasocket


【解决方案1】:

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

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

local interface = dofile("input.idl")

界面将是一个很好的表格,就像您在文件中指定的一样。如果您无法根据自己的喜好更改这些文件,则必须将文件加载到字符串中,执行一些字符串操作(具体而言,将第一个 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 不会抱怨,但在这种情况下你也不会得到该字段。

【讨论】:

  • 非常感谢您的回答!猜猜现在对我来说更清楚了!我尝试使用 loadstring(如上所示)制作这个示例,并将 myInterface 用引号括起来。现在我被困在“local interface = f()”这一行......它返回一个零引用。
  • require"pl.pretty".dump(interface) 有什么用?我不明白这一行=/
  • @BrenoRiba 这只是一种以漂亮格式输出整个嵌套表的巧妙方法。您的输入文件是否仍然在第一行包含interface?如果不是,请将"^interface" 更改为"^"
  • @BrenoRiba 不客气。事实上,在这种情况下使用gsub 可能有点矫枉过正。 input = "return " .. input 也可以解决问题;)。或者,如果您可以随意以任何方式编写文件,只需立即在文件中包含return。节省代码行和执行时间。
  • @BrenoRiba for key, value in pairs(interface.methods) do ... 将遍历表中的所有键值对,因此在循环的每次迭代中,key 将是方法名称,value 是方法的表
猜你喜欢
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
相关资源
最近更新 更多