Пример #1
0
        private bool ParseAssignStmt(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int startAssignStmt = builder.Mark();

            if (!ParseVariableTypecast(builder))
            {
                if (builder.GetTokenType() != SpringTokenType.IDENTIFIER)
                {
                    builder.RollbackTo(startAssignStmt);
                    return(false);
                }

                builder.AdvanceLexer();
            }

            SkipWhitespace(builder);

            if (builder.GetTokenType() != SpringTokenType.ASSGN)
            {
                builder.RollbackTo(startAssignStmt);
                return(false);
            }

            builder.AdvanceLexer();
            SkipWhitespace(builder);

            if (!ParseExpression(builder))
            {
                builder.Error("Expected EXPRESSION");
            }
            builder.Done(startAssignStmt, SpringCompositeNodeType.ASSGN_STMT, null);
            SkipWhitespace(builder);
            return(true);
        }
Пример #2
0
        private bool ParseCompoundStmt(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int startCompoundStmt = builder.Mark();

            if (builder.GetTokenType() != SpringTokenType.BEGIN)
            {
                builder.RollbackTo(startCompoundStmt);
                return(false);
            }

            builder.AdvanceLexer();
            if (!ParseStmtList(builder))
            {
                builder.Error("Expected STATEMENT");
            }

            if (builder.GetTokenType() != SpringTokenType.END)
            {
                builder.Error("Expected \"end\"");
            }
            else
            {
                builder.AdvanceLexer();
            }

            builder.Done(startCompoundStmt, SpringCompositeNodeType.COMPOUND_STMT, null);
            SkipWhitespace(builder);
            return(true);
        }
Пример #3
0
        private bool ParseExpression(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int  startExpr = builder.Mark();
            bool res       = ParseSimpleExpression(builder);

            if (!res)
            {
                // builder.Error("Expected Expression");
                builder.RollbackTo(startExpr);
                return(false);
            }
            else
            {
                while (builder.GetTokenType() == SpringTokenType.REL_OPS)
                {
                    builder.AdvanceLexer();
                    if (!ParseSimpleExpression(builder))
                    {
                        builder.Error("Expected SIMPLE EXPRESSION");
                        break;
                    }
                }
            }
            builder.Done(startExpr, SpringCompositeNodeType.EXPR, null);
            SkipWhitespace(builder);
            return(res);
        }
Пример #4
0
        private bool ParseValueTypecast(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int start = builder.Mark();

            if (builder.GetTokenType() != SpringTokenType.IDENTIFIER) // Type
            {
                builder.RollbackTo(start);
                return(false);
            }

            builder.AdvanceLexer();

            if (builder.GetTokenType() != SpringTokenType.LBRACKET)
            {
                builder.RollbackTo(start);
                return(false);
            }

            builder.AdvanceLexer();

            if (!ParseExpression(builder))
            {
                builder.RollbackTo(start);
                return(false);
            }

            builder.AdvanceLexer();

            if (builder.GetTokenType() != SpringTokenType.RBRACKET)
            {
                builder.RollbackTo(start);
                return(false);
            }

            builder.AdvanceLexer();
            builder.Done(start, SpringCompositeNodeType.VAL_TYPECAST, null);
            return(true);
        }
Пример #5
0
        private bool ParseForStmt(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int startForStmt = builder.Mark();

            if (builder.GetTokenType() != SpringTokenType.FOR)
            {
                builder.RollbackTo(startForStmt);
                return(false);
            }

            builder.AdvanceLexer();
            if (!ParseAssignStmt(builder))
            {
                builder.Error("Expected variable declaration");
            }

            SkipWhitespace(builder);
            if (builder.GetTokenType() != SpringTokenType.CYCLE_DIR)
            {
                builder.Error("expected 'to' or 'downto'");
            }
            else
            {
                builder.AdvanceLexer();
            }

            if (!ParseExpression(builder))
            {
                builder.Error("Expected EXPRESSION");
            }

            SkipWhitespace(builder);
            if (builder.GetTokenType() != SpringTokenType.DO)
            {
                builder.Error("expected 'do'");
            }
            else
            {
                builder.AdvanceLexer();
            }

            if (!ParseStatement(builder))
            {
                builder.Error("expected STATEMENT");
            }

            builder.Done(startForStmt, SpringCompositeNodeType.FOR_STMT, null);
            SkipWhitespace(builder);
            return(true);
        }
Пример #6
0
        private bool ParseFunctionCall(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int startFuncCall = builder.Mark();

            if (builder.GetTokenType() != SpringTokenType.IDENTIFIER)
            {
                // throw new Exception("NOT AN IDENTIFIER");
                builder.RollbackTo(startFuncCall);
                return(false);
            }

            builder.AdvanceLexer();
            if (builder.GetTokenType() != SpringTokenType.LBRACKET)
            {
                builder.Done(startFuncCall, SpringCompositeNodeType.FUNC_CALL, null);
                return(true);
                // builder.RollbackTo(startFuncCall);
                // return false;
            }

            builder.AdvanceLexer();
            SkipWhitespace(builder);

            if (ParseExpression(builder))
            {
                while (builder.GetTokenType() == SpringTokenType.COMMA)
                {
                    builder.AdvanceLexer();
                    if (!ParseExpression(builder))
                    {
                        builder.Error("Expected EXPRESSION");
                        break;
                    }
                }
            }

            if (builder.GetTokenType() != SpringTokenType.RBRACKET)
            {
                builder.Error("Expected )");
            }
            else
            {
                builder.AdvanceLexer();
            }

            builder.Done(startFuncCall, SpringCompositeNodeType.FUNC_CALL, null);
            SkipWhitespace(builder);
            return(true);
        }
Пример #7
0
        private bool ParseSimpleStatement(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int startSimpleStatement = builder.Mark();

            if (!ParseAssignStmt(builder) && !ParseFunctionCall(builder))
            {
                builder.RollbackTo(startSimpleStatement);
                return(false);
            }
            builder.Done(startSimpleStatement, SpringCompositeNodeType.SIMPLE_STMT, null);
            SkipWhitespace(builder);
            return(true);
        }
Пример #8
0
        private bool ParseConditionalStatement(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int startCondStmt = builder.Mark();

            if (!ParseIfStmt(builder) && !ParseCaseStmt(builder))
            {
                builder.RollbackTo(startCondStmt);
                return(false);
            }
            builder.Done(startCondStmt, SpringCompositeNodeType.COND_STMT, null);
            SkipWhitespace(builder);
            return(true);
        }
Пример #9
0
        private bool ParseRepetitiveStatement(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int startRepStmt = builder.Mark();

            if (!ParseForInStmt(builder) &&
                !ParseForStmt(builder) &&
                !ParseWhileStmt(builder) &&
                !ParseRepeatStatement(builder))
            {
                builder.RollbackTo(startRepStmt);
                return(false);
            }
            builder.Done(startRepStmt, SpringCompositeNodeType.REP_STMT, null);
            SkipWhitespace(builder);
            return(true);
        }
Пример #10
0
        private bool ParseStructuredStatement(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int startStructuredStatement = builder.Mark();

            if (!ParseCompoundStmt(builder) &&
                !ParseConditionalStatement(builder) &&
                !ParseRepetitiveStatement(builder) &&
                !ParseWithStmt(builder))
            {
                builder.RollbackTo(startStructuredStatement);
                return(false);
            }
            builder.Done(startStructuredStatement, SpringCompositeNodeType.STRUCT_STMT, null);
            SkipWhitespace(builder);
            return(true);
        }
Пример #11
0
        private bool ParseStatement(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int startStatement = builder.Mark();

            if (!ParseSimpleStatement(builder))
            {
                if (!ParseStructuredStatement(builder))
                {
                    builder.RollbackTo(startStatement);
                    return(false);
                }
            }
            builder.Done(startStatement, SpringCompositeNodeType.STMT, null);
            SkipWhitespace(builder);
            return(true);
        }
Пример #12
0
        private bool ParseIfStmt(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int startIfStmt = builder.Mark();

            if (builder.GetTokenType() != SpringTokenType.IF)
            {
                builder.RollbackTo(startIfStmt);
                return(false);
            }

            builder.AdvanceLexer();
            if (!ParseExpression(builder))
            {
                builder.Error("Expected EXPRESSION");
            }

            if (builder.GetTokenType() != SpringTokenType.THEN)
            {
                builder.Error("Expected then");
            }
            else
            {
                builder.AdvanceLexer();
            }

            if (!ParseStatement(builder))
            {
                builder.Error("Expected STATEMENT");
            }

            if (builder.GetTokenType() == SpringTokenType.ELSE)
            {
                builder.AdvanceLexer();
                if (!ParseStatement(builder))
                {
                    builder.Error("Expected STATEMENT");
                }
            }

            builder.Done(startIfStmt, SpringCompositeNodeType.IF_STMT, null);
            SkipWhitespace(builder);
            return(true);
        }
Пример #13
0
        private bool ParseWhileStmt(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int startWhile = builder.Mark();

            if (builder.GetTokenType() != SpringTokenType.WHILE)
            {
                builder.RollbackTo(startWhile);
                return(false);
            }

            builder.AdvanceLexer();
            SkipWhitespace(builder);
            if (!ParseExpression(builder))
            {
                builder.Error("expected EXPR");
            }

            SkipWhitespace(builder);
            if (builder.GetTokenType() != SpringTokenType.DO)
            {
                builder.Error("expected 'do'");
            }
            else
            {
                builder.AdvanceLexer();
            }

            SkipWhitespace(builder);
            if (!ParseStatement(builder))
            {
                builder.Error("expected STMT");
            }

            builder.Done(startWhile, SpringCompositeNodeType.WHILE_STMT, null);
            SkipWhitespace(builder);
            return(true);
        }
Пример #14
0
        private bool ParseCaseStmt(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int startCaseStmt = builder.Mark();

            if (builder.GetTokenType() != SpringTokenType.CASE)
            {
                builder.RollbackTo(startCaseStmt);
                return(false);
            }

            builder.AdvanceLexer();
            SkipWhitespace(builder);
            if (!ParseExpression(builder))
            {
                builder.Error("Expected EXPR");
            }

            if (builder.GetTokenType() != SpringTokenType.OF)
            {
                builder.Error("expected 'of'");
            }
            else
            {
                builder.AdvanceLexer();
            }

            ParseCase(builder);
            while (builder.GetTokenType() == SpringTokenType.SEMICOLON)
            {
                builder.AdvanceLexer();
                if (ParseCase(builder))
                {
                    continue;
                }
                break;
            }

            if (builder.GetTokenType() == SpringTokenType.ELSE || builder.GetTokenType() == SpringTokenType.OTHERWISE)
            {
                builder.AdvanceLexer();
                if (!ParseStmtList(builder))
                {
                    builder.Error("Expected STMT");
                }
            }

            if (builder.GetTokenType() == SpringTokenType.SEMICOLON)
            {
                builder.AdvanceLexer();
            }

            if (builder.GetTokenType() != SpringTokenType.END)
            {
                builder.Error("expected 'end");
            }
            else
            {
                builder.AdvanceLexer();
            }
            builder.Done(startCaseStmt, SpringCompositeNodeType.CASE_STMT, null);
            SkipWhitespace(builder);
            return(true);
        }
Пример #15
0
        private bool ParseForInStmt(PsiBuilder builder)
        {
            SkipWhitespace(builder);
            int mark = builder.Mark();

            if (builder.GetTokenType() != SpringTokenType.FOR)
            {
                builder.RollbackTo(mark);
                return(false);
            }

            builder.AdvanceLexer();
            SkipWhitespace(builder);
            if (builder.GetTokenType() != SpringTokenType.IDENTIFIER) // Control variable
            {
                builder.RollbackTo(mark);
                return(false);
            }

            builder.AdvanceLexer();
            SkipWhitespace(builder);

            if (builder.GetTokenType() != SpringTokenType.IN)
            {
                builder.RollbackTo(mark);
                return(false);
            }

            builder.AdvanceLexer();
            SkipWhitespace(builder);

            if (!ParseExpression(builder))
            {
                if (builder.GetTokenType() != SpringTokenType.IDENTIFIER)
                {
                    builder.Error("Expected ENUMERABLE");
                }
                else
                {
                    builder.AdvanceLexer();
                    SkipWhitespace(builder);
                }
            }

            if (builder.GetTokenType() != SpringTokenType.DO)
            {
                builder.Error("Expected 'do'");
            }
            else
            {
                builder.AdvanceLexer();
            }

            if (!ParseStatement(builder))
            {
                builder.Error("Expected STMT");
            }

            builder.Done(mark, SpringCompositeNodeType.FOR_IN_STMT, null);
            SkipWhitespace(builder);
            return(true);
        }
Пример #16
0
        private bool ParseIdent(PsiBuilder builder)
        {
            var start = builder.Mark();

            if (builder.GetTokenType() == SpringTokenType.READ)
            {
                AdvanceWithSpaces(builder);

                if (builder.GetTokenType() != SpringTokenType.LBRACKET)
                {
                    builder.RollbackTo(start);
                    builder.Error("Missing '('");
                    return(false);
                }

                AdvanceWithSpaces(builder);

                if (builder.GetTokenType() != SpringTokenType.RBRACKET)
                {
                    builder.RollbackTo(start);
                    builder.Error("Missing ')'");
                    return(false);
                }

                AdvanceWithSpaces(builder);

                builder.DoneBeforeWhitespaces(start, SpringCompositeNodeType.READ, null);
                return(true);
            }

            if (builder.GetTokenType() == SpringTokenType.NUMBER)
            {
                AdvanceWithSpaces(builder);
                builder.Done(start, SpringCompositeNodeType.NUMBER, null);
                return(true);
            }

            if (builder.GetTokenType() == SpringTokenType.IDENT)
            {
                AdvanceWithSpaces(builder);
                builder.DoneBeforeWhitespaces(start, SpringCompositeNodeType.VARIABLE, null);
                return(true);
            }

            if (builder.GetTokenType() == SpringTokenType.STRING)
            {
                AdvanceWithSpaces(builder);
                builder.DoneBeforeWhitespaces(start, SpringCompositeNodeType.STRING, null);
                return(true);
            }

            if (builder.GetTokenType() == SpringTokenType.LBRACKET)
            {
                AdvanceWithSpaces(builder);

                if (!ParseLogic(builder))
                {
                    builder.RollbackTo(start);
                    return(false);
                }

                if (builder.GetTokenType() != SpringTokenType.RBRACKET)
                {
                    builder.RollbackTo(start);
                    builder.Error("Missing ')'");
                    return(false);
                }

                AdvanceWithSpaces(builder);
                builder.Drop(start);
                return(true);
            }

            builder.Drop(start);
            builder.Error("Not ident");
            return(false);
        }
Пример #17
0
        private bool ParseStmt(PsiBuilder builder)
        {
            var start = builder.Mark();

            if (builder.GetTokenType() == SpringTokenType.IF)
            {
                AdvanceWithSpaces(builder);

                if (builder.GetTokenType() != SpringTokenType.LBRACKET)
                {
                    builder.Drop(start);
                    builder.Error("Missing '('");
                    return(false);
                }

                AdvanceWithSpaces(builder);

                if (!ParseLogic(builder))
                {
                    builder.Drop(start);
                    return(false);
                }

                if (builder.GetTokenType() != SpringTokenType.RBRACKET)
                {
                    builder.Drop(start);
                    builder.Error("Missing ')'");
                    return(false);
                }

                AdvanceWithSpaces(builder);

                if (builder.GetTokenType() != SpringTokenType.LFBRACKET)
                {
                    builder.Drop(start);
                    builder.Error("Missing '{'");
                    return(false);
                }

                AdvanceWithSpaces(builder);

                if (!ParseSeq(builder))
                {
                    builder.Drop(start);
                    return(false);
                }

                if (builder.GetTokenType() != SpringTokenType.RFBRACKET)
                {
                    builder.Drop(start);
                    builder.Error("Missing '}'");
                    return(false);
                }

                AdvanceWithSpaces(builder);

                if (builder.GetTokenType() == SpringTokenType.ELSE)
                {
                    AdvanceWithSpaces(builder);

                    if (builder.GetTokenType() != SpringTokenType.LFBRACKET)
                    {
                        builder.Drop(start);
                        builder.Error("Missing '{'");
                        return(false);
                    }

                    AdvanceWithSpaces(builder);

                    if (!ParseSeq(builder))
                    {
                        builder.Drop(start);
                        return(false);
                    }

                    if (builder.GetTokenType() != SpringTokenType.RFBRACKET)
                    {
                        builder.Drop(start);
                        builder.Error("Missing '}'");
                        return(false);
                    }

                    AdvanceWithSpaces(builder);
                }
                builder.DoneBeforeWhitespaces(start, SpringCompositeNodeType.IF, null);
                return(true);
            }

            if (builder.GetTokenType() == SpringTokenType.FOR)
            {
                AdvanceWithSpaces(builder);

                if (builder.GetTokenType() != SpringTokenType.LBRACKET)
                {
                    builder.Drop(start);
                    builder.Error("Missing '('");
                    return(false);
                }

                AdvanceWithSpaces(builder);

                if (!ParseAssign(builder))
                {
                    builder.Drop(start);
                    return(false);
                }

                if (builder.GetTokenType() != SpringTokenType.SEQ)
                {
                    builder.Drop(start);
                    builder.Error("Missing ';'");
                    return(false);
                }

                AdvanceWithSpaces(builder);

                if (!ParseLogic(builder))
                {
                    builder.Drop(start);
                    return(false);
                }

                if (builder.GetTokenType() != SpringTokenType.SEQ)
                {
                    builder.Drop(start);
                    builder.Error("Missing ';'");
                    return(false);
                }

                AdvanceWithSpaces(builder);

                if (!ParseAssign(builder))
                {
                    builder.Drop(start);
                    return(false);
                }

                if (builder.GetTokenType() != SpringTokenType.RBRACKET)
                {
                    builder.Drop(start);
                    builder.Error("Missing ')'");
                    return(false);
                }

                AdvanceWithSpaces(builder);

                if (builder.GetTokenType() != SpringTokenType.LFBRACKET)
                {
                    builder.Drop(start);
                    builder.Error("Missing '{'");
                    return(false);
                }

                AdvanceWithSpaces(builder);

                if (!ParseSeq(builder))
                {
                    builder.Drop(start);
                    return(false);
                }

                if (builder.GetTokenType() != SpringTokenType.RFBRACKET)
                {
                    builder.Drop(start);
                    builder.Error("Missing '}'");
                    return(false);
                }

                AdvanceWithSpaces(builder);
                builder.DoneBeforeWhitespaces(start, SpringCompositeNodeType.FOR, null);
                return(true);
            }

            if (builder.GetTokenType() == SpringTokenType.WRITE)
            {
                AdvanceWithSpaces(builder);

                if (builder.GetTokenType() != SpringTokenType.LBRACKET)
                {
                    builder.RollbackTo(start);
                    builder.Error("Missing '('");
                    return(false);
                }

                AdvanceWithSpaces(builder);

                if (!ParseLogic(builder))
                {
                    builder.Drop(start);
                    return(false);
                }

                if (builder.GetTokenType() != SpringTokenType.RBRACKET)
                {
                    builder.RollbackTo(start);
                    builder.Error("Missing ')'");
                    return(false);
                }

                AdvanceWithSpaces(builder);

                builder.DoneBeforeWhitespaces(start, SpringCompositeNodeType.WRITE, null);

                if (builder.GetTokenType() != SpringTokenType.SEQ)
                {
                    builder.Error("Missing ';'");
                    return(false);
                }

                AdvanceWithSpaces(builder);
                return(true);
            }

            if (!ParseAssign(builder))
            {
                builder.Drop(start);
                return(false);
            }

            if (builder.GetTokenType() != SpringTokenType.SEQ)
            {
                builder.Drop(start);
                builder.Error("Missing ';'");
                return(false);
            }

            AdvanceWithSpaces(builder);
            builder.Drop(start);
            return(true);
        }
Пример #18
0
        private bool ParseBooleanPrimary()
        {
            if (builder.GetTokenType() == SpringTokenType.LOGICAL_CONST)
            {
                AdvanceLexerSkipNonsemantical();
                return(true);
            }

            // try to parse relation
            {
                var beforeRelationMark = builder.Mark();
                if (!ParseArithExpr())
                {
                    builder.RollbackTo(beforeRelationMark);
                }
                else if (builder.GetTokenType() != SpringTokenType.REL_OP)
                {
                    builder.RollbackTo(beforeRelationMark);
                }
                else
                {
                    AdvanceLexerSkipNonsemantical();
                    if (!ParseArithExpr())
                    {
                        builder.Error("An arithmetic expression expected");
                    }
                    builder.DoneBeforeWhitespaces(beforeRelationMark, SpringCompositeNodeType.RELATION, null);
                    return(true);
                }
            }

            if (builder.GetTokenType() == SpringTokenType.IDENTIFIER)
            {
                var start = builder.Mark();
                AdvanceLexerSkipNonsemantical();

                if (builder.GetTokenType() == SpringTokenType.ROUND_LBRACE)
                {
                    var paramsListMark = builder.Mark();
                    AdvanceLexerSkipNonsemantical();
                    if (!ParseNonemptyList(tt => tt == SpringTokenType.COMMA, ParseActualParam, "An actual parameter expected"))
                    {
                        builder.Error("An actual parameter expected");
                    }

                    if (builder.GetTokenType() != SpringTokenType.ROUND_RBRACE)
                    {
                        builder.Error("A closing bracket expected");
                    }
                    else
                    {
                        AdvanceLexerSkipNonsemantical();
                    }

                    builder.DoneBeforeWhitespaces(paramsListMark, SpringCompositeNodeType.ACTUAL_PARAM_LIST, null);
                    builder.DoneBeforeWhitespaces(start, SpringCompositeNodeType.FUNC_APP, null);
                }
                else
                {
                    builder.DoneBeforeWhitespaces(start, SpringCompositeNodeType.VAR, null);
                }

                return(true);
            }

            if (builder.GetTokenType() == SpringTokenType.ROUND_LBRACE)
            {
                var start = builder.Mark();
                AdvanceLexerSkipNonsemantical();

                if (!ParseBooleanExpr())
                {
                    builder.Error("An inner boolean expression expected");
                }

                if (builder.GetTokenType() != SpringTokenType.ROUND_RBRACE)
                {
                    builder.Error("A closing bracket expected");
                }
                else
                {
                    AdvanceLexerSkipNonsemantical();
                }

                builder.DoneBeforeWhitespaces(start, SpringCompositeNodeType.INNER_EXPR, null);
                return(true);
            }

            return(false);
        }