我们尝试解析简单的数字/文本(在文本中存在数字,因此我们必须将输入序列拆分为2个元素类型(TEXT和NUMBER)向量)语法,其中数字可以采用以下格式:
+10.90
10.90
10
+10
-10
所以我们写语法:
struct CMyTag
{
TagTypes tagName;
std::string tagData;
std::vector<CMyTag> tagChild;
};
BOOST_FUSION_ADAPT_STRUCT(::CMyTag, (TagTypes, tagName) (std::string, tagData) (std::vector<CMyTag>, tagChild))
template <typename Iterator>
struct TextWithNumbers_grammar : qi::grammar<Iterator, std::vector<CMyTag>()>
{
TextWithNumbers_grammar() :
TextWithNumbers_grammar::base_type(line)
{
line = +(numbertag | texttag);
number = qi::lexeme[-(qi::lit('+') | '-') >> +qi::digit >> *(qi::char_('.') >> +qi::digit)];
numbertag = qi::attr(NUMBER) >> number;
text = +(~qi::digit - (qi::char_("+-") >> qi::digit));
texttag = qi::attr(TEXT) >> text;
}
qi::rule<Iterator, std::string()> number, text;
qi::rule<Iterator, CMyTag()> numbertag, texttag;
qi::rule<Iterator, std::vector<CMyTag>()> line;
};
一切正常,但如果我们尝试解析这一行:
wernwl kjwnwenrlwe +10.90+ klwnfkwenwf
我们按预期得到了3个元素向量,但此向量中的最后一个元素将带有文本(CMyTag.tagData):
++ klwnfkwenwf
添加了附加符号“+”。 我们还尝试将语法重写为简单的跳过数规则:
text = qi::skip(number)[+~qi::digit];
但解析器死于分段错误异常
答案 0 :(得分:2)
属性值不会在回溯时回滚。实际上,只有容器属性(例如$('body').on('submit', 'form.load-external', function(e) {
e.preventDefault();
var target = $($(this).data('target'));
$.ajax({
url: $(this).attr('action'),
type: $(this).attr('method'),
data: $(this).serialize(),
dataType: 'html',
success: function(response) {
target.html(response);
}
});
});
或vector<>
)才能看到它。
在这种情况下,首先解析numbertag规则并解析string
符号。然后,数字规则失败,已匹配的+
将保留在输入中。
我不知道完全您正在尝试做什么,但看起来您只是想要:
+
对于输入line = +(numbertag | texttag);
numbertag = attr(NUMBER) >> raw[double_];
texttag = attr(TEXT) >> raw[+(char_ - double_)];
,它打印
"wernwl kjwnwenrlwe +10.90e3++ klwnfkwenwf"
<强> Live On Coliru 强>
Parse success: 5 elements
TEXT 'wernwl kjwnwenrlwe '
NUMBER '+10.90'
TEXT 'e'
NUMBER '3'
TEXT '++ klwnfkwenwf'