Я хочу, чтобы разобрать непрерывный поток байтов (от розетки) с государственной машиной, используя 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 - это не тот инструмент? Если нет: что я должен использовать вместо этого?
О, да. Статемахины. Сейчас я заменяю одномоментные государственные механизмы работы с помощью Statemachine. –
Statemachine хорош для того, что он делает, но он (я считаю) не имеет функций, которые мне бы хотелось (я бы afaict все еще нуждался в lexer для преобразования потока байтов в токены и не мог делать такие вещи, как lookahead, приоритеты , семантические условия, если я сам их не создаю) – levinalex
Достаточно честный. Извините, это не помогло вам. Но спасибо за то, что вы задали крутой вопрос. –