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); }
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); }
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); }
private BoundLabel GenerateLabel(string tag, LabelToken token) => new BoundLabel($"{tag}Label{(int)token}");