package frontend.ast.exp; import frontend.ast.Node; import frontend.ast.SyntaxType; import frontend.lexer.TokenStream; import frontend.lexer.TokenType; import frontend.ast.token.TokenNode; import error.Errors; import error.Error; import error.ErrorType; public class PrimaryExp extends Node { public PrimaryExp(TokenStream ts) { super(SyntaxType.PRIMARY_EXP, ts); } public void parse(Errors errors) { if (getCurrToken().getType() == TokenType.LPARENT) { addChild(new TokenNode(ts)); // lparent Exp exp = new Exp(this.ts); exp.parse(errors); addChild(exp); if (getCurrToken().getType() == TokenType.RPARENT) { addChild(new TokenNode(ts)); // rparent } else { errors.addError(new Error(this.ts.peek(-1).getLine(), ErrorType.j)); } } else if (getCurrToken().getType() == TokenType.IDENFR) { LVal lval = new LVal(this.ts); lval.parse(errors); addChild(lval); } else { NumberExp num = new NumberExp(this.ts); num.parse(errors); addChild(num); } } public int getType() { if (getChild(0) instanceof TokenNode) { return ((Exp) getChild(1)).getType(); } else if (getChild(0) instanceof LVal) { return ((LVal) getChild(0)).getType(); } else { return 0; } } public int getValue() { if (getChild(0) instanceof TokenNode) { return ((Exp) getChild(1)).getValue(); } else if (getChild(0) instanceof LVal) { return ((LVal) getChild(0)).getValue(); } else { return ((NumberExp) getChild(0)).getValue(); } } }