// 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); }
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); } }
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;"); }
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;"); }