关于在Ruby中解析结构化文本有几个问题,但它们都不适用于我的案例。
我是Ruby Whois library的作者。该库包括几个解析器,用于解析WHOIS响应并从内容中提取属性。
到目前为止,我使用了两种方法:
正则表达式效率不高,因为如果我需要提取15个属性,我需要扫描相同的响应至少15次。
StringScanner是一个不错的库,但创建一个高效的扫描仪并不那么简单。
我想知道是否有一些其他Ruby工具建议您实施WHOIS记录解析器。我正在阅读有关Treetop的内容,但由于WHOIS记录缺乏规范,我认为Treetop不是正确的解决方案。
有什么建议吗?
答案 0 :(得分:4)
显而易见的是Ragel。 whois记录非常简单,有一组有限的关键术语等 - 它应该是直截了当的。事实证明,Ragel解析器非常有效。
更新按照承诺。
好的,为什么使用Ragel?基本上,任何可以描述为有限状态机的东西都可以在Ragel中描述,然后Ragel为高效的解析器生成代码。这个解析器比一般化的正则表达式引擎要快得多,因为它的程序比一般的解析器更简单。
现在,您可以更进一步,例如使用ABNF Generator here。然后,您的描述可以像
一样简单WHOIS ::= RECORD*
RECORD ::= FIELDNAME ':' FIELDVALUE
FIELDVALUE ::= NAMESTRING | IPADDRESS | DOMAINNAME
(我没有声称特别是ABNF语法,只是粗略的BNF。)重点是你以一种或多或少的直观形式描述解析器,让生成器创建令人兴奋的代码部分。