// ParametersTail -> CommaToken IdentifierToken ParametersTail |
 //                   CommaToken NumberToken ParametersTail |
 //                   e
 private bool ProcessParametersTail()
 {
     if (LexicalAnaylzer.Token == Token.CommaToken && LexicalAnaylzer.IsFirstWordCharacter(LexicalAnaylzer.LookNextCharacter()))
     { // TODO: This isn't good - will work for this grammar but shouldn't be checking just next character like so
         LexicalAnaylzer.GetNextToken();
         if (!CheckDeclaredVariable())
         {
             return(false);
         }
         ParameterStack.Push(LexicalAnaylzer.Lexeme);
         if (!MatchToken(Token.IdentifierToken))
         {
             return(false);
         }
         if (!ProcessParametersTail())
         {
             return(false);
         }
     }
     else if (LexicalAnaylzer.Token == Token.CommaToken && LexicalAnaylzer.IsDigitCharacter(LexicalAnaylzer.LookNextCharacter()))
     { // TODO: This isn't good - will work for this grammar but shouldn't be checking just next character like so
         LexicalAnaylzer.GetNextToken();
         ParameterStack.Push(LexicalAnaylzer.Lexeme);
         if (!MatchToken(Token.NumberToken))
         {
             return(false);
         }
         if (!ProcessParametersTail())
         {
             return(false);
         }
     }
     return(true);
 }
 // Parameters -> IdentifierToken ParametersTail |
 //               NumberToken ParametersTail |
 //               e
 private bool ProcessParameters()
 {
     if (LexicalAnaylzer.Token == Token.IdentifierToken)
     {
         if (!CheckDeclaredVariable())
         {
             return(false);
         }
         ParameterStack.Push(LexicalAnaylzer.Lexeme);
         LexicalAnaylzer.GetNextToken();
         if (!ProcessParametersTail())
         {
             return(false);
         }
     }
     else if (LexicalAnaylzer.Token == Token.NumberToken)
     {
         ParameterStack.Push(LexicalAnaylzer.Lexeme);
         LexicalAnaylzer.GetNextToken();
         if (!ProcessParametersTail())
         {
             return(false);
         }
     }
     return(true);
 }
Пример #3
0
    static IEnumerable <LazyString> Impl_Starg_S(MethodInfo method, Instruction instruction)
    {
        var parameters = method.Definition.Parameters;
        var paramCount = parameters.Count;

        yield return(SetGlobal(Variables.Temporary, ArraySlice(
                                   GetGlobal(Variables.ParameterStack),
                                   () => "0",
                                   () => paramCount.ToString())));

        foreach (var action in ParameterStack.Pop(paramCount))
        {
            yield return(action);
        }

        foreach (var i in Enumerable.Range(0, paramCount))
        {
            var push = ParameterStack.Push(
                instruction.Operand == parameters[i] ?
                VariableStack.GetLastElement(0) :
                ArraySubscript(GetGlobal(Variables.Temporary), i));
            foreach (var action in push)
            {
                yield return(action);
            }
        }

        foreach (var action in VariableStack.Pop(1))
        {
            yield return(action);
        }
    }
Пример #4
0
    IEnumerable <LazyString> Impl_Call_CustomMethod(MethodInfo method, Instruction instruction, MethodDefinition targetMethod)
    {
        // pop the parameters off the variable stack and onto the parameter stack
        var paramsVal = ArraySlice(
            GetGlobal(Variables.VariableStack),
            () => "0",
            () => targetMethod.Parameters.Count.ToString());

        foreach (var action in ParameterStack.Push(paramsVal))
        {
            yield return(action);
        }
        foreach (var action in VariableStack.Pop(targetMethod.Parameters.Count))
        {
            yield return(action);
        }

        foreach (var action in JumpOffsetStack.Push(GetJumpId(method, instruction.Next)))
        {
            yield return(action);
        }
        foreach (var action in JumpOffsetStack.Push(() => "0"))
        {
            yield return(action);
        }

        foreach (var action in Impl_Call_CustomMethod_Direct(targetMethod))
        {
            yield return(action);
        }

        yield return(() => "Loop;");
    }
Пример #5
0
    IEnumerable <LazyString> TaskRunnerActions(MethodDefinition updateMethod)
    {
        yield return(() => $"Abort If (Not({FunctionCondition(0)()}));");

        yield return(() => "Wait(0, Ignore Condition);");

        foreach (var action in TaskQueue.PopTaskTo(Variables.Temporary))
        {
            yield return(action);
        }

        var functionId = ArraySubscript(GetGlobal(Variables.Temporary), 0);

        // if there's no function, call Update (if it exists, otherwise just loop)
        var updateCallActions = updateMethod == null ? new LazyString[0] : Impl_Call_CustomMethod_Direct(updateMethod);

        yield return(SkipIf(NotEqual(functionId, () => "0"), () => (updateCallActions.Count() + 1).ToString()));

        foreach (var action in updateCallActions)
        {
            yield return(action);
        }
        yield return(() => "Loop;");

        // push event params onto stack before calling
        foreach (var action in ParameterStack.Push(ArraySlice(GetGlobal(Variables.Temporary), () => "1", () => "3")))
        {
            yield return(action);
        }

        foreach (var action in Impl_Call_CustomMethod_Direct(functionId, m_maxNumLocalVariables))
        {
            yield return(action);
        }

        yield return(() => "Loop;");
    }