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

parse lua script and connect with C++ codes

本文关键字:c++ 代码 连接 lua 脚本 解析      更新时间:2023-10-16

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

我有一台机器要控制。基本的操作函数(例如移动,开门,等待命令等),接口等都是用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.

在这个伪代码中,我们有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是一种轻量级和快速的语言,我想充分利用它。如果你理解我的问题,有更好的想法来解决我的问题,我将非常乐意学习!

在这种情况下,我不会坚持使用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,它在IMO上更容易使用。

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

lua_pushcfunction(L, func);

其中func具有签名:

int func(lua_State * L);

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