Инкапсулировать (чистый Ruby) парсер Ragel для бесконечных потоков? - PullRequest
1 голос
/ 16 января 2010

Я хочу проанализировать непрерывный поток байтов (из сокета) с помощью конечного автомата, используя 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 - не тот инструмент? Если нет: что я должен использовать вместо этого?

Ответы [ 2 ]

1 голос
/ 17 января 2010

На первый взгляд, Ragel не очень похож на Ruby.Вы смотрели на Statemachine ?Похоже, вы можете передавать события конечного автомата (символы в вашей задаче) по одному за раз.

0 голосов
/ 17 января 2010

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

...