Question

J'ai besoin d'un outil pour analyser les expressions de table Lua. Si tout le reste échoue, je vais finir par code juste un petit module de Lua pour convertir des tables en XML, mais pour le moment, je suis intéressé par une bibliothèque Ruby faire, mais à défaut, j'accepterais outil dans toutes les langues, à condition que je peut regarder sa source.

Voici un extrait de l'exemple (il est une sortie addon WoW):

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

L'idée de base est, tableaux associatifs imbriqués. Toute aide ou pointeur seront examinés, toute idée est appréciée.

EDIT #1

En raison des conflits, permettez-moi de préciser qu'ai-je essayer. Je complémente la chaîne / chaîne remplacement d'expressions rationnelles fournies par l'un des participants, comme suit:

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

I (1) ajouté la suppression des commentaires Lua, (2) a remplacé l'un des regex Substituts: quand vous avez le dernier élément dans un objet / tableau, il a encore une virgule après, de sorte que doivent être couverts et la Comma correctement supprimés.

Avez-vous remarqué les double ouverture accolades ? JSON n'aime pas avoir des objets anonymes. Il ressemble à ça:

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

En gros au niveau de la racine, nous avons fait une liste / tableau d'objets similaires, les deux ayant une section « aaa » et « QQQ », à suivre l'exemple. Cependant, en Lua qui est évidemment permis, tout en JSON il n'est pas. Parce que les accolades d'ouverture sont traités comme « commencer un objet », mais cet objet n'a pas de nom.

I essayé de détecter ce cas avec regex et remplacer les accolades avec « [] » paires. Alors que le problème était le même regex résultant a travaillé,:. OK, nous définissons un tableau d'objets similaires au lieu, mais la déclaration du tableau est toujours sans nom

Une solution possible serait au lieu de détecter et de remplacer ces accolades avec [], pour les objets avec baptisera index, comme: "0" = { "aaa" = {...} }, "1" = { "aaa" = {... } }, etc. Ce (espérons-dernière) solution va probablement le faire fonctionner ... Est-ce à nouveau rapport . ;)

Était-ce utile?

La solution

Skipping la première ligne, puis une transformation ad hoc à 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"}}}

Autres conseils

Je suis sans doute une lapalissade, mais Lua peux certainement analyser les tables Lua. Et vous pouvez « embed » Lua dans à peu près toutes les langues mainstream y compris Java et Ruby (défiler vers le bas le lien pour les liaisons Java et Ruby). Par Embed, je veux dire l'analyse syntaxique des fichiers source, appelant les fonctions Lua et tables à explorer, peut être même appeler des fonctions écrites dans votre langue hôte de Lua. Il est possible que ces bibliothèques de liaison sont plus de travail que l'exportation de vos tableaux au format XML / JSON, mais il vaut la peine de les regarder au moins

Edit: niveau 70? C'est donc la dernière décennie)

Il est simple d'écrire un programme Lua qui génère des tables en XML, mais cela dépend de la façon dont vous voulez que le format XML. Voir aussi LuaXML , qui a xml.save (mais il est écrit en C) et this question .

Il va probablement être plus simple à utiliser JSON que xml sur ce cas.

La traduction des tables de Lua est près de 1 à 1 (= changement à: et retirer [et] des clés). Ceci est l'équivalent JSON de votre exemple:

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

...

En outre, Rails a intégré JSON-analyse syntaxique (via JSON :: parse).

Pour le lire à partir d'une application Ruby, vous devez faire quelque chose de semblable à ceci:

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

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

Ensuite, les infos du joueur seraient disponibles à:

player_infos = info["PlayerInfos"]

Il y a aussi un analyseur de JSON java, mais je n'ai aucune expérience avec elle.

Essayez ce 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)

Vous mentionnez que vous ne pouvez utiliser Java, Ruby ou PHP pour l'analyse syntaxique de cela. Une option est d'utiliser un outil comme ANTLR pour générer un peu analyseur pour vous.

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

génère un analyseur qui peut prendre comme entrée:

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

et la transformer en:

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

(cliquez sur pour une pleine résolution de l'image)

L'écriture d'un fichier XML de cette structure d'arbre est un jeu d'enfant.

Mais comme je l'ai dit, les tables Lua peuvent être très différentes de la grammaire que j'ai posté ci-dessus: les chaînes peuvent ressembler à:

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

et les clés et les valeurs peuvent consister en des expressions. Mais si les arbres ont toujours l'air comme la façon dont vous avez publié, il pourrait être une option pour vous.

Bonne chance!

Je avais besoin de faire cela en Java, donc je l'ai écrit une petite bibliothèque:

https://github.com/mutantbob/jluadata

code non testé. Et, je ne fais que suivre le lien de Sbk ici, donc je ne mérite aucun crédit du tout.

require 'rubyluabridge'

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

Puis-je souligner que Lua ne dispose pas d'une expression régulière, modèle tout remplacement de texte correspondant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top