6

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

Lua 表的问题在于有可选字段,表是非常动态的,而不仅仅是一个字典,键为一种类型,值为一种类型。可以有一个 Lua 表,其中包含字符串和整数键,以及整数、字符串甚至表类型的值。

可悲的是,我正在解析的数据利用了语言的动态特性,并没有以任何直接的方式进行结构化。这需要数据的动态表示,例如使用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 }
        }
}

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

4

2 回答 2

3

您可以使用luainterface

这里有一些示例代码

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

编辑:

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

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

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

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

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

具有不同级别的等号

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

0X1.921FB54442D18P+1

以 P 作为二进制指数。

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

于 2012-11-04T15:50:56.557 回答
2

我知道这是一个旧帖子,但这对于在此帖子之后到达这里的人可能很有用......

您还可以查看 Xanathar 的 MoonSharp (Moon#) 项目;我刚刚开始尝试它,它似乎可以很好地包装动态表、嵌套表等。你只需给解释器一个脚本,它就会在解释器上下文中解析和保存解析的对象。

链接:

例子:

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

如果上面的代码不完全正确,我们深表歉意,因为它取自我的一个测试类并转换为在此处发布。请原谅包装好的模拟数据常量,但它们本质上是 Lua 脚本和预期值。

当尝试通过不正确的键访问 Lua 表中的条目时,DynValue 的 DataType 为“Nil”,因此很容易通过条件检查来处理。

更多关于 Xanathar 的 Moonsharp 使用示例可以在 Xanathar 的网站和他的 git hub repo 上找到。(见下面的链接)。他似乎对您可能遇到的任何问题或疑问都非常有帮助。

链接:

我已经开始编写一些具有单元测试的扩展,这些扩展在我的一个存储库中显示了进一步的用法(请参见下面的链接)

链接:

于 2014-10-22T06:56:26.313 回答