mips without optimize

This commit is contained in:
colden
2025-12-12 20:14:00 +08:00
parent 84827838e2
commit c94bebf37b
130 changed files with 5462 additions and 4182 deletions

0
frontend/ast/func/FuncDef.java Normal file → Executable file
View File

96
frontend/ast/func/FuncFParam.java Normal file → Executable file
View File

@@ -1,49 +1,49 @@
package frontend.ast.func;
import frontend.ast.Node;
import frontend.ast.SyntaxType;
import frontend.lexer.TokenStream;
import frontend.lexer.TokenType;
import midend.symbol.Symbol;
import midend.symbol.SymbolType;
import midend.symbol.ArraySymbol;
import error.Errors;
import frontend.ast.token.TokenNode;
import error.ErrorType;
import error.Error;
public class FuncFParam extends Node {
public FuncFParam(TokenStream ts) {
super(SyntaxType.FUNC_FORMAL_PARAM, ts);
}
public void parse(Errors errors) {
TokenNode intkk = new TokenNode(this.ts);
addChild(intkk);
TokenNode ident = new TokenNode(this.ts);
addChild(ident);
if (getCurrToken().getType() == TokenType.LBRACK) {
TokenNode lbrack = new TokenNode(this.ts);
addChild(lbrack);
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));
}
}
}
public Symbol getSymbol() {
if (getChildren().size() == 2) {
TokenNode tn = (TokenNode) getChild(1);
return new Symbol(tn.getName(), SymbolType.INT, tn.getLine());
} else {
TokenNode tn = (TokenNode) getChild(1);
return new ArraySymbol(tn.getName(), SymbolType.INT_ARRAY, tn.getLine(), -1);
//这里不求维数,因为函数形参为数组只是相当于一个指针
}
}
package frontend.ast.func;
import frontend.ast.Node;
import frontend.ast.SyntaxType;
import frontend.lexer.TokenStream;
import frontend.lexer.TokenType;
import midend.symbol.Symbol;
import midend.symbol.SymbolType;
import midend.symbol.ArraySymbol;
import error.Errors;
import frontend.ast.token.TokenNode;
import error.ErrorType;
import error.Error;
public class FuncFParam extends Node {
public FuncFParam(TokenStream ts) {
super(SyntaxType.FUNC_FORMAL_PARAM, ts);
}
public void parse(Errors errors) {
TokenNode intkk = new TokenNode(this.ts);
addChild(intkk);
TokenNode ident = new TokenNode(this.ts);
addChild(ident);
if (getCurrToken().getType() == TokenType.LBRACK) {
TokenNode lbrack = new TokenNode(this.ts);
addChild(lbrack);
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));
}
}
}
public Symbol getSymbol() {
if (getChildren().size() == 2) {
TokenNode tn = (TokenNode) getChild(1);
return new Symbol(tn.getName(), SymbolType.INT, tn.getLine());
} else {
TokenNode tn = (TokenNode) getChild(1);
return new ArraySymbol(tn.getName(), SymbolType.INT_ARRAY, tn.getLine(), -1);
//这里不求维数,因为函数形参为数组只是相当于一个指针
}
}
}

0
frontend/ast/func/FuncFParams.java Normal file → Executable file
View File

114
frontend/ast/func/FuncRParams.java Normal file → Executable file
View File

@@ -1,57 +1,57 @@
package frontend.ast.func;
import java.util.ArrayList;
import frontend.ast.Node;
import frontend.ast.SyntaxType;
import frontend.lexer.TokenStream;
import frontend.lexer.TokenType;
import error.Errors;
import error.Error;
import error.ErrorType;
import frontend.ast.token.TokenNode;
import frontend.ast.exp.Exp;
import midend.symbol.FuncSymbol;
public class FuncRParams extends Node {
public FuncRParams(TokenStream ts) {
super(SyntaxType.FUNC_REAL_PARAM_S, ts);
}
public void parse(Errors errors) {
while (true) {
Exp ep = new Exp(ts);
ep.parse(errors);
addChild(ep);
if (getCurrToken().getType() == TokenType.COMMA) {
addChild(new TokenNode(ts)); // comma
} else {
break;
}
}
}
public int getParamNum() {
return (getChildren().size() + 1) / 2;
}
public void checkParamType(FuncSymbol funcSymbol, Errors errors, int line) {
int fparaNum = funcSymbol.getParamNum();
int rparaNum = getParamNum();
int size = rparaNum < fparaNum ? rparaNum : fparaNum;
for (int i = 0; i < size; i++) {
Exp exp = (Exp) getChild(i * 2);
if (exp.getType() != funcSymbol.getParamType(i)) {
errors.addError(new Error(line, ErrorType.e));
}
}
}
public ArrayList<Exp> getParamList() {
ArrayList<Exp> paramList = new ArrayList<Exp>();
for (int i = 0; i < getChildren().size(); i += 2) {
paramList.add((Exp) getChild(i));
}
return paramList;
}
}
package frontend.ast.func;
import java.util.ArrayList;
import frontend.ast.Node;
import frontend.ast.SyntaxType;
import frontend.lexer.TokenStream;
import frontend.lexer.TokenType;
import error.Errors;
import error.Error;
import error.ErrorType;
import frontend.ast.token.TokenNode;
import frontend.ast.exp.Exp;
import midend.symbol.FuncSymbol;
public class FuncRParams extends Node {
public FuncRParams(TokenStream ts) {
super(SyntaxType.FUNC_REAL_PARAM_S, ts);
}
public void parse(Errors errors) {
while (true) {
Exp ep = new Exp(ts);
ep.parse(errors);
addChild(ep);
if (getCurrToken().getType() == TokenType.COMMA) {
addChild(new TokenNode(ts)); // comma
} else {
break;
}
}
}
public int getParamNum() {
return (getChildren().size() + 1) / 2;
}
public void checkParamType(FuncSymbol funcSymbol, Errors errors, int line) {
int fparaNum = funcSymbol.getParamNum();
int rparaNum = getParamNum();
int size = rparaNum < fparaNum ? rparaNum : fparaNum;
for (int i = 0; i < size; i++) {
Exp exp = (Exp) getChild(i * 2);
if (exp.getType() != funcSymbol.getParamType(i)) {
errors.addError(new Error(line, ErrorType.e));
}
}
}
public ArrayList<Exp> getParamList() {
ArrayList<Exp> paramList = new ArrayList<Exp>();
for (int i = 0; i < getChildren().size(); i += 2) {
paramList.add((Exp) getChild(i));
}
return paramList;
}
}

0
frontend/ast/func/FuncType.java Normal file → Executable file
View File

0
frontend/ast/func/MainFuncDef.java Normal file → Executable file
View File