OO-Unit1-hw2
OO第一单元第二次作业 0.题目需求分析 0.1 概念分析 本次作业在第一次作业的基础上添加了指数函数和自定义函数,其中 需要支持嵌套多层括号 新增指数因子,指数函数括号内部包含任意因子 新增自定义函数因子,自定义函数的表达式会给出且其中不会调用其他自定义函数 本次迭代表达式架构上的改变 支持前导0的十进制带符号整数 因子 变量因子,x 幂函数 一般形式:x^非负整数 省略形式:指数为1,x 指数函数:特指以e为底数的指数函数,表示为exp(<因子>)等 一般形式:exp(<因子>)^指数,注:该指数为exp()整体的指数 exp()的指数为非负整数 **省略形式:**指数为1时,写为exp(<因子>) 自定义函数 自定义函数中不会调用其他自定义函数,定义类似于 f(x,y,z) = 表达式(可能不全部包含x,y,z这三个变量) f,g,h是函数的函数名,本次作业中的自定义函数名只包括f,g,h即最多只有三个自定义函数 x,y,z是函数的形参,形参个数为1~3个,且同一函数定义中不会出现重复使用的形参 函数表达式为关于形参的表达式 函数调用的形式为f(因子,因子,因子),例如f(x^2),g(exp(x^2),exp(x)),h(1,0,-0),因子为函数调用中的实参,包含任意一种因子 注意:函数定义中不允许出现自定义函数,但是函数调用中的实参可以是自定义函数 常数因子 表达式因子 项 表达式 关于去括号要求中的**“必要的括号”** 指数函数调用时必要的一层括号exp() 指数函数对应的嵌套因子为不带指数的表达式因子时,该因子两侧必要的一层括号,例如 exp((x+1)^2)中(x+1)中的括号是不合法的,需要展开为不带指数的形式exp((x^2+2*x+1)) 0.2 表达式架构图 大致保留之前的架构,新增指数函数因子类和自定义函数因子类 1.处理流程分析 1.1 字符串预处理 由于自定义函数的引入,可以新增去除,后不必要的+ 1.2 语义分析 1.2.1 Lexer 本次作业中,新增了EXP,F,G,H,COMMA(逗号)等token,需要增加识别功能。 1.2.2 Parser 1.2.2.1 parseExp 在Parser类中新建一个方法parseExp,当我们读到的token为EXP时调用该方法进行解析。首先对括号内的因子进行解析,再对括号外的指数进行解析。 $$ exp()^n \space | \space exp() $$ public Factor parseExp() { // exp(<factor>)^<num> | exp(<factor>) // lexer : exp -> pos = pos + 4 already into the ( // 读到RP时接着往后读看有没有指数 int pow = 1;//默认指数为1 Factor innerFactor = parseFactor(); if (lexer.getCurTokenType() == TokenType.POW) { // 后面有指数 } return new Exp(innerFactor, pow); } 1.2.2.2 parseFunc 1.2.2.2.1 Definer 为了成功地解析自定义函数,我们首先定义出Definer类,他的主要作用是处理自定义函数的定义以及调用。(相当于parseFunc的slave)其中定义出两个HashMap ...