2012-11-04 8 views
5

Mam pęczku danych w postaci tabeli Lua i chciałbym parsować te dane do użytecznej struktury w C#.Jak najlepiej przeanalizować dowolny stały stół Lua bez ładowania go w maszynie wirtualnej Lua?

Problem z tabelami Lua polega na tym, że istnieją opcjonalne pola, tabele są bardzo dynamiczne i nie są tylko słownikiem z jednym typem dla klucza i jednym typem dla wartości. Możliwe jest posiadanie jednej tabeli Lua z kluczami ciągowymi i całkowitymi oraz wartościami typu integer, string i nawet z tabelą.

Niestety, dane, które analizuję, wykorzystują dynamiczną naturę języka i nie są tak skonstruowane w prosty sposób. Wymaga to dynamicznej reprezentacji danych, używając na przykład Dictionary<object, dynamic>.

Format danych to np. (od 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 } 
     } 
} 

Czy są tam jakieś biblioteki? Czy istnieje sposób, aby to osiągnąć bez analizowania danych znak po znaku?

+0

możliwe duplikat [Najprostszym sposobem analizowania datastructure Lua C#/NET] (http://stackoverflow.com/questions/881445/easiest-way-to-parse-a-lua -datastructure-in-c-sharp-net) –

Odpowiedz

3

Można użyć luainterface bibliotekę

Jest trochę sample code here.

Będziemy chcieli użyć kombinacji DoFile (do załadowania pliku) i GetTable czytać tabelę w LuaTable obiektu, który można wykorzystać wynik z C#. Obiekt LuaTable ujawnia IDictionaryEnumerator do GetEnumerator.

EDIT:

gdybyś miał tego konstruktora tabeli:

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

funkcja w konstruktorze które powinny być wykonywane w celu zainicjowania danych.

dla stałych literałów, można mieć stałe ciągów znaków tak:

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

o różnych poziomach równych znaków

dosłownym numeryczna może mieć postać:

0X1.921FB54442D18P+1 

z P jako wykładnik binarny.

wierne odtworzenie składni lua dla stałych literałów bez użycia lekkiej maszyny wirtualnej lua wymagałoby ponownego wdrożenia dobrej części specyfikacji lua language. niewiele przynosi mu ponowne wynalezienie koła.

+0

Wymagałoby to załadowania maszyny Lua VM do mojej aplikacji, co jest dość dużym obciążeniem dla tylko analizy danych. – lesderid

+1

Czy Lua naprawdę jest duży? Zauważ, że aby po prostu przeanalizować tabelę, możesz uniknąć ładowania standardowych bibliotek Lua, co zmniejszy obciążenie. – lhf

2

Wiem, że to stary post, ale może to być przydatne dla osób, które przybywają tu po tym poście ...

Można również spojrzeć na Xanathar za MoonSharp Księżyc (#) projektu; Właśnie zacząłem go wypróbowywać i wygląda na to, że działa dobrze z zawijaniem tabel dynamicznych, z tabelami zagnieżdżonymi itp. Po prostu tłumacz ustny jest skryptem, który będzie analizował i wstrzymywał parsowane obiekty w kontekście interpretera.

Linki:

Przykład:

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

Przeprosiny jeśli powyższy kod nie jest dokładnie poprawne, gdyż pochodzi od jednego z mojego testu klasy i przekonwertowane do publikowania tutaj. Proszę wybaczyć zawinięte stałe próbne dane, ale są one w istocie skryptem Lua i oczekiwanymi wartościami.

Podczas próby uzyskania dostępu do wpisów w tabeli Lua za pomocą niepoprawnego klawisza DynValue ma DataType "Nil", więc są łatwe w obsłudze z kontrolą warunkową.

Więcej przykładów użycia Xionathar's Moonsharp można znaleźć na stronie Xanathar i jego repozytorium git hub. (Zobacz linki poniżej). Wydaje się być bardzo pomocny przy wszelkich problemach lub pytaniach, które możesz napotkać.

Linki:

zacząłem pisać kilka rozszerzeń, które mają próbę jednostek, które przedstawiają dalsze wykorzystanie w jednym z moich repo (patrz linki poniżej)

Linki: