Можно ли вызвать несколько машин в одном файле Ragel?

Я создаю довольно простой парсер, который не имеет рекурсивных структур или чего-то слишком сложного.

Что я хотел бы сделать, так это когда я запускаю "команду", я хотел бы вызвать отдельную функцию синтаксического анализа (на языке хоста), такую ​​как parseCommandType1, которая затем будет иметь отдельный тип возврата и т. Д. В зависимости от команды. Эта функция затем вызывала бы свой собственный компьютер Ragel для анализа содержимого команды.

Если я хочу сделать все это в одном парсере Ragel, логика становится очень уродливой очень быстро, потому что в зависимости от типа команды мне нужно по-разному интерпретировать данные и создавать некоторые производные объекты другого типа.

"Субмашины" также очень просты, и их будет довольно много, поэтому я бы не хотел разбивать их на отдельные файлы. Моя текущая реализация, которую я пытаюсь очистить, содержит около 200-300 строк, поэтому разделение ее на десять файлов кажется немного неудобным.

Итак, вопрос в том, могу ли я как-то вызвать / создать / создать несколько машин Ragel в одном файле? У машин может быть имя, но, кажется, нет никакого способа назвать это имя, просто включить его в разные машины, так что мне кажется, что вы можете иметь только одну машину на файл?

Есть ли другой способ сделать это?

1 ответ

Как-то так у меня работает. По общему признанию это может стать довольно многословным, если у вас есть много определений функций.

%%{

    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;

}
Другие вопросы по тегам