180814287SRaphael Isemann //===-- StringLexer.cpp ---------------------------------------------------===// 2a02d6255SEnrico Granata // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a02d6255SEnrico Granata // 7a02d6255SEnrico Granata //===----------------------------------------------------------------------===// 8a02d6255SEnrico Granata 9a02d6255SEnrico Granata #include "lldb/Utility/StringLexer.h" 10a02d6255SEnrico Granata 119f1d3363SEnrico Granata #include <algorithm> 12*76e47d48SRaphael Isemann #include <cassert> 130d5fc822SJonas Devlieghere #include <utility> 149f1d3363SEnrico Granata 154b3c0fd5SJonas Devlieghere using namespace lldb_private; 16a02d6255SEnrico Granata StringLexer(std::string s)170d5fc822SJonas DevlieghereStringLexer::StringLexer(std::string s) : m_data(std::move(s)), m_position(0) {} 18a02d6255SEnrico Granata Peek()19b9c1b51eSKate StoneStringLexer::Character StringLexer::Peek() { return m_data[m_position]; } 20a02d6255SEnrico Granata NextIf(Character c)21b9c1b51eSKate Stonebool StringLexer::NextIf(Character c) { 22a02d6255SEnrico Granata auto val = Peek(); 23b9c1b51eSKate Stone if (val == c) { 24a02d6255SEnrico Granata Next(); 25a02d6255SEnrico Granata return true; 26a02d6255SEnrico Granata } 27a02d6255SEnrico Granata return false; 28a02d6255SEnrico Granata } 29a02d6255SEnrico Granata 30e65a28f3SEnrico Granata std::pair<bool, StringLexer::Character> NextIf(std::initializer_list<Character> cs)31b9c1b51eSKate StoneStringLexer::NextIf(std::initializer_list<Character> cs) { 32e65a28f3SEnrico Granata auto val = Peek(); 33b9c1b51eSKate Stone for (auto c : cs) { 34b9c1b51eSKate Stone if (val == c) { 35e65a28f3SEnrico Granata Next(); 36e65a28f3SEnrico Granata return {true, c}; 37e65a28f3SEnrico Granata } 38e65a28f3SEnrico Granata } 39e65a28f3SEnrico Granata return {false, 0}; 40e65a28f3SEnrico Granata } 41e65a28f3SEnrico Granata AdvanceIf(const std::string & token)42b9c1b51eSKate Stonebool StringLexer::AdvanceIf(const std::string &token) { 43e65a28f3SEnrico Granata auto pos = m_position; 44e65a28f3SEnrico Granata bool matches = true; 45b9c1b51eSKate Stone for (auto c : token) { 46b9c1b51eSKate Stone if (!NextIf(c)) { 47e65a28f3SEnrico Granata matches = false; 48e65a28f3SEnrico Granata break; 49e65a28f3SEnrico Granata } 50e65a28f3SEnrico Granata } 51b9c1b51eSKate Stone if (!matches) { 52e65a28f3SEnrico Granata m_position = pos; 53e65a28f3SEnrico Granata return false; 54e65a28f3SEnrico Granata } 55e65a28f3SEnrico Granata return true; 56e65a28f3SEnrico Granata } 57e65a28f3SEnrico Granata Next()58b9c1b51eSKate StoneStringLexer::Character StringLexer::Next() { 59a02d6255SEnrico Granata auto val = Peek(); 60a02d6255SEnrico Granata Consume(); 61a02d6255SEnrico Granata return val; 62a02d6255SEnrico Granata } 63a02d6255SEnrico Granata HasAtLeast(Size s)64b9c1b51eSKate Stonebool StringLexer::HasAtLeast(Size s) { 655c35f7cfSSean Callanan return (m_data.size() - m_position) >= s; 66a02d6255SEnrico Granata } 67a02d6255SEnrico Granata PutBack(Size s)68b9c1b51eSKate Stonevoid StringLexer::PutBack(Size s) { 695c35f7cfSSean Callanan assert(m_position >= s); 705c35f7cfSSean Callanan m_position -= s; 71a02d6255SEnrico Granata } 72a02d6255SEnrico Granata GetUnlexed()73b9c1b51eSKate Stonestd::string StringLexer::GetUnlexed() { 74e65a28f3SEnrico Granata return std::string(m_data, m_position); 75e65a28f3SEnrico Granata } 76e65a28f3SEnrico Granata Consume()77b9c1b51eSKate Stonevoid StringLexer::Consume() { m_position++; } 78a02d6255SEnrico Granata operator =(const StringLexer & rhs)79b9c1b51eSKate StoneStringLexer &StringLexer::operator=(const StringLexer &rhs) { 80b9c1b51eSKate Stone if (this != &rhs) { 81a02d6255SEnrico Granata m_data = rhs.m_data; 82a02d6255SEnrico Granata m_position = rhs.m_position; 83a02d6255SEnrico Granata } 84a02d6255SEnrico Granata return *this; 85a02d6255SEnrico Granata } 86