2013-04-18 34 views
3

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

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

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

这是等于码波纹管(更易于阅读):

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

可以阅读文件,载荷串和解析用gmatch来提取信息,但是有没有简单的模式来解析这些信息?

最后,我想要的东西(例如表)与接口名称,他们的方法,结果类型和参数。只是为了知道我正在工作的界面。

+0

来自Microsoft网站的IDL文件的[示例](http://msdn.microsoft.com/en-us/library/windows/desktop/aa378710%28v=vs.85%29.aspx)看起来完全不同。 –

+0

那是双'{{'应该是单个'{'?在这种情况下,你可以在'interface'和开头的'{'之间插入一个'=',并将文件加载为lua代码并简单地运行它。那会给你一个表(称为'interface'),你需要所有的数据,不是吗? –

+0

叶戈尔,看起来不同。但我认为lua可以理解这个代码(我认为xD哈哈哈)。如果没有,我可以创建一个接口文件,就像你在链接上说的那样。但我必须知道如何解析界面 – Crasher

回答

2

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

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

local interface = dofile("input.idl") 

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

+0

非常感谢您的回答!猜猜我现在更清楚了!我尝试使用loadstring来创建这个示例(如上所示),并将myInterface用引号括起来。现在,我在“local interface = f()”这一行填充了它......它返回了一个零参考。 – Crasher

+0

什么是需要“pl.pretty”.dump(接口)的?我不明白这条线=/ – Crasher

+0

@BrenoRiba这是一个很好的方式来输出一个完整的格式化嵌套表格。你的输入文件是否仍然在第一行包含'interface'?如果不是,请将'“^ interface”'改为'“^”'。 –