七天开发基于编译原理的公式计算器设计与实现-第三天

207 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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所示

image.png 图2 模块关系图