解析lua脚本并连接C ++代码

时间:2015-10-23 13:25:24

标签: c++ parsing lua

我不确定在这里提出这个问题是否合适,但我会尽可能清楚地解释我的问题。

我有一台机器可以控制。基本的操作功能(例如移动,打开门,等待命令等),接口等都是用C ++编写的,我们需要在lua中编写一些服务脚本。伪代码服务脚本如下:

 * define the service name and give some description
 * declare the task address
 * declare the input and output class name
 * list the input plugin files
 * define a "run" function
   -- publish the machine state
   -- initialize the machine
   -- wait for commands
   -- call the "service" function
   -- wait for stop command
 * define a "service" function
   -- set the service state to be true
   -- move the car to destination
   -- open the door for a while
   -- close the door 
 * after the service is finished, send a "finish" flag to the center handler.

在这个伪代码中,我们有两个函数,行以" - "通常是用C ++编写的基本操作函数或其他lua插件文件中定义的函数。

我之前编写了非常简单的C ++代码和Lua脚本并将它们连接起来。但它们就像从C ++传递一个数字表到lua,使用lua中的函数来计算sum / factorial / sqaure ......然后将结果传递回C ++并打印出来。在这样的练习中,我只使用了诸如lua_State * L之类的函数;     L = luaL_newstate();     luaL_openlibs();         luaL_loadfile();         lua_pcall();         lua_tostring();         lua_tonumber();         ......

但是现在我需要处理这么复杂的lua脚本和C ++代码系统。我认为简单地做我以前做的事情是不够的....我想知道是否有一种特定的方法来解析lua脚本,获取每个组件的值(任务地址,函数等等)并将它们保存在C ++代码,那么我可能更容易将提取的组件连接到现有的C ++函数....

或者这是可能的:只是以表的形式从lua返回所有内容(包括值,函数等等),然后我编写一个C ++代码来读取表并保存值,然后我连接将项目提取到现有的C ++函数....

我不确定我是否清楚地提出了我的问题......我是Lua的新手,我认为Lua有很多伟大的东西我找不到......我知道有人说Lua是一种轻快的语言,我想充分利用它。如果你理解我的问题并有更好的想法来解决我的问题,我将非常乐意学习!

2 个答案:

答案 0 :(得分:0)

在这种情况下,我不仅会坚持Lua,而是准备一些领域特定语言。在示例中,您提供了您的语言的非正式语法,需要正式记录。

您需要定义令牌(您的语言的原子),然后定义语法规则(如何从这些令牌中构建服务)。看起来或多或少的东西:

%tokens {
    NUMBER = [0-9]+
    NAME = [A-Z]+
    STRING = \"[^\"]\"
}

%rules {
    script: service
          | service script

    service: "def" NAME "doc" STRING "address" NUMBER io body

    io: //and much more here
}

有很多工具可以将正式定义转换为解析器或解释器。 作为C ++开发人员,您可能喜欢Bison / Flex。这是用C编写的编译器编译器,它编译包含带有标记和规则定义的混合C / C ++代码的文件。 如果您不需要在C ++中编写解析器,那么我建议您使用更简单易用的ANTLR。

答案 1 :(得分:0)

你应该研究lua API在将C函数作为函数指针推送时直接接收到环境中的能力:

lua_pushcfunction(L, func);

其中func有签名:

int func(lua_State * L);

使用这种机制,您可以创建一个API来控制脚本中的门等,并且lua脚本编写器控制它是非常自然的。我认为这比让lua计算一堆编码应该发生的事情的表要好得多。