public override object VisitTerminal(ITerminalNode node) { if (_withLogging) { _tabs = _tabs + "\t"; PLogger.Info($"{_tabs}{PascalTokenTypes.Convert(node.Symbol.Type)}"); _tabs = _tabs.Substring(0, _tabs.Length - 1); } //Restore whitespaces that ANTLR does not produce if (node.Symbol.TokenIndex != -1) { var toLoop = node.Symbol.TokenIndex - (_prev?.Symbol.TokenIndex ?? -1) - 1; while (toLoop > 0) { if (!_psiBuilder.Eof()) { _psiBuilder.AdvanceLexer(); } toLoop--; } } if (!_psiBuilder.Eof()) { _psiBuilder.AdvanceLexer(); } _prev = node; return(null); }
public override object VisitTerminal(ITerminalNode node) { if (node.Symbol.TokenIndex != -1) { var counter = 0; while (counter < node.Symbol.TokenIndex - (previousGoodToken?.Symbol.TokenIndex ?? -1) - 1) { if (!_psiBuilder.Eof()) { _psiBuilder.AdvanceLexer(); } counter++; } } if (!_psiBuilder.Eof()) { _psiBuilder.AdvanceLexer(); } previousGoodToken = node; return(null); }
private TokenNodeType skipWhitespaces() { var resharperTokenType = Builder.GetTokenType(); if (resharperTokenType == null) { return(null); } while (resharperTokenType.IsComment || resharperTokenType.IsWhitespace || resharperTokenType == SpringTokenType.ComplexDefine || resharperTokenType == SpringTokenType.IncludeDirective || resharperTokenType == SpringTokenType.AsmBlock || resharperTokenType == SpringTokenType.LineAfterPreprocessing || resharperTokenType == SpringTokenType.LineDirective || resharperTokenType == SpringTokenType.PragmaDirective) { Builder.AdvanceLexer(); resharperTokenType = Builder.GetTokenType(); if (resharperTokenType == null) { return(null); } } return(resharperTokenType); }
private void ParseBlock(PsiBuilder builder) { while (!builder.Eof()) { var tt = builder.GetTokenType(); if (tt == SpringTokenType.LeftBrace) { var start = builder.Mark(); builder.AdvanceLexer(); ParseBlock(builder); if (builder.GetTokenType() != SpringTokenType.RightBrace) { builder.Error("Expected '}'"); } else { builder.AdvanceLexer(); } builder.Done(start, SpringCompositeNodeType.BLOCK, null); } else if (tt == SpringTokenType.RightBrace) { return; } else { builder.AdvanceLexer(); } } }
private static int?ParseRule(PsiBuilder builder, int?ruleMarker) { if (builder.GetTokenType() == GherkinTokenTypes.RULE_KEYWORD) { if (ruleMarker != null) { builder.DoneBeforeWhitespaces(ruleMarker.Value, GherkinNodeTypes.RULE, null); } ruleMarker = builder.Mark(); builder.AdvanceLexer(); if (builder.GetTokenType() == GherkinTokenTypes.COLON) { builder.AdvanceLexer(); } else { return(ruleMarker); } while (builder.GetTokenType() == GherkinTokenTypes.TEXT || builder.GetTokenType() == GherkinTokenTypes.WHITE_SPACE || builder.GetTokenType() == GherkinTokenTypes.NEW_LINE) { builder.AdvanceLexer(); } } return(ruleMarker); }
private void ParseComments(PsiBuilder builder) { while (builder.GetTokenType() == GherkinTokenTypes.COMMENT) { var commentMarker = builder.Mark(); var commentText = builder.GetTokenText(); builder.AdvanceLexer(); var match = LanguagePattern.Match(commentText); if (match.Success) { _lang = match.Groups["lang"].Value; builder.DoneBeforeWhitespaces(commentMarker, GherkinNodeTypes.LANGUAGE_COMMENT, _lang); } else { builder.Drop(commentMarker); } if (builder.GetTokenType() == GherkinTokenTypes.WHITE_SPACE || builder.GetTokenType() == GherkinTokenTypes.NEW_LINE) { builder.AdvanceLexer(); } } }
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 void AdvanceWithSpaces(PsiBuilder builder) { builder.AdvanceLexer(); while (builder.GetTokenType() == SpringTokenType.WHITE_SPACE) { builder.AdvanceLexer(); } }
private void SkipNonsemanticalTokens() { while (builder.GetTokenType() == SpringTokenType.WHITE_SPACE_SECTION || builder.GetTokenType() == SpringTokenType.COMMENT_SECTION) { builder.AdvanceLexer(); } }
private bool ParseWithStmt(PsiBuilder builder) { SkipWhitespace(builder); if (builder.GetTokenType() != SpringTokenType.WITH) { return(false); } int mark = builder.Mark(); builder.AdvanceLexer(); SkipWhitespace(builder); if (builder.GetTokenType() != SpringTokenType.IDENTIFIER) { builder.Error("Expected variable identifier"); } else { builder.AdvanceLexer(); } SkipWhitespace(builder); while (builder.GetTokenType() == SpringTokenType.COMMA) { builder.AdvanceLexer(); SkipWhitespace(builder); if (builder.GetTokenType() == SpringTokenType.IDENTIFIER) { builder.AdvanceLexer(); SkipWhitespace(builder); } else { builder.Error("Expected variable identifier"); break; } } 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.WITH_STMT, null); SkipWhitespace(builder); return(true); }
private bool ParseFactor(PsiBuilder builder) { SkipWhitespace(builder); int startFactor = builder.Mark(); var tt = builder.GetTokenType(); bool result = false; if (ParseFunctionCall(builder)) { result = true; } else if (ParseValueTypecast(builder)) { result = true; } else if (ParseVariableTypecast(builder)) { result = true; } else if (ParseSetCtor(builder)) { result = true; } else if (ParseAddrOf(builder)) { result = true; } else if (tt == SpringTokenType.IDENTIFIER || tt == SpringTokenType.NUMBER || tt == SpringTokenType.STRING) { builder.AdvanceLexer(); result = true; } else if (tt == SpringTokenType.LBRACKET) { builder.AdvanceLexer(); result = ParseExpression(builder); if (builder.GetTokenType() != SpringTokenType.RBRACKET) { builder.Error("Expected )"); } else { builder.AdvanceLexer(); result = true; } } else { builder.Error("Expected FACTOR"); } builder.Done(startFactor, SpringCompositeNodeType.FACTOR, null); SkipWhitespace(builder); return(result); }
private void ParseDefines(PsiBuilder builder) { SkipWhitespace(builder); while (!builder.Eof()) { var tt = builder.GetTokenType(); if (tt == SpringTokenType.LPAREN) { var start = builder.Mark(); AdvanceSkippingWhitespace(builder); if (builder.GetTokenType() == SpringTokenType.DEFINE) { AdvanceSkippingWhitespace(builder); ParseIdentDecl(builder); SkipWhitespace(builder); ParseExpr(builder); SkipWhitespace(builder); } else { builder.Error("Expected definition!"); } /* * if (builder.GetTokenType() == SpringTokenType.RPAREN) * builder.AdvanceLexer(); * else * builder.Error("Expected ')' to close definition!"); * * builder.Done(start, SpringCompositeNodeType.DEFINE, null); */ SkipWhitespace(builder); if (builder.GetTokenType() == SpringTokenType.RPAREN) { builder.AdvanceLexer(); builder.Done(start, SpringCompositeNodeType.DEFINE, null); } else { builder.Error(start, "Expected ')' to close definition!"); } } else { var tokenType = builder.GetTokenType(); var mark = builder.Mark(); builder.AdvanceLexer(); builder.Error(mark, "Expected '(', but got: " + tokenType.TokenRepresentation); } SkipWhitespace(builder); } }
private void ParseStep(PsiBuilder builder) { var marker = builder.Mark(); var keywordText = builder.GetTokenText(); builder.AdvanceLexer(); while (builder.GetTokenType() == GherkinTokenTypes.TEXT || builder.GetTokenType() == GherkinTokenTypes.STEP_PARAMETER_BRACE || builder.GetTokenType() == GherkinTokenTypes.STEP_PARAMETER_TEXT || builder.GetTokenType() == GherkinTokenTypes.WHITE_SPACE || builder.GetTokenType() == GherkinTokenTypes.NEW_LINE) { if (IsLineBreak(builder)) { break; } if (!ParseStepParameter(builder)) { builder.AdvanceLexer(); } } SkipGroupedWhiteSpaces(builder); var nextToken = builder.GetTokenType(1); if (nextToken == GherkinTokenTypes.PIPE) { builder.AdvanceLexer(); ParseTable(builder); } else if (nextToken == GherkinTokenTypes.PYSTRING) { builder.AdvanceLexer(); ParsePystring(builder); } var stepKind = _keywordProvider.GetStepKind(_lang, keywordText); var effectiveStepKind = stepKind; if (stepKind == GherkinStepKind.And) { effectiveStepKind = _lastStepKind; } else if (stepKind == GherkinStepKind.Given || stepKind == GherkinStepKind.When || stepKind == GherkinStepKind.Then) { _lastStepKind = effectiveStepKind; } builder.DoneBeforeWhitespaces(marker, GherkinNodeTypes.STEP, (stepKind, effectiveStepKind)); }
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 static void ParseTags(PsiBuilder builder) { while (builder.GetTokenType() == GherkinTokenTypes.TAG) { var tagMarker = builder.Mark(); builder.AdvanceLexer(); builder.Done(tagMarker, GherkinNodeTypes.TAG, null); if (builder.GetTokenType() == GherkinTokenTypes.WHITE_SPACE) { builder.AdvanceLexer(); } } }
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); }
public IFile ParseFile() { using (var lifetimeDefinition = Lifetime.Define()) { var builder = new PsiBuilder(_lexer, GherkinNodeTypes.FILE, null, lifetimeDefinition.Lifetime); var fileMarker = builder.Mark(); while (!builder.Eof()) { var tokenType = builder.GetTokenType(); if (tokenType == GherkinTokenTypes.FEATURE_KEYWORD) { ParseFeature(builder); } else if (tokenType == GherkinTokenTypes.TAG) { ParseTags(builder); } else if (tokenType == GherkinTokenTypes.COMMENT) { ParseComments(builder); } else { builder.AdvanceLexer(); } } builder.Done(fileMarker, GherkinNodeTypes.FILE, new GherkinFile.FileMetadata(_sourceFile?.Name, _lang)); var resultTree = (GherkinFile)builder.BuildTree(); return(resultTree); } }
private bool ParseTerm(PsiBuilder builder) { SkipWhitespace(builder); int startTerm = builder.Mark(); bool res = ParseFactor(builder); if (!res) { builder.Error("Expected FACTOR"); } else { while (builder.GetTokenType() == SpringTokenType.FACTOR_OPS) { builder.AdvanceLexer(); if (!ParseFactor(builder)) { builder.Error("expected FACTOR"); break; } } } builder.Done(startTerm, SpringCompositeNodeType.TERM, null); SkipWhitespace(builder); return(res); }
private bool ParseSimpleExpression(PsiBuilder builder) { SkipWhitespace(builder); int startSimpleExpr = builder.Mark(); bool res = ParseTerm(builder); if (!res) { builder.Error("Expected TERM"); } else { // throw new Exception("Token past Term: " + builder.GetTokenType().ToString() + " \"" + builder.GetTokenText() + '"'); while (builder.GetTokenType() == SpringTokenType.TERM_OPS) { builder.AdvanceLexer(); if (!ParseTerm(builder)) { builder.Error("Expected TERM"); break; } } } builder.Done(startSimpleExpr, SpringCompositeNodeType.SIMPLE_EXPR, null); SkipWhitespace(builder); return(res); }
private static void ParseTable(PsiBuilder builder) { var marker = builder.Mark(); var rowMarker = builder.Mark(); var headerNodeType = GherkinNodeTypes.TABLE_HEADER_ROW; int?cellMarker = null; var wasLineBreak = false; var possibleEmptyCell = false; while (builder.GetTokenType() == GherkinTokenTypes.PIPE || builder.GetTokenType() == GherkinTokenTypes.TABLE_CELL || builder.GetTokenType() == GherkinTokenTypes.WHITE_SPACE) { var tokenType = builder.GetTokenType(); if (tokenType == GherkinTokenTypes.TABLE_CELL && cellMarker == null) { cellMarker = builder.Mark(); } else if (tokenType != GherkinTokenTypes.TABLE_CELL && cellMarker != null) { builder.Done(cellMarker.Value, GherkinNodeTypes.TABLE_CELL, null); cellMarker = null; possibleEmptyCell = false; } if (tokenType == GherkinTokenTypes.PIPE) { if (wasLineBreak) { possibleEmptyCell = true; builder.Done(rowMarker, headerNodeType, null); headerNodeType = GherkinNodeTypes.TABLE_ROW; rowMarker = builder.Mark(); } else { if (possibleEmptyCell) { cellMarker = builder.Mark(); builder.Done(cellMarker.Value, GherkinNodeTypes.TABLE_CELL, null); cellMarker = null; } possibleEmptyCell = true; } } wasLineBreak = IsLineBreak(builder); builder.AdvanceLexer(); } if (cellMarker.HasValue) { builder.Done(cellMarker.Value, GherkinNodeTypes.TABLE_CELL, null); } builder.Done(rowMarker, headerNodeType, null); builder.Done(marker, GherkinNodeTypes.TABLE, null); }
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 static void SkipWhitespace(PsiBuilder builder) { while (builder.GetTokenType() == SpringTokenType.WS || builder.GetTokenType() == SpringTokenType.COMMENT) { builder.AdvanceLexer(); } }
private bool ParseRepeatStatement(PsiBuilder builder) { SkipWhitespace(builder); if (builder.GetTokenType() != SpringTokenType.REPEAT) { return(false); } int startRepeatStmt = builder.Mark(); builder.AdvanceLexer(); SkipWhitespace(builder); if (!ParseStatement(builder)) { builder.Error("expected STMT"); } SkipWhitespace(builder); while (builder.GetTokenType() == SpringTokenType.SEMICOLON) { builder.AdvanceLexer(); if (!ParseStatement(builder)) { builder.Error("expected STMT"); break; } } SkipWhitespace(builder); if (builder.GetTokenType() != SpringTokenType.UNTIL) { builder.Error("Expected 'until'"); } else { builder.AdvanceLexer(); } if (!ParseExpression(builder)) { builder.Error("expected EXPR"); } builder.Done(startRepeatStmt, SpringCompositeNodeType.REPEAT_STMT, null); return(true); }
private static void SkipWhitespace(PsiBuilder builder) { while (builder.GetTokenType() == GherkinTokenTypes.WHITE_SPACE || builder.GetTokenType() == GherkinTokenTypes.NEW_LINE) { builder.AdvanceLexer(); } }
private void SkipWhitespace(PsiBuilder builder) { while (builder.GetTokenType() == SpringTokenType.WHITESPACE || builder.GetTokenType() == SpringTokenType.SINGLE_LINE_COMMENT || builder.GetTokenType() == SpringTokenType.MULTILINE_COMMENT) { builder.AdvanceLexer(); } }
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 ParseCaseHead(PsiBuilder builder) { SkipWhitespace(builder); var curToken = builder.GetTokenType(); if (!curToken.IsConstantLiteral && !curToken.IsStringLiteral) { return(false); } builder.AdvanceLexer(); SkipWhitespace(builder); if (builder.GetTokenType() == SpringTokenType.DOUBLEDOTS) { builder.AdvanceLexer(); SkipWhitespace(builder); curToken = builder.GetTokenType(); if (!curToken.IsConstantLiteral && !curToken.IsStringLiteral) { builder.Error("expected constant"); } else { builder.AdvanceLexer(); } } SkipWhitespace(builder); while (builder.GetTokenType() == SpringTokenType.COMMA) { builder.AdvanceLexer(); SkipWhitespace(builder); curToken = builder.GetTokenType(); if (!curToken.IsConstantLiteral && !curToken.IsStringLiteral) { break; } builder.AdvanceLexer(); SkipWhitespace(builder); if (builder.GetTokenType() == SpringTokenType.DOUBLEDOTS) { builder.AdvanceLexer(); SkipWhitespace(builder); curToken = builder.GetTokenType(); if (!curToken.IsConstantLiteral && !curToken.IsStringLiteral) { builder.Error("expected constant"); } else { builder.AdvanceLexer(); } } SkipWhitespace(builder); } SkipWhitespace(builder); return(true); }
private static void ParseTags(PsiBuilder builder) { while (builder.GetTokenType() == GherkinTokenTypes.TAG) { var tagMarker = builder.Mark(); builder.AdvanceLexer(); builder.DoneBeforeWhitespaces(tagMarker, GherkinNodeTypes.TAG, null); SkipWhitespace(builder); } }
private static bool ParseStepParameter(PsiBuilder builder) { if (builder.GetTokenType() != GherkinTokenTypes.STEP_PARAMETER_TEXT) { return(false); } var stepParameterMarker = builder.Mark(); builder.AdvanceLexer(); builder.Done(stepParameterMarker, GherkinNodeTypes.STEP_PARAMETER, null); return(true); }