持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
3总体设计
3.1技术路线
采用C++编程语言,进行面向过程软件设计,语法分析采用递归下降 LL(1)分析程序,每个非终结符都对应一个子程序,表达式计算模块使用了STL中的栈,判断不同运算符的优先级,再与栈结合,来计算表达式。
3.2总体结构
输入一个字符串,即计算表达式,对其进行单词合法性检查,是否含有未知字符,然后对句子的语法进行判断,是否符合文法规则,对完成词法分析和语法分析且无误的计算表达式,进行后缀表达式的转换,最后求值输出。
程序的总体流程:
1.对中缀表达式进行词法分析和语法分析
2.中缀表达式转化为后缀表达式
3.后缀表达式的计算
3.3模块功能及关系
3.3.1词法分析模块功能
对输入的表达式从左到右扫描,识别出表达式中的单词(包括运算符和运算数),检查操作数是否合法,合法的操作数首个字符可以是“-”,也可以是“0”-“9”。后面的字符最多只包含一个“.”字符,其余字符都是“0”-“9”。若单词的构成不符合词法规则(运算符和运算数的构成规则),则报错并停止计算。 我们的运算表达式只包含两种元素:操作符和操作数。其中,操作符目前限定为+、-、*、/、^、%六种,另外还有括号:左括号和右括号。操作数可以是小数也可以是整数。
即单词类别:操作数:浮点数和整数
操作符:+、-、*、/、%、^
3.3.2语法分析模块功能
将单词串分解为各类语法短语,根据文法判断是否符合文法规则,若存在不符合语法规则的语法短语,则报错并停止计算。
四则运算表达式的文法为:
1.Term 一“-”( <运算数> | “(”Exp”)”)|( <运算数> | “(”Exp”)”)
2.Factor一Term Factor1
3.Factor1一 ((“*” | “/”|“%”|“^”) Term) Factor1
4.Factor1一 Ø
5.Exp 一 Factor Exp1
6.Exp1一((“+” | “-”) Factor) Exp1
7.Exp1一Ø
8.<运算数>一<整数>|<浮点数>
9.<浮点数>一<整数>”.” <整数>
10.<整数>一<数字>|<数字><整数>
11. <数字>一0|1|2|3|4|5|6|7|8|9
3.3.3计算模块功能
将符合语法规则的中缀表达式转化为后缀表达式,对后缀表达式进行计算,计算精度为float。若计算不能进行(如除法运算的除数为0等),则报错并停止计算。
3.3.4模块关系
三个功能模块中,语法分析模块是核心,各模块之间的关系如图2所示
图2 模块关系图