2015-05-04 61 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

相關問題