package frontend.ast.decl; import error.Error; import error.ErrorType; import error.Errors; import frontend.ast.Node; import frontend.ast.SyntaxType; import frontend.ast.exp.ConstExp; import frontend.ast.token.TokenNode; import frontend.ast.val.ConstInitVal; import frontend.lexer.TokenStream; import frontend.lexer.TokenType; import midend.symbol.ArraySymbol; import midend.symbol.Symbol; import midend.symbol.SymbolType; public class ConstDef extends Node { private boolean isArray; public ConstDef(TokenStream ts) { super(SyntaxType.CONST_DEF, ts); isArray = false; } public void parse(Errors errors) { TokenNode ident = new TokenNode(this.ts); addChild(ident); if (getCurrToken().getType() == TokenType.LBRACK) { TokenNode lbrack = new TokenNode(this.ts); addChild(lbrack); isArray = true; ConstExp cep = new ConstExp(this.ts); cep.parse(errors); addChild(cep); if (getCurrToken().getType() == TokenType.RBRACK) { TokenNode rbrack = new TokenNode(this.ts); addChild(rbrack); } else { errors.addError(new Error(this.ts.peek(-1).getLine(), ErrorType.k)); } } TokenNode assign = new TokenNode(this.ts); addChild(assign); ConstInitVal civ = new ConstInitVal(this.ts); civ.parse(errors); addChild(civ); } public Symbol getSymbol() { if (isArray) { TokenNode tn = (TokenNode) getChild(0); ArraySymbol arraySymbol = new ArraySymbol(tn.getName(), SymbolType.CONST_INT_ARRAY, tn.getLine(), ((ConstExp) getChild(2)).getValue()); arraySymbol.addValue(((ConstInitVal) getChild(getChildren().size() - 1)).getValue()); arraySymbol.fullValue(); return arraySymbol; } else { TokenNode tn = (TokenNode) getChild(0); Symbol valueSymbol = new Symbol(tn.getName(), SymbolType.CONST_INT, tn.getLine()); valueSymbol.addValue(((ConstInitVal) getChild(getChildren().size() - 1)).getValue()); return valueSymbol; } } }