我需要一个工具来解析Lua表格,最好用Ruby或Java。

我需要一个工具来解析 Lua 表达式中的表格。如果其他方法都失败了,我最终只会编写一个小型的 Lua 模块将表格转换为 XML,但目前我对使用 Ruby 库进行转换感兴趣,但如果找不到,我会接受任何语言的工具,只要我可以查看它的源代码。

以下是一个示例片段(是一个 WoW 插件输出):

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,
        },
...

基本想法是,嵌套的关联数组。任何帮助或指针都将被审查,任何想法都将被欣赏。

编辑#1

由于争议,让我澄清我尝试了什么。我补充了一个参与者提供的字符串 / 正则表达式替换链,如下所示:

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

我(1)添加了Lua注释的删除,(2)替换了其中一个正则表达式替换器:当对象 /数组中有最后一个元素时,它仍然在其后有一个逗号,因此必须覆盖该逗号并正确删除。

你是否注意到了 _双开花括号_?JSON 不喜欢匿名对象。它看起来像这样:

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

基本上在根级别,我们实际上有一个类似对象的列表/数组,两者都有 "aaa" 和 "qqq" 部分,以遵循示例。但是,在 Lua 中,显然是允许的,在 JSON 中却不是。因为开头的花括号被视为 “开始一个对象”,但该对象没有名称。

我尝试使用正则表达式检测该情况并将花括号替换为“\ []”对。虽然得到的正则表达式运行良好,但问题仍然存在:好的,我们定义了一个类似对象的数组,但是数组的声明仍然是匿名的。

一个可能的解决方案是,除了检测和替换那些大括号为\ []之外,还要为对象分配索引,例如:“ \“0 \”= { \”aaa \“={...}}, \”1 \“= { \”aaa \“={... } }“等。这(希望最终)的解决方法可能会使其工作... 再次报告。;)

原文链接 https://stackoverflow.com/questions/2370153

点赞
stackoverflow用户107090
stackoverflow用户107090

可以简单地编写一个 Lua 程序将表格输出为 XML,但这取决于你希望 XML 格式如何。也可以参考 LuaXML,它有 xml.save 方法(但是是用 C 编写的),以及 这个问题

2010-03-03 10:09:17
stackoverflow用户312586
stackoverflow用户312586

对于这种情况,使用JSON可能会更简单。

从lua表中的翻译几乎是1对1的(将=改为:,并从键中删除[和])。这是您示例的JSON等效项:

{
  “PlayerInfos”:{
    “Nyim”:{
      “race”:“兽人”,
      “guild”:“Excubitores Noctae”,
      “sex”:2,
      “class”:“猎人”,
      “level”:70
    },
    “Zyrn”:{
      “race”:“BloodElf”,
      “guild”:“Excubitores Noctae”,
      “sex”:2,
      “class”:“WARLOCK”,
      “level”:70
    },

...

此外,Rails具有内置的JSON解析(通过JSON :: parse)。

为了从ruby应用程序中读取它,您需要执行类似于以下内容:

要求'json'#在Rails应用程序中已经包含

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

然后玩家信息将可用于:

player_infos = info [“PlayerInfos”]

还有一个java JSON解析器,但我没有经验。

2010-03-03 11:10:27
stackoverflow用户169828
stackoverflow用户169828

我可能在说一些显而易见的事情,但是 Lua 肯定可以解析 Lua 表。你可以将 Lua“嵌入”到几乎所有主流的语言中,包括 Java 和 Ruby(请在链接中向下滚动以获取 Java 和 Ruby 绑定)。通过嵌入,我指的是解析源文件、调用 Lua 函数并浏览表,甚至可能从 Lua 中调用您的宿主语言编写的函数。这些绑定库可能比将表导出为 XML/JSON 更需要工作,但至少值得一看。

编辑:70 级?那是上个十年的事了 ;)

2010-03-03 15:07:20
stackoverflow用户50476
stackoverflow用户50476

你提到你只能使用Java、Ruby或PHP来解析这个。一个选项是使用诸如ANTLR之类的工具来为您生成一个小解析器。

ANTLR语法:

语法测试;

解析
  :识别符'='表EOF
  ;

表
  :'{'(入口(','入口)* ',?)?'}'
  ;

入口
  :关键字('='值)?
  |字符串
  |数
  ;

键
  :'['(字符串 |数)']'
  |识别符
  ;

值
  :字符串
  |数
  |识别符
  |表
  ;

识别符
  :('a'..'z' | 'A'..'Z' | '_')('a'..'z' | 'A'..'Z' | '_' | '0'..'9')*
  ;

串
  :''〜''* ''
  ;

数
  :'0'..'9' +
  ;

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

生成一个解析器,可以接受输入,例如:

表= {
  [“k1”] =“V1”,
  [“k2”] = {[“x”] = 1,[“y”] = 2},
  [“k3”] =“v3”
}

并将其转换为:

alt text http://img59.imageshack.us/img59/7112/treef.png

(点击[此处](http://img59.imageshack.us/img59/7112/treef.png)以获取完整分辨率的图像)

从这个树结构编写XML轻而易举。

但正如我所说,Lua表可以看起来与我发布的语法非常不同:字符串可以看起来像:

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

键和值可以由表达式组成。但是,如果树始终像您发布的那样,这可能是一个选项。

祝你好运!

2010-03-03 15:19:54
stackoverflow用户44620
stackoverflow用户44620

略过第一行,然后做一些临时的转换,转换为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"}}}
2010-03-03 15:50:04
stackoverflow用户266308
stackoverflow用户266308

未验证的代码。同时,我只是在这里跟随 Sbk 的链接,所以我根本不应该得到任何信用。

require 'rubyluabridge'

def lua_data_to_ruby_hash(data)
    luastate = Lua::State.new
    luastate.eval "d = #{data}"
    return luastate.d.to_hash
end
2010-03-03 16:39:34
stackoverflow用户215924
stackoverflow用户215924

可以指出 Lua 并不具有正则表达式能力,只能进行模式匹配文本替换。

2010-03-04 10:37:22
stackoverflow用户107090
stackoverflow用户107090

尝试这段代码

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)
2010-03-04 14:13:00
stackoverflow用户995935
stackoverflow用户995935

我需要在Java中完成这项任务,因此我编写了一个小的库:

https://github.com/mutantbob/jluadata

2013-03-26 20:52:21