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 getParamList() { ArrayList paramList = new ArrayList(); for (int i = 0; i < getChildren().size(); i += 2) { paramList.add((Exp) getChild(i)); } return paramList; } }