解析lua脚本并连接c++代码
parse lua script and connect with C++ codes
我不确定在这里问这个问题是否合适,但我会尽可能清楚地解释我的问题。
我有一台机器要控制。基本的操作函数(例如移动,开门,等待命令等),接口等都是用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计算一堆表来编码应该发生的事情要好得多。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值