void ParseStatement(TokenRange toks, List <Statement> statements) { toks = toks.SkipWhile(Whitespace); Action <Statement> Add = stmt => { stmt.FirstSourceLine = toks.First().SourceLine; statements.Add(stmt); }; switch (toks.First().Value) { case "loop": Add(ParseLoopStatement(toks)); break; case "while": Add(ParseWhileStatement(toks)); break; case "for": Add(ParseForStatement(toks)); break; case "break": Add(new BreakStatement()); break; case "continue": Add(new ContinueStatement()); break; case "return": Add(ParseReturnStatement(toks)); break; case "{": Add(ParseCompoundStatement(toks)); break; case "if": Add(ParseIfStatement(toks)); break; case "else": ParseElseStatement(toks, statements[statements.Count - 1]); break; case "choose": Add(ParseChooseStatement(toks)); break; case "when": Add(ParseWhenStatement(toks)); break; case "try": Add(ParseTryStatement(toks)); break; case "catch": ParseCatchStatement(toks, statements[statements.Count - 1]); break; case "throw": Add(ParseThrowStatement(toks)); break; default: if (IllegalKeywords.Contains(toks.First().Value)) { throw new Error(toks.First().SourceLine, "Statement '{0}' not supported in actors.", toks.First().Value); } if (toks.Any(t => t.Value == "wait" || t.Value == "waitNext")) { Add(ParseWaitStatement(toks)); } else if (toks.First().Value == "state") { Add(ParseStateDeclaration(toks)); } else if (toks.First().Value == "switch" && toks.Any(t => t.Value == "return")) { throw new Error(toks.First().SourceLine, "Unsupported compound statement containing return."); } else if (toks.RevSkipWhile(t => t.Value == ";").Any(NonWhitespace)) { Add(new PlainOldCodeStatement { code = str(NormalizeWhitespace(toks.RevSkipWhile(t => t.Value == ";"))) + ";" }); } break; } ; }