Exemple #1
0
        /* 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);
        }
Exemple #2
0
 Expr ILastStatementVisitor <Expr> .Visit(LastStatement.Break lastStatement)
 {
     return(Expr.Break(scope.BreakLabel()));
 }
Exemple #3
0
        /* 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));
        }