From b4dc168009de705d49d92cc454e5b3e3f74a4051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD?= Date: Sun, 13 Oct 2024 18:42:41 +0300 Subject: [PATCH] Fix/bug 49 (#117) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * #49 - рефакторинг на строго типизированные теории * #49 - исправление бага с помощью lookahead и lookbehind --- .../Lexer/TokenTypesJson.cs | 6 +-- tests/HydraScript.Tests/TestData/LexerData.cs | 37 ++++++++++++------- .../Unit/FrontEnd/RegexLexerTests.cs | 9 +++++ 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/Domain/HydraScript.Domain.FrontEnd/Lexer/TokenTypesJson.cs b/src/Domain/HydraScript.Domain.FrontEnd/Lexer/TokenTypesJson.cs index 97197054..e981f970 100644 --- a/src/Domain/HydraScript.Domain.FrontEnd/Lexer/TokenTypesJson.cs +++ b/src/Domain/HydraScript.Domain.FrontEnd/Lexer/TokenTypesJson.cs @@ -31,12 +31,12 @@ public static class TokenTypesJson }, { "tag": "NullLiteral", - "pattern": "null", + "pattern": "(? +public class LexerSuccessData : TheoryData { - public IEnumerator GetEnumerator() + public LexerSuccessData() { - yield return new object[] { "a + b - c return while do" }; - yield return new object[] { "=> abc null true false" }; - yield return new object[] { "{ . } , ( ) [] =?:" }; + Add("a + b - c return while do"); + Add("=> abc null true false"); + Add("{ . } , ( ) [] =?:"); } - - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); } -public class LexerFailData : IEnumerable +public class LexerFailData : TheoryData { - public IEnumerator GetEnumerator() + public LexerFailData() { - yield return new object[] { "a + v $$$" }; - yield return new object[] { "kkk &" }; - yield return new object[] { "|| |" }; + Add("a + v $$$"); + Add("kkk &"); + Add("|| |"); } +} - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); +public class LexerKeywordInsideIdentData : TheoryData +{ + public LexerKeywordInsideIdentData() + { + Add("constExpr"); + Add("letVarConst"); + Add("nullObj"); + Add("trueStmt"); + Add("falseStmt"); + Add("returnResult"); + } } \ No newline at end of file diff --git a/tests/HydraScript.Tests/Unit/FrontEnd/RegexLexerTests.cs b/tests/HydraScript.Tests/Unit/FrontEnd/RegexLexerTests.cs index 454921e2..75e9bc62 100644 --- a/tests/HydraScript.Tests/Unit/FrontEnd/RegexLexerTests.cs +++ b/tests/HydraScript.Tests/Unit/FrontEnd/RegexLexerTests.cs @@ -1,5 +1,6 @@ using HydraScript.Domain.FrontEnd.Lexer; using HydraScript.Domain.FrontEnd.Lexer.Impl; +using HydraScript.Domain.FrontEnd.Lexer.TokenTypes; using HydraScript.Infrastructure; using HydraScript.Tests.TestData; using Xunit; @@ -44,4 +45,12 @@ public void GetTokensSkipIgnorableTypesTest() var tokens = _regexLexer.GetTokens(text); Assert.DoesNotContain(_regexLexer.Structure.FindByTag("Comment"), tokens.Select(x => x.Type)); } + + [Theory, ClassData(typeof(LexerKeywordInsideIdentData))] + public void GetTokens_KeywordInsideIdent_Ident(string input) + { + var tokens = _regexLexer.GetTokens(input); + var token = tokens.First(); + token.Type.Should().Be(new TokenType("Ident")); + } } \ No newline at end of file