Esempio n. 1
0
        public Statement Parse(ScriptParser parser, ScriptToken token, out bool trailingSemicolon)
        {
            trailingSemicolon = true;

            var baseType = parser.ParseType(token);

            var definitions = parser.ParseSeparatedBy(ScriptTokenType.Comma, (_, first) =>
            {
                var name = parser.Take(ScriptTokenType.Identifier).Contents;

                var arrayDims = 0;
                while (parser.MatchAndTake(ScriptTokenType.LeftSquare))
                {
                    parser.Take(ScriptTokenType.RightSquare);
                    arrayDims++;
                }

                var type = baseType;

                if (arrayDims > 0)
                {
                    type = new ScriptType(baseType.Name, baseType.ArrayDimensions + arrayDims, baseType.IsResizable);
                }

                Expression value = null;
                if (parser.MatchAndTake(ScriptTokenType.Assign))
                {
                    value = parser.ParseExpression();
                }

                return(new VariableStatement.Definition(type, name, value));
            }).ToList();

            return(new VariableStatement(token, parser.Previous, baseType, false, definitions));
        }
Esempio n. 2
0
        public Expression Parse(ScriptParser parser, ScriptToken token)
        {
            var type = string.Join(".", parser.ParseSeparatedBy(ScriptTokenType.Dot, (_, first) => parser.Take(ScriptTokenType.Identifier).Contents));

            if (type == "string")
            {
                type = "String";
            }

            var isArray = parser.Match(ScriptTokenType.LeftSquare);

            parser.Take(isArray ? ScriptTokenType.LeftSquare : ScriptTokenType.LeftParen);

            var parameters = parser.ParseSeparatedBy(ScriptTokenType.Comma, (_, first) =>
            {
                if (first && parser.Match(isArray ? ScriptTokenType.RightSquare : ScriptTokenType.RightParen))
                {
                    return(null);
                }

                return(parser.ParseExpression());
            }).ToList();

            parser.Take(isArray ? ScriptTokenType.RightSquare : ScriptTokenType.RightParen);

            List <Expression> values = null;

            if (isArray && parser.MatchAndTake(ScriptTokenType.LeftBrace))
            {
                values = parser.ParseSeparatedBy(ScriptTokenType.Comma, (_, first) =>
                {
                    if (parser.Match(ScriptTokenType.RightBrace))
                    {
                        return(null);
                    }

                    return(parser.ParseExpression());
                }).ToList();

                parser.MatchAndTake(ScriptTokenType.RightBrace);
            }

            int arrayDimensions = isArray ? 1 : 0;

            if (isArray)
            {
                while (parser.Match(ScriptTokenType.LeftSquare) && parser.Match(ScriptTokenType.RightSquare, 1))
                {
                    parser.Take(ScriptTokenType.LeftSquare);
                    parser.Take(ScriptTokenType.RightSquare);
                    arrayDimensions++;
                }
            }

            return(new NewExpression(token, parser.Previous, type, arrayDimensions, parameters, values));
        }
Esempio n. 3
0
        public Declaration Parse(ScriptParser parser, ScriptToken token)
        {
            var done   = false;
            var tokens = parser.ParseSeparatedBy(ScriptTokenType.Dot, (_, first) =>
            {
                if (done)
                {
                    return(null);
                }

                if (parser.Match(ScriptTokenType.Multiply))
                {
                    done = true;
                    return(parser.Take(ScriptTokenType.Multiply));
                }

                return(parser.Take(ScriptTokenType.Identifier));
            });

            var name = string.Join(".", tokens.Select(t => t.Contents));

            if (!parser.MatchAndTake(ScriptTokenType.Semicolon))
            {
                Console.WriteLine("JFjngkjasnholjhnaskl");
            }

            return(new IncludeDeclaration(token, parser.Previous, name));
        }
        public Declaration Parse(ScriptParser parser, ScriptToken token)
        {
            var returnType = parser.ParseType(token);
            var name       = parser.Take(ScriptTokenType.Identifier).Contents;

            if (parser.MatchAndTake(ScriptTokenType.Assign))
            {
                var value = parser.ParseExpression();
                parser.Take(ScriptTokenType.Semicolon);

                return(new FieldDeclaration(token, parser.Previous, returnType, name, value, false, false));
            }

            parser.Take(ScriptTokenType.LeftParen);

            var parameters = parser.ParseSeparatedBy(ScriptTokenType.Comma, (_, first) =>
            {
                if (parser.Match(ScriptTokenType.RightParen))
                {
                    return(null);
                }

                ScriptType paramType;
                string paramName;
                parser.ParseNamedType(out paramType, out paramName);

                return(new MethodDeclaration.Parameter(paramType, paramName));
            }).ToList();

            parser.Take(ScriptTokenType.RightParen);

            var block = parser.ParseBlock(false);

            return(new MethodDeclaration(token, parser.Previous, returnType, name, parameters, block));
        }
Esempio n. 5
0
        public Statement Parse(ScriptParser parser, ScriptToken token, out bool trailingSemicolon)
        {
            trailingSemicolon = false;

            var first    = true;
            var branches = new List <IfStatement.Branch>();

            IfStatement.Branch defaultBranch = null;

            do
            {
                var isDefaultBranch = !first && !parser.MatchAndTake(ScriptTokenType.If);
                first = false;

                Expression condition = null;
                if (!isDefaultBranch)
                {
                    parser.Take(ScriptTokenType.LeftParen);

                    condition = parser.ParseExpression();

                    parser.Take(ScriptTokenType.RightParen);
                }

                var block  = parser.ParseBlock();
                var branch = new IfStatement.Branch(condition, block);

                if (isDefaultBranch)
                {
                    defaultBranch = branch;
                }
                else
                {
                    branches.Add(branch);
                }

                if (isDefaultBranch)
                {
                    break;
                }
            } while (parser.MatchAndTake(ScriptTokenType.Else));

            return(new IfStatement(token, parser.Previous, branches, defaultBranch));
        }
Esempio n. 6
0
        public Declaration Parse(ScriptParser parser, ScriptToken token)
        {
            var tokens = parser.ParseSeparatedBy(ScriptTokenType.Dot, (_, first) => parser.Take(ScriptTokenType.Identifier));

            var name = string.Join(".", tokens.Select(t => t.Contents));

            if (!parser.MatchAndTake(ScriptTokenType.Semicolon))
            {
                Console.WriteLine("fkshgnbkashnkhnasb");
            }

            return(new InheritsDeclaration(token, parser.Previous, name));
        }
        public Statement Parse(ScriptParser parser, ScriptToken token, out bool trailingSemicolon)
        {
            trailingSemicolon = false;

            parser.Take(ScriptTokenType.LeftParen);

            var expression = parser.ParseExpression();

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

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

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

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

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

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

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

                    if (hasDefault)
                    {
                        throw new CompilerException(defaultToken, "Multiple default labels");
                    }

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

                    parser.Take(ScriptTokenType.Colon);
                }

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

                var errorToken = parser.Peek();
                throw new CompilerException(errorToken, "Expected Case or Default but found {0}", errorToken);
            }

            parser.Take(ScriptTokenType.RightBrace);

            return(new SwitchStatement(token, parser.Previous, expression, branches));
        }