手工实现且时空效率较高。
实际的语法分析工作从调用总程序的分析子程序开始,根据产生式进行递归调用各个分析子程序。
3.2 逆波兰式的描述3.2.1 逆波兰式的定义 将运算对象写在前面,而把运算符号写在后面。
用这种表示法表示的表 达式也称做后缀式。
逆波兰式的特点在于运算对象顺序不变,运算符号位置 反映运算顺序。
采用逆波兰式可以很好的表示简单算术表达式,其优点在于 易于计算机处理表达式。
3.2.2 产生逆波兰式的前提:中缀算术表达式4.设计概要4.1 数据结构的说明static char exprEXP_LEN //算术表达式输入字符缓冲区4.2 变量的说明define EXP_LEN 100 //定义输入字符缓冲区的长度/------------出错代码的宏定义--------------/define INVALID_CHAR_TAIL 0 //表达式后跟有非法字符define CHAR_AFTER_RIGHT 1 //右括号后连接非法字符define LEFT_AFTER_NUM 2 //数字后非法直接连接左括号define INVALID_CHAR_IN 3 //表达式中含有非法字符define NO_RIGHT 4 //缺少右括号define EMPTY_BRACKET 5 //括号内无表达式define UNEXPECTED_END 6 //预期外的算术表达式结束using namespace stdconst n20const string ErrCodeStr //表达式出错信息 表达式后跟有非法字符! 右括号后连接非法字符! 数字后非法直接连接左括号! 表达式中含有非法字符! 缺少右括号! 括号内无表达式或表达式不完整! 表达式非法结束或表达式不完整!static char exprEXP_LEN //算术表达式输入字符缓冲区static int pos //字符指示器标志:用来保存正在分析的字符的位置static jmp_buf errjb //出错跳转缓冲器bool firsttrue //第一个运算参数的标志,默认为真4.3 函数的说明//产生式E - TE T-E T的函数,用来分析加减算术表达式int E_AddSub//产生式T - FT F/T F的函数,用来分析乘除算术表达式int T_MulDiv//产生式F - i E的函数,用来分析数字和括号内的表达式int F_Number//出错处理函数,可以指出错误位置,出错信息void Errorint ErrCodeint main主函数。
4.4 详细的算法描述及程序框图4.4.1 主函数的说明和框图(1)主函数的说明 函数的主体。
(2)主函数的框图4.4.2 子函数的说明及框图(1)子函数的说明 1.E_AddSub函数的说明 产生式E - TE T-E T的函数,用来分析加减算术表达式。
返回计算结果 2.T_MulDiv函数的说明 推导式T - FT F/T F的函数,用来分析乘除算术表达式。
返回计算结果 3.F_Number函数的说明 产生式F - i E的函数,用来分析数字和括号内的表达式。
4.Errorint ErrCode 函数的说明 出错处理函数,输入错误代码,可以指出错误位置,出错信息。
(2)子函数的框图E_AddSub函数和 T_MulDiv函数的框图:F_Number函数的框图:Errorint ErrCode函数的框图:5.源程序includeincludeincludeincludeincludedefine EXP_LEN 100 //定义输入字符缓冲区的长度/------------出错代码的宏定义--------------/define INVALID_CHAR_TAIL 0 //表达式后跟有非法字符define CHAR_AFTER_RIGHT 1 //右括号后连接非法字符define LEFT_AFTER_NUM 2 //数字后非法直接连接左括号define INVALID_CHAR_IN 3 //表达式中含有非法字符define NO_RIGHT 4 //缺少右括号define EMPTY_BRACKET 5 //括号内无表达式define UNEXPECTED_END 6 //预期外的算术表达式结束using namespace stdconst n20const string ErrCodeStr //表达式出错信息 表达式后跟有非法字符! 右括号后连接非法字符! 数字后非法直接连接左括号! 表达式中含有非法字符! 缺少右括号! 括号内无表达式或表达式不完整! 表达式非法结束或表达式不完整!static char exprEXP_LEN //算术表达式输入字符缓冲区static int pos //字符指示器标志:用来保存正在分析的字符的位置static jmp_buf errjb //出错跳转缓冲器bool firsttrue //第一个运算参数的标志,默认为真/以下是函数声明///产生式E - TE T-E T的函数,用来分析加减算术表达式int E_AddSub//产生式T - FT F/T F的函数,用来分析乘除算术表达式int T_MulDiv//产生式F - i E的函数,用来分析数字和括号内的表达式int F_Number//出错处理函数,可以指出错误位置,出错信息void Errorint ErrCodeint main int ans //保存算术表达式的计算结果 bool quitfalse //是否退出计算 printfn printf n printf 加减乘除计算器 n printf n printfn do //在此设定一个跳转目标,如果本程序的其他函数调用 longjmp //执行指令就跳转到这里,从这里继续执行 ifsetjmperrjb0 //如果没有错误 pos0 //初始化字符指示器为 0,即指向输入字符串的第一个字符 cout