Lua逐行脚本编写

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() 被传递了,解释器缺少结束语句。

我该怎么办?我应该检查该行是否以函数、while 等命令开头,然后扫描 end 块并将其添加到一个字符串中,以便我可以一次执行和突出显示这个多行语句吗?这可行吗?我该如何做?

请帮帮我。

2个回答

5
我希望能够实现获取当前正在执行的行(类似于Visual Studio)并加以突出显示,与此相关,请不要逐行提供Lua脚本。运行整个脚本,并让Lua在执行切换到新行时通知您,通过调试挂钩实现:
Programming in Lua: Hooks
Lua manual: debug.sethook

太棒了!谢谢!我不知道这个方法。所以我可以将自己的_setHighlightLine函数绑定到动态Lua对象上。设置Lua钩子,我的函数将在每个新行lua执行时自动调用。我会试一下的。谢谢。 - pixelport

2
[编辑] 在回答这个问题的时候,我不知道已经有人提到了LUA解析器。我同意那位用户的观点,尽可能使用官方解析库而不是自己编写。下面的回答是为了原始问题而准备的,但不应视为终极答案。请查看被接受的答案以获取正确处理此问题的方法。[/编辑]
您正在显式调用它来解析代码行/执行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)
    }

谢谢你的回答,这正是我想到的。但是我如何检查是否可以执行该行代码或者需要添加更多代码呢?是扫描关键词比如"while"、"function"等吗?还是添加并执行下一行代码直到没有异常出现?我应该怎么做? - pixelport
完全取决于您的实现,恐怕我无能为力。您应该知道何时准备发送多行命令,因此可能需要类似以下的内容:如果(行首以¤¤¤开头)则继续读取,直到遇到/¤¤¤的行终止符。-- 您可以考虑使用稍微高级一些的技术,例如传递JSON数据,而不是仅仅盲目地按新行拆分。然后您将更容易指定完整的行。 - Matches
2
@user2414724,总的来说,这是一种不好的方法。当你处理完每一个角落的情况时,你将会编写一个完整的Lua解析器。Lua已经有了一个解析器,并且有一个标准库可以做到你正在尝试做的事情。 - Mud
1
我没有使用过 LUA 解析器,只是在回复原帖问题 - 在看到其他选项后,我同意这个更好。我会编辑我的答案,建议查看实际解析器(被接受的答案),而不是这种方法。 - Matches

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接