OO第一单元表达式解析总结

陈佳琦-19373598 学生 2023-03-19 17:51:37

总结

总体来说,三次作业难度层层递进,不过第一次到第二次的难度跨度比较大,下面是下次作业完成后的一个UML类图。

img

下面是类复杂度

img

homework1

本次作业给定了要求的文法,要求将括号去除,根据递归下降层层解析,最后计算输出即可得到想要的结果。
基于递归下降的原则,对文法的原子进行分割,这里使用Lexer类来进行词法分割,对输入的字符串进行处理,再通过Parser类对分割的原子进行分析来进行语法分类,将输入的解析好的字符串转为设计好的语法树。
这里根据题目所给的文法设置了三个基本类,表达式类Exp,项类Item以及变量类Val。表达式中可以含有项,项中也可以有表达式因子。因为项与项直接是由"+"或"-"号连接起来的,因此,项类中不仅设置系数coefficient来存储其系数,也设置了一个isPos来对其项前正负进行储存,在之后展开语法树的时候,我们只需要将其进行相乘合并即可,用以保证展开式的正确性。
对于存储好的语法树,通过类Cal对其进行遍历输出。这里采用递归的方式进行展开,为接下来的嵌套括号做准备。在完整的功能中分割出多项式乘多项式方法expMulExp,单项式乘多项式方法itemMulExp,以及系数及变量相乘方法mulValue。为了避免多项式连乘或者高次幂导致的大量项遍历,再设置一个simplify方法来合并简化中间表达式。
最后,只需要将x**2化简为x*x,以及将系数1去掉即可。

homework2

本次作业的主要难度在于对函数的加入及替换。首先是加上三角函数类Trigo以及在LexerParser类中添加其对应的解析方式。
接下来则是在Cal类中对其输出进行添加即可,对三角函数部分的化简比较复杂,所以就没有进行相应的替换。
以上部分完成之后,实际上大部分工作就结束了。对函数的输入替换均可以调用已经完成的代码来实现。难点在于对参数列表的解析。这里使用了两个类Func以及SubFunc来实现,前者用于解析函数名,函数形参列表,函数表达式并存储,后者获取实参列表,对函数表达式进行替换并对函数名替换。

homework3

本次作业添加了求导的元素,那么实际上也就是对dx(expression)的一个替换,直接利用一个Derive类来对求导替换的部分进行一个替换。而且,由于我们已然完成了对表达式括号去除的工作,我们就能直接对expression进行一个预处理,将其括号(三角函数除外)用已经实现的代码去除,再来进行求导,那么就是相当于遍历项了,只需要将链式求导法则运用到位即可。对于每个项的求导,只需对每个因子求导后相加即可。
对于后定义的函数能调用前面定义的函数,这个只需要在函数表达式解析的时候调用SubFunc类替换掉即可。

本单元作业的bug

本单元作业的bug主要体现在嵌套括号中,在嵌套括号展开的过程中出现了项丢失的问题。经过多次的print和判断,最后确定应该是出现在了expMulExp或者itemMulExp中,对于表达式因子内部项中有表达式因子的逻辑应该是没有完全实现,由于时间原因,这部分便没有进行修改。初步估计是应该需要对方法调用和赋值顺序进行一定的调整。

本单元心得

总体来说,本单元的难度应该算是比较高的,总共将近写了800行代码来完成整个单元的作业。对一个复杂问题进行细分并逐个突破,这是我们该学会的

...全文
28 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

444

社区成员

发帖
与我相关
我的任务
社区描述
2023年北京航空航天大学《面向对象设计与构造》课程博客
java 高校 北京·海淀区
社区管理员
  • 被Taylor淹没的一条鱼
  • 0逝者如斯夫0
  • Mr.Lin30
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧