精神解析器输出中的附加符号

时间:2015-05-25 23:59:32

标签: c++ parsing boost boost-spirit

我们尝试解析简单的数字/文本(在文本中存在数字,因此我们必须将输入序列拆分为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];

但解析器死于分段错误异常

1 个答案:

答案 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'