public CodeObject Visit(ASTProcedureCall call) { MethodInfo theMethod = this.metadataRetriever.GetFunctionMethod(call.ProcedureId); CodeMethodInvokeExpression result = new CodeMethodInvokeExpression( new CodeMethodReferenceExpression( new CodeTypeReferenceExpression(theMethod.ReflectedType), theMethod.Name ) ); foreach (var actual in call.Actuals) { result.Parameters.Add((CodeExpression)actual.Accept(this)); } return(result); }
// <call> ::= <lval> | <procedurecall> | <snacall> // <lval> ::= <ID> // <snacall> ::= <ID> <DOLLAR> <ID> // <procedurecall> ::= <ID> <LPAR> <actuals> <RPAR> private ASTAnyCall ExpectCall() { string id = this.ExpectQualID(); if(this.Scanner.CurrentToken == TokenType.LPAR) { ASTProcedureCall call = new ASTProcedureCall(); call.ProcedureId = this.ResolveFunctionId(id); this.Expect(TokenType.LPAR); IList<ASTAnyExpression> actuals = this.ExpectActuals(); foreach (var actual in actuals) { call.Actuals.Add(actual); } this.Expect(TokenType.RPAR); return call; } else if(this.Scanner.CurrentToken == TokenType.DOLLAR) { this.Expect(TokenType.DOLLAR); return new ASTDirectSNACall() { SnaId = this.ResolveFunctionId(id), ActualId = ExpectID() }; } else { return new ASTLValue() { Id = id }; } }