StringLexer.cpp revision 360784
1//===--------------------- StringLexer.cpp -----------------------*- C++-*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8 9#include "lldb/Utility/StringLexer.h" 10 11#include <algorithm> 12#include <assert.h> 13 14using namespace lldb_private; 15 16StringLexer::StringLexer(std::string s) : m_data(s), m_position(0) {} 17 18StringLexer::Character StringLexer::Peek() { return m_data[m_position]; } 19 20bool StringLexer::NextIf(Character c) { 21 auto val = Peek(); 22 if (val == c) { 23 Next(); 24 return true; 25 } 26 return false; 27} 28 29std::pair<bool, StringLexer::Character> 30StringLexer::NextIf(std::initializer_list<Character> cs) { 31 auto val = Peek(); 32 for (auto c : cs) { 33 if (val == c) { 34 Next(); 35 return {true, c}; 36 } 37 } 38 return {false, 0}; 39} 40 41bool StringLexer::AdvanceIf(const std::string &token) { 42 auto pos = m_position; 43 bool matches = true; 44 for (auto c : token) { 45 if (!NextIf(c)) { 46 matches = false; 47 break; 48 } 49 } 50 if (!matches) { 51 m_position = pos; 52 return false; 53 } 54 return true; 55} 56 57StringLexer::Character StringLexer::Next() { 58 auto val = Peek(); 59 Consume(); 60 return val; 61} 62 63bool StringLexer::HasAtLeast(Size s) { 64 return (m_data.size() - m_position) >= s; 65} 66 67void StringLexer::PutBack(Size s) { 68 assert(m_position >= s); 69 m_position -= s; 70} 71 72std::string StringLexer::GetUnlexed() { 73 return std::string(m_data, m_position); 74} 75 76void StringLexer::Consume() { m_position++; } 77 78StringLexer &StringLexer::operator=(const StringLexer &rhs) { 79 if (this != &rhs) { 80 m_data = rhs.m_data; 81 m_position = rhs.m_position; 82 } 83 return *this; 84} 85