在Ruby中解析结构化文本

时间:2011-02-16 22:43:12

标签: ruby parsing lexical-analysis

关于在Ruby中解析结构化文本有几个问题,但它们都不适用于我的案例。

我是Ruby Whois library的作者。该库包括几个解析器,用于解析WHOIS响应并从内容中提取属性。

到目前为止,我使用了两种方法:

  1. 基本解析器的正则表达式(例如whois.aero
  2. StringScanner用于高级解析器(例如whois.nic.it
  3. 正则表达式效率不高,因为如果我需要提取15个属性,我需要扫描相同的响应至少15次。

    StringScanner是一个不错的库,但创建一个高效的扫描仪并不那么简单。

    我想知道是否有一些其他Ruby工具建议您实施WHOIS记录解析器。我正在阅读有关Treetop的内容,但由于WHOIS记录缺乏规范,我认为Treetop不是正确的解决方案。

    有什么建议吗?

1 个答案:

答案 0 :(得分:4)

显而易见的是Ragel。 whois记录非常简单,有一组有限的关键术语等 - 它应该是直截了当的。事实证明,Ragel解析器非常有效。

更新按照承诺。

好的,为什么使用Ragel?基本上,任何可以描述为有限状态机的东西都可以在Ragel中描述,然后Ragel为高效的解析器生成代码。这个解析器比一般化的正则表达式引擎要快得多,因为它的程序比一般的解析器更简单。

现在,您可以更进一步,例如使用ABNF Generator here。然后,您的描述可以像

一样简单
WHOIS ::= RECORD*
RECORD ::= FIELDNAME ':' FIELDVALUE
FIELDVALUE ::= NAMESTRING | IPADDRESS | DOMAINNAME

(我没有声称特别是ABNF语法,只是粗略的BNF。)重点是你以一种或多或少的直观形式描述解析器,让生成器创建令人兴奋的代码部分。