我正在编写一个 LSL 到 Lua 翻译器,并且在实现递增和递减运算符时遇到了各种麻烦。LSL 使用通常的 C 类语法(x++、x--、++x、--x)有这样的东西,但 Lua 没有。只是为了避免大量输入,我将这些类型的运算符称为“crements”。在下面的代码中,我将使用“...”来表示表达式的其他部分。
... x += 1 ...
不会工作,因为 Lua 只有简单的任务。
... x = x + 1 ...
不能工作,因为这是一个语句,Lua 不能在表达式中使用语句。LSL 可以在表达式中使用crements。
function preIncrement(x) x = x + 1; return x; end
... preIncrement(x) ...
虽然它确实在表达式中提供了正确的值,但 Lua 是按值传递数字的,因此原始变量不会改变。如果我能让它真正改变变量,那么一切都很好。弄乱环境可能不是一个好主意,不知道范围 x 是什么。我想我接下来会调查一下。翻译器可以输出范围详细信息。
假设上述功能存在 -
... x = preIncrement(x) ...
不会因为“这是一个声明”的原因而工作。
其他解决方案开始变得非常混乱。
x = preIncrement(x)
... x ...
工作正常,除非原始 LSL 代码是这样的 -
while (doOneThing(x++))
{
doOtherThing(x);
}
这变成了一整罐蠕虫。在函数中使用表格 -
function preIncrement(x) x[1] = x[1] + 1; return x[1]; end
temp = {x}
... preincrement(temp) ...
x = temp[1]
更混乱,并且有同样的问题。
开始看起来我可能不得不实际分析周围的代码,而不是仅仅做简单的翻译来找出实现任何给定crement的正确方法是什么。有人有任何简单的想法吗?