xref: /llvm-project/lldb/source/Utility/StringLexer.cpp (revision 76e47d4887f456878c0e2f20ebfae36267006cd7)
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 Devlieghere StringLexer::StringLexer(std::string s) : m_data(std::move(s)), m_position(0) {}
18a02d6255SEnrico Granata 
Peek()19b9c1b51eSKate Stone StringLexer::Character StringLexer::Peek() { return m_data[m_position]; }
20a02d6255SEnrico Granata 
NextIf(Character c)21b9c1b51eSKate Stone bool 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 Stone StringLexer::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 Stone bool 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 Stone StringLexer::Character StringLexer::Next() {
59a02d6255SEnrico Granata   auto val = Peek();
60a02d6255SEnrico Granata   Consume();
61a02d6255SEnrico Granata   return val;
62a02d6255SEnrico Granata }
63a02d6255SEnrico Granata 
HasAtLeast(Size s)64b9c1b51eSKate Stone bool StringLexer::HasAtLeast(Size s) {
655c35f7cfSSean Callanan   return (m_data.size() - m_position) >= s;
66a02d6255SEnrico Granata }
67a02d6255SEnrico Granata 
PutBack(Size s)68b9c1b51eSKate Stone void StringLexer::PutBack(Size s) {
695c35f7cfSSean Callanan   assert(m_position >= s);
705c35f7cfSSean Callanan   m_position -= s;
71a02d6255SEnrico Granata }
72a02d6255SEnrico Granata 
GetUnlexed()73b9c1b51eSKate Stone std::string StringLexer::GetUnlexed() {
74e65a28f3SEnrico Granata   return std::string(m_data, m_position);
75e65a28f3SEnrico Granata }
76e65a28f3SEnrico Granata 
Consume()77b9c1b51eSKate Stone void StringLexer::Consume() { m_position++; }
78a02d6255SEnrico Granata 
operator =(const StringLexer & rhs)79b9c1b51eSKate Stone StringLexer &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