今天使用智能指针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不支持类型转换,于是在需要类型转换的时候愣了几下,忘记可以转成指针来用了
结论:该用指针的时候还是用指针
希望明天完成测试表达式树与类型检查。