classDiagram class AS { -Character value +toString() String +AS() +getValue() Character +eDeepClone() ExprItem } class ExprItem { <<interface>> } class ExprNode { -int exp -ExprItem item -ExprNode left -ExprNode right -ExprNode parent -Character leadingAS +switchAS() void +toString() String +fDeepClone() Factor +simplified() String +powerSpan() ExprNode +treeToList() ArrayList~Term~ +multN() ExprNode +ExprNode() +listToTree() ExprNode +printTree() void -inOrder() void } class Factor { <<interface>> } class Number { +Number() +fDeepClone() Factor } class PowerF { -Integer exp -Character base +getExp() Integer +toString() String +fDeepClone() Factor +PowerF() } class SimpTerm { -Integer xnum -Integer ynum -Integer znum -BigInteger coef +SimpTerm() +toString() String +coefAdd() void +equals() boolean -putPF() void } class Term { -ExprNode dst -Term powerFSum -Number numberSum -Character leadingAS +switchAS() void +toString() String +eDeepClone() ExprItem +Term() -sumAdd() void +addFactor() void } class Lexer { -int pos -String input -String curToken -Character tempAS +next() void +getExp() int +peek() String +hasExp() boolean +getNumber() String +getPowerF() PowerF +Lexer() } class Parser { -Lexer lexer +parseTerm() Term +Parser() +parseFactor() Factor +parseExpr() ExprNode -getLeadingAS() Character } class ArrayList~Factor~ Parser *-- Lexer ExprNode ..|> Factor Number ..|> Factor PowerF ..|> Factor Term ..|> ExprItem AS ..|> ExprItem SimpTerm --* ExprNode ArrayList~Factor~ <|-- Term ExprItem --* ExprNode Factor --* Term