diff --git a/.github/workflows/RunTests.yml b/.github/workflows/RunTests.yml index db2cc90a..56aa0fc7 100644 --- a/.github/workflows/RunTests.yml +++ b/.github/workflows/RunTests.yml @@ -25,7 +25,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v1 with: - dotnet-version: '6.0.101' + dotnet-version: '6.0.425' - name: Test run: | cd Sources diff --git a/Sources/SynKit/Libraries/Lexer.Generator/RegExParser.cs b/Sources/SynKit/Libraries/Lexer.Generator/RegExParser.cs index 7a48703f..48569409 100644 --- a/Sources/SynKit/Libraries/Lexer.Generator/RegExParser.cs +++ b/Sources/SynKit/Libraries/Lexer.Generator/RegExParser.cs @@ -117,6 +117,7 @@ private char ParseLiteralRangeAtom() var ch = this.Consume(); var escaped = Escape(ch); if (ch == '-') return ch; + if (ch == '[') return ch; if (ch == ']') return ch; if (escaped == null) throw new FormatException($"invalid escape \\{ch} in grouping (position {this.index - 2})"); return escaped.Value; diff --git a/Sources/SynKit/Tests/Lexer.Tests/AdvancedLexerGeneratorTests.cs b/Sources/SynKit/Tests/Lexer.Tests/AdvancedLexerGeneratorTests.cs index 7547e483..8cd4aea5 100644 --- a/Sources/SynKit/Tests/Lexer.Tests/AdvancedLexerGeneratorTests.cs +++ b/Sources/SynKit/Tests/Lexer.Tests/AdvancedLexerGeneratorTests.cs @@ -18,6 +18,8 @@ public enum TokenType [End] End, [Regex("[\\-]")] MinusInRegexGroup, + [Regex("[\\[]")] LeftBracketInRegexGroup, + [Regex("[\\]]")] RightBracketInRegexGroup, } [Lexer(typeof(TokenType))] @@ -32,4 +34,20 @@ public void AdvancedRulesSequence() Assert.Equal(Token("-", TokenType.MinusInRegexGroup, Range((0, 0), 1)), lexer.Next()); Assert.Equal(Token(string.Empty, TokenType.End, Range((0, 1), 0)), lexer.Next()); } + + [Fact] + public void LeftBracketInRegex() + { + var lexer = new AdvancedLexer("["); + Assert.Equal(Token("[", TokenType.LeftBracketInRegexGroup, Range((0, 0), 1)), lexer.Next()); + Assert.Equal(Token(string.Empty, TokenType.End, Range((0, 1), 0)), lexer.Next()); + } + + [Fact] + public void RightBracketInRegex() + { + var lexer = new AdvancedLexer("]"); + Assert.Equal(Token("]", TokenType.RightBracketInRegexGroup, Range((0, 0), 1)), lexer.Next()); + Assert.Equal(Token(string.Empty, TokenType.End, Range((0, 1), 0)), lexer.Next()); + } }