いが必要なツールを構文解析のユーザテーブル、preferrably RubyまたはJava

StackOverflow https://stackoverflow.com/questions/2370153

質問

いが必要なツールを構文解析のユーザテーブルの表現です。ドひとつだけのコードの小さなユーザモジュール変換テーブルをXMLでは、Rubyの図書館やっているが、失敗についてお話したいと思いますけツールの言語ででも、見です。

ここでは、次の例では、なんとアドオンの出力):

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

による紛争、明らかになっています。って補完されるstring regex交換チェーンの提供により、参加者はこのように:

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

(1)追加の除去のユーザコメント(2)交換の正規表現replacers:できたら最後の要素オブジェクトレースでは、カンマで区切った後、で明かすことはできないのですが、コンマを適切に除去します。

いの ダブルル開巻きブレース?JSONないようで、また頑張ろうという気持匿名のオブジェクト。そのように見え:

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

基本的には根レベル、つまり、リスト/レオ、"aaa"および"qqqの記の例です。しかし、Luaることが明らかに許可をJSONでい分けるどれがいいですか?での巻きブレースの扱い開始オブジェクト"がそのオブジェクトにはあまりない名前です。

って検出する場合との正規表現と交換巻きブレース、"[]"のペアになっています。ながら、regex、この問題は同じです:OKと定義し、配列のそれに類似するものではなく、その宣言の配列はまだ無名.

解決策がわの検出および交換その中括弧[]で、christenのオブジェクト指数のように: "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のテーブルを解析することができます。そして、あなたはのJavaとRuby(スクロールダウンを含むをほとんどすべての主流の言語でのLuaを「埋め込む」ことができますJavaとRubyのバインディングのリンク)。埋め込みによって、私はLuaの関数や探検テーブルを呼び出して、ソースファイルを解析する意味もLuaのからあなたのホスト言語で記述された関数を呼び出すことができます。これは、これらの結合ライブラリは、少なくともそれらを見て、それの価値がある

XML / JSONにあなたのテーブルをエクスポートするよりも、より多くの仕事ですが、いる可能性があります

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

簡単に書くのユーザプログラムの出力テーブルをXMLにより異なりますがどうしたいのXMLフォーマット化され参照 LuaXML, る形式をサポートしています。保存(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を介して::解析)。

ルビーアプリからそれを読むためには、あなたがこれに似た何かをしなければならないでしょう。

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

とに変換します:

ALTテキストhttp://img59.imageshack.us/img59/7112/treef .PNGする

のここクリックしてください) P>

は、そのツリー構造からXMLを書くことは、子どもの遊びです。

私は、Luaのテーブルは、私は上記の投稿の文法とは全く異なって見えることができます言ったようしかし:文字列は次のように見ることができます:

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

とキーと値は、式で構成することができます。木は常にあなたがそれを掲示する方法のように見える場合でも、それはあなたのための選択肢かもしれません。

グッドラック!

未テストコード。私はまったく信用に値しないようにと、私は、ここに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