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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }
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); }