【问题标题】:Easiest way to parse a Lua datastructure in C# / .Net在 C# / .Net 中解析 Lua 数据结构的最简单方法
【发布时间】:2010-10-27 06:09:37
【问题描述】:

有人知道在 C# 或任何 .Net 库中解析 Lua 数据结构的简单方法吗?这将类似于 JSON 解码,除了 Lua 而不是 javascript。

在这一点上,我似乎需要自己编写,但希望已经有一些东西了。

【问题讨论】:

标签: c# parsing lua


【解决方案1】:

感谢你们两个,我使用 LuaInterface 找到了我想要的东西

这是我想阅读的 Lua 数据结构(“c:\sample.lua”):

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

下面是一些使用 LuaInterface 读取 Lua 数据结构的示例代码:

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

下面是示例代码写入控制台的内容:

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

为了弄清楚如何使用这个库,我在 Reflector 中打开了 LuaInterface.dll 并用谷歌搜索了成员函数。

【讨论】:

    【解决方案2】:

    亚历山大所说的。毕竟,实验室是 Lua 的家。

    具体来说,LuaInterface 可以允许 Lua 解释器嵌入到您的应用程序中,以便您可以使用 Lua 自己的解析器来读取数据。这类似于将 Lua 嵌入到 C/C++ 应用程序中以用作配置/数据文件语言。 LuaCLR 项目在某些时候可能也会有成果,但可能还不够成熟。

    【讨论】:

    • 啊 LuaInterface 似乎只有 x86。 :(
    【解决方案3】:

    LsonLib 可以解析 Lua 数据结构,操作它们并将结果序列化回 Lua 文本。全面披露:我是作者。它是纯 C# 并且没有依赖项。

    给定:

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

    基本用法:

    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
    

    (它实际上是我们内部使用的 JSON 库的一个相当简单的端口,因此它具有相当多的功能,并且可能会留下一些 JSON 痕迹)

    【讨论】:

    • 谢谢。我正在尝试解析以下文件,但出现了一些错误。它可以读取一个开头的文件吗:local ui return { {var1 =...}。 {var2 = ....}, ... }, } ?
    • @dandan 不,在这方面它非常有限,您必须对这个文件进行一些预处理。
    【解决方案4】:

    您可能(也可能不会)在Lablua projects 中找到您需要的内容。

    无论如何,请随时在Lua mailing list 上提问。

    【讨论】:

      【解决方案5】:

      我还没有看过这个,暂时保存一个链接: http://www.youpvp.com/blog/post/LuaParse-C-parser-for-World-of-Warcraft-saved-variable-files.aspx

      不幸的是,LuaInterface 仅打包为在 x86 上运行,所以我正在寻找替代方案。这是来源:

      /*
       * 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);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-06-23
        • 2014-05-17
        • 2011-05-09
        • 2015-07-11
        • 2013-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-11
        相关资源
        最近更新 更多