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

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

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

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

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

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

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

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;

}
2

Другие решения


По вопросам рекламы [email protected]