2

我正在创建一个相当简单的解析器,它没有递归结构或任何太具有挑战性的东西。

我想做的是当我遇到“命令”时,我想调用一个单独的解析函数(用宿主语言),例如 parseCommandType1 ,然后根据命令有一个单独的返回类型等。然后该函数将调用它自己的 Ragel 机器来解析命令的内容。

如果我想在一个 Ragel 解析器中完成所有这些,那么逻辑很快就会变得非常难看,因为根据命令类型,我需要以不同的方式解释数据并创建一些不同类型的派生对象。

“子机”也非常简单,其中会有很多,所以我绝对不想将它们拆分为单独的文件。我正在尝试清理的当前实现有 200-300 行,因此将其拆分为十个文件似乎有点不方便。

所以问题是我可以在一个文件中以某种方式调用/创建/实例化多个 Ragel 机器吗?这些机器可以有一个名称,但似乎无法调用该名称,只需将其包含在不同的机器上,所以对我来说,看起来每个文件只能有一台机器?

有没有其他巧妙的方法来做到这一点?

4

1 回答 1

2

像这样的东西对我有用。诚然,如果您有许多函数定义,它可能会变得非常冗长。

%%{

    machine Machine1;

    main := ... ;

}%%

%% write data nofinal;

void machine1_func(char *p, size_t p_len) {
    int cs;
    char *pe = p + p_len; 

%% write init;
%% write exec;

} //Only one blank line between next ragel machine definition or it doesn't seem to find the next definition. 

%%{

    machine Machine2;

    main := ... ;

}%%

%% write data nofinal;

void machine2_func(char *p, size_t p_len) {
    int cs;
    char *pe = p + p_len; 

    %% write init;
    %% write exec;

}
于 2015-09-05T16:49:24.020 回答