2010-11-09 1 views
2

Я пытаюсь разбить пакет Packages.gz с использованием верхушки Ruby, и у меня возникли проблемы с выбором ключевых слов и значений однозначно. Вот моя Treetop грамматика:Использование привязки рубинового дерева для разбора debian Packages.gz

grammar Debian 
    rule collection 
    entry+ 
    end 
    rule entry 
    (tag space value) 
    end 

    rule package_details 
    tag value &[^$] 
    end 
    rule tag 
    [A-Za-z0-9\-]+ ":" 
    end 
    rule value 
    (!tag value_line+ "\n")+ 
    end 
    rule value_line 
    ([A-Za-z0-9 <>@()=\.\-|/,_"':])+ 
    end 
    rule space 
    [ \t]+ 
    end 
end 

И вот мой пример ввода:

Package: acct 
Priority: optional 
Section: admin 
Installed-Size: 352 
Maintainer: Ubuntu Developers <[email protected]> 
Original-Maintainer: Mathieu Trudel <[email protected]> 
Architecture: i386 
Version: 6.5.4-2ubuntu1 
Depends: dpkg (>= 1.15.4) | install-info, libc6 (>= 2.4) 
Filename: pool/main/a/acct/acct_6.5.4-2ubuntu1_i386.deb 
Size: 111226 
MD5sum: 10cba1458ace8c31169c0e9e915c9a0f 
SHA1: 6c2dcdc480144a9922329cd4fa22c7d1cb83fcbb 
SHA256: bf8d8bb8eef3939786a1cefc39f94079f43464b71099f4a59b61b24cafdbc010 
Description: The GNU Accounting utilities for process and login accounting 
GNU Accounting Utilities is a set of utilities which reports and summarizes 
data about user connect times and process execution statistics. 
. 
"Login accounting" provides summaries of system resource usage based on connect 
time, and "process accounting" provides summaries based on the commands 
executed on the system. 
. 
The 'last' command is provided by the sysvinit package and not included here. 
Homepage: http://www.gnu.org/software/acct/ 
Bugs: https://bugs.launchpad.net/ubuntu/+filebug 
Origin: Ubuntu 
Supported: 18m 

Это работает почти 100%, но тогда он не при рассмотрении URL. Проблема заключается в том, что URL-адрес содержит «:», который, как мне кажется, не способен ломаться. Когда я редактирую запись «Домашняя страница образца» и заменяю «_» на «:», она идет прямо.

Это моя первая грамматика ПЭГ, но я могу сказать, что мне нужно сделать ее менее двусмысленной/более кратким. Оглядываясь на расширенную документацию, я хотел бы определить тег как

Но я не совсем понимаю, что он делает. Тег не должен (не иметь новой строки ИЛИ чего-либо), что я подразумеваю (либо новой строки, либо ничего). Тонкости уходят от меня ...

Переключение в этот формат поможет мне? Кто-нибудь знает, почему это не соответствует?

ответ

1

кажется получил одну рабочей грамматику в данный момент:

grammar Debian 
    # The file is too big for us to emit a package_list. Look at parser.rb to see how I just split the string. 
    #rule package_list 
    # (package "\n"?)+ <DebianSyntaxNode::PackageList> 
    #end 
    rule package 
    (tag/value)+ <DebianSyntaxNode::Package> 
    end 

    rule tag 
    tag_value tag_stop <DebianSyntaxNode::Tag> 
    end 
    rule tag_value 
    [\w\-]+ <DebianSyntaxNode::TagValue> 
    end 
    rule tag_stop 
    ": " <DebianSyntaxNode::TagStop> 
    end 

    rule value 
    value_line value_stop <DebianSyntaxNode::Value> 
    # value_line value_stop <DebianSyntaxNode::Value> 
    end 
    rule value_line 
    (!"\n" .)+ <DebianSyntaxNode::ValueLine> 
    # ([\w \. " , \- ' :/< > @ () = | \[ \] + ; ~ í á * % `])+ <DebianSyntaxNode::ValueLine> 
    end 
    rule value_stop 
    "\n"? <DebianSyntaxNode::ValueStop> 
    end 
end 

Проблема заключается в том, что теперь value_line не включает «\ N», когда это многострочная запись. Кроме того, мне нужно объединить многострочные записи в синтаксическом анализаторе.

Если вы хотите увидеть, где этот код, ознакомьтесь с небольшим проектом github, который я начал: https://github.com/derdewey/Debian-Packages-Parser

Смежные вопросы