Esempio n. 1
0
        public ASTNode Parse(Token sourceToken, ParseContext context)
        {
            context.Expect(TokenType.OpenParenthesis);
            var condition = context.ParseExpression();

            context.Expect(TokenType.CloseParenthesis);

            ASTNode body = context.ParseStatement();

            return(new WhileNode(sourceToken, condition, body));
        }
        public ASTNode Parse(Token sourceToken, ParseContext context)
        {
            var id = context.ParseExpression <IdentifierNode>();

            context.Expect(TokenType.Colon);
            var type = TypeIdentifierNode.Parse(context);

            context.Expect(TokenType.Equals);
            ASTNode assignment = context.ParseExpression();

            return(new ConstDeclarationNode(sourceToken, id, type, assignment));
        }
Esempio n. 3
0
        public ASTNode Parse(Token sourceToken, ParseContext context)
        {
            context.Expect(TokenType.OpenAngleBracket);
            TypeIdentifierNode toType = TypeIdentifierNode.Parse(context);

            context.Expect(TokenType.CloseAngleBracket);

            context.Expect(TokenType.OpenParenthesis);
            ASTNode castExpr = context.ParseExpression();

            context.Expect(TokenType.CloseParenthesis);

            return(new CastNode(sourceToken, toType, castExpr));
        }
Esempio n. 4
0
        public ASTNode Parse(Token sourceToken, ParseContext context)
        {
            context.Expect(TokenType.OpenParenthesis);

            IdentifierNode identifier = new IdentifierNode(context.Expect(TokenType.Identifier));

            context.Expect(TokenType.In);
            ASTNode rangeExpr = context.ParseExpression();

            context.Expect(TokenType.CloseParenthesis);

            ASTNode body = context.ParseStatement();

            return(new ForNode(sourceToken, identifier, rangeExpr, body));
        }
Esempio n. 5
0
        public ASTNode Parse(Token sourceToken, ParseContext context)
        {
            ASTNode body      = context.ParseStatement();
            ASTNode condition = null;

            if (context.TryMatch(TokenType.While))
            {
                context.Expect(TokenType.OpenParenthesis);
                condition = context.ParseExpression();
                context.Expect(TokenType.CloseParenthesis);

                context.Expect(TokenType.Semicolon);
            }

            return(new DoNode(sourceToken, condition, body));
        }
        public static TypeIdentifierNode Parse(ParseContext context)
        {
            bool           isReference = context.TryMatch(TokenType.Ampersand);
            IdentifierNode typeID      = context.ParseExpression <IdentifierNode>();
            IdentifierNode moduleID    = null;

            if (context.TryMatch(TokenType.Dot))
            {
                moduleID = typeID;
                typeID   = context.ParseExpression <IdentifierNode>();
            }

            int pointerLevel = 0;

            while (context.TryMatch(TokenType.Asterisk))
            {
                pointerLevel++;
            }

            bool    isArray       = false;
            ASTNode arraySizeExpr = null;

            if (context.TryMatch(TokenType.OpenBracket))
            {
                isArray = true;

                if (!context.TryMatch(TokenType.CloseBracket))
                {
                    arraySizeExpr = context.ParseExpression();
                    context.Expect(TokenType.CloseBracket);
                }
            }

            return(new TypeIdentifierNode(typeID.Source, typeID, moduleID, isReference, pointerLevel, isArray, arraySizeExpr));
        }
Esempio n. 7
0
        public ASTNode Parse(ASTNode lhs, Token sourceToken, ParseContext context)
        {
            var indexer = context.ParseExpression();

            context.Expect(TokenType.CloseBracket);
            return(new IndexNode(sourceToken, lhs, indexer));
        }
Esempio n. 8
0
        public ASTNode Parse(Token sourceToken, ParseContext context)
        {
            context.Expect(TokenType.OpenParenthesis);
            var condition = context.ParseExpression();

            context.Expect(TokenType.CloseParenthesis);

            ASTNode body     = context.ParseStatement();
            ASTNode elseBody = null;

            if (context.TryMatch(TokenType.Else))
            {
                elseBody = context.ParseStatement();
            }

            return(new IfNode(sourceToken, condition, body, elseBody));
        }
Esempio n. 9
0
        public ASTNode Parse(Token sourceToken, ParseContext context)
        {
            var inner = context.ParseExpression();

            context.Expect(TokenType.CloseParenthesis);

            return(new GroupNode(sourceToken, inner));
        }
Esempio n. 10
0
        public static FunctionParameterNode Parse(ParseContext context)
        {
            // todo: support "ref"

            var id = context.ParseExpression <IdentifierNode>();

            context.Expect(TokenType.Colon);
            var type = TypeIdentifierNode.Parse(context);

            return(new FunctionParameterNode(id.Source, id, type));
        }