3

我有语法文件alexa_scrape.tt

grammar AlexaScrape
  rule document
    category_listing*
  end
  rule category_listing
    category_line url_line*
  end
  rule category_line
    category "\n"
  end
  rule category
    ("/" [^/]+)+
  end
  rule url_line
    [0-9]+ ". " url "\n"
  end
  rule url
    [^\n]*
  end
end

我有一个 ruby​​ 文件,它试图利用它:

#!/usr/bin/env ruby -I .
require 'rubygems'
require 'polyglot'
require 'treetop'
require 'alexa_scrape.tt'

parser = AlexaScrapeParser.new
p( parser.parse("") || parser.failure_reason )
p( parser.parse("/x\n") || parser.failure_reason )

但我没有得到预期的结果:

SyntaxNode offset=0, ""
"Expected one of /, \n at line 2, column 1 (byte 4) after /x\n"

它正确解析空字符串(作为 , zeros 的平凡匹配documentcategory_listing,但无法解析"/x\n"(因为文档包含一个category_listing本身具有 zerosurl_line的单个)。

我究竟做错了什么?

4

1 回答 1

2

看起来正则表达式category正在通过匹配所需的空白前进category_line......这样做:

  rule category
    ("/" [^/\s]+)+    # or perhaps ("/" [^/\n]+)+
  end

(哇,一个 Treetop 问题。这是 SO 历史上的第 47 个问题,总共有 400 万个问题。87,000 个 SO 问题中有一个被标记为Treetop)

于 2012-11-30T18:10:02.320 回答