301
社区成员
发帖
与我相关
我的任务
分享由于先修过编译原理课程,对使用到的递归下降方法比较熟悉。但是对面向对象的思想理解不够,这一单元作业完成的过程中遇到了很多的困难,在这里就把顺利完成的前两次作业进行一个总结吧。
第一次作业需要完成的任务为:读入一个包含加、减、乘、乘方以及括号的单变量表达式,输出恒等变形展开所有括号后的表达式。第二次作业在第一次作业基础上支持嵌套多层括号。新增指数函数因子,指数函数括号内部包含任意因子。新增自定义函数因子,但自定义函数的函数表达式中不会调用其他自定义函数。完成这两次作业,我采取的是递归下降方法解析语法结构。首先建立lexer类,lexer.peek()获得当前Token,lexer.next()获得下一token。
public void next() {
if (pos == expr.length()) {
return;
}
char c1 = expr.charAt(pos);
String str3 = pos + 3 < expr.length() ? expr.substring(pos, pos + 3) : "Error";
if (Character.isDigit(c1)) {
now = getNumber();
} else if (str3.equals("exp")) {
//
} else if ("fgh,()+-*ix^".indexOf(c1) != -1) {
//
}
}
public String peek() {
return this.now;
}
在Parser部分,分别为Expr,Term,Factor编写解析方法,递归下降进行解析。
1.UML类图:
2.代码规模分析:

代码总体规模并不大,一共在500行左右。Parser和Expr类较复杂,行数较多。
3.Bug分析
第二次作业未进入强测,在处理Exp()括号内为负数时出现问题。比如Exp(-1)。没有很好的考虑第二次作业的“正确性判定”中关于指数函数括号层次的要求。比如EXP(2*x),在输出的时候,2*x作为表达式因子,应该带有括号,输出为exp((2*x))。所以即使第一种数学上是正确的,但是不符合形式化描述,在评测机评测时卡了很久。
第一次作业只进行了合并同类项的优化。第二次作业引入指数函数后,事情便走向了不可控的境地。由于指数函数的优化处理需要考虑的情况很多,基于我的代码架构,多个指数函数相乘的因子上的优化很难实现。于是放弃了这个方向的优化,只求能先保证正确性。
虽然说已经接触过递归下降,但是主要还是面向过程的思想()。本单元作业中,通过设计factor接口以及term,number,expr等继承类,使用面向对象的方法完成本单元任务,虽然很艰辛,但是成就感也很足。在不断Debug的过程中,对于面向对象的思想掌握也更多了,相信以后我能够更进一步!
uml类图也需要放进来