60 lines
1.8 KiB
Java
60 lines
1.8 KiB
Java
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);
|
||
}
|
||
}
|
||
}
|