我需要一个工具来分析Lua表表达式。如果一切都失败了,我最终将只是代码一个小Lua模块的转换表,以XML,但在目前,我感兴趣的红宝石图书馆这样做,但如果做不到这一点,我会接受的工具,在任何语言,提供了我可以看看它的来源。

这里是一个例子段(这是一个哇附件输出):

CT_RaidTracker_RaidLog = {
{
    ["PlayerInfos"] = {
        ["Nyim"] = {
            ["race"] = "Orc",
            ["guild"] = "Excubitores Noctae",
            ["sex"] = 2,
            ["class"] = "HUNTER",
            ["level"] = 70,
        },
        ["Zyrn"] = {
            ["race"] = "BloodElf",
            ["guild"] = "Excubitores Noctae",
            ["sex"] = 2,
            ["class"] = "WARLOCK",
            ["level"] = 70,
        },
...

基本想法是,嵌套关联阵列。任何帮助或指针将被审查,任何的想法表示赞赏。

EDIT #1

由于争端,让我澄清我怎么尝试。我补充串/regex替换链提供的一个参与者,像这样:

str.gsub(/--.+$/, "").gsub("=", ":").gsub(/[\[\]]/,"").gsub('" :','":').gsub(/,\s*\n(\s*)}/, "\n\\1}")

I(1)增加切除Lua评论,(2)取代一个regex代乳品:当你最后一个元素中的一个目/阵列,它仍然有一个逗号后,因此必须被复盖和正常逗号删除。

你注意到 双括号打开?JSON不喜欢具有匿名的对象。它看起来像是:

"xxx" = {
  {
    ["aaa"} = {
      ["bbb"] = {
        "ccc" = 7
        "ddd" = "a string"
        "eee" = "a date/time pattern"
      }
    },
    ["qqq"} = {
      "hm" = "something"
    }
  },
  {
    ["aaa"] = {
    -- ...
    },
    ["qqq"] = {
    -- ...
    }
  }
}

基本上根一级,我们实际上有一个名单/系列类似的对象,既有"aaa"和"异"部分,以效仿的榜样。然而,在Lua,显然是允许的,而关系图来描述软件所需的依赖它不是。因为开括号处理像"开始的一个目",但对没有一个名称。

我尝试,以检测这种情况下与regex和更换大括号中的"[]"对。虽然所得regex的工作,该问题是相同的:好吧,我们确定一系列类似的对象,而不是的,但是《宣言》的阵仍然是无名。

一个可能的解决办法是相反的检测和更换那些与括号[],克里森的对象的指标,如: "0" = { "aaa" = {...} }, "1" = { "aaa" = {... } }, 等等。那个(我希望最终)的解决方法可能会使它的工作...将报告后再返回。;)

有帮助吗?

解决方案

跳过第一行,然后一些特设变换到JSON。

s=File.readlines("test.luatable")[1..-1].join
JSON.parse(s.gsub("=", ":").gsub(/[\[\]]/,"").gsub('" :','":').gsub(/,\n(.+)\}/,"\n\\1}"))
=> {"PlayerInfos"=>{"Nyim"=>{"guild"=>"Excubitores Noctae", "class"=>"HUNTER",  
    "level"=>70, "sex"=>2, "race"=>"Orc"}, "Zyrn"=>{"guild"=>"Excubitores Noctae", 
    "class"=>"WARLOCK", "level"=>70, "sex"=>2, "race"=>"BloodElf"}}}

其他提示

我可能说明明显,但肯定的Lua可以解析Lua中的表。你可以在几乎任何主流语言“嵌入”的Lua 包括Java和Ruby(向下滚动链接Java和Ruby绑定)。通过嵌入,我的意思是解析源文件,调用Lua函数和探索的表,可以是用从Lua的宿主语言甚至通话功能。这可能是因为这些绑定库比出口你的表到XML / JSON更多的工作,但它的身价至少在看他们。

编辑:70水平?这是如此过去十年)

这是简单的编写Lua程序,输出表在XML但这取决于你怎么想的XML格式。也参看 LuaXML, ,其中有xml。省(但是写在C)和 这个问题.

它可能将是简单的使用 JSON 比此情况下的XML。

这LUA表翻译接近1比1(=变化到:,和删除[和]从密钥)。这是JSON等效您的示例的:

{
  "PlayerInfos": {
    "Nyim": {
      "race": "Orc",
      "guild": "Excubitores Noctae",
      "sex": 2,
      "class": "HUNTER",
      "level": 70
    },
    "Zyrn": {
      "race": "BloodElf",
      "guild": "Excubitores Noctae",
      "sex": 2,
      "class": "WARLOCK",
      "level": 70
    },

...

此外,滑轨具有内置的JSON-解析(通过JSON ::分析)。

为了从一个Ruby应用程序读取它,你会做一些类似的:

require 'json' # This is already included on Rails apps

info = JSON::parse(File.read("PlayerInfos.json"))

然后玩家的相关信息将是可在:

player_infos = info["PlayerInfos"]

还有一个Java的JSON解析器,但我与它没有任何经验。

试试这个代码

function toxml(t,n)
        local s=string.rep(" ",n)
        for k,v in pairs(t) do
                print(s.."<"..k..">")
                if type(v)=="table" then
                        toxml(v,n+1)
                else
                        print(s.." "..v)
                end
                print(s.."</"..k..">")
        end
end

toxml(CT_RaidTracker_RaidLog,0)

您提到您只能使用Java,Ruby或PHP本作的分析。一种选择是使用像ANTLR的工具来生成一个小解析器你。

在ANTLR语法:

grammar Test;

parse
  :  Identifier '=' table EOF
  ;

table
  :  '{' (entry (',' entry)* ','?)? '}'
  ;

entry
  :  key ('=' value)?
  |  String
  |  Number
  ;

key
  :  '[' (String | Number) ']'
  |  Identifier
  ;

value
  :  String 
  |  Number
  |  Identifier
  |  table
  ;

Identifier
  :  ('a'..'z' | 'A'..'Z' | '_') ('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
  ;

String
  :  '"' ~'"'* '"'
  ;

Number
  :  '0'..'9'+
  ;

Space
  :  (' ' | '\t' | '\r' | '\n') {skip();}
  ;

生成解析器,可以采取像输入:

Table = {
  ["k1"] = "v1",
  ["k2"] = {["x"]=1, ["y"]=2},
  ["k3"] = "v3"
}

和将其转化为:

替代文字http://img59.imageshack.us/img59/7112/treef .PNG

(点击这里图像的全分辨率)

从树结构编写XML是儿戏。

但是正如我所说,Lua中的表可以看从我张贴以上语法相当不同:字符串可以是这样的:

'a string'
[===[ also ]==] a string ]===]

和键和值可以由表达式。但是,如果树总是看起来怎么样,你的贴吧,它可能是一个选择。

祝你好运!

我需要做在Java中,所以我写了一个小库:

https://github.com/mutantbob/jluadata

未经测试的代码。而且,我只是下面的SBK的链接在这里,所以我完全不值得任何信贷。

require 'rubyluabridge'

def lua_data_to_ruby_hash(data)
    luastate = Lua::State.new
    luastate.eval "d = #{data}"
    return luastate.d.to_hash
end

可以我想指出,Lua中没有正则表达式的能力,只是模式匹配的文本替换。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top