2010-01-16 3 views
1

Я хочу, чтобы разобрать непрерывный поток байтов (от розетки) с государственной машиной, используя RagelИнкапсулировать (чистый Ruby) парсер Ragel для бесконечных потоков?

Однако, все примеры я нашел либо разбора полный файл в один проход (как the Gherkin lexer или используют Ragels C Target (как mongrel HTTP1.1 Parser)

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

окончательный интерфейс Я ищет что-то вроде:

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 - это не тот инструмент? Если нет: что я должен использовать вместо этого?

ответ

0

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

1

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

+0

О, да. Статемахины. Сейчас я заменяю одномоментные государственные механизмы работы с помощью Statemachine. –

+0

Statemachine хорош для того, что он делает, но он (я считаю) не имеет функций, которые мне бы хотелось (я бы afaict все еще нуждался в lexer для преобразования потока байтов в токены и не мог делать такие вещи, как lookahead, приоритеты , семантические условия, если я сам их не создаю) – levinalex

+0

Достаточно честный. Извините, это не помогло вам. Но спасибо за то, что вы задали крутой вопрос. –