classDiagram class AddNode { -int exp -ArrayList~ExprNode~ children +rmBracket() FactorNode +addChild() void +powerExpand() void +addIntoMult() void +derivated() FactorNode +nodeChange() AddNode +toSimpFactorInTrig() FactorNode } class DrvNode { -AddNode expr -Character base } class ExprNode { <<abstract>> -SimpTerms simpTerms +toAddNode() AddNode +collectSimpTerms()* void } class FactorNode { <<interface>> deepClone() FactorNode addIntoMult() void toSimpFactorInTrig() FactorNode; containBase() boolean derivated() FactorNode } class Func { -AddNode template -ArrayList~Character~ virSeq +Func() +funcToAddNode() AddNode -createValueMap() HashMap~Character-FactorNode~ } class MultNode { -SimpTerms tmpExpr -SimpTerm tmpSimpTerm -ArrayList~FactorNode~ children +addExpr() void +addTrig() void +addPF() void +addChild() void +addNumber() void } class NumberNode { -BigInteger value } class PowerFNode { -Integer exp -Character base +pow() void } class BaseNums { +expAdd() void +expAddAll() void +onlyKey() Character +noBase() boolean } class TrigFNodes{ +add() boolean +addAll() boolean +equals() boolean } class SimpTerm { -class BaseNums -BaseNums baseNums -class TrigFNodes -TrigFNodes trigFNodes -BigInteger coef +isZero() boolean +isConst() boolean +coefNegated() void +rmBracket() FactorNode +coefIsPositive() boolean +coefAdd() void +putPF() void +mult() SimpTerm +compareTo() int +addTrig() void +coefMult() void +equals() boolean +varEquals() boolean +derivated() SimpTerms -productsRule() AddNode -powerFAppended(StringBuilder sb) void -trigAppended() void +containBase() boolean +factorExchange() MultNode -pfExchange() void } class SimpTerms { +add() boolean +addAll() boolean +mult() SimpTerms +equals() boolean +derivated() void } class TrigFNode { -Integer exp -boolean trig -FactorNode factor +isSin() boolean +mult() void +equals() boolean +varEqual() boolean +factorExchange() TrigFNode } class Lexer { -int pos -String input -String curToken +next() void +peek() String +hasExp() boolean +getNumber() String +getPowerF() PowerFNode } class Parser { -Lexer lexer -HashMap~Character-Func~ funcMap +Parser() -parseFunc() AddNode +parseTerm() MultNode -parseTrig() TrigFNode +parseFactor() FactorNode -getLeadingAS() Character +parseFuncDef() void } Parser *-- Lexer : 递归下降,文法词法解析 FactorNode <|.. NumberNode : 常数因子 FactorNode <|.. PowerFNode : 幂函数因子 FactorNode <|.. TrigFNode : 三角函数因子 FactorNode <|.. AddNode : 表达式因子 FactorNode --o MultNode : 因子被收集 AddNode o--|> ExprNode : 加法算子(表达式)\n 算子也是AddNode的子节点 MultNode --|> ExprNode : 乘法算子(项) DrvNode --|> ExprNode : 求导算子 SimpTerm --o SimpTerms : 最简多项式中的最简单项式 SimpTerm --> MultNode : 计算时临时用到 SimpTerms --o ExprNode : 代表物理意义--最简多项式 SimpTerms --> MultNode : 计算时临时用到 Func <--> AddNode : Func利用AddNode当做模板,又生产AddNode Func --* Parser : 放置于 TrigFNode --o TrigFNodes : 组成 TrigFNodes --* SimpTerm : 内部类 SimpTerm *-- BaseNums: 内部类