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 >> ')'); // 因子 = 实数 | '(' , 表达式 , ')';
//因子*因子或因子/因子,可连续乘除也可只是一个因子
乘除计算 = 因子,{('*',因子)|('/',因子)};
//加减计算,与上面类似
表达式 = 乘除计算,{('+',乘除计算)|('-',乘除计算)}; 这个定义已经隐含了优先级:
要计算表达式(加减计算),必然要先计算乘除计算;
要计算乘除计算,就要先计算因子;
要计算因子,要么得到一个数字,要么就要计算括号内的子表达式。
相关文章推荐
- 使用Boost.Spirit实现四则运算字符串的解析
- Android 使用正则表达式验证身份证号是否符合规则
- boost正则表达式判断字符串是不是正确的四则运算
- asp.net验证一个字符串是否符合指定的正则表达式
- 验证银行卡卡号是否符合规则
- 验证身份证号码是否符合规则
- 字符串应用_验证注册账户时用名和密码是否符合要求
- 验证表单内容是否符合数据库字段的规则
- asp.net验证一个字符串是否符合指定的正则表达式
- js验证手机号输入是否符合规则
- ElasticSearch 中符合其规定的分析规则的字符串可能会认为是date 类型的数据
- javascript 正则表达式验证表单信息(光标离开会判断是否符合规定,不符合会提示)
- JavaScript学习 CodeWars 打怪升级日记 判断输入字符串是否符合IPv4地址标准
- 利用正则表达式判断四则运算表达式是否合法
- 输入一串字符串,其中有普通的字符与括号组成(包括‘(’、‘)’、‘[’,']'),要求验证括号是否匹配,如果匹配则输出0、否则输出1.
- 计算一个字符串表示的四则运算表达式
- 按位验证字符串是否为1-9a-zA-z的两种做法
- 检测身份证是否符合规则
- C#验证给定字符串是否为数字的方法
- 验证oracle 的number(p,s)的值是否符合要求