Я создаю довольно простой парсер, который не имеет рекурсивных структур или чего-то слишком сложного.
Что я хотел бы сделать, так это когда я запускаю «команду», я хотел бы вызвать отдельную функцию синтаксического анализа (на языке хоста), такую как parseCommandType1, которая затем будет иметь отдельный тип возврата и т. Д. В зависимости от команды. Затем эта функция вызовет свой собственный компьютер Ragel для анализа содержимого команды.
Если я хочу сделать все это в одном парсере Ragel, логика становится очень уродливой очень быстро, потому что в зависимости от типа команды мне нужно по-разному интерпретировать данные и создавать некоторые производные объекты другого типа.
«Субмашины» также очень просты, и их будет довольно много, поэтому я бы определенно не хотел разбивать их на отдельные файлы. Моя текущая реализация, которую я пытаюсь очистить, содержит около 200-300 строк, поэтому разделение ее на десять файлов кажется немного неудобным.
Итак, вопрос в том, могу ли я как-то вызвать / создать / создать несколько машин 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;
}