我正在写一个LSL到Lua翻译器,我在实现递增和递减运算符时遇到了各种各样的麻烦. LSL使用通常的C语法(x,x–,x, – x)进行此类操作,但Lua没有.为了避免大量打字,我将这些类型的运算符称为
... x += 1 ...
不工作,因为Lua只有简单的任务.
... x = x + 1 ...
不会工作因为这是一个声明,Lua不能在表达式中使用语句. LSL可以在表达式中使用创建.
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]
甚至更乱,并且有同样的问题.
开始看起来我可能必须实际分析周围的代码而不是仅仅进行简单的翻译来理清实现任何给定的创建的正确方法.有人有任何简单的想法吗?
我认为要真正做到这一点,你将不得不做一些更详细的分析,并将一些表达式分成多个语句,尽管很多可能很容易翻译.请注意,至少在C中,您可以将后递增/递减延迟到下一个“序列点”,并将前递增/递减放在前一个序列点之前;序列点仅位于几个地方:语句之间,“短路运算符”(&&和||)等.(more info here)
所以可以替换x = * y z * f(); {x = * y z * f(); y = y 1; – 不允许用户假设y将在语句中的任何其他内容之前递增,只是在* y中使用的值在递增之前将为y.同样,x = * – y z * f();可以用{y = y – 1; x = * y z * f(); }