C# 逐行编写Lua脚本

C# 逐行编写Lua脚本,c#,dynamic,lua,scripting-language,embedded-script,C#,Dynamic,Lua,Scripting Language,Embedded Script,我使用库将Lua脚本添加到我的C#应用程序中,效果非常好。 我想实现的是,您得到正在执行的当前行(就像在VisualStudio中)并突出显示它 目前我正在这样做: public static void RunLua(string LuaToExecute) { dynamic lua = new DynamicLua.DynamicLua(); string[] lua_s_split = LuaToExecute.Split('\n');

我使用库将Lua脚本添加到我的C#应用程序中,效果非常好。 我想实现的是,您得到正在执行的当前行(就像在VisualStudio中)并突出显示它

目前我正在这样做:

   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语句

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


请帮助。

[EDIT]在回答这个问题时,我不知道在接受的答案中提到的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)
    }
我想实现的是,您得到正在执行的当前行(就像在VisualStudio中)并突出显示它

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



谢谢你的回答,这正是我的想法。但是如何检查是否可以执行该行或是否需要添加更多行?扫描“while”、“function”等关键词。?或者添加并执行下一行直到我没有异常?我该怎么办?恐怕完全取决于你的实施。您应该知道何时准备发送多行命令,因此可能类似于,if(行的开头。startswith(·m)继续读取,直到遇到/·m的行终止符。-您可能会考虑使用更高级的技术,例如传递JSON数据,而不是盲目地拆分新行。这样您就可以更轻松地指定整行。@user2414724这通常是一种不好的方法。当您处理完每个角落的案例时,您将已经编写了一个完整的Lua解析器。Lua已经有了一个解析器和一个标准库,可以完全执行您正在尝试执行的操作。我没有Lua解析器的任何经验,只是回答了最初的线程问题-在看到另一个选项后,我会同意它更好。我将编辑我的答案,建议使用实际的解析器(接受的答案),而不是这个方法。太棒了!谢谢我不知道这个方法。因此,我可以将自己的
\u setHighlightLine
函数绑定到动态Lua对象。设置Lua钩子,我的函数将在Lua执行的每一行上自动被调用。我会试试看。谢谢