Я хочу проанализировать непрерывный поток байтов (из сокета) с помощью конечного автомата, используя Ragel
Тем не менее, все примеры, которые я нашел, либо анализируют полный файл за один проход (например, лексер Gherkin , либо используют Ragels C Target (например, mongrel HTTP1.1 Parser * 1006) *)
Я ищу несколько советов или примеров, как создать экземпляр автомата Ragel State, а затем добавить к нему байты, сохраняя существующее состояние без изменений.
Последний интерфейс, который я ищу, выглядит примерно так:
parser = MyStreamParser.new(Grammar)
parser.on_token { |t| puts t.inspect }
# I can't parse lines seperately because tokens can span multiple lines.
$stdin.each_line do |line|
parser.add(line)
end
Любой совет о том, как это сделать в Ragel, очень ценится. Я предпочел бы использовать это, чем кодировать другой конечный автомат вручную.
Может быть, Ragel - не тот инструмент? Если нет: что я должен использовать вместо этого?