我不确定在这里提出这个问题是否合适,但我会尽可能清楚地解释我的问题。
我有一台机器可以控制。基本的操作功能(例如移动,打开门,等待命令等),接口等都是用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是一种轻快的语言,我想充分利用它。如果你理解我的问题并有更好的想法来解决我的问题,我将非常乐意学习!
答案 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计算一堆编码应该发生的事情的表要好得多。