使用版本 Version:2.2
这几天在Mark老大的带领下,开始接触StarUML,之前用过visio画过面向过程编程的流程图。感觉StarUML用来分析类的关系方面很好用。
上下文:实现一个运算器,该运算器可输入运算式类似:1+5*(2-1)等等类型
使用算法方法:递归下降法
递归下降法来分析此运算器:
1 表达式
项 + / - 表达式
项
2 项
因子 * / / 项
因子
3 因子
数字
-因子
(表达式)
:观察普通特例,抽象出规律
式子1:1+5*(2-1)
------> 第一步是直接从认定它是一个表达式开始,表达式里面从左往右寻找+或-号(括号里的是在因子阶段解析)
1(项) + 5*(2-1)(表达式)
------> 项中的格式“因子”符合 第一步分析出来的 项1,则项1为因子
------> 因子里面的格式“数字”符合第二步分析出来的因子1,所以1(项)被解析为数字1,接下来第一步中加号的另一边表达式
+
1(数字) 5*(2-1)(表达式)
------> 表达式 5*(2-1)符合表达式格式里面的“
项”,因为没有找到+,-号(括号里的是在因子阶段解析为表达式)
+
1(数字) 5*(2-1) (项)
------>项5*(2-1)符合项格式里面的“
因子*项”,
+
1(数字) 5
(因子) * (2-1)
(项)
------>同理,因子5就被解析为数字5,项(2-1)被解析为表达式2-1
+
1 *
5 2-1
----------------------------------------------------------------------------->
+
1 *
5 -
2
1
式子2: -5*2
------> 第一步是直接从认定它是一个表达式开始,表达式里面从左往右寻找+或-号(括号里的是在因子阶段解析)
*
- 2
5
上面式子1和2都最后解析成两棵树,通过观察这两棵树可逐渐归纳出规律:
节点类型:
加法节点,减法节点,乘法节点,除法节点,数字节点,负号节点
节点里面再分类:
二元节点:
加法节点,减法节点,乘法节点,除法节点,
一元节点:
数字节点,负号节点
再对节点进行细节分辨:
二元节点:
加法节点
左节点 右节点
减法节点
左节点 右节点
乘法节点
左节点 右节点
除法节点
左节点 右节点
一元节点:
负号节点
子节点
数字节点
进一步细节分析:各个节点进行一个不同的计算
二元节点:
加法节点
计算加法
左节点 右节点
减法节点
计算减法
左节点 右节点
乘法节点
计算乘法
左节点 右节点
除法节点
计算除法
左节点 右节点
一元节点:
负号节点
计算负号
子节点
数字节点
计算
返回值
分别对二元节点,一元节点进行抽象:
二元节点:
计算
左节点
右节点
加法节点
计算加法
左节点 右节点
减法节点
计算减法
左节点 右节点
乘法节点
计算乘法
左节点 右节点
除法节点
计算除法
左节点 右节点
一元节点:
计算
子节点
负号节点
计算负号
子节点
数字节点
计算返回值
返回值
对整体一元,二元节点进行抽象:
节点
计算
二元节点:
计算
左节点
右节点
加法节点
计算加法
左节点 右节点
减法节点
计算减法
左节点 右节点
乘法节点
计算乘法
左节点 右节点
除法节点
计算除法
左节点 右节点
一元节点:
计算
子节点
负号节点
计算负号
子节点
数字节点
计算返回值
返回值
有了以上的分析,现在可以用StarUML生成对应的UML图:
注意:
1、Node类和BinaryNode类的类名是斜体字,表示抽象类,因为calc是要在各个底层节点进行实现的。
2、BinaryNode类和UnitaryNode类里面的节点变量为#开头表示访问权限是Protect的,不能是private的,因为子类继承父类时不能访问Private的属性。
关于代码实现将在 StarUML分析实现笔记(2)里面实现。刚刚入门C++编程,上述分析肯定会有错误的,希望各位看官可以帮忙指正,谢谢