2012-09-01 47 views
1

我想語法如下解析輸入如boost :: spirit :: qi爲什麼遞歸解析器不按預期工作?

a_end 
a_b_end 
a_b_c_end 

但它只解析a_end上卻失敗多於一個_什麼。下面是語法:

template < typename Iterator > 
struct recursive_parser : qi::grammar<Iterator> 
{ 
    qi::rule<Iterator> start; 
    qi::rule<Iterator> end; 
    recursive_parser() : recursive_parser::base_type(start) 
    { 
     using namespace qi; 
     end = string("_end") | start; 
     start = +(char_ - '_') >> end; 
    } 
}; 

不是設計規則可以遞歸使用還是我失去了一些東西更明顯?

回答

3

隨着你的語法,輸入字符串a_b_end我們有以下分析發生:

In Start: consume "a". Iterate into end. 
In End: The next part of the string is not "_end", so the first alternative fails. 
      Try the second alternative, which is to iterate into start. 
In Start: The next character is a "_", so start fails. 

所以你的語法應該是:

end = string("end") | start; 
start = +(char_ - '_') >> '_' >> end; 
+0

是的,是我不好。謝謝。 – John

相關問題