2013-04-18 45 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」'改爲'「^」'。 –