是否有可能在一个Ragel文件中调用多台机器?

Is it possible to invocate multiple machines in one Ragel file?

本文关键字:调用 文件 机器 Ragel 一个 有可能 是否      更新时间:2023-10-16

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

我想做的是当我运行到一个"命令"时,我想调用一个单独的解析函数(在主机语言中),如parsecommantype1,然后根据命令有一个单独的返回类型等。然后,该函数将调用自己的Ragel机器来解析命令的内容。

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

"子机器"也非常简单,而且会有相当多的子机器,所以我绝对不想将它们拆分为单独的文件。我目前正在尝试清理的实现有200-300行,所以把它分成10个文件似乎有点不方便。

所以问题是我可以在一个文件中调用/创建/实例化多个Ragel机器吗?机器可以有名字,但似乎没有办法叫这个名字,只是把它包含到不同的机器上,所以在我看来,每个文件只能有一台机器?

是否有其他整洁的方法来做到这一点?

这样的东西适合我。不可否认,如果你有很多函数定义,它会变得相当冗长。

%%{
    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;
}