解析Lua脚本并与C++代码连接。

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

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

* 定义服务名称并提供一些描述
* 声明任务地址
* 声明输入和输出类名
* 列出输入插件文件
* 定义一个“运行”函数
  - 发布机器状态
  - 初始化机器
  - 等待命令
  - 调用“服务”函数
  - 等待停止命令
* 定义“服务”函数
  - 将服务状态设置为true
  - 将汽车移动到目标位置
  - 打开门一段时间
  - 关闭门
* 在服务完成后,向中央处理程序发送“完成”标志。

在此伪代码中,我们有2个函数,并且以“--”开头的行通常是用C++编写的基本操作函数或在其他lua插件文件中定义的函数。

我以前编写过非常简单的C++代码和Lua脚本,并将它们连接起来。但是它们就像是从C++传递一个数字表到Lua,使用Lua中的函数计算和/阶乘/平方...然后将结果传回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是一种轻巧快速的语言,我想充分利用它。如果您理解我的问题并有更好的解决方法,请告诉我,我将非常乐意学习!

点赞
用户3710640
用户3710640

在这种情况下,我不仅会坚持使用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,因为它在我看来更简单。

2015-10-24 13:18:23
用户3598119
用户3598119

你应该查看 Lua API 的能力,当它们被推作函数指针时,直接将 C 函数加入环境:

lua_pushcfunction(L, func);

其中 func 的签名为:

int func(lua_State * L);

通过使用这种机制,你可以创建一个 API,使脚本能够控制门等东西,并且 Lua 脚本编写者可以很自然地进行控制。我认为这比让 Lua 计算一堆编码了应该发生什么的表格要好得多。

2015-10-27 01:24:33