如何解析任何常量Lua表,最好不要在Lua VM中加载它?

les*_*rid 5 c# lua parsing dynamic

我有一堆Lua表形式的数据,我想将这些数据解析为C#中的可用结构.

Lua表的问题在于存在可选字段,表非常动态,并且不仅仅是一个字体,其中一个类型用于键,一个类型用于值.可以有一个包含字符串和整数键的Lua表,以及integer,string和even table 类型的值.

遗憾的是,我正在解析的数据利用了语言的动态特性,而且并没有真正以任何直接的方式构建.例如,这需要动态表示数据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 }
        }
}
Run Code Online (Sandbox Code Playgroud)

有没有图书馆可以做到这一点?有没有办法在不逐字符解析数据的情况下实现这一目标?

jsp*_*cal 3

您可以使用luainterface

这里有一些示例代码

您将需要使用DoFile(加载文件)和GetTable将表读入一个LuaTable对象的组合,您可以使用 c# 的结果。暴露LuaTable了一个IDictionaryEnumerator贯穿GetEnumerator

编辑:

如果你有这个表构造函数:

local t = { os.time() }
print(t[1]);
Run Code Online (Sandbox Code Playgroud)

需要执行构造函数中的函数来初始化数据。

对于常量文字,您可以使用字符串常量,如下所示:

local a = [==[
  hello
  there""\"]==]
Run Code Online (Sandbox Code Playgroud)

具有不同级别的等号

数字文字可以具有以下形式:

0X1.921FB54442D18P+1
Run Code Online (Sandbox Code Playgroud)

以 P 作为二进制指数。

在不使用轻量级 lua VM 的情况下忠实地重现常量文字的 lua 语法将需要重新实现 lua 语言规范的大部分内容。重新发明轮子并没有多大好处。