private StatementNode ParseStatement() { switch (_curtok.TokenId) { case TokenId.LCurly: case TokenId.Block: BlockStatement block = new BlockStatement(_curtok); ParseBlock(block); return block; case TokenId.Semi: Advance(); return new StatementNode(_curtok); case TokenId.If: return ParseIf(); case TokenId.For: return ParseFor(); case TokenId.Break: return ParseBreak(); case TokenId.Continue: return ParseContinue(); case TokenId.Dollar: return ParseDollar(); case TokenId.Echo: return ParseEcho(); case TokenId.Html: return ParseHtml(); case TokenId.String: case TokenId.Int: case TokenId.Double: case TokenId.True: case TokenId.False: case TokenId.Null: case TokenId.LParen: case TokenId.PlusPlus: case TokenId.MinusMinus: case TokenId.Ident: { ExpressionStatement node = new ExpressionStatement(ParseExpression()); AssertAndAdvance(TokenId.Semi); return node; } case TokenId.Var: { Advance(); ExpressionStatement node = new ExpressionStatement(ParseExpression()); AssertAndAdvance(TokenId.Semi); return node; } default: { throw new ParseException("Unknow token, " + _curtok); } } }