在Ruby中解析结构化文本

Sim*_*tti 7 ruby parsing lexical-analysis

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

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

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

  1. 基本解析器的正则表达式(例如whois.aero)
  2. StringScanner先进分析器(如whois.nic.it)

正则表达式效率不高,因为如果我需要提取15个属性,我需要扫描相同的响应至少15次.

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

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

有什么建议吗?

Cha*_*tin 5

最明显的是雷格尔。whois 记录非常简单,只有一组有限的关键术语等等——它应该是简单的。并且 Ragel 解析器已被证明非常有效。

更新正如承诺的那样。

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

现在,您可以更进一步,例如在这里使用 ABNF 生成器。然后,您开始的描述可能就像这样简单

WHOIS ::= RECORD*
RECORD ::= FIELDNAME ':' FIELDVALUE
FIELDVALUE ::= NAMESTRING | IPADDRESS | DOMAINNAME
Run Code Online (Sandbox Code Playgroud)

(我不声称这是特别的 ABNF 语法,只是一个粗略的 BNF。)关键是您或多或少以直观的形式描述解析器,并让生成器制作令人兴奋的代码部分。