Files
MY_COMPILER/frontend/ast/decl/ConstDef.java
2025-12-12 20:14:00 +08:00

67 lines
2.2 KiB
Java
Executable File

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;
}
}
}