Скрипты Lua построчно
Я добавил сценарии Lua в свое приложение на C# с помощью библиотеки DynamicLua, и она работает очень хорошо. Я хотел бы реализовать, что вы получите текущую строку, которая выполняется (как в 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()
пропущен, а в интерпретаторе отсутствует оператор конца.
Что я могу сделать? Должен ли я проверить, начинается ли строка с функции, а команда..., а затем сканировать конечные блоки и добавить ее в строку, чтобы я мог выполнить и выделить этот многострочный оператор все в одном? Будет ли это возможно? Как бы я это сделал?
Пожалуйста помоги.
2 ответа
Я хотел бы реализовать, что вы получите текущую строку, которая выполняется (как в Visual Studio) и выделите ее.
Не делайте этого, передавая сценарий Lua строку за раз. Запустите весь сценарий и позвольте Lua уведомить вас, когда выполнение переключится на новую строку, через отладочный хук:
Программирование на Lua: Hooks
Руководство по Lua: debug.sethook
[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)
}