15ffd83dbSDimitry Andric //===-- StringLexer.cpp ---------------------------------------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "lldb/Utility/StringLexer.h" 100b57cec5SDimitry Andric 110b57cec5SDimitry Andric #include <algorithm> 12*5f7ddb14SDimitry Andric #include <cassert> 13af732203SDimitry Andric #include <utility> 140b57cec5SDimitry Andric 159dba64beSDimitry Andric using namespace lldb_private; 160b57cec5SDimitry Andric StringLexer(std::string s)17af732203SDimitry AndricStringLexer::StringLexer(std::string s) : m_data(std::move(s)), m_position(0) {} 180b57cec5SDimitry Andric Peek()190b57cec5SDimitry AndricStringLexer::Character StringLexer::Peek() { return m_data[m_position]; } 200b57cec5SDimitry Andric NextIf(Character c)210b57cec5SDimitry Andricbool StringLexer::NextIf(Character c) { 220b57cec5SDimitry Andric auto val = Peek(); 230b57cec5SDimitry Andric if (val == c) { 240b57cec5SDimitry Andric Next(); 250b57cec5SDimitry Andric return true; 260b57cec5SDimitry Andric } 270b57cec5SDimitry Andric return false; 280b57cec5SDimitry Andric } 290b57cec5SDimitry Andric 300b57cec5SDimitry Andric std::pair<bool, StringLexer::Character> NextIf(std::initializer_list<Character> cs)310b57cec5SDimitry AndricStringLexer::NextIf(std::initializer_list<Character> cs) { 320b57cec5SDimitry Andric auto val = Peek(); 330b57cec5SDimitry Andric for (auto c : cs) { 340b57cec5SDimitry Andric if (val == c) { 350b57cec5SDimitry Andric Next(); 360b57cec5SDimitry Andric return {true, c}; 370b57cec5SDimitry Andric } 380b57cec5SDimitry Andric } 390b57cec5SDimitry Andric return {false, 0}; 400b57cec5SDimitry Andric } 410b57cec5SDimitry Andric AdvanceIf(const std::string & token)420b57cec5SDimitry Andricbool StringLexer::AdvanceIf(const std::string &token) { 430b57cec5SDimitry Andric auto pos = m_position; 440b57cec5SDimitry Andric bool matches = true; 450b57cec5SDimitry Andric for (auto c : token) { 460b57cec5SDimitry Andric if (!NextIf(c)) { 470b57cec5SDimitry Andric matches = false; 480b57cec5SDimitry Andric break; 490b57cec5SDimitry Andric } 500b57cec5SDimitry Andric } 510b57cec5SDimitry Andric if (!matches) { 520b57cec5SDimitry Andric m_position = pos; 530b57cec5SDimitry Andric return false; 540b57cec5SDimitry Andric } 550b57cec5SDimitry Andric return true; 560b57cec5SDimitry Andric } 570b57cec5SDimitry Andric Next()580b57cec5SDimitry AndricStringLexer::Character StringLexer::Next() { 590b57cec5SDimitry Andric auto val = Peek(); 600b57cec5SDimitry Andric Consume(); 610b57cec5SDimitry Andric return val; 620b57cec5SDimitry Andric } 630b57cec5SDimitry Andric HasAtLeast(Size s)640b57cec5SDimitry Andricbool StringLexer::HasAtLeast(Size s) { 650b57cec5SDimitry Andric return (m_data.size() - m_position) >= s; 660b57cec5SDimitry Andric } 670b57cec5SDimitry Andric PutBack(Size s)680b57cec5SDimitry Andricvoid StringLexer::PutBack(Size s) { 690b57cec5SDimitry Andric assert(m_position >= s); 700b57cec5SDimitry Andric m_position -= s; 710b57cec5SDimitry Andric } 720b57cec5SDimitry Andric GetUnlexed()730b57cec5SDimitry Andricstd::string StringLexer::GetUnlexed() { 740b57cec5SDimitry Andric return std::string(m_data, m_position); 750b57cec5SDimitry Andric } 760b57cec5SDimitry Andric Consume()770b57cec5SDimitry Andricvoid StringLexer::Consume() { m_position++; } 780b57cec5SDimitry Andric operator =(const StringLexer & rhs)790b57cec5SDimitry AndricStringLexer &StringLexer::operator=(const StringLexer &rhs) { 800b57cec5SDimitry Andric if (this != &rhs) { 810b57cec5SDimitry Andric m_data = rhs.m_data; 820b57cec5SDimitry Andric m_position = rhs.m_position; 830b57cec5SDimitry Andric } 840b57cec5SDimitry Andric return *this; 850b57cec5SDimitry Andric } 86