您的位置:首页 > 其它

boost::spirit验证字符串是否符合四则运算规则

2013-08-15 18:10 232 查看
// defaultbyzt
#include
#include
int main()
{
using namespace boost::spirit;
using namespace std;

rule factor, term, exp;
// 因子 = 实数 | '(' , 表达式 , ')';
factor = real_p | ('(' >> exp >> ')');
// factor = real_p | !(ch_p('+')|ch_p('-')) >> ('(' >> exp >> ')')
// 上面注释部分是括号前可以带正负号的规则

// 乘除计算 = 因子,{('*',因子)|('/',因子)};
term   = factor >> *(('*' >> factor) | ('/' >> factor));
// 表达式 = 乘除计算,{('+',乘除计算)|('-',乘除计算)};
exp    = term >> *(('+' >> term) | ('-' >> term));

const char *szExp = "(2+3)";
parse_info<> rule = parse( szExp , exp, space_p);
cout << "parse " << (rule.full?"success":"fail") << endl;

return 0;
}


解析四则运算表达式,要把EBNF规则写出来:

//实数或者是括号包围的子表达式

real_p | ('(' >> exp >> ')');  // 因子 = 实数 | '(' , 表达式 , ')';

//因子*因子或因子/因子,可连续乘除也可只是一个因子

乘除计算 = 因子,{('*',因子)|('/',因子)};

//加减计算,与上面类似

表达式 = 乘除计算,{('+',乘除计算)|('-',乘除计算)};    这个定义已经隐含了优先级:

要计算表达式(加减计算),必然要先计算乘除计算; 

要计算乘除计算,就要先计算因子; 

要计算因子,要么得到一个数字,要么就要计算括号内的子表达式。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: