为无限流封装(纯Ruby)Ragel解析器?

时间:2010-01-16 18:48:07

标签: ruby parsing state-machine ragel

我想用状态机使用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不是正确的工具?如果不是:我应该使用什么呢?

2 个答案:

答案 0 :(得分:1)

乍一看,Ragel看起来并不像Ruby那样。你看过Statemachine了吗?看起来您可以一次一个地提供状态机事件(字符,在您的问题中)。

答案 1 :(得分:0)

它可能不是您正在寻找的,但Dhaka是另一个不错的解析器生成器来看一看。我不确定这会有所帮助,但它在过去一直很好用。