【问题标题】:Encapsulating a (pure Ruby) Ragel parser for infinite streams?为无限流封装(纯 Ruby)Ragel 解析器?
【发布时间】:2010-01-16 18:48:06
【问题描述】:

我想使用 Ragel 使用状态机解析连续的字节流(来自套接字)

但是,我发现的所有示例要么一次性解析完整文件(如 the Gherkin lexer,要么使用 Ragels C 目标(如 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 不是正确的工具?如果不是:我应该改用什么?

【问题讨论】:

    标签: ruby parsing state-machine ragel


    【解决方案1】:

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

    【讨论】:

    • 哦,是的。状态机摇摆不定。我现在正在用 Statemachine 替换工作中的一个手工状态引擎。
    • Statemachine 的功能很好,但它(我相信)没有我想要的功能(我仍然需要一个词法分析器将我的字节流转换为令牌,它可以'除非我自己构建它们,否则不会做诸如前瞻、优先级、语义条件之类的事情)
    • 很公平。抱歉,对你没有帮助。但是感谢您提出了一个很酷的问题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多