classDiagram class AddNode { -int exp +equals() boolean +powerExpand() void +deepClone() AddNode +rmBracket() ExprItem +collectSimpTerms() void +nodeChange() AddNode } class ExprItem { <<interface>> deepclone() ExprItem } class ExprNode { <<abstract>> -SimpTerms simpTerms -ArrayList~ExprItem~ children +toString() String #getSimpTerms() SimpTerms +collectSimpTerms()* void +addChild() void #getChildren() ArrayList~ExprItem~ +setSimpTerms() void } class Func { -AddNode template -ArrayList~Character~ virSeq +funcToAddNode() AddNode -createValueMap() HashMap~Character-ExprItem~ } class MultNode { -SimpTerms tmpExpr -SimpTerm tmpSimpTerm +switchAS() void +collectSimpTerms() void +equals() boolean +addPF() void +simpTermsAdd() void +addNumber() void } class NumberNode { -BigInteger value +toString() String +deepClone() NumberNode +equals() boolean } class PowerFNode { -Integer exp -Character base +toString() String +deepClone() ExprItem +equals() boolean } class TrigFNodes{ +deepClone() TrigFNodes +equals() boolean +add() boolean +addAll() boolean } class SimpTerm { -Integer xnum -Integer ynum -Integer znum -BigInteger coef -class TrigFNodes -TrigFNodes trigFNodes +isZero() boolean +isConst() boolean +toString() String +coefNegated() void +deepClone() SimpTerm +rmBracket() ExprItem +coefIsPositive() boolean +coefAdd() void +putPF() void +mult() SimpTerm +compareTo() int +addTrig() void +equals() boolean +coefMult() void +varEquals() boolean -trigAppended() void +factorExchange() MultNode -pfExchange() void } class SimpTerms { +toString() String +deepClone() SimpTerms +add() boolean +mult() SimpTerms +equals() boolean +addAll() boolean } class TrigFNode { -Integer exp -boolean trig -ExprItem factor +isSin() boolean +toString() String +mult() void +equals() boolean +varEqual() boolean +factorExchange() TrigNode +deepClone() ExprItem } class Lexer { -int pos -String input -String curToken +next() void +getExp() int +peek() String +hasExp() boolean +getNumber() String +getPowerF() PowerFNode } class Parser { -Lexer lexer -HashMap~Character-Func~ funcMap +parseExpr() AddNode +parseTerm() MultNode +parseFactor() ExprItem -getLeadingAS() Character +parseFuncDef() void } Parser *-- Lexer ExprNode ..|> ExprItem NumberNode ..|> ExprItem PowerFNode ..|> ExprItem TrigFNode ..|> ExprItem AddNode --|> ExprNode MultNode --|> ExprNode SimpTerm --o SimpTerms SimpTerm --> MultNode SimpTerms --o ExprNode SimpTerms --> MultNode Func <--> AddNode TrigFNode --o TrigFNodes