いが必要なツールを構文解析のユーザテーブル、preferrably RubyまたはJava
質問
いが必要なツールを構文解析のユーザテーブルの表現です。ドひとつだけのコードの小さなユーザモジュール変換テーブルを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?それはとても十年です;)
これはおそらく使用する方が簡単になるだろう 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"
}
とに変換します:
私は、Javaでこれを行うために必要なます:
未テストコード。私はまったく信用に値しないようにと、私は、ここにSBKのリンクを下記のよ。
require 'rubyluabridge'
def lua_data_to_ruby_hash(data)
luastate = Lua::State.new
luastate.eval "d = #{data}"
return luastate.d.to_hash
end
することができます私のポイントアウトます。