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

7 篇文章 0 订阅

boost::spirit验证字符串是否符合四则运算规则 | 火苗999℃的博客


#include <iostream>
#include <boost/spirit.hpp>  
int main()
{
    using namespace boost::spirit;
    using namespace std;
    rule<phrase_scanner_t> 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 >> ')');  // 因子 = 实数 | '(' , 表达式 , ')';
//因子*因子或因子/因子,可连续乘除也可只是一个因子
乘除计算 = 因子,{('*',因子)|('/',因子)};
//加减计算,与上面类似
表达式 = 乘除计算,{('+',乘除计算)|('-',乘除计算)};    这个定义已经隐含了优先级:
要计算表达式(加减计算),必然要先计算乘除计算; 
要计算乘除计算,就要先计算因子; 
要计算因子,要么得到一个数字,要么就要计算括号内的子表达式。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值