使用版本 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++編程,上述分析肯定會有錯誤的,希望各位看官可以幫忙指正,謝謝