58 lines
1.6 KiB
Java
58 lines
1.6 KiB
Java
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;
|
|
}
|
|
}
|