Beispiel #1
0
        public Expression Parse(Parser parser, Token token, out bool trailingSemicolon)
        {
            trailingSemicolon = false;

            parser.Take(TokenType.LeftParen);

            var expression = parser.ParseExpression();

            parser.Take(TokenType.RightParen);
            parser.Take(TokenType.LeftBrace);

            var hasDefault = false;
            var branches = new List<SwitchExpression.Branch>();

            while (!parser.Match(TokenType.RightBrace))
            {
                var conditions = new List<Expression>();

                while (true)
                {
                    if (parser.MatchAndTake(TokenType.Case))
                    {
                        var condition = parser.ParseExpression();
                        conditions.Add(condition);

                        parser.Take(TokenType.Colon);
                        continue;
                    }

                    if (!parser.Match(TokenType.Default))
                        break;

                    var defaultToken = parser.Take(TokenType.Default);

                    if (hasDefault)
                        throw new MondCompilerException(defaultToken, CompilerError.DuplicateDefault);

                    conditions.Add(null); // special default condition
                    hasDefault = true;

                    parser.Take(TokenType.Colon);
                }

                if (conditions.Count > 0)
                {
                    var block = ParseBlock(parser);
                    var branch = new SwitchExpression.Branch(conditions, block);
                    branches.Add(branch);
                    continue;
                }

                var errorToken = parser.Peek();
                throw new MondCompilerException(errorToken, CompilerError.ExpectedButFound2, TokenType.Case, TokenType.Default, errorToken);
            }

            parser.Take(TokenType.RightBrace);

            return new SwitchExpression(token, expression, branches);
        }
Beispiel #2
0
        public Expression Parse(Parser parser, Token token, out bool trailingSemicolon)
        {
            trailingSemicolon = false;

            parser.Take(TokenType.LeftParen);

            var expression = parser.ParseExpession();

            parser.Take(TokenType.RightParen);
            parser.Take(TokenType.LeftBrace);

            var branches = new List<SwitchExpression.Branch>();
            BlockExpression defaultBlock = null;

            while (!parser.Match(TokenType.RightBrace))
            {
                var conditions = new List<Expression>();

                while (parser.MatchAndTake(TokenType.Case))
                {
                    var condition = parser.ParseExpession();
                    conditions.Add(condition);

                    parser.Take(TokenType.Colon);
                }

                if (conditions.Count > 0)
                {
                    var block = ParseBlock(parser);
                    var branch = new SwitchExpression.Branch(conditions, block);
                    branches.Add(branch);
                    continue;
                }

                if (parser.MatchAndTake(TokenType.Default))
                {
                    parser.Take(TokenType.Colon);

                    var block = ParseBlock(parser);
                    defaultBlock = block;
                    break;
                }

                var errorToken = parser.Peek();
                throw new MondCompilerException(errorToken.FileName, errorToken.Line, "Expected Case or Default but got {0}", errorToken.Type);
            }

            parser.Take(TokenType.RightBrace);

            return new SwitchExpression(token, expression, branches, defaultBlock);
        }
Beispiel #3
0
        public Expression Parse(Parser parser, Token token, out bool trailingSemicolon)
        {
            trailingSemicolon = false;

            parser.Take(TokenType.LeftParen);

            var expression = parser.ParseExpession();

            parser.Take(TokenType.RightParen);
            parser.Take(TokenType.LeftBrace);

            var             branches     = new List <SwitchExpression.Branch>();
            BlockExpression defaultBlock = null;

            while (!parser.Match(TokenType.RightBrace))
            {
                var conditions = new List <Expression>();

                while (parser.MatchAndTake(TokenType.Case))
                {
                    var condition = parser.ParseExpession();
                    conditions.Add(condition);

                    parser.Take(TokenType.Colon);
                }

                if (conditions.Count > 0)
                {
                    var block  = ParseBlock(parser);
                    var branch = new SwitchExpression.Branch(conditions, block);
                    branches.Add(branch);
                    continue;
                }

                if (parser.MatchAndTake(TokenType.Default))
                {
                    parser.Take(TokenType.Colon);

                    var block = ParseBlock(parser);
                    defaultBlock = block;
                    break;
                }

                var errorToken = parser.Peek();
                throw new MondCompilerException(errorToken.FileName, errorToken.Line, CompilerError.ExpectedButFound2, TokenType.Case, TokenType.Default, errorToken);
            }

            parser.Take(TokenType.RightBrace);

            return(new SwitchExpression(token, expression, branches, defaultBlock));
        }
Beispiel #4
0
        public Expression Parse(Parser parser, Token token, out bool trailingSemicolon)
        {
            trailingSemicolon = false;

            parser.Take(TokenType.LeftParen);

            var expression = parser.ParseExpression();

            parser.Take(TokenType.RightParen);
            parser.Take(TokenType.LeftBrace);

            var hasDefault = false;
            var branches   = new List <SwitchExpression.Branch>();

            while (!parser.Match(TokenType.RightBrace))
            {
                var conditions = new List <Expression>();

                while (true)
                {
                    if (parser.MatchAndTake(TokenType.Case))
                    {
                        var condition = parser.ParseExpression();
                        conditions.Add(condition);

                        parser.Take(TokenType.Colon);
                        continue;
                    }

                    if (!parser.Match(TokenType.Default))
                    {
                        break;
                    }

                    var defaultToken = parser.Take(TokenType.Default);

                    if (hasDefault)
                    {
                        throw new MondCompilerException(defaultToken, CompilerError.DuplicateDefault);
                    }

                    conditions.Add(null); // special default condition
                    hasDefault = true;

                    parser.Take(TokenType.Colon);
                }

                if (conditions.Count > 0)
                {
                    var block  = ParseBlock(parser);
                    var branch = new SwitchExpression.Branch(conditions, block);
                    branches.Add(branch);
                    continue;
                }

                var errorToken = parser.Peek();
                throw new MondCompilerException(errorToken, CompilerError.ExpectedButFound2, TokenType.Case, TokenType.Default, errorToken);
            }

            parser.Take(TokenType.RightBrace);

            return(new SwitchExpression(token, expression, branches));
        }