今天使用智能指針LytPtr初步完成了表達式樹,未調試完全,頭文件代碼如下:
其中,關于優先級的設計有點迷惑,參考了網上關于Pascal操作符優先級后,文法如下:
Expression = RelationExpression;RelationExpression = RelationExpression ("<" | "<=" | "=" | "!=" | ">" | ">=") XorExpression | XorExpressionXorExpression = XorExpression "xor" OrExpression | OrExpressionOrExpression = OrExpression "or" AddExpression | AddSubExpressionAddSubExpression = AddSubExpression ("+" | "-") AndExpression | AndExpressionAndExpression = AndExpression "and" MulDivExpression | MulDivModExpressionMulDivModExpression = MulDivModExpression ("*" | "div" | "mod") UnaryExpression | UnaryExpressionPositiveNegativeExpression = ("+" | "-") NotExpression | NotExpressionNotExpression = "not" SimpleExpression | SimpleExpression;SimpleExpression = Number | bool | CallFunctionExpression
代碼舉例:
不難發現,含有二元操作符的表達式文法接近(一元也一樣),函數實現方法也類似,為了讓代碼好看點,我動了幾個念頭,但最終沒實現:
1.函數模板
2.函數指針:利用typedef,后來發現定義過程中有遞歸,遂寫不出來,暫時放棄
3.宏:記得括號來括號去那里要加得很清楚,腦袋暈乎,暫時放棄
晚上睡覺能想到啥好辦法明天再解決。
在構造表達式樹的時候還出現了幾個問題:
1.先前由于我沒有充分測試,LytPtr有bug,自食其果了
結論:寫出啥數據結構在使用前一定要充分測試
2.猶豫到底該用返回什么類型的指針,暫時還不明白返回LytPtr<Expression>與返回LytPtr<Base>的區別,其中Expression是繼承Base的
3.LytPtr不支持類型轉換,于是在需要類型轉換的時候愣了幾下,忘記可以轉成指針來用了
結論:該用指針的時候還是用指針
希望明天完成測試表達式樹與類型檢查。