@Override public FunctionDecl visit(FunctionDecl fd, Void arg) throws CompilationException { FunctionDecl copy = new FunctionDecl(fd.getSignature(), fd.getParamList(), (Expression) fd.getFuncBody().accept(this, arg)); copy.setSourceLocation(fd.getSourceLocation()); return copy; }
final public FunctionDecl FunctionDeclaration() throws ParseException, ParseException { FunctionDecl funcDecl; FunctionSignature signature; String functionName; List<VarIdentifier> paramList = new ArrayList<VarIdentifier>(); Expression funcBody; createNewScope(); jj_consume_token(DECLARE); jj_consume_token(FUNCTION); functionName = Identifier(); paramList = ParameterList(); jj_consume_token(LEFTBRACE); funcBody = Expression(); jj_consume_token(RIGHTBRACE); signature = new FunctionSignature(defaultDataverse, functionName, paramList.size()); getCurrentScope().addFunctionDescriptor(signature, false); funcDecl = new FunctionDecl(signature, paramList, funcBody); removeCurrentScope(); {if (true) return funcDecl;} throw new Error("Missing return statement in function"); }
final public FunctionDecl FunctionDeclaration() throws ParseException, ParseException { FunctionDecl funcDecl; FunctionSignature signature; String functionName; List<VarIdentifier> paramList = new ArrayList<VarIdentifier>(); Expression funcBody; createNewScope(); jj_consume_token(DECLARE); jj_consume_token(FUNCTION); functionName = Identifier(); paramList = ParameterList(); jj_consume_token(LEFTBRACE); funcBody = Expression(); jj_consume_token(RIGHTBRACE); signature = new FunctionSignature(defaultDataverse, functionName, paramList.size()); getCurrentScope().addFunctionDescriptor(signature, false); funcDecl = new FunctionDecl(signature, paramList, funcBody); removeCurrentScope(); {if (true) return funcDecl;} throw new Error("Missing return statement in function"); }
@Override public Pair<ILangExpression, VariableSubstitutionEnvironment> visit(FunctionDecl fd, VariableSubstitutionEnvironment env) throws CompilationException { List<VarIdentifier> newList = new ArrayList<>(fd.getParamList().size()); for (VarIdentifier vi : fd.getParamList()) { VariableExpr varExpr = new VariableExpr(vi); if (!env.constainsOldVar(varExpr)) { throw new CompilationException(ErrorCode.COMPILATION_ERROR, fd.getSourceLocation(), "Parameter " + vi + " does not appear in the substitution list."); } Expression newExpr = env.findSubstitution(varExpr); if (newExpr.getKind() != Kind.VARIABLE_EXPRESSION) { throw new CompilationException(ErrorCode.COMPILATION_ERROR, fd.getSourceLocation(), "Parameter " + vi + " cannot be substituted by a non-variable expression."); } newList.add(((VariableExpr) newExpr).getVar()); } Pair<ILangExpression, VariableSubstitutionEnvironment> p1 = fd.getFuncBody().accept(this, env); FunctionDecl newF = new FunctionDecl(fd.getSignature(), newList, (Expression) p1.first); newF.setSourceLocation(fd.getSourceLocation()); return new Pair<>(newF, env); }
FunctionSignature signature = new FunctionSignature(defaultDataverse, functionName, paramList.size()); getCurrentScope().addFunctionDescriptor(signature, false); FunctionDecl stmt = new FunctionDecl(signature, paramList, funcBody); removeCurrentScope(); {if (true) return addSourceLocation(stmt, startToken);}