Exemplo n.º 1
0
        public Declaration Parse(LoonyParser parser, LoonyToken token)
        {
            var start = token;

            var      name       = parser.Take(LoonyTokenType.Identifier);
            var      parameters = new List <FuncDeclaration.Parameter>();
            TypeBase returnType = null;

            parser.Take(LoonyTokenType.LeftParen);

            if (!parser.MatchAndTake(LoonyTokenType.RightParen))
            {
                do
                {
                    var paramName = parser.Take(LoonyTokenType.Identifier);
                    parser.Take(LoonyTokenType.Colon);
                    var paramType = parser.ParseType();

                    parameters.Add(new FuncDeclaration.Parameter(paramName, paramType));
                } while (parser.MatchAndTake(LoonyTokenType.Comma));

                parser.Take(LoonyTokenType.RightParen);
            }

            if (parser.MatchAndTake(LoonyTokenType.Colon))
            {
                returnType = parser.ParseType();
            }

            var body = parser.ParseBlock(false);

            var end = parser.Previous;

            return(new FuncDeclaration(start, end, name, parameters, returnType, body));
        }
Exemplo n.º 2
0
        private static TypeBase Parse(string type)
        {
            var lexer  = new LoonyLexer(type);
            var parser = new LoonyParser(lexer);

            return(parser.ParseType());
        }
Exemplo n.º 3
0
        public Statement Parse(LoonyParser parser, LoonyToken token, out bool trailingSemicolon)
        {
            trailingSemicolon = true;

            var value = parser.ParseExpression();
            return new ReturnStatement(token, parser.Previous, value);
        }
Exemplo n.º 4
0
        public Statement Parse(LoonyParser parser, LoonyToken token, out bool trailingSemicolon)
        {
            trailingSemicolon = true;

            var        name        = parser.Take(LoonyTokenType.Identifier).Contents;
            TypeBase   type        = null;
            Expression initializer = null;

            if (parser.MatchAndTake(LoonyTokenType.Colon))
            {
                type = parser.ParseType();
            }

            if (type == null)
            {
                parser.Take(LoonyTokenType.Assign);
                initializer = parser.ParseExpression();
            }
            else if (parser.MatchAndTake(LoonyTokenType.Assign))
            {
                initializer = parser.ParseExpression();
            }

            return(new VariableStatement(token, parser.Previous, name, type, initializer));
        }
Exemplo n.º 5
0
        public Expression Parse(LoonyParser parser, LoonyToken token)
        {
            var expression = parser.ParseExpression();

            parser.Take(LoonyTokenType.RightParen);
            return(expression);
        }
Exemplo n.º 6
0
        public Declaration Parse(LoonyParser parser, LoonyToken token)
        {
            var start = token;

            var name = parser.Take(LoonyTokenType.Identifier);
            var parameters = new List<FuncDeclaration.Parameter>();
            TypeBase returnType = null;

            parser.Take(LoonyTokenType.LeftParen);

            if (!parser.MatchAndTake(LoonyTokenType.RightParen))
            {
                do
                {
                    var paramName = parser.Take(LoonyTokenType.Identifier);
                    parser.Take(LoonyTokenType.Colon);
                    var paramType = parser.ParseType();

                    parameters.Add(new FuncDeclaration.Parameter(paramName, paramType));
                } while (parser.MatchAndTake(LoonyTokenType.Comma));

                parser.Take(LoonyTokenType.RightParen);
            }

            if (parser.MatchAndTake(LoonyTokenType.Colon))
                returnType = parser.ParseType();

            var body = parser.ParseBlock(false);

            var end = parser.Previous;

            return new FuncDeclaration(start, end, name, parameters, returnType, body);
        }
Exemplo n.º 7
0
        public Statement Parse(LoonyParser parser, LoonyToken token, out bool trailingSemicolon)
        {
            trailingSemicolon = true;

            var value = parser.ParseExpression();

            return(new ReturnStatement(token, parser.Previous, value));
        }
Exemplo n.º 8
0
        static void Main()
        {
            const string source = @"
                func main(argc: int, argv: **char): int
                {
                    var x = 10 + (20 * 30 ^ 40 * 50);
                    return x * 3 + 1;
                }
            ";

            Console.WriteLine("-- Source --");
            Console.WriteLine(source);
            Console.WriteLine();

            var lexer  = new LoonyLexer(source);
            var parser = new LoonyParser(lexer);

            var document = parser.ParseAll();

            Console.WriteLine("-- AST --");
            var printer = new AstPrintVisitor(Console.Out);

            printer.Visit(document);
            Console.WriteLine();
            Console.WriteLine();

            /*var simplify = new AstSimplifyTransform();
             * document = simplify.Visit(document);
             *
             * Console.WriteLine("-- Simplified AST --");
             * printer.Visit(document);
             * Console.WriteLine();
             * Console.WriteLine();*/

            Console.WriteLine("-- Assembly --");
            var assembler = new Assembler();
            var compiler  = new AstCompileVisitor(assembler);

            compiler.Visit(document);

            assembler.Compile(Console.Out);

            Console.ReadLine();
        }
Exemplo n.º 9
0
        public Statement Parse(LoonyParser parser, LoonyToken token, out bool trailingSemicolon)
        {
            trailingSemicolon = true;

            var name = parser.Take(LoonyTokenType.Identifier).Contents;
            TypeBase type = null;
            Expression initializer = null;

            if (parser.MatchAndTake(LoonyTokenType.Colon))
                type = parser.ParseType();

            if (type == null)
            {
                parser.Take(LoonyTokenType.Assign);
                initializer = parser.ParseExpression();
            }
            else if (parser.MatchAndTake(LoonyTokenType.Assign))
            {
                initializer = parser.ParseExpression();
            }

            return new VariableStatement(token, parser.Previous, name, type, initializer);
        }
Exemplo n.º 10
0
        public Expression Parse(LoonyParser parser, LoonyToken token)
        {
            var value = int.Parse(token.Contents);

            return(new NumberExpression(token, value));
        }
Exemplo n.º 11
0
 public Expression Parse(LoonyParser parser, LoonyToken token)
 {
     var value = int.Parse(token.Contents);
     return new NumberExpression(token, value);
 }
Exemplo n.º 12
0
 public Expression Parse(LoonyParser parser, Expression left, LoonyToken token)
 {
     var right = parser.ParseExpression(Precedence - (_isRight ? 1 : 0));
     return new BinaryOperatorExpression(token, left, right);
 }
Exemplo n.º 13
0
 public Expression Parse(LoonyParser parser, LoonyToken token)
 {
     return(new IdentifierExpression(token, token.Contents));
 }
Exemplo n.º 14
0
 public Expression Parse(LoonyParser parser, LoonyToken token)
 {
     return new IdentifierExpression(token, token.Contents);
 }
Exemplo n.º 15
0
 public Expression Parse(LoonyParser parser, LoonyToken token)
 {
     var expression = parser.ParseExpression();
     parser.Take(LoonyTokenType.RightParen);
     return expression;
 }
Exemplo n.º 16
0
        public Expression Parse(LoonyParser parser, Expression left, LoonyToken token)
        {
            var right = parser.ParseExpression(Precedence - (_isRight ? 1 : 0));

            return(new BinaryOperatorExpression(token, left, right));
        }