package frontend.ast.exp; import frontend.ast.Node; import frontend.ast.SyntaxType; import frontend.ast.token.TokenNode; import frontend.lexer.TokenStream; import frontend.lexer.TokenType; import midend.symbol.SymbolManager; import midend.symbol.Symbol; import midend.symbol.ArraySymbol; import error.Errors; import error.Error; import error.ErrorType; public class LVal extends Node { public LVal(TokenStream ts) { super(SyntaxType.LVAL_EXP, ts); } public void parse(Errors errors) { addChild(new TokenNode(this.ts)); // idenfr if (getCurrToken().getType() == TokenType.LBRACK) { addChild(new TokenNode(this.ts)); // lbrack Exp exp = new Exp(this.ts); exp.parse(errors); addChild(exp); if (getCurrToken().getType() == TokenType.RBRACK) { addChild(new TokenNode(this.ts)); // rbrack } else { errors.addError(new Error(this.ts.peek(-1).getLine(), ErrorType.k)); } } } public int getType() { if (getChildren().size() == 1) { TokenNode idenfr = (TokenNode) getChild(0); Symbol symbol = SymbolManager.getSymbol(idenfr.getName()); if (symbol instanceof ArraySymbol) { return 1; } return 0; } else { return 0; } } public int getValue() { TokenNode idenfr = (TokenNode) getChild(0); //idenfr一定是个常量,可在符号表找到且有值 if (getChildren().size() == 1) { Symbol symbol = SymbolManager.getSymbol(idenfr.getName()); return symbol.getValue(0); } else { int index = ((Exp) getChild(2)).getValue(); Symbol symbol = SymbolManager.getSymbol(idenfr.getName()); return symbol.getValue(index); } } }