From 552f96029950382fa7dda024c2bd313967f8cadf Mon Sep 17 00:00:00 2001 From: Alexander Luzgarev Date: Tue, 7 Jul 2020 22:02:40 +0200 Subject: [PATCH 1/2] Fix lexing of unpaired brackets --- Parser.Tests/MLexerGreenTests.cs | 18 ++++++++++++++++-- Parser/Internal/DiagnosticsBag.cs | 11 +++++++++++ Parser/Internal/MLexerGreen.cs | 9 ++++++--- 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/Parser.Tests/MLexerGreenTests.cs b/Parser.Tests/MLexerGreenTests.cs index cca2663..5d42561 100644 --- a/Parser.Tests/MLexerGreenTests.cs +++ b/Parser.Tests/MLexerGreenTests.cs @@ -89,8 +89,6 @@ namespace Parser.Tests let text = SyntaxFacts.GetText(kind) where !(text is null) where !(SyntaxFacts.IsUnaryTokenKind(kind) - || SyntaxFacts.IsOpeningToken(kind) - || SyntaxFacts.IsClosingToken(kind) || kind == TokenKind.ApostropheToken) select (kind, text); @@ -254,6 +252,22 @@ namespace Parser.Tests { return true; } + + if (kind1 == TokenKind.CloseBraceToken && kind2 == TokenKind.StringLiteralToken) + { + return true; + } + + if (kind1 == TokenKind.CloseParenthesisToken && kind2 == TokenKind.StringLiteralToken) + { + return true; + } + + if (kind1 == TokenKind.CloseSquareBracketToken && kind2 == TokenKind.StringLiteralToken) + { + return true; + } + return false; } diff --git a/Parser/Internal/DiagnosticsBag.cs b/Parser/Internal/DiagnosticsBag.cs index ca0ab3f..1dadf31 100644 --- a/Parser/Internal/DiagnosticsBag.cs +++ b/Parser/Internal/DiagnosticsBag.cs @@ -57,6 +57,16 @@ namespace Parser.Internal Report($"Unexpected token '{actual}', expected '{expected}'."); } + internal void ReportUnmatchedCloseParenthesis(TextSpan span, TokenKind kind) + { + Report(span, $"Unmatched close parenthesis '{kind}'."); + } + + internal void ReportUnmatchedOpenParenthesisByEndOfFile(TextSpan span) + { + Report(span, "Unmatched open parenthesis by the end of file."); + } + public IEnumerator GetEnumerator() { return _diagnostics.GetEnumerator(); @@ -66,5 +76,6 @@ namespace Parser.Internal { return GetEnumerator(); } + } } \ No newline at end of file diff --git a/Parser/Internal/MLexerGreen.cs b/Parser/Internal/MLexerGreen.cs index 8ff6352..1537d84 100644 --- a/Parser/Internal/MLexerGreen.cs +++ b/Parser/Internal/MLexerGreen.cs @@ -798,19 +798,22 @@ namespace Parser.Internal } else { - throw new ParsingException($"Unmatched \"{tokenInfo.Text}\" at {Window.Position}."); + Diagnostics.ReportUnmatchedCloseParenthesis( + new TextSpan(Window.Position.Offset, 1), tokenInfo.Kind); } } else { - throw new ParsingException($"Unmatched \"{tokenInfo.Text}\" at {Window.Position}."); + Diagnostics.ReportUnmatchedCloseParenthesis( + new TextSpan(Window.Position.Offset, 1), tokenInfo.Kind); } } if (tokenInfo.Kind == TokenKind.EndOfFileToken && TokenStack.Any()) { - throw new ParsingException($"Unmatched \"{TokenStack.Pop()}\" by the end of file."); + Diagnostics.ReportUnmatchedOpenParenthesisByEndOfFile( + new TextSpan(Window.Position.Offset, 1)); } var result = Create( From eac18d1f2952b2824d4229171a2d7aaef4ae7bff Mon Sep 17 00:00:00 2001 From: Alexander Luzgarev Date: Tue, 7 Jul 2020 22:26:41 +0200 Subject: [PATCH 2/2] Remove unnecessary pragmas --- Parser.Tests/MLexerGreenTests.cs | 6 ------ Parser.Tests/ThereAndBackAgain.cs | 2 -- 2 files changed, 8 deletions(-) diff --git a/Parser.Tests/MLexerGreenTests.cs b/Parser.Tests/MLexerGreenTests.cs index 5d42561..fe3aac1 100644 --- a/Parser.Tests/MLexerGreenTests.cs +++ b/Parser.Tests/MLexerGreenTests.cs @@ -15,9 +15,7 @@ namespace Parser.Tests } [Theory] -#pragma warning disable xUnit1019 // MemberData must reference a member providing a valid data type [MemberData(nameof(SingleTokensData))] -#pragma warning restore xUnit1019 // MemberData must reference a member providing a valid data type public void MLexerGreen_Parses_Token(TokenKind kind, string text) { var tokens = ParseText(text); @@ -26,9 +24,7 @@ namespace Parser.Tests } [Theory] -#pragma warning disable xUnit1019 // MemberData must reference a member providing a valid data type [MemberData(nameof(PairTokensData))] -#pragma warning restore xUnit1019 // MemberData must reference a member providing a valid data type public void MLexerGreen_Parses_PairOfTokens(TokenKind kind1, string text1, TokenKind kind2, string text2) { var text = text1 + text2; @@ -39,9 +35,7 @@ namespace Parser.Tests } [Theory] -#pragma warning disable xUnit1019 // MemberData must reference a member providing a valid data type [MemberData(nameof(PairTokensWithSeparatorData))] -#pragma warning restore xUnit1019 // MemberData must reference a member providing a valid data type public void MLexerGreen_Parses_PairOfTokensWithSeparator(TokenKind kind1, string text1, string separatorText, TokenKind kind2, string text2) { var text = text1 + separatorText + text2; diff --git a/Parser.Tests/ThereAndBackAgain.cs b/Parser.Tests/ThereAndBackAgain.cs index c73faf0..782f36f 100644 --- a/Parser.Tests/ThereAndBackAgain.cs +++ b/Parser.Tests/ThereAndBackAgain.cs @@ -44,9 +44,7 @@ namespace Parser.Tests } [Theory] -#pragma warning disable xUnit1019 // MemberData must reference a member providing a valid data type [MemberData(nameof(FilesData))] -#pragma warning restore xUnit1019 // MemberData must reference a member providing a valid data type public void TestFile(string fileName) { var text = File.ReadAllText(fileName);