Ragel を使用してステート マシンで (ソケットからの) バイトの連続ストリームを解析したい
ただし、私が見つけたすべての例は、1回のパスで完全なファイルを解析している ( Gherkin lexer のように)か、Ragels C Target ( mongrel HTTP1.1 Parserのように)を使用しています。
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 は適切なツールではないのでしょうか。そうでない場合: 代わりに何を使用すればよいですか?