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);
        }
Exemple #2
0
        // <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
                };
            }
        }