示例#1
0
        private static bool ProcessIf(Token token, Stack <Token> stack, IList <Token> prn, IList <LabelToken> labels)
        {
            if (token.Substring == "then")
            {
                var lastIf = stack.First(x => x.Substring == "if");

                var label = new LabelToken($"_m{labels.Count + 1}");
                lastIf.Tag = label;

                labels.Add(label);

                while (stack.Peek() != lastIf)
                {
                    prn.Add(stack.Pop());
                }

                prn.Add(label);
                prn.Add(new ConditionalFalseJumpOperation());

                return(true);
            }

            if (token.Substring == "]")
            {
                //) pushes anything not farther than [
                var pop = stack.Pop();
                while (pop.Substring != "[")
                {
                    prn.Add(pop);
                    pop = stack.Pop();
                }
                ;
                return(true);
            }

            if (token.Substring == "goto")
            {
                return(true);
            }

            var ifToken = stack.FirstOrDefault(x => x.Substring == "if");

            if (ifToken != null && token.Substring == "\r\n")
            {
                while (stack.Peek() != ifToken)
                {
                    prn.Add(stack.Pop());
                }

                prn.Add(new UnconditionalJumpOperation());
                prn.Add(ifToken.Tag as LabelToken);
                prn.Add(new StringToken(":"));

                stack.Pop(); //Remove if
                return(true);
            }
            return(false);
        }
示例#2
0
        private void ReturnLabel(StateMachine.Transition transition)
        {
            Log(LogEventLevel.Information, "Found a label: {0}", false, CurrentToken);
            var name          = CurrentToken.Substring.Trim(':');
            var existingLabel = Labels.FirstOrDefault(l => l.Name == name);

            var label = Labels.FirstOrDefault(x => x.Name == name)?.Clone() as LabelToken;

            if (label == null)
            {
                label = new LabelToken(name)
                {
                    Line       = Line,
                    TokenIndex = LabelIndex,
                    Index      = existingLabel != null ? existingLabel.Index : Labels.Count
                };
                Labels.Add(label);
            }
            label.Line = Line;

            ReturnToken(label, transition.Trigger);
        }
示例#3
0
        private bool ProcessFor(Token token, Stack <Token> stack, List <Token> prn, IList <LabelToken> labels, VariableStore store)
        {
            if (stack.Peek().Substring == "do" && stack.Peek().Tag == null && prn.Last() is IdentifierToken) //Identifier right after for keyword
            {
                stack.Peek().Tag = new ForContext()
                {
                    Parameter = prn.Last() as IdentifierToken
                };
            }

            var lastFor = stack.First(x => x.Substring == "do");
            var context = lastFor.Tag as ForContext;

            if (token.Substring == "to")
            {
                var workingId = new IdentifierToken($"_r{store.Count + 1}");
                store[workingId]     = new ConstantToken <float>(0);
                context.ToIdentifier = workingId;

                var label = new LabelToken($"_m{labels.Count + 1}");
                labels.Add(label);
                context.LoopLabel = label;


                while (stack.Peek().Substring != "do")
                {
                    prn.Add(stack.Pop());
                }

                prn.Add(label);
                prn.Add(new StringToken(":"));
                prn.Add(context.ToIdentifier);

                return(true);
            }

            if (token.Substring == Environment.NewLine)
            {
                if (token.Line == lastFor.Line)
                {
                    var label = new LabelToken($"_m{labels.Count + 1}");
                    labels.Add(label);
                    context.ExitLabel = label;

                    while (stack.Peek().Substring != "do")
                    {
                        prn.Add(stack.Pop());
                    }

                    prn.Add(new StringToken("="));
                    prn.Add(context.Parameter);
                    prn.Add(context.ToIdentifier);
                    prn.Add(new StringToken("<="));
                    prn.Add(context.ExitLabel);
                    prn.Add(new ConditionalFalseJumpOperation());
                }

                return(true);
            }

            if (token.Substring == "next")
            {
                while (stack.Peek().Substring != "do")
                {
                    prn.Add(stack.Pop());
                }

                prn.Add(context.Parameter);
                prn.Add(context.Parameter);
                prn.Add(new ConstantToken <float>(1));
                prn.Add(new StringToken("+"));
                prn.Add(new StringToken("="));

                prn.Add(context.LoopLabel);
                prn.Add(new UnconditionalJumpOperation());
                prn.Add(context.ExitLabel);
                prn.Add(new StringToken(":"));

                stack.Pop(); //Pop for

                return(true);
            }

            return(false);
        }
示例#4
0
 private BoundLabel GenerateLabel(string tag, LabelToken token) =>
 new BoundLabel($"{tag}Label{(int)token}");