1a02d6255SEnrico Granata //===--------------------- StringLexer.cpp -----------------------*- C++ -*-===// 2a02d6255SEnrico Granata // 3a02d6255SEnrico Granata // The LLVM Compiler Infrastructure 4a02d6255SEnrico Granata // 5a02d6255SEnrico Granata // This file is distributed under the University of Illinois Open Source 6a02d6255SEnrico Granata // License. See LICENSE.TXT for details. 7a02d6255SEnrico Granata // 8a02d6255SEnrico Granata //===----------------------------------------------------------------------===// 9a02d6255SEnrico Granata 10a02d6255SEnrico Granata #include "lldb/Utility/StringLexer.h" 11a02d6255SEnrico Granata 129f1d3363SEnrico Granata #include <algorithm> 135c35f7cfSSean Callanan #include <assert.h> 149f1d3363SEnrico Granata 15a02d6255SEnrico Granata using namespace lldb_utility; 16a02d6255SEnrico Granata 17a02d6255SEnrico Granata StringLexer::StringLexer (std::string s) : 18a02d6255SEnrico Granata m_data(s), 195c35f7cfSSean Callanan m_position(0) 20a02d6255SEnrico Granata { } 21a02d6255SEnrico Granata 22a02d6255SEnrico Granata StringLexer::StringLexer (const StringLexer& rhs) : 23a02d6255SEnrico Granata m_data(rhs.m_data), 245c35f7cfSSean Callanan m_position(rhs.m_position) 25a02d6255SEnrico Granata { } 26a02d6255SEnrico Granata 27a02d6255SEnrico Granata StringLexer::Character 28a02d6255SEnrico Granata StringLexer::Peek () 29a02d6255SEnrico Granata { 30a02d6255SEnrico Granata return m_data[m_position]; 31a02d6255SEnrico Granata } 32a02d6255SEnrico Granata 33a02d6255SEnrico Granata bool 34a02d6255SEnrico Granata StringLexer::NextIf (Character c) 35a02d6255SEnrico Granata { 36a02d6255SEnrico Granata auto val = Peek(); 37a02d6255SEnrico Granata if (val == c) 38a02d6255SEnrico Granata { 39a02d6255SEnrico Granata Next(); 40a02d6255SEnrico Granata return true; 41a02d6255SEnrico Granata } 42a02d6255SEnrico Granata return false; 43a02d6255SEnrico Granata } 44a02d6255SEnrico Granata 45*e65a28f3SEnrico Granata std::pair<bool, StringLexer::Character> 46*e65a28f3SEnrico Granata StringLexer::NextIf (std::initializer_list<Character> cs) 47*e65a28f3SEnrico Granata { 48*e65a28f3SEnrico Granata auto val = Peek(); 49*e65a28f3SEnrico Granata for (auto c : cs) 50*e65a28f3SEnrico Granata { 51*e65a28f3SEnrico Granata if (val == c) 52*e65a28f3SEnrico Granata { 53*e65a28f3SEnrico Granata Next(); 54*e65a28f3SEnrico Granata return {true,c}; 55*e65a28f3SEnrico Granata } 56*e65a28f3SEnrico Granata } 57*e65a28f3SEnrico Granata return {false,0}; 58*e65a28f3SEnrico Granata } 59*e65a28f3SEnrico Granata 60*e65a28f3SEnrico Granata bool 61*e65a28f3SEnrico Granata StringLexer::AdvanceIf (const std::string& token) 62*e65a28f3SEnrico Granata { 63*e65a28f3SEnrico Granata auto pos = m_position; 64*e65a28f3SEnrico Granata bool matches = true; 65*e65a28f3SEnrico Granata for (auto c : token) 66*e65a28f3SEnrico Granata { 67*e65a28f3SEnrico Granata if (!NextIf(c)) 68*e65a28f3SEnrico Granata { 69*e65a28f3SEnrico Granata matches = false; 70*e65a28f3SEnrico Granata break; 71*e65a28f3SEnrico Granata } 72*e65a28f3SEnrico Granata } 73*e65a28f3SEnrico Granata if (!matches) 74*e65a28f3SEnrico Granata { 75*e65a28f3SEnrico Granata m_position = pos; 76*e65a28f3SEnrico Granata return false; 77*e65a28f3SEnrico Granata } 78*e65a28f3SEnrico Granata return true; 79*e65a28f3SEnrico Granata } 80*e65a28f3SEnrico Granata 81a02d6255SEnrico Granata StringLexer::Character 82a02d6255SEnrico Granata StringLexer::Next () 83a02d6255SEnrico Granata { 84a02d6255SEnrico Granata auto val = Peek(); 85a02d6255SEnrico Granata Consume(); 86a02d6255SEnrico Granata return val; 87a02d6255SEnrico Granata } 88a02d6255SEnrico Granata 89a02d6255SEnrico Granata bool 90a02d6255SEnrico Granata StringLexer::HasAtLeast (Size s) 91a02d6255SEnrico Granata { 925c35f7cfSSean Callanan return (m_data.size() - m_position) >= s; 93a02d6255SEnrico Granata } 94a02d6255SEnrico Granata 95a02d6255SEnrico Granata void 965c35f7cfSSean Callanan StringLexer::PutBack (Size s) 97a02d6255SEnrico Granata { 985c35f7cfSSean Callanan assert (m_position >= s); 995c35f7cfSSean Callanan m_position -= s; 100a02d6255SEnrico Granata } 101a02d6255SEnrico Granata 102a02d6255SEnrico Granata bool 103a02d6255SEnrico Granata StringLexer::HasAny (Character c) 104a02d6255SEnrico Granata { 105a02d6255SEnrico Granata return m_data.find(c, m_position) != std::string::npos; 106a02d6255SEnrico Granata } 107a02d6255SEnrico Granata 108*e65a28f3SEnrico Granata std::string 109*e65a28f3SEnrico Granata StringLexer::GetUnlexed () 110*e65a28f3SEnrico Granata { 111*e65a28f3SEnrico Granata return std::string(m_data, m_position); 112*e65a28f3SEnrico Granata } 113*e65a28f3SEnrico Granata 114a02d6255SEnrico Granata void 115a02d6255SEnrico Granata StringLexer::Consume() 116a02d6255SEnrico Granata { 117a02d6255SEnrico Granata m_position++; 118a02d6255SEnrico Granata } 119a02d6255SEnrico Granata 120a02d6255SEnrico Granata StringLexer& 121a02d6255SEnrico Granata StringLexer::operator = (const StringLexer& rhs) 122a02d6255SEnrico Granata { 123a02d6255SEnrico Granata if (this != &rhs) 124a02d6255SEnrico Granata { 125a02d6255SEnrico Granata m_data = rhs.m_data; 126a02d6255SEnrico Granata m_position = rhs.m_position; 127a02d6255SEnrico Granata } 128a02d6255SEnrico Granata return *this; 129a02d6255SEnrico Granata } 130