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

为无限流封装(纯Ruby)Ragel解析器?,ruby,parsing,state-machine,ragel,Ruby,Parsing,State Machine,Ragel,我想用状态机使用Ragel解析连续的字节流(来自套接字) 但是,我发现的所有示例都是一次性解析一个完整的文件(比如)或者使用Ragels C Target(比如) 我正在寻找一些关于如何实例化Ragel状态机并向其添加字节、保持现有状态不变的建议或示例 我要寻找的最终界面类似于: parser = MyStreamParser.new(Grammar) parser.on_token { |t| puts t.inspect } # I can't parse lines seperately

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

但是,我发现的所有示例都是一次性解析一个完整的文件(比如)或者使用Ragels C Target(比如)

我正在寻找一些关于如何实例化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不是合适的工具?如果不是:我应该用什么来代替呢?

它可能不完全是您想要的,但它是另一个值得一看的语法分析器生成器。我不确定这是否会有帮助,但它在过去对我很有用。

它可能不是您想要的,但它是另一个不错的语法分析器生成器看一看。我不确定这是否有帮助,但它在过去对我很有帮助。

乍一看,Ragel不像Ruby。你看了吗?它看起来可以为状态机事件提供数据(在你的问题中是字符)一次一个。

乍一看,Ragel不像Ruby。你看了吗?它看起来可以为状态机事件(问题中的字符)提供数据一次一个。

哦,是的。状态机很厉害。我现在正在用状态机替换work的一个手工制作的状态引擎。状态机的功能很好,但它(我相信)没有我想要的功能(我可能仍然需要一个lexer来将我的字节流转换成令牌,除非我自己构建它们,否则它不能做诸如前瞻、优先级和语义条件之类的事情)很公平。很抱歉这对你没有帮助。但是谢谢你问了一个很酷的问题。哦,是的。Statemachine很酷。我现在正在用Statemachine替换work的一个手工制作的状态引擎。Statemachine很不错,但它(我相信)没有我想要的功能(我可能仍然不需要一个lexer来将我的字节流转换成令牌,除非我自己构建它们,否则它不能做前瞻、优先级、语义条件等事情)足够公平。很抱歉,这对您没有帮助。但感谢您提出了一个很酷的问题。