Exemple #1
0
        private ASTStatementBase ParseWhile()
        {
            Require(TokenType.WHILE);
            Require(TokenType.LEFT_PARENTHESIS);

            ASTExpressionBase condition = ParseExpression();

            Require(TokenType.RIGHT_PARENTHESIS);

            _loopLevel++;
            ASTStatementBase body = ParseStatement();

            _loopLevel--;

            return(new ASTWhile(condition, body));
        }
Exemple #2
0
        private void DeclareFunction(List <ASTFunctionBase> functionDeclarations)
        {
            var name      = Require(TokenType.IDENTIFIER).Text;
            var baseClass = "";

            if (Match(TokenType.DOUBLE_COLON))
            {
                Consume();

                baseClass = Require(TokenType.IDENTIFIER).Text;
                var tmp = baseClass;
                baseClass = name;
                name      = tmp;
            }

            Require(TokenType.LEFT_PARENTHESIS);
            List <string> arguments = new List <string>();

            while (!Match(TokenType.RIGHT_PARENTHESIS))
            {
                arguments.Add(Require(TokenType.IDENTIFIER).Text);

                if (Match(TokenType.COMMA))
                {
                    Consume();

                    if (!Match(TokenType.IDENTIFIER))
                    {
                        throw new ParserException($"Argument name is expected following a comma.", _lexer.Line, _lexer.Character);
                    }
                }
            }

            Require(TokenType.RIGHT_PARENTHESIS);

            ASTStatementBase body = ParseBlock();

            if (baseClass.Length != 0)
            {
                functionDeclarations.Add(new ASTMemberFunction(name, baseClass, arguments, body));
            }
            else
            {
                functionDeclarations.Add(new ASTGlobalFunction(name, arguments, body));
            }
        }
Exemple #3
0
        private ASTStatementBase ParseFor()
        {
            Require(TokenType.FOR);
            Require(TokenType.LEFT_PARENTHESIS);

            ASTExpressionBase initializer = ParseExpression();

            Require(TokenType.SEMICOLON);

            ASTExpressionBase condition = ParseExpression();

            Require(TokenType.SEMICOLON);

            ASTExpressionBase incrementer = ParseExpression();

            Require(TokenType.RIGHT_PARENTHESIS);

            _loopLevel++;
            ASTStatementBase body = ParseStatement();

            _loopLevel--;

            return(new ASTFor(initializer, condition, incrementer, body));
        }
Exemple #4
0
        private ASTStatementBase ParseIf()
        {
            Require(TokenType.IF);
            Require(TokenType.LEFT_PARENTHESIS);

            ASTExpressionBase condition = ParseExpression();

            Require(TokenType.RIGHT_PARENTHESIS);

            ASTStatementBase ifPart   = ParseStatement();
            ASTStatementBase elsePart = null;

            if (Match(TokenType.ELSE))
            {
                Consume();
                elsePart = ParseStatement();
            }

            if (elsePart == null)
            {
                return(new ASTIf(condition, ifPart));
            }
            return(new ASTIf(condition, ifPart, elsePart));
        }