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() {