2015-02-06 67 views
4

可以说我有Lua嵌入在C++应用程序中。这个问题听起来很奇怪,但我很感兴趣,有没有标准的方式来禁用C++端的Lua功能?Lua,我可以从C++中禁用部分语言吗?

比如我想禁用除了定义了几下,像这样的新的变量创建:

local time = 10 
local size = 20 
function test() 
    return time * size 
end 

我想提出,如果我定义什么比timesizetest功能其他的Lua VM失败。这可能不是黑客虚拟机本身?

或者例如我想禁用循环(forwhile语句)。

回答

5

限制可以创建或访问全球变量的名字很简单:只需使用具有对__index__newindex适当元方法的环境中加载你的脚本。

限制本地变量的名称需要一些深度黑客,可能不值得,因为它们不会影响主机程序。

限制关键字无法做到开箱即用,但可以与一些做一个简单的黑客:

要删除一些关键字,只需在llex.c. luaX_tokens添加一个空格给相关的字符串这些关键字将可用于变量名称,并且相应的语法结构将不可访问,并会引发错误。例如,要删除循环,请禁用for,whilerepeat。您可以离开inuntil,但他们不会做任何事情。如果您想动态执行此操作,请参阅this lua-l message

+0

感谢您的建议! – 2015-02-06 13:34:40

+0

@ lukas.pukenis,当然。请分享您选择的解决方案。 – lhf 2015-02-07 00:24:45

+0

我还没有选择任何解决方案,因为我现在没有实际执行它。我需要一个伪语言。我认为Lua是完美的,但我想限制语言功能(想出于游戏目的),所以想知道它有多可能:) – 2015-02-07 08:20:17

3

一个选项是获取Lua source code并删除不需要的部分。这听起来并不像听起来那么疯狂:代码非常可读。

+0

感谢您的建议。我不介意潜入Lua代码,但我想知道是否有更简单的方法。就像也许有标志或我在寻找这样的东西时错过了:)。 – 2015-02-06 12:11:19

4

不,没有用于禁用该语言的核心功能的任何标志。并且不可能有任何像编译时标志的“只允许X变量”的任何合理的方式。

修改lua删除forwhile可能相当简单,但修改它不允许创建变量可能不会(我想也许不会)很容易。

metalua这样的东西实际上会让我觉得这样的事情更容易。

+0

我有同样的观点,阻止例如变量应该是代码中的重要组成部分,因此不容易移动。没有听说metalua感谢它。 – 2015-02-06 12:39:18

相关问题