2012-11-04 16 views
5

Ho un sacco di dati sotto forma di una tabella Lua e vorrei analizzare questi dati in una struttura utilizzabile in C#.Come analizzare una tabella Lua costante preferibilmente senza caricarla nella Lua VM?

Il problema con le tabelle Lua è che esistono campi facoltativi, le tabelle sono molto dinamiche e non sono solo un dizionario con un tipo per la chiave e un tipo per il valore. È possibile avere una tabella Lua con chiavi sia stringa sia intera e valori di tipo intero, stringa e tabella anche.

Purtroppo, i dati che sto analizzando si avvalgono della natura dinamica del linguaggio e non sono realmente strutturati in alcun modo diretto. Ciò richiede una rappresentazione dinamica dei dati, utilizzando ad esempio Dictionary<object, dynamic>.

Il formato dei dati è ad es. (Da http://ideone.com/9nzXvt)

local mainNode = 
{ 
    [0] = 
     { 
      Name = "First element", 
      Comments = "I have comments!", 
      Data = { {123, 456}; foo = { "bar" } } 
     }, 
    [1337] = 
     { 
      Name = "Another element", 
      Data = { {0}; foo = nil } 
     } 
} 

Esistono librerie là fuori per fare questo? C'è un modo per farlo senza analizzare il carattere dei dati per carattere?

+0

possibile duplicato del [Il modo più semplice per analizzare un datastructure Lua in C#/.Net] (http://stackoverflow.com/questions/881445/easiest-way-to-parse-a-lua -datastructure-in-c-sharp-net) –

risposta

3

È possibile utilizzare la libreria luainterface

C'è un po 'sample code here.

Ti consigliamo di utilizzare una combinazione di DoFile (per caricare il file) e GetTable leggere la tabella in un oggetto LuaTable che è possibile utilizzare il risultato da C#. Lo LuaTable espone uno IDictionaryEnumerator tramite GetEnumerator.

EDIT:

se si ha questa tabella costruttore:

local t = { os.time() } 
print(t[1]); 

la funzione nel costruttore avrebbe bisogno di essere eseguito per inizializzare i dati.

per letterali costanti, si può avere costanti stringa in questo modo:

local a = [==[ 
    hello 
    there""\"]==] 

con differenti livelli di segni di uguale

un letterale numerico può avere la forma:

0X1.921FB54442D18P+1 

con P come esponente binario.

riproducendo fedelmente la sintassi lua per valori letterali costanti senza utilizzare il leggero lua VM richiederebbe il re-implementazione di una buona parte delle specifiche del linguaggio lua. non è molto utile reinventare la ruota.

+0

Questo mi richiederebbe di caricare la VM Lua nella mia applicazione, che è un overhead piuttosto grande per l'analisi dei dati. – lesderid

+1

Lua è davvero un grande sovraccarico? Si noti che per analizzare solo una tabella si potrebbe evitare di caricare le librerie standard Lua, il che ridurrà il sovraccarico. – lhf

2

So che questo è un vecchio post, ma questo potrebbe essere utile per le persone che arrivano qui dopo questo post ...

Si potrebbe anche guardare di Xanathar MoonSharp (Luna #) del progetto; Ho appena iniziato a provarlo e sembra funzionare bene con il wrapping delle tabelle dinamiche, con le tabelle nidificate ecc. Basta dare all'interprete uno script e analizzerà e manterrà gli oggetti analizzati nel contesto dell'interprete.

vicini:

Esempio:

[TestMethod] 
    public void Test_GetProperty_ForValidTypeAndKey_ReturnsValue() 
    { 
     // Arrange 
     String luaScript = MockLuaScripts.TEST_OBJECT_WITH_STRING; 
     Script context = new Script(); 
     String expectedResult = MockLuaScripts.ValidValue1; 

     // Act 
     /* Run the script */ 
     context.DoString(luaScript); 

     /* Get the object */ 
     DynValue resultObject = context.Globals.Get(MockLuaScripts.ObjectInstance1); 

     /* Get the property */ 
     DynValue tableValue = instance.Table.Get((MockLuaScripts.ValidKey1); 
     String actualResult = tableValue.String(); 

     /* Or you can use.. 
      String actualResult = tableValue.ToObject<String>(); 
     */ 

     // Assert 
     Assert.AreEqual(expectedResult, actualResult); 
    } 

Mi scuso se il codice di cui sopra non è esattamente corretto in quanto è tratto da uno dei miei test di classi e convertito per la pubblicazione qui. Si prega di scusare le costanti mock-data avvolte, ma sono essenzialmente lo script Lua e i valori attesi.

Quando si tenta di accedere a voci nella tabella Lua tramite una chiave errata, DynValue ha un DataType di "Nil", quindi è facile da gestire con un controllo condizionale.

Altri esempi sull'utilizzo di Xanathar's Moonsharp possono essere trovati sul sito Web di Xanathar e sul suo repo hub git. (Vedi link sotto). Sembra essere molto utile con qualsiasi problema o domanda che potresti incontrare anche tu.

vicini:

ho iniziato a scrivere alcune estensioni che hanno prova di unità che mostrano ulteriore utilizzo in uno dei miei pronti contro termine (vedi link sotto)

Collegamenti: