2015-05-04 63 views
3

我有一个更复杂的boost :: spirit语法,它不符合我的预期。 我能够打破它这个最小例如:http://ideone.com/oPu2e7(不能编译在那里,但VS2010编译)为什么'boost :: spirit与(+ alpha | + alnum)语法匹配foo123?

基本上这是我的语法:

my_grammar() : my_grammar::base_type(start) 
{ 
    start %= 
     (+alpha | +alnum) 
    ; 
} 
qi::rule<Iterator, std::string(), ascii::space_type> start; 

它匹配foobar的123foo但不匹配foo123。为什么?我希望它能匹配所有三个。

回答

2

PEG分析器匹配贪婪,从左到右。这应该足以解释。

但是让我们看看foo123:它匹配“。1以上+alpha,所以第一个分支,第二不转移,所以NUMERICS 123保持未解析

有没有。‘固有的’出尔反尔在Kleen的运营商,您/可/使用回溯,如果你知道比如,你需要分析整个输入:

(+alpha >> eoi | +alnum >> eoi) 
+0

你真的是通过把以前进之间的词来强调斜线 – Columbo

+0

谢谢,匹配'? foo123' - 但作为比赛结果,我得到了'foofoo123' - 所以'+ alp ha'和'+ alnum',即使我在两个分支之间都有一个“|”,并且第一个分支不完全匹配。 – Stefan

+1

这是容器属性常见的陷阱。你可以使用'qi :: hold []' – sehe

相关问题