如何在包含 C++ 的定义时解析和修改 LUA 文件?

我正在尝试使用 C++ 解析和修改 LUA 文件,这些文件与制图师有关。我是一个 LUA 新手,不能处理具有复杂结构的文件。以下是文件的示例:

//test.lua

include "map_builder.lua"
include "trajectory_builder.lua"

options = {
    map_builder = MAP_BUILDER,
    trajectory_builder = TRAJECTORY_BUILDER,
    map_frame = "map",
    tracking_fame = "base_link",
    published_frame = "base_link",
    ...
    submap_publish_period_sec = 0.3,
    ...
}

--MAP_BUILDER
MAP_BUILDER.use_trajectory_builder_3d = true
MAP_BUILDER.num_background_threads = 7

--POSE_GRAPH
POSE_GRAPH.optimize_every_n_nodes = 640
...

--TRAJECTORY_BUILDER_3D
TRAJECTORY_BUILDER_3D.max_range = 50.
...

return options

接下来,

//map_builder.lua

include "pose_graph.lua"

MAP_BUILDER = {
    use_trajectory_builder_2d = false,
    use_trajectory_builder_3d = false,
    num_background_threads = 4,
    pose_graph = POSE_GRAPH,
    ...
}

pose_graph.lua:

//pose_graph.lua

POSE_GRAPH = {
    optimize_every_n_nodes = 20,
    constraint_builder = {
        smapling_ratio = 0.03,
        ...
    },
    ...
}

trajectory_builder.lua:

//trajectory_builder.lua

include "trajectory_builder_2d.lua"
include "trajectory_builder_3d.lua"

TRAJECTORY_BUILDER = {
    trajectory_builder_2d = TRAJECTORY_BUILDER_2D,
    trajectory_builder_3d = TRAJECTORY_BUILDER_3D,
    collate_fixed_frame = true,
    ...
}

trajectory_builder_2d.lua:

//trajectory_builder_2d.lua

TRAJECTORY_BUILDER_2D = {
    ...
}

trjectory_builder_3d.lua:

//trajectory_builder_3d.lua

MAX_3D_RANGE = 100.
...
TRAJECTORY_BUILDER_3D = {
    ...
}

最后,这是我的测试代码:


我像这样重新编辑了我的代码,似乎我应该在加载文件之前在 luaInclude() 中处理 MAP_BUILDER 等。那么,在加载 test.lua 文件之前处理它们的正确方法是什么?

int luaInclude(lua_State *L) {
    printf("include file: %s\n", lua_tostring(L, -1));

    // get include lua file name and handle it here
    // how to handle MAP_BUILDER etc.?
}

int main() {
    lua_State *L = luaL_newstate();
    luaL_openlibs(L);

    lua_register(L, "include", luaInclude);

    if(luaL_dofile(L, "test.lua")) {
        printf("read file failed: %s", lua_tostring(L, -1));
        return;
    }

    lua_getglobal(L, "options");
    int size = lua_gettop(L);
    lua_pushnil(L);

    // here to do sth.
    // like modify "submap_publish_period_sec" from 0.3 to 0.6

    lua_close(L);

    return 0;
}

但是,我得到错误:

test.lua: attempt to index global 'MAP_BUILDER'(a nil value)!

那么,如何在 test.lua 中处理 "MAP_BUILDER"、" POSE_GRAPH" 和 " TRAJECTORY_BUILDER_3D" 等类似的内容?帮帮我吧!

点赞