From 1daa5158ebb37f1b7f8fb8210559be0c4ff30164 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Wed, 28 Oct 2020 09:29:03 +0000 Subject: [PATCH] AK: Add GenericLexer::retreat() This allows going back one character at a time, and then re-consume previously consumed chars. The code I need this for looks something like this: ASSERT(lexer.consume_specific('\\')); if (lexer.next_is("foo")) ... lexer.retreat(); lexer.consume_escaped_character(); // This expects lexer.peek() == '\\' --- AK/GenericLexer.cpp | 7 +++++++ AK/GenericLexer.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/AK/GenericLexer.cpp b/AK/GenericLexer.cpp index 565ecf3917..4ea809973f 100644 --- a/AK/GenericLexer.cpp +++ b/AK/GenericLexer.cpp @@ -76,6 +76,13 @@ bool GenericLexer::next_is(const char* expected) const return true; } +// Go back to the previous character +void GenericLexer::retreat() +{ + ASSERT(m_index > 0); + m_index--; +} + // Consume a character and advance the parser index char GenericLexer::consume() { diff --git a/AK/GenericLexer.h b/AK/GenericLexer.h index ce5d123f16..854bc96a21 100644 --- a/AK/GenericLexer.h +++ b/AK/GenericLexer.h @@ -48,6 +48,8 @@ public: bool next_is(StringView) const; bool next_is(const char*) const; + void retreat(); + char consume(); bool consume_specific(char); bool consume_specific(StringView);