Разбор структурированного текста в Ruby - PullRequest
6 голосов
/ 17 февраля 2011

В SO есть несколько вопросов о разборе структурированного текста в Ruby, но ни один из них не применим к моему случаю.

Я являюсь автором библиотеки Ruby Whois .Библиотека включает в себя несколько анализаторов для анализа ответа WHOIS и извлечения свойств из содержимого.

До сих пор я использовал два подхода:

  1. Регулярные выражения для базовых анализаторов (например, whois.aero )
  2. StringScanner для расширенных анализаторов (например, whois.nic.it )

Регулярные выражениянеэффективно, потому что если мне нужно извлечь 15 свойств, мне нужно сканировать один и тот же ответ по крайней мере 15 раз.

StringScanner - хорошая библиотека, но создать эффективный сканер не так просто.

Мне было интересно, есть ли другие инструменты Ruby, которые вы предлагаете для реализации анализатора записей WHOIS.Я читал о Treetop, но поскольку в записях WHOIS отсутствует спецификация, я считаю, что Treetop не является правильным решением.

Есть какие-либо предложения?

1 Ответ

4 голосов
/ 17 февраля 2011

Очевидным является Ragel . Записи whois довольно просты, имеют ограниченный набор ключевых терминов и тому подобное - все должно быть просто. И парсеры Ragel доказали свою эффективность.

Обновление Как и обещано.

Хорошо, так , почему использует Ragel ? По сути, все, что может быть описано как конечный автомат, может быть описано в Ragel, который затем генерирует код для высокоэффективного синтаксического анализатора. Этот синтаксический анализатор намного быстрее, чем обобщенный механизм регулярных выражений, просто потому, что он имеет более простую программу, чем обычный синтаксический анализатор.

Теперь вы можете пойти дальше, например, с помощью генератора ABNF здесь . Тогда ваше описание для начала может быть таким простым, как

WHOIS ::= RECORD*
RECORD ::= FIELDNAME ':' FIELDVALUE
FIELDVALUE ::= NAMESTRING | IPADDRESS | DOMAINNAME

(Я не утверждаю, что это, в частности, синтаксис ABNF, просто грубый BNF.) Дело в том, что вы описываете синтаксический анализатор в более или менее интуитивно понятной форме и позволяете генератору создать захватывающую часть кода.

...