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