public override bool Match(Lexer lexer, out State result) { int startPos = lexer.Pos; if (IsMatchingString(lexer, MatchString)) { result = new State(Type, startPos, lexer.Pos - startPos); return true; } result = new State(); return false; }
public override bool Match(Lexer lexer, out State result) { int startPos = lexer.Pos; if (IsMatchingString(lexer, Start)) { if (EscapeCharacter == null) { do { if (IsMatchingString(lexer, End)) { result = new State(Type, startPos, lexer.Pos - startPos); return true; } } while (lexer.Next()); // Det här är specialfall som uppstår om man inte har något sluttecken och vi kommer till slutet på texten. // I teorin är det inte en träff, men jag vill ändå räkna det som en träff fast som inte är komplett. result = new State(Type, startPos, lexer.Pos - startPos, true); return true; } else { do { if (lexer.Current == EscapeCharacter) { // Är det nuvarande tecknet samma som escape så hoppa över det och nästa. lexer.Next(); } else if (IsMatchingString(lexer, End)) { result = new State(Type, startPos, lexer.Pos - startPos); return true; } } while (lexer.Next()); // Det här är specialfall som uppstår om man inte har något sluttecken och vi kommer till slutet på texten. // I teorin är det inte en träff, men jag vill ändå räkna det som en träff fast som inte är komplett. result = new State(Type, startPos, lexer.Pos - startPos, true); return true; } } result = new State(); return false; }
public abstract bool Match(Lexer lexer, out State result);
public override bool Match(Lexer lexer, out State result) { if (!lexer.IsLetter) { result = new State(); return false; } int startPos = lexer.Pos; while (lexer.Next()) { if (!(lexer.IsLetterOrDigit || lexer.Current == '_')) break; } var foundWord = lexer.GetSubArray(startPos, lexer.Pos - startPos).ToString().ToUpper(); result = new State(SpecialWords.ContainsKey(foundWord) ? SpecialWords[foundWord] : Type, startPos, lexer.Pos - startPos); return true; }