今天使用智能指針LytPtr初步完成了表達(dá)式樹(shù),未調(diào)試完全,頭文件代碼如下:
其中,關(guān)于優(yōu)先級(jí)的設(shè)計(jì)有點(diǎn)迷惑,參考了網(wǎng)上關(guān)于Pascal操作符優(yōu)先級(jí)后,文法如下:
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
代碼舉例:
不難發(fā)現(xiàn),含有二元操作符的表達(dá)式文法接近(一元也一樣),函數(shù)實(shí)現(xiàn)方法也類似,為了讓代碼好看點(diǎn),我動(dòng)了幾個(gè)念頭,但最終沒(méi)實(shí)現(xiàn):
1.函數(shù)模板
2.函數(shù)指針:利用typedef,后來(lái)發(fā)現(xiàn)定義過(guò)程中有遞歸,遂寫不出來(lái),暫時(shí)放棄
3.宏:記得括號(hào)來(lái)括號(hào)去那里要加得很清楚,腦袋暈乎,暫時(shí)放棄
晚上睡覺(jué)能想到啥好辦法明天再解決。
在構(gòu)造表達(dá)式樹(shù)的時(shí)候還出現(xiàn)了幾個(gè)問(wèn)題:
1.先前由于我沒(méi)有充分測(cè)試,LytPtr有bug,自食其果了
結(jié)論:寫出啥數(shù)據(jù)結(jié)構(gòu)在使用前一定要充分測(cè)試
2.猶豫到底該用返回什么類型的指針,暫時(shí)還不明白返回LytPtr<Expression>與返回LytPtr<Base>的區(qū)別,其中Expression是繼承Base的
3.LytPtr不支持類型轉(zhuǎn)換,于是在需要類型轉(zhuǎn)換的時(shí)候愣了幾下,忘記可以轉(zhuǎn)成指針來(lái)用了
結(jié)論:該用指針的時(shí)候還是用指針
希望明天完成測(cè)試表達(dá)式樹(shù)與類型檢查。