如何解析任何常量Lua表,最好是在不加载它到Lua虚拟机中的情况下?

我有一堆用 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 }
        }
}

是否有任何库可以做到这一点?是否有任何方法可以在不逐个字符解析数据的情况下完成此操作?

点赞
用户235354
用户235354

你可以使用 luainterface 库。

这里有一些 示例代码

你需要使用 DoFile (加载文件)和 GetTable 的组合来将表中的数据读入到一个能够从C#中使用的 LuaTable 对象中。LuaTable 通过 GetEnumerator 公开一个 IDictionaryEnumerator

编辑:

如果您有此表构造:

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

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

对于常量文字,可以像这样使用字符串常量:

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

通过不同数量的等号级别。

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

0X1.921FB54442D18P+1

其中 P 为二进制指数。

忠实地复制Lua常量文字语法而不使用轻量级的Lua虚拟机将需要重新实现Lua语言规范的很大一部分,重新发明轮子的好处并不多。

2012-11-04 15:50:56
用户254215
用户254215

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

您还可以查看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的数据类型为“Nil”,因此易于处理条件检查。

有关使用Xanathar的Moonsharp的更多示例,请访问Xanathar的网站和他的git hub仓库。 (请参见下面的链接)。他似乎在任何问题或问题上都非常有帮助。

链接:

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

链接:

2014-10-22 06:56:26