使用ruby的treetop peg来解析debian Packages.gz

我正在尝试使用Ruby的树梢打开一个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 <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Mathieu Trudel <mathieu.tl@gmail.com>
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包含一个“:”,我似乎无法阻止它。当我编辑样本的主页条目并将“_”替换为“:”时,它会直接通过。 这是我的第一个PEG语法,但我可以说我需要使它不那么模糊/更简洁。查看高级文档,我想将标记定义为
rule tag
  !(!'n' .) [A-Za-z0-9-]+ ":"
end
但我完全不明白它在做什么。标签不得(没有新的行或任何东西),我所指的意思是(换行或不行)。细微之处让我失望...... 切换到那种格式可以帮助我吗?有人知道为什么不匹配?     
已邀请:
我此时似乎已经掌握了一个工作语法:
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     

要回复问题请先登录注册