Pregunta

necesito una herramienta para analizar las expresiones de tabla Lua. Si todo lo demás falla, que con el tiempo se acaba código de un pequeño módulo de Lua a las tablas Convertir a XML, pero por el momento, estoy interesado en una librería Ruby haciendo eso, sino que en su defecto, aceptaría herramienta en cualquier idioma, siempre que puede mirar a su fuente.

He aquí un fragmento de ejemplo (es un WoW salida complemento):

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 básica es, anidado matrices asociativas. Cualquier ayuda o puntero serán examinadas, ninguna idea es apreciado.

EDIT #1

Debido a las disputas, quiero aclarar qué hizo lo intento. I complementó la expresión regular cadena de cadena / sustitución proporcionado por uno de los participantes, así:

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

I (1) la eliminación adicional de los comentarios de Lua, (2) reemplazó a uno de los sustitutos de expresiones regulares: cuando se tiene el último elemento de un objeto / matriz, que todavía tiene una coma después de ella, por lo que es necesario cubrir y la coma adecuadamente removido.

¿Notas la doble apertura rizado llaves ? JSON no le gusta tener objetos anónimos. Se ve así:

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

Básicamente en el nivel de la raíz, que en realidad tiene una lista / matriz de objetos similares, teniendo ambos la sección "qqq" "AAA" y, a seguir el ejemplo. Sin embargo, en Lua que obviamente está permitido, mientras que en JSON no lo es. Debido a que la abertura de las llaves son tratados como "iniciar un objeto", pero ese objeto no tiene un nombre.

He intentado detectar que ocurre con expresiones regulares y reemplazar llaves con "[]" pares. Mientras que la expresión regular resultante funcionaba, el problema era el mismo:. OK, definimos una matriz de objetos similares en su lugar, pero la declaración de la matriz está todavía sin nombre

Una posible solución sería que en lugar de detectar y reemplazar esos apoyos con [], para bautizar los objetos con los índices, como: "0" = { "aaa" = {...} }, "1" = { "aaa" = {... } }, etc, que (con suerte final) Solución probablemente hará que funcione ... informará de nuevo . ;)

¿Fue útil?

Solución

Saltarse la primera línea y luego alguna transformación ad hoc a 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"}}}

Otros consejos

Soy probablemente una obviedad, pero sin duda Lua Lua puede analizar tablas. Y se puede "incrustar" Lua en casi cualquier lenguaje corriente incluyendo Java y Ruby (por desplazamiento el enlace para los enlaces de Java y Ruby). Por incrustar, me refiero a analizar los archivos fuente, llamar a las funciones de Lua y mesas de exploración, puede ser incluso funciones de llamada escritas en su lengua de acogida de Lua. Es posible que estas bibliotecas de unión son más trabajo que la exportación de sus tablas a XML / JSON, pero vale la pena mirarlos al menos

Editar: nivel 70? Eso es tan última década;)

Es muy sencillo de escribir un programa Lua que da salida a las tablas en XML, pero depende de cómo desea que el formato XML. Ver también LuaXML , que tiene xml.save (pero que está escrito en C) y this pregunta .

Se probablemente va a ser más fácil de usar JSON de XML en este caso.

La traducción a partir de tablas LUA es casi 1-a-1 (cambio = a: y retire [y] de las teclas). Esto es el equivalente de su JSON ejemplo:

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

...

Además, los carriles se ha incorporado en JSON-análisis (a través de JSON :: parse).

Con el fin de leerlo desde una aplicación de rubí, que tendría que hacer algo similar a esto:

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

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

A continuación, las infos jugador estaría disponible en:

player_infos = info["PlayerInfos"]

También hay un analizador JSON java, pero no tengo ninguna experiencia con ella.

Trate de este código

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)

Usted menciona que sólo se puede utilizar Java, Ruby o PHP para el análisis de esta. Una opción es utilizar una herramienta como antlr para generar un pequeño analizador para usted.

La gramática 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 analizador que puede tomar la entrada como:

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

y transformarla en:

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

(haga clic aquí de resolución completa de la imagen)

Escribir un XML a partir de esa estructura de árbol es un juego de niños.

Pero como he dicho, tablas Lua pueden parecer muy diferente de la gramática que he publicado anteriormente: las cadenas pueden ser:

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

y las claves y los valores pueden consistir en expresiones. Pero si los árboles siempre se ven como la forma en que usted envió, podría ser una opción para usted.

Buena suerte!

Yo tenía que hacer esto en Java, por lo que escribí una pequeña biblioteca:

https://github.com/mutantbob/jluadata

código no probado. Y, sólo estoy siguiente enlace de Sbk aquí, así que no merece ningún crédito en absoluto.

require 'rubyluabridge'

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

he de decirle que Lua no tiene capacidades de expresiones regulares, simplemente patrón emparejado reemplazo de texto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top