使用boost spirit预处理自定义文本文件以删除注释

时间:2014-02-01 17:56:55

标签: c++ boost-spirit boost-spirit-qi

我的文字包含“等式”,如:

-- This is comment
ABC:= 121-XY1/7 > 45 OR SS >= 3
    ZY2 AND -- This is another comment
    (JKL * PQR) < 75;

JKL:= PP1 OR 
      PP2/2 XOR PP3;

ZZ_1:=A-B > 0 XOR (B2 % GH == 6 AND 
   SP == 4
-- Again a comment
    NOT AX > GF < 2 OR C*AS2 >= 5);

我决定用boost精神来解析这个文本,截至目前我只需要知道我的操作数和操作符。

我已经提到this很好的答案(感谢sehe :))来编写我的表达式语法(关系运算符尚未编写)

但是我无法用以下方式删除我的评论: -

     qi::phrase_parse(input.begin()
     ,input.end()
     ,p >> ';' // parser object
     ,qi::space | "--" >> *(qi::char_ - qi::eol) >> qi::eol
     ,result //expression object,  (boost::variant with boost::recursive_wrapper)
     ); 

因为它会产生一些错误,post的一些人会说调整一个提升头文件。

所以我首先使用另一种语法来删除评论:

     qi::phrase_parse(input.begin()
     ,input.end()
     ,qi::char_ >> *qi::char_ 
     , qi::space | "--" >> *(qi::char_ - qi::eol) >> qi::eol
     ,stripped // std::string 
     );

但这给了我一个删除所有空格和注释的文字:

ABC:=121-XY1/7>45ORSS>=3ZY2AND(JKL*PQR)<75;JKL:=PP1ORPP2/2XORPP3;ZZ_1:=A-B>0XOR(B2%GH==6ANDSP==4NOTAX>GF<2ORC*AS2>=5);

所以,问题是我如何才能删除评论,保留空间和换行符?

使用:Boost版本1.55.0

1 个答案:

答案 0 :(得分:2)

您的确切代码示例丢失了。请允许我向您链接到的"boolean expression grammar"添加一个示例队长:

std::string const input = 
        "a and\n"
        "-- abacadabra\n"
        "b;";

typedef std::string::const_iterator It;

// ADDED: allow comments
qi::rule<It> skip_ws_and_comments 
    = qi::space 
    | "--" >> *(qi::char_-qi::eol) >> qi::eol
    ;

parser<It, qi::rule<It> > p;

这就是所需的所有变化。输出:

result: (a & b)

查看 Live On Coliru