From a8241b0350ada499ea938527bd716823c2ed6bb8 Mon Sep 17 00:00:00 2001 From: sergey-raevskiy Date: Mon, 22 Sep 2014 17:56:44 +0400 Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B1=D0=B0=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dwarf-cs/dwarf.core/lang/Lexer.cs | 11 +++++++++-- dwarf-cs/tests/LexerTests.cs | 14 ++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/dwarf-cs/dwarf.core/lang/Lexer.cs b/dwarf-cs/dwarf.core/lang/Lexer.cs index 21b96ed..1fbfd74 100644 --- a/dwarf-cs/dwarf.core/lang/Lexer.cs +++ b/dwarf-cs/dwarf.core/lang/Lexer.cs @@ -107,6 +107,11 @@ internal class Matcher public Token Token { get; private set; } public bool Stop { get; private set; } + public int MatchedLen + { + get { return matched.Length; } + } + public Matcher(ITokenRule rule) { this.rule = rule; @@ -208,12 +213,14 @@ public IEnumerable Tokenize(string source) if (matchers.All(m => m.Stop)) { + int len = 0; + foreach (var matcher in matchers) { - if (matcher.Token != null) + if (matcher.Token != null && matcher.MatchedLen > len) { token = matcher.Token; - break; + len = matcher.MatchedLen; } } diff --git a/dwarf-cs/tests/LexerTests.cs b/dwarf-cs/tests/LexerTests.cs index e89afe0..0f92235 100644 --- a/dwarf-cs/tests/LexerTests.cs +++ b/dwarf-cs/tests/LexerTests.cs @@ -49,6 +49,20 @@ public void IfThenElseTest() Assert.AreEqual(expected, actual); } + [Test] + public void AmbiguousIdentifiersTest() + { + var source = Multiline( + "if iff"); + + var lexer = new Lexer(); + var actual = String.Join("", lexer.Tokenize(source)); + + const string expected = "if [iff] "; + + Assert.AreEqual(expected, actual); + } + [Test] public void ConstTest() {