为什么 n boost::spirit 将 foo123 与 (+alpha | +alnum) 语法匹配?
Why does'n boost::spirit match foo123 with (+alpha | +alnum) grammar?
我有一个更复杂的 boost::spirit 语法,与我预期的不匹配。
我能够将其分解为这个最小的示例:http://ideone.com/oPu2e7(不在那里编译,但使用 VS2010 编译)
基本上这是我的语法:
my_grammar() : my_grammar::base_type(start)
{
start %=
(+alpha | +alnum)
;
}
qi::rule<Iterator, std::string(), ascii::space_type> start;
它匹配 foobar、123foo 但不匹配 foo123。为什么?我希望它能匹配所有三个。
PEG 解析器贪婪地从左到右匹配。这应该足以解释。
但是让我们看看foo123
:它匹配“1个或多个+alpha
,所以第一个分支被采用。第二个分支没有被采用,所以数字123
保留未解析。
kleen 运算符没有 "inherent" 回溯。如果您知道例如,您/可以/使用回溯您需要解析完整的输入:
(+alpha >> eoi | +alnum >> eoi)
我有一个更复杂的 boost::spirit 语法,与我预期的不匹配。 我能够将其分解为这个最小的示例:http://ideone.com/oPu2e7(不在那里编译,但使用 VS2010 编译)
基本上这是我的语法:
my_grammar() : my_grammar::base_type(start)
{
start %=
(+alpha | +alnum)
;
}
qi::rule<Iterator, std::string(), ascii::space_type> start;
它匹配 foobar、123foo 但不匹配 foo123。为什么?我希望它能匹配所有三个。
PEG 解析器贪婪地从左到右匹配。这应该足以解释。
但是让我们看看foo123
:它匹配“1个或多个+alpha
,所以第一个分支被采用。第二个分支没有被采用,所以数字123
保留未解析。
kleen 运算符没有 "inherent" 回溯。如果您知道例如,您/可以/使用回溯您需要解析完整的输入:
(+alpha >> eoi | +alnum >> eoi)