2012-11-30 57 views
3

我有语法文件alexa_scrape.tt我的Treetop语法有什么问题?

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的微不足道的匹配,零category_listing s),但无法解析se "/x\n"(作为包含单个category_listing的文档本身具有零个url_line s)。

我在做什么错?

回答

2

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

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

(而且,哇,树顶问题这是数47。 SO及其400万个问题的历史,87,000个SO问题中的一个被标记为Treetop)

+0

[#48](http://stackoverflow.com/questions/13655658/can-i-use-treetop-to-parse-an-io)现在可用。 – rampion