Frage

ich benötige ein Werkzeug Lua Tabellenausdrücke zu analysieren. Wenn alle Stricke reißen, werde ich schließlich Code nur ein kleines Lua-Modul zum Konvertieren von Tabellen zu XML, aber für den Augenblick, ich bin an einer Ruby-Bibliothek tut das, aber in Ermangelung eines solchen, würde ich Werkzeug in jeder Sprache akzeptieren, vorausgesetzt, ich Blick auf seine Quelle kann.

Hier ist ein Beispiel-Schnipsel (es ist eine WoW Addon-Ausgabe):

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

Grundidee ist, assoziativen Arrays verschachtelt. Jede Hilfe oder Zeiger wird untersucht, ist eine Idee, geschätzt.

EDIT #1

Aufgrund der Streitigkeiten, lassen Sie mich klarstellen, was tat ich es versuchen. Ich ergänzt die Zeichenfolge / regex ersetzen Kette von einem der Teilnehmer zur Verfügung gestellt, etwa so:

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

I (1) hinzugefügt Entfernung von Lua Kommentare (2) ersetzt eine der regex Ersatzstoffe: wenn Sie das letzte Element in einem Objekt / Array haben, es hat immer noch ein Komma, nachdem er, so dass abgedeckt werden müssen und die Komma korrekt entfernt.

Bemerken Sie die doppelte Öffnung geschweiften Klammern ? JSON nicht wie anonyme Objekte mit. Es sieht wie folgt aus:

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

Im Grunde genommen auf der Root-Ebene, wir haben tatsächlich eine Liste / Array von ähnlichen Objekten, die beide mit „aaa“ und „qqq“ Abschnitt, dem Beispiel zu folgen. Doch in Lua, die offensichtlich erlaubt ist, während in JSON ist es nicht. Da die Öffnung geschweiften Klammern wie „ein Objekt starten“ behandelt werden, aber das Objekt keinen Namen.

Ich habe versucht, diesen Fall mit Regex zu erkennen und geschweiften Klammern mit „[]“ Paaren ersetzen. Während die resultierende regex arbeitete, war das Problem das gleiche:. OK, wir eine Reihe von ähnlichen Objekten statt definieren, aber die Deklaration des Arrays ist noch namenlos

Eine mögliche Lösung wäre, anstatt zu erkennen und diese Klammern mit [] zu ersetzen, die Objekte mit Indizes taufen, wie: "0" = { "aaa" = {...} }, "1" = { "aaa" = {... } } usw. Die (hoffentlich endgültig) Abhilfe wird wahrscheinlich damit es funktioniert ... Ich werde wieder berichten . ;)

War es hilfreich?

Lösung

Skipping die erste Zeile und dann einig Ad-hoc-Transformation zu 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"}}}

Andere Tipps

Ich stelle wohl das offensichtlich, aber Lua kann sicherlich Lua Tabellen analysieren. Und Sie können „einbetten“ Lua in so ziemlich jede Mainstream-Sprache einschließlich Java und Ruby (nach unten scrollen die Verbindung für Java und Ruby-Bindungen). Durch die Einbettung bedeuten Parsen I Quelldateien, Aufruf Lua Funktionen und erkunden Tabellen, können auch in Ihrer Host-Sprache Lua geschrieben Aufruf von Funktionen. Es ist möglich, dass diese Bindung Bibliotheken mehr Arbeit sind als Ihre Tabellen zu XML / JSON exportieren, aber es lohnt sich auf sie zumindest suchen

Edit: Stufe 70? Das ist so im letzten Jahrzehnt;)

Es ist einfach ein Lua-Programm, dass Ausgänge Tabellen in XML zu schreiben, aber es hängt davon ab, wie Sie die XML formatiert werden sollen. Siehe auch LuaXML , die xml.save (aber ist in C geschrieben) und this Frage .

Es ist wahrscheinlich einfacher sein, JSON als xml auf diesen Fall.

Die Übersetzung von lua Tabellen ist fast 1-zu-1 (Änderung = zu: und entfernen [und] von den Tasten). Dies ist die JSON-Äquivalent von Ihrem Beispiel:

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

...

Außerdem Rails verfügt über eine integrierte in JSON-Parsing (via JSON :: parse).

Um es von einem Rubin App zu lesen, würden Sie haben etwas ähnliches wie dies zu tun:

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

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

Dann werden die Spieler Infos würde unter:

player_infos = info["PlayerInfos"]

Es gibt auch einen Java-JSON-Parser, aber ich habe keine Erfahrung damit.

Versuchen Sie diesen Code

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)

Sie erwähnen Sie können nur Java, Ruby-oder PHP für das Parsen von diesem verwendet werden. Eine Option ist ein Tool wie ANTLR zu verwenden, um einen kleinen Parser für Sie zu erzeugen.

Die ANTLR Grammatik:

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();}
  ;

erzeugt einen Parser, den Eingang nehmen wie:

Table = {
  ["k1"] = "v1",
  ["k2"] = {["x"]=1, ["y"]=2},
  ["k3"] = "v3"
}

und verwandelt es in:

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

(klicken hier für eine vollständige Auflösung des Bildes)

Das Schreiben eines XML aus dieser Baumstruktur ist ein Kinderspiel.

Aber wie ich schon sagte, Lua Tabellen aus der Grammatik ganz anders aussehen kann ich oben geschrieben: strings aussehen kann:

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

und Schlüssel und Werte können von Ausdrücken bestehen. Aber wenn die Bäume immer so aussehen, wie Sie es geschrieben, könnte es eine Option für Sie sein.

Viel Glück!

Ich brauchte dies in Java zu tun, so dass ich eine kleine Bibliothek schrieb:

https://github.com/mutantbob/jluadata

Ungeprüfte Code. Und ich folge nur hier SBK Link, so verdiene ich keinen Kredit überhaupt.

require 'rubyluabridge'

def lua_data_to_ruby_hash(data)
    luastate = Lua::State.new
    luastate.eval "d = #{data}"
    return luastate.d.to_hash
end

Kann ich darauf hin, dass Lua nicht haben Regex-Funktionen, nur Muster angepasst Ersetzen von Text.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top