llvmir some opt
This commit is contained in:
59
frontend/ast/exp/LVal.java
Normal file
59
frontend/ast/exp/LVal.java
Normal file
@@ -0,0 +1,59 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user