开发者

Encapsulating a (pure Ruby) Ragel parser for infinite streams?

I want to parse a continuous stream of bytes (from a socket) with a state machine using Ragel

However, all the Examples I have found are either parsing a complete file in one pass (like the Gherkin lexer or are using Ragels C Target (like the mongrel HTTP1.1 Parser)

I'm looking for some advice or examples on how to instantiate a Ragel State machine and then add bytes to it, keeping the existing st开发者_如何学Pythonate intact.

The final interface I am looking for is something like:

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

Any advice on how to do that in Ragel is greatly appreciated. I'd rather use that than code another state machine by hand.

Maybe Ragel is not the right tool? If not: What should I use instead?


At first glance, Ragel doesn't look very Ruby-like. Have you taken a look at Statemachine? It looks like you can feed the state machine events (characters, in your problem) one at a time.


It may not be exactly what you are looking for, but Dhaka is another decent parser generator to take a look at. I'm not sure that will help, but it has served me well in the past.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜