2012-11-04 17 views
5

मेरे पास लूआ टेबल के रूप में डेटा का एक गुच्छा है और मैं उस डेटा को सी # में उपयोग करने योग्य संरचना में पार्स करना चाहता हूं।किसी भी निरंतर लुआ तालिका को लूआ वीएम में लोड किए बिना अधिमानतः कैसे पार्स करें?

लुआ टेबल के साथ समस्या यह है कि वैकल्पिक फ़ील्ड हैं, टेबल बहुत गतिशील हैं और केवल कुंजी के लिए एक प्रकार और मूल्य के लिए एक प्रकार के साथ एक शब्दकोश नहीं हैं। स्ट्रिंग और पूर्णांक कुंजी, और प्रकार पूर्णांक, स्ट्रिंग और के मान भी तालिका दोनों के साथ एक लुआ टेबल होना संभव है।

अफसोस की बात है कि, जो डेटा मैं पार्सिंग कर रहा हूं वह भाषा की गतिशील प्रकृति का उपयोग करता है और वास्तव में किसी भी सीधे रास्ते में संरचित नहीं होता है। उदाहरण के लिए Dictionary<object, dynamic> का उपयोग करके डेटा के गतिशील प्रतिनिधित्व की आवश्यकता है।

डेटा का प्रारूप उदा। (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 } 
     } 
} 

क्या ऐसा करने के लिए वहां कोई पुस्तकालय हैं? चरित्र द्वारा डेटा चरित्र को पार्स किए बिना इसे पूरा करने का कोई तरीका है?

+0

[सबसे आसान तरीका सी # में एक लुआ आंकड़ा संरचना/नेट पार्स करने के लिए] (के संभावित डुप्लिकेट http://stackoverflow.com/questions/881445/easiest-way-to-parse-a-lua -डेटास्ट्रक्चर-इन-सी-तेज-नेट) –

उत्तर

3

आप luainterface पुस्तकालय

कुछ sample code here है उपयोग कर सकते हैं।

आप DoFile के संयोजन का उपयोग करना चाहते हैं (फ़ाइल लोड करने) और GetTable एक LuaTable उद्देश्य यह है कि आप सी # से परिणाम का उपयोग कर सकते में तालिका को पढ़ने के लिए। LuaTableIDictionaryEnumeratorGetEnumerator के माध्यम सेखुलासा करता है।

संपादित करें:

अगर आप इस तालिका निर्माता थे:

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

निर्माता में समारोह डेटा प्रारंभ करने में क्रियान्वित किया जा करने की आवश्यकता होगी।

निरंतर शाब्दिक के लिए

, तो आप ऐसा तरह स्ट्रिंग स्थिरांक हो सकता है:

local a = [==[ 
    hello 
    there""\"]==] 
बराबर चिह्न के विभिन्न स्तरों के साथ

एक अंकीय शाब्दिक रूप हो सकते हैं:

0X1.921FB54442D18P+1 
पी के साथ

एक बाइनरी एक्सपोनेंट के रूप में।

लाइटवेट लुआ वीएम का उपयोग किए बिना निरंतर अक्षरों के लिए लूआ सिंटैक्स को ईमानदारी से पुन: उत्पन्न करने के लिए लूआ भाषा भाषा के अच्छे हिस्से को दोबारा लागू करने की आवश्यकता होगी। पहिया को फिर से आविष्कार करने से ज्यादा लाभ नहीं होता है।

+0

मुझे मेरे आवेदन में लूआ वीएम लोड करने की आवश्यकता होगी, जो केवल डेटा पार्सिंग के लिए काफी बड़ा ओवरहेड है। – lesderid

+1

क्या लुआ वास्तव में एक बड़ा उपरि है? ध्यान दें कि केवल एक टेबल को पार्स करने के लिए आप लुआ मानक पुस्तकालयों को लोड करने से बचने में सक्षम होंगे, जो ओवरहेड को कम कर देगा। – lhf

2

मैं जानता हूँ कि यह एक पुरानी पोस्ट है, लेकिन यह लोग हैं, जो इस पोस्ट के बाद यहां आने के लिए उपयोगी हो सकता है ...

तुम भी Xanathar के MoonSharp (चंद्रमा #) परियोजना को देखो सकता है; मैंने अभी कोशिश करनी शुरू कर दी है और ऐसा लगता है कि नेस्टेड टेबल आदि के साथ गतिशील तालिकाओं को लपेटने के साथ अच्छी तरह से काम करना प्रतीत होता है। आप केवल दुभाषिया को एक स्क्रिप्ट देते हैं और यह दुभाषिया संदर्भ में पार्स किए गए ऑब्जेक्ट्स को पार्स और पकड़ देगा।

लिंक:

उदाहरण:

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

क्षमा याचना करता है, तो इसके बाद के संस्करण कोड वास्तव में सही रूप में यह अपने परीक्षण में से एक से लिया जाता है नहीं है कक्षाएं और यहां पोस्ट करने के लिए परिवर्तित। कृपया लपेटा हुआ मॉक-डेटा स्थिरांक क्षमा करें, लेकिन वे लू लिपि और अपेक्षित मानों के सार में हैं।

एक गलत कुंजी के माध्यम से लुआ टेबल में प्रविष्टियों तक पहुंचने का प्रयास करते समय DynValue में "नील" का डेटाटाइप होता है, इसलिए सशर्त जांच के साथ संभालना आसान होता है।

Xanathar के Moonsharp के उपयोग पर अधिक उदाहरण Xanathar की वेबसाइट और उसके गिट हब रेपो पर पाए जा सकते हैं। (नीचे दिए गए लिंक देखें)। वह किसी भी मुद्दे या प्रश्नों के साथ बहुत मददगार प्रतीत होता है जो आप भी पार कर सकते हैं।

लिंक:

मैं जो है इकाइयों परीक्षण कुछ एक्सटेंशन जो मेरे रेपोस में से एक में आगे उपयोग दिखाते हैं (नीचे लिंक देखें)

लिखने के लिए शुरू कर दिया है

लिंक: