解析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是一种轻巧快速的语言,我想充分利用它。如果您理解我的问题并有更好的解决方法,请告诉我,我将非常乐意学习!
你应该查看 Lua API 的能力,当它们被推作函数指针时,直接将 C 函数加入环境:
lua_pushcfunction(L, func);
其中 func 的签名为:
int func(lua_State * L);
通过使用这种机制,你可以创建一个 API,使脚本能够控制门等东西,并且 Lua 脚本编写者可以很自然地进行控制。我认为这比让 Lua 计算一堆编码了应该发生什么的表格要好得多。
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil 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,因为它在我看来更简单。