我的文字包含“等式”,如:
-- 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
答案 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)