Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要一个工具来解析Lua表,最好是用Ruby或Java_Java_Ruby_Parsing_Lua_Lua Table - Fatal编程技术网

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

我需要一个工具来解析Lua表,最好是用Ruby或Java,java,ruby,parsing,lua,lua-table,Java,Ruby,Parsing,Lua,Lua Table,我需要一个工具来解析Lua表表达式。如果所有这些都失败了,我最终将只编写一个小的Lua模块来将表转换为XML,但目前,我对Ruby库这样做感兴趣,但如果失败了,我会接受任何语言的工具,只要我能查看它的源代码 下面是一个示例片段(它是一个WoW插件输出): 基本思想是,嵌套关联数组。任何帮助或指示都将被检查,任何想法都将被感激 EDIT#1 由于争议,让我澄清一下我尝试了什么。我补充了一位参与者提供的字符串/正则表达式替换链,如下所示: str.gsub(/--.+$/, "").gsub("="

我需要一个工具来解析Lua表表达式。如果所有这些都失败了,我最终将只编写一个小的Lua模块来将表转换为XML,但目前,我对Ruby库这样做感兴趣,但如果失败了,我会接受任何语言的工具,只要我能查看它的源代码

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

基本思想是,嵌套关联数组。任何帮助或指示都将被检查,任何想法都将被感激

EDIT#1

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

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”和“qqq”部分。然而,在Lua中这显然是允许的,而在JSON中则不是。因为开头的花括号被视为“启动一个对象”,但该对象没有名称

我试图用正则表达式检测这种情况,并用“[]”对替换大括号。虽然生成的正则表达式有效,但问题是相同的:好的,我们定义了一个类似对象的数组,但是数组的声明仍然是匿名的


一个可能的解决方案是,不用检测并用[]替换这些大括号,而是用索引命名对象,比如:
“0”={“aaa”={…},“1”={“aaa”={…}}
,等等。这(希望是最终的)解决方案可能会使它工作起来。。。将再次报告。;)

编写以XML输出表的Lua程序很简单,但这取决于XML的格式。另请参见,其中包含xml.save(但是用C编写的)和。

在这种情况下,它可能比xml更易于使用

lua表的转换几乎是1对1(change=to:,并从键中删除[and])。这是与您的示例类似的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
    },

此外,Rails还内置了JSON解析(通过JSON::parse)

要从ruby应用程序中读取它,您必须执行以下类似操作:

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

info = JSON::parse(File.read("PlayerInfos.json"))
然后,玩家信息将在以下位置提供:

player_infos = info["PlayerInfos"]

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

我可能会说一些显而易见的事情,但Lua肯定可以解析Lua表。您还可以包括Java和Ruby(向下滚动Java和Ruby绑定的链接)。所谓嵌入,我指的是解析源文件、调用Lua函数和浏览表,甚至可能是从Lua调用用宿主语言编写的函数。这些绑定库可能比将表导出为XML/JSON要复杂得多,但至少值得一看


编辑:70级?这就是过去十年;)

您提到,您只能使用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"
}
并将其转化为:

(单击可获得图像的完整分辨率)

从该树结构中编写XML是儿戏

但正如我所说,Lua表可能与我在上面发布的语法完全不同:字符串可能类似:

'a string'
[===[ also ]==] a string ]===]
键和值可以由表达式组成。但是,如果这些树总是像你发布的那样,那么它可能是你的一个选择


祝你好运

跳过第一行,然后进行一些特殊的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"}}}

未经测试的代码。而且,我只是在关注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没有正则表达式功能,只是模式匹配的文本替换。

试试这段代码

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)
函数toxml(t,n) 本地s=string.rep(“,n) 对于k,v成对(t)do 印刷品(s…“) 如果类型(v)=“表”,则 toxml(v,n+1) 其他的 印刷品(s.“…v) 结束 印刷品(s…“) 结束 结束 toxml(CT\U RaidTracker\U RaidLog,0)
我需要用Java来实现这一点,所以我编写了一个小库:


键和值是否总是字符串和数字?或者它们也可以是表达式?以下是一个有效的Lua表:
function foo()return 1 end table={[2-foo()]='t'..'wo'}
但是要(正确地)解析比您发布的示例更困难。请原谅我没有澄清它,我目前基本上对Lua一无所知。是的,我粘贴的片段基本上就是整个事情的样子。Variable1=Variable2=…好的,您的输入是什么?包含表格和其他文本的文件,还是仅包含表格?在确定了文件中的表之后,您的目标是什么?输入是我粘贴的:只是对这些嵌套结构的变量赋值。最终目标是在Rails应用程序中使用这些信息;因此,数据必须转换成JSON或XML,然后从那里完成任务。魔兽世界插件提供了什么输出?这是我最后的选择不过,这可能是最好的解决方案。如果您能告诉我您想要的XML格式,我可以发布Lua代码进行转换。我的观点是,解析Lua数据文件最简单的方法是将它们加载到Lua中。目前,我对数据的确切模式没有100%的清晰性(尽管像疯了一样谷歌搜索),然而,递归嵌套的关联数组并在过程中发出正确的XML有什么错呢?没有错,但确切的XML确实取决于您想要输出的内容
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)