4

我使用DynamicLua库将 Lua 脚本添加到我的 C# 应用程序中,它运行良好。我想实现您获取正在执行的当前行(如在 Visual Studio 中)并突出显示它。

目前我正在这样做:

   public static void RunLua(string LuaToExecute)
    {
        dynamic lua = new DynamicLua.DynamicLua();

        string[] lua_s_split = LuaToExecute.Split('\n');
        int counter = 0;
        foreach (string line in lua_s_split)
        {
            // highlight current line in editor
            HighlightLine(counter + 1);

            //execute current line 
            lua(line);
            counter++;
        }
    }

这对我的 Lua 代码非常有效,例如

move(20, 19)
sleep(1000)
move(5, 19)

但我不能只执行一行语句。就像我的绑定函数一样move()。但我也想使用多行语句,如函数和循环。如果文本编辑器包含:

function test()
    return  "Hallo Welt"
end

lua(line)引发异常,因为仅function test()传递了第一行并且解释器缺少 end 语句。

我能做些什么?我是否应该检查该行是否以函数开头,while... 命令,然后扫描结束块并将其添加到字符串中,以便我可以一次执行并突出显示该多行语句?这可能吗?我该怎么做?

请帮忙。

4

2 回答 2

5

我想实现您获取正在执行的当前行(如在 Visual Studio 中)并突出显示它。

不要通过一次向 Lua 脚本输入一行来做到这一点。运行整个脚本并让 Lua 在执行切换到新行时通过调试挂钩通知您:

Lua 编程:Hooks
Lua 手册:debug.sethook

于 2014-06-21T06:21:24.013 回答
2

[编辑] 在这个答案的时候,我不知道在接受的答案中提到的 LUA 解析器。我同意那张海报,您应该尽可能使用官方解析库,而不是自己滚动。以下回答了原始问题,但不应被视为最终答案。请查看已接受的答案以了解处理此问题的正确方法。[/EDIT]

您明确调用它来解析代码行/执行 LUA。

如果您有一个多行函数,请确保在调用执行块之前传递完整的内容。

var myCommand = new StringBuilder()

... myCommand.Append(line) ...

foreach (string line in lua_s_split)
    {
        // highlight current line in editor
        HighlightLine(counter + 1);

        //execute current line 
        If(NeedsToExecute(istrue))
        {
            lua(myCommand.ToString());
            counter++;
        }
        else{myCommand.appendline(line)
    }
于 2014-06-20T20:09:13.297 回答