/* Parses block * {do | while | repeat | if | for | function | local | assignOrFunctionCall} * [return | break] */ Block Block() { var statements = new List<Statement>(); LastStatement lastStatement = null; bool continueBlock = true; while (continueBlock) { switch (lexer.Current.Symbol) { case Symbol.Do: statements.Add(Do()); break; case Symbol.While: statements.Add(While()); break; case Symbol.Repeat: statements.Add(Repeat()); break; case Symbol.If: statements.Add(If()); break; case Symbol.For: statements.Add(For()); break; case Symbol.Function: statements.Add(Function()); break; case Symbol.Local: statements.Add(Local()); break; case Symbol.Identifier: case Symbol.LeftParen: statements.Add(AssignOrFunctionCall()); break; case Symbol.Return: lastStatement = Return(); continueBlock = false; break; case Symbol.Break: lastStatement = new LastStatement.Break(); continueBlock = false; break; default: continueBlock = false; break; } lexer.TryConsume(Symbol.SemiColon); } return new Block(statements, lastStatement); }
Expr ILastStatementVisitor <Expr> .Visit(LastStatement.Break lastStatement) { return(Expr.Break(scope.BreakLabel())); }
/* Parses block * {do | while | repeat | if | for | function | local | assignOrFunctionCall} * [return | break] */ Block Block() { var statements = new List <Statement>(); LastStatement lastStatement = null; bool continueBlock = true; while (continueBlock) { switch (lexer.Current.Symbol) { case Symbol.Do: statements.Add(Do()); break; case Symbol.While: statements.Add(While()); break; case Symbol.Repeat: statements.Add(Repeat()); break; case Symbol.If: statements.Add(If()); break; case Symbol.For: statements.Add(For()); break; case Symbol.Function: statements.Add(Function()); break; case Symbol.Local: statements.Add(Local()); break; case Symbol.Identifier: case Symbol.LeftParen: statements.Add(AssignOrFunctionCall()); break; case Symbol.Return: lastStatement = Return(); continueBlock = false; break; case Symbol.Break: lastStatement = new LastStatement.Break(); continueBlock = false; break; default: continueBlock = false; break; } lexer.TryConsume(Symbol.SemiColon); } return(new Block(statements, lastStatement)); }