我正在创建一个相当简单的解析器,它没有递归结构或任何太具挑战性的东西。
我想要做的是当我运行“命令”时,我想调用一个单独的解析函数(在宿主语言中),例如parseCommandType1,然后根据命令具有单独的返回类型等。 。然后该函数将调用自己的Ragel机器来解析命令的内容。
如果我想在一个Ragel解析器中完成所有这些操作,逻辑会非常快速地变得非常丑陋,因为基于命令类型我需要以不同方式解释数据并创建一些不同类型的派生对象。
“submachines”也非常简单,并且会有相当多的,所以我绝对不希望将它们拆分为单独的文件。我正在尝试清理的当前实现有200-300行,所以将它拆分为十个文件似乎有点不方便。
所以问题是我能以某种方式在一个文件中调用/创建/实例化多个Ragel机器吗?机器可以有一个名称,但似乎无法调用该名称,只是将它包含在不同的机器中,所以对我而言,你看起来每个文件只能有一台机器?
还有其他简洁的方法吗?
答案 0 :(得分: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;
}