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

それを利用しようとするルビーファイルがあります:

#!/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"

空の文字列は適切に解析されますが ( document, zerocategory_listingの自明な一致として)、解析に失敗します(それ自体が 0の"/x\n"単一の文字列を含むドキュメントとして)。category_listingurl_line

私は何を間違っていますか?

4

1 に答える 1

2

category一致するために必要な空白を正規表現が進んでいるようcategory_lineです...これを行います:

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

(そして、すごい、Treetop の質問です。これは、SO の歴史の中で 47 番目であり、合計 400 万の質問があります。87,000 の SO の質問に 1 つはTreetop のタグが付けられています) .

于 2012-11-30T18:10:02.320 に答える