4

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

基本的な考え方は、ネストされた連想配列です。ヘルプやポインタがあれば調べられます。アイデアはありがたいです。

EDIT #1

論争のため、私が何を試みたかを明確にさせてください。次のように、参加者の1人が提供した文字列/正規表現置換チェーンを補完しました。

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

私は(1)Luaコメントの削除を追加し、(2)正規表現置換の1つを置き換えました:オブジェクト/配列の最後の要素がある場合でも、その後にコンマがあるため、カバーしてコンマを適切に削除する必要があります。

中括弧が二重に開いていることに気づきましたか?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" = {... } }。その(できれば最終的な)回避策でおそらく機能するでしょう...再度報告します。;)

4

9 に答える 9

5

私はおそらく明白なことを述べていますが、Luaは確かにLuaテーブルを解析できます。また、JavaやRubyを含むほとんどすべての主流言語にLuaを「埋め込む」ことができます(JavaおよびRubyバインディングのリンクを下にスクロールしてください)。埋め込みとは、ソースファイルの解析、Lua関数の呼び出し、テーブルの探索、さらにはLuaからホスト言語で記述された関数の呼び出しを意味します。これらのバインディングライブラリは、テーブルをXML / JSONにエクスポートするよりも手間がかかる可能性がありますが、少なくともそれらを確認する価値があります。

編集:レベル70?それはとても過去10年です;)

于 2010-03-03T15:07:20.697 に答える
3

XMLでテーブルを出力するLuaプログラムを作成するのは簡単ですが、XMLをどのようにフォーマットするかによって異なります。xml.save(ただしCで記述されています)を持つLuaXMLおよびこの質問も参照してください。

于 2010-03-03T10:09:17.130 に答える
3

この場合、xmlよりもJSONを使用する方がおそらく簡単です。

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

..。

さらに、RailsにはJSON解析が組み込まれています(JSON :: parseを介して)。

ルビーアプリから読み取るには、次のような操作を行う必要があります。

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

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

その後、プレーヤー情報は次の場所で入手できます。

player_infos = info["PlayerInfos"]

java JSONパーサーもありますが、私はそれを使った経験がありません。

于 2010-03-03T11:10:27.683 に答える
3

最初の行をスキップしてから、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-03T15:50:04.287 に答える
2

このコードを試してください

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-04T14:13:00.880 に答える
1

これの解析には、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 ]===]

キーと値は式で構成できます。しかし、木が常にあなたがそれを投稿したように見える場合、それはあなたのためのオプションかもしれません。

幸運を!

于 2010-03-03T15:19:54.673 に答える
1

これをJavaで行う必要があったので、小さなライブラリを作成しました。

https://github.com/mutantbob/jluadata

于 2013-03-26T20:52:21.757 に答える
0

テストされていないコード。そして、私はここで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-03T16:39:34.337 に答える
0

Luaには正規表現機能がなく、パターンマッチングされたテキスト置換だけであると指摘できますか?

于 2010-03-04T10:37:22.947 に答える