2009-05-19 41 views
11

Bất cứ ai biết cách dễ dàng để phân tích một cơ sở hạ tầng Lua trong C# hoặc với bất kỳ thư viện .Net nào? Điều này sẽ tương tự như giải mã JSON, ngoại trừ Lua thay vì javascript.Cách dễ nhất để phân tích một cơ sở hạ tầng Lua trong C#/.Net

Tại thời điểm này có vẻ như tôi sẽ cần phải viết của riêng tôi, nhưng hy vọng có một cái gì đó đã ra khỏi đó.

+7

Vui lòng không bao giờ viết LUA là tất cả các thủ đô: http://www.lua.org/about.html#name –

Trả lời

5

Điều Alexander nói. Các phòng thí nghiệm là nhà của Lua, sau khi tất cả.

Cụ thể, LuaInterface có thể cho phép trình thông dịch Lua được nhúng trong ứng dụng của bạn để bạn có thể sử dụng trình phân tích cú pháp riêng của Lua để đọc dữ liệu. Điều này tương tự như nhúng Lua vào một ứng dụng C/C++ để sử dụng như một ngôn ngữ cấu hình/datafile. Dự án LuaCLR cũng có thể có hiệu quả tại một số thời điểm, nhưng nó có thể không hoàn toàn như trưởng thành.

+0

xem câu trả lời của tôi cho mã mẫu về cách tôi sử dụng LuaInterface –

+0

ahh LuaInterface dường như chỉ là x86. :( –

1

Bạn có thể (hoặc không thể) tìm thấy những gì bạn cần trong số Lablua projects.

Trong mọi trường hợp, đừng ngần ngại đặt câu hỏi của bạn theo số Lua mailing list.

9

Nhờ cả các bạn, tôi tìm thấy những gì tôi đang tìm kiếm sử dụng LuaInterface

Dưới đây là một datastructure trong Lua Tôi muốn đọc ("c: \ sample.lua"):

TestValues = { 
    NumbericOneMillionth = 1e-006, 
    NumbericOnehalf = 0.5, 
    NumbericOne = 1, 
    AString = "a string" 
} 

Dưới đây là một số mẫu mã đọc rằng Lua datastructure sử dụng LuaInterface:

Lua lua = new Lua(); 

var result = lua.DoFile("C:\\sample.lua"); 

foreach (DictionaryEntry member in lua.GetTable("TestValues")) { 
    Console.WriteLine("({0}) {1} = {2}", 
     member.Value.GetType().ToString(), 
     member.Key, 
     member.Value); 
} 

Và đây là những gì mà mẫu mã viết ra cửa sổ console:

(System.String) AString = a string 
(System.Double) NumbericOneMillionth = 1E-06 
(System.Double) NumbericOnehalf = 0.5 
(System.Double) NumbericOne = 1 

Để tìm ra cách để sử dụng thư viện tôi đã mở lên LuaInterface.dll trong Reflector và google'd các hàm thành viên.

1

tôi đã không nhìn cái này chưa, tiết kiệm một liên kết cho bây giờ: http://www.youpvp.com/blog/post/LuaParse-C-parser-for-World-of-Warcraft-saved-variable-files.aspx

LuaInterface đang tiếc là chỉ đóng gói để chạy trên x86, vì vậy tôi đã nhìn vào giải pháp thay thế. Dưới đây là các nguồn:

/* 
* Denis Bekman 2009 
* www.youpvp.com/blog 
-- 
* This code is licensed under a Creative Commons Attribution 3.0 United States License. 
* To view a copy of this license, visit http://creativecommons.org/licenses/by/3.0/us/ 
*/ 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Xml.Linq; 
using System.IO; 
using System.Text.RegularExpressions; 
using System.Xml; 
using System.Net; 

namespace YouPVP 
{ 
    public class LuaParse 
    { 
     List<string> toks = new List<string>(); 

     public string Id { get; set; } 
     public LuaObject Val { get; set; } 
     public void Parse(string s) 
     { 
      string qs = string.Format("({0}[^{0}]*{0})", "\""); 
      string[] z = Regex.Split(s, qs + @"|(=)|(,)|(\[)|(\])|(\{)|(\})|(--[^\n\r]*)"); 

      foreach (string tok in z) 
      { 
       if (tok.Trim().Length != 0 && !tok.StartsWith("--")) 
       { 
        toks.Add(tok.Trim()); 
       } 
      } 

      Assign(); 
     } 
     protected void Assign() 
     { 
      if (!IsLiteral) 
       throw new Exception("expect identifier"); 
      Id = GetToken(); 
      if (!IsToken("=")) 
       throw new Exception("expect '='"); 
      NextToken(); 
      Val = RVal(); 
     } 
     protected LuaObject RVal() 
     { 
      if (IsToken("{")) 
       return LuaObject(); 
      else if (IsString) 
       return GetString(); 
      else if (IsNumber) 
       return GetNumber(); 
      else if (IsFloat) 
       return GetFloat(); 
      else 
       throw new Exception("expecting '{', a string or a number"); 
     } 
     protected LuaObject LuaObject() 
     { 
      Dictionary<string, LuaObject> table = new Dictionary<string, LuaObject>(); 
      NextToken(); 
      while (!IsToken("}")) 
      { 
       if (IsToken("[")) 
       { 
        NextToken(); 
        string name = GetString(); 
        if (!IsToken("]")) 
         throw new Exception("expecting ']'"); 
        NextToken(); 
        if (!IsToken("=")) 
         throw new Exception("expecting '='"); 
        NextToken(); 
        table.Add(name, RVal()); 
       } 
       else 
       { 
        table.Add(table.Count.ToString(), RVal());//array 
       } 
       if (!IsToken(",")) 
        throw new Exception("expecting ','"); 
       NextToken(); 
      } 
      NextToken(); 
      return table; 
     } 

     protected bool IsLiteral 
     { 
      get 
      { 
       return Regex.IsMatch(toks[0], "^[a-zA-Z]+[0-9a-zA-Z_]*"); 
      } 
     } 
     protected bool IsString 
     { 
      get 
      { 
       return Regex.IsMatch(toks[0], "^\"([^\"]*)\""); 
      } 
     } 
     protected bool IsNumber 
     { 
      get 
      { 
       return Regex.IsMatch(toks[0], @"^\d+"); 
      } 
     } 
     protected bool IsFloat 
     { 
      get 
      { 
       return Regex.IsMatch(toks[0], @"^\d*\.\d+"); 
      } 
     } 
     protected string GetToken() 
     { 
      string v = toks[0]; 
      toks.RemoveAt(0); 
      return v; 
     } 
     protected LuaObject GetString() 
     { 
      Match m = Regex.Match(toks[0], "^\"([^\"]*)\""); 
      string v = m.Groups[1].Captures[0].Value; 
      toks.RemoveAt(0); 
      return v; 
     } 
     protected LuaObject GetNumber() 
     { 
      int v = Convert.ToInt32(toks[0]); 
      toks.RemoveAt(0); 
      return v; 
     } 
     protected LuaObject GetFloat() 
     { 
      double v = Convert.ToDouble(toks[0]); 
      toks.RemoveAt(0); 
      return v; 
     } 
     protected void NextToken() 
     { 
      toks.RemoveAt(0); 
     } 
     protected bool IsToken(string s) 
     { 
      return toks[0] == s; 
     } 
    } 



    public class LuaObject : System.Collections.IEnumerable 
    { 
     private object luaobj; 

     public LuaObject(object o) 
     { 
      luaobj = o; 
     } 
     public System.Collections.IEnumerator GetEnumerator() 
     { 
      Dictionary<string, LuaObject> dic = luaobj as Dictionary<string, LuaObject>; 
      return dic.GetEnumerator(); 
     } 
     public LuaObject this[int ix] 
     { 
      get 
      { 
       Dictionary<string, LuaObject> dic = luaobj as Dictionary<string, LuaObject>; 
       try 
       { 
        return dic[ix.ToString()]; 
       } 
       catch (KeyNotFoundException) 
       { 
        return null; 
       } 
      } 
     } 
     public LuaObject this[string index] 
     { 
      get 
      { 
       Dictionary<string, LuaObject> dic = luaobj as Dictionary<string, LuaObject>; 
       try 
       { 
        return dic[index]; 
       } 
       catch (KeyNotFoundException) 
       { 
        return null; 
       } 
      } 
     } 
     public static implicit operator string(LuaObject m) 
     { 
      return m.luaobj as string; 
     } 
     public static implicit operator int(LuaObject m) 
     { 
      return (m.luaobj as int? ?? 0); 
     } 
     public static implicit operator LuaObject(string s) 
     { 
      return new LuaObject(s); 
     } 
     public static implicit operator LuaObject(int i) 
     { 
      return new LuaObject(i); 
     } 
     public static implicit operator LuaObject(double d) 
     { 
      return new LuaObject(d); 
     } 
     public static implicit operator LuaObject(Dictionary<string, LuaObject> dic) 
     { 
      return new LuaObject(dic); 
     } 
    } 
} 
4

LsonLib có thể phân tích Lua cấu trúc dữ liệu, thao tác chúng và serialize kết quả trở lại Lua văn bản. Tiết lộ đầy đủ: Tôi là tác giả. Đó là C# thuần túy và không có phụ thuộc.

Given:

MY_VAR = { "Foo", ["Bar"] = "Baz" } 
ANOTHER = { 235, nil } 

sử dụng cơ bản:

var d = LsonVars.Parse(File.ReadAllText(somefile)); 

d["MY_VAR"][1].GetString()  // returns "Foo" 
d["MY_VAR"]["Bar"].GetString() // returns "Baz" 
d["MY_VAR"][2]     // throws 

d["ANOTHER"][1].GetString() // throws because it's an int 
d["ANOTHER"][1].GetInt()  // returns 235 
d["ANOTHER"][2]    // returns null 
d["ANOTHER"][1].GetStringLenient() // returns "235" 

d["ANOTHER"][1] = "blah";  // now { "blah", nil } 
d["ANOTHER"].Remove(2);  // now { "blah" } 

File.WriteAllText(somefile, LsonVars.ToString(d)); // save changes 

(nó thực sự là một cảng khá đơn giản của một thư viện JSON chúng tôi sử dụng trong nội bộ, do đó nó có khá một vài tính năng và có thể có một số JSON dấu vết còn lại)

Các vấn đề liên quan