Domanda

Ho bisogno di uno strumento per analizzare espressioni di tabella Lua. Se tutto il resto fallisce, io alla fine solo codice di un piccolo modulo Lua alle tabelle convertire a XML, ma per il momento, mi interessa in una libreria Ruby farlo, ma in mancanza di questo, avrei accettato strumento in qualsiasi lingua, purché io può guardare alla fonte.

Ecco un frammento di esempio (si tratta di un WoW uscita addon):

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

idea di base è, annidato array associativi. Qualsiasi aiuto o puntatore verranno esaminate, ogni idea è apprezzato.

EDIT #1

A causa delle controversie, vorrei chiarire che cosa ha fatto ci provo. Ho completato la stringa / regex catena di sostituzione fornito da uno dei partecipanti, in questo modo:

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

I (1) la rimozione aggiunto commenti Lua, (2) ha sostituito uno dei sostituti regex: quando si ha l'ultimo elemento in un oggetto / array, ha ancora una virgola dopo di esso, in modo che deve essere coperta e il virgola correttamente rimosso.

Non si nota la doppia apertura ricci parentesi ? JSON non piace avere oggetti anonimi. Sembra che:

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

Fondamentalmente sul livello principale, in realtà avere una lista / array di oggetti simili, sia avente sezione "qqq" "aaa" e, a seguire l'esempio. Tuttavia, in Lua che è ovviamente consentito, mentre in JSON non lo è. Perché l'apertura parentesi graffe sono trattati come "avviare un oggetto" ma questo oggetto non ha un nome.

Ho provato a rilevare questo caso con regex e sostituirlo con graffe "[]" coppie. Mentre la regex risultante lavorato, il problema era lo stesso:. OK, definiamo un array di oggetti simili invece, ma la dichiarazione dell'array è ancora senza nome

Una possibile soluzione potrebbe essere, invece di rilevare e sostituzione di quelle bretelle con [], per battezzare gli oggetti con gli indici, come: "0" = { "aaa" = {...} }, "1" = { "aaa" = {... } }, ecc Questo (si spera definitivo) soluzione probabilmente farlo funzionare ... riferirà di nuovo . ;)

È stato utile?

Soluzione

saltare la prima riga e poi qualche trasformazione ad hoc per 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"}}}

Altri suggerimenti

Sono probabilmente affermare l'ovvio, ma può certamente Lua Lua analizzare le tabelle. E si può "incorporare" Lua in praticamente qualsiasi lingua corrente principale tra cui Java e Ruby (scroll down il link per binding Java e Ruby). Con incorporare, voglio dire l'analisi dei file di origine, chiamando le funzioni di Lua e tabelle che esplorano, può essere anche chiamando funzioni scritte in lingua host da Lua. E 'possibile che queste librerie sono vincolanti più lavoro di esportare le tabelle in formato XML / JSON, ma vale la pena di guardare loro almeno

Modifica: livello 70? E 'così nell'ultimo decennio;)

E 'semplice scrivere un programma che Lua uscite tabelle in XML, ma dipende da come si desidera che il formato XML. Vedi anche LuaXML , che ha xml.save (ma è scritto in C) e this domanda .

Si è destinata probabilmente ad essere più semplice da utilizzare JSON di XML su questo caso.

La traduzione da tabelle lua è quasi 1-a-1 (variazione = a: e rimuovere [e] dai tasti). Questo è l'equivalente JSON del vostro esempio:

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

...

Inoltre, Rails è built-in JSON-analisi (tramite JSON :: parse).

Al fine di leggerlo da un'applicazione rubino, che avrebbe dovuto fare qualcosa di simile a questo:

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

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

Poi sarebbe disponibile le informazioni giocatore all'indirizzo:

player_infos = info["PlayerInfos"]

C'è anche un parser JSON Java, ma non ho alcuna esperienza con esso.

Prova questo codice

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)

È menzione è possibile utilizzare solo Java, Ruby o PHP per il parsing di questo. Una possibilità è quella di utilizzare uno strumento come ANTLR per generare un po 'di parser per voi.

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

genera un parser in grado di prendere l'input come:

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

e trasformarlo in:

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

(clicca qui di risoluzione completa dell'immagine)

La scrittura XML da quella struttura ad albero è un gioco da ragazzi.

Ma come ho detto, le tabelle Lua possono guardare molto diversa da quella grammatica ho postato sopra: le stringhe possono apparire come:

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

e le chiavi ed i valori possono essere costituite da espressioni. Ma se gli alberi sembrano sempre come come si postato, potrebbe essere un'opzione per voi.

In bocca al lupo!

avevo bisogno di fare questo in Java, così ho scritto una piccola biblioteca:

https://github.com/mutantbob/jluadata

codice non testato. E, sto solo seguente link di Sbk qui, quindi non merito alcun credito a tutti.

require 'rubyluabridge'

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

Posso punto che Lua non ha capacità di regex, solo criterio di sostituzione testo corrispondente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top