diff --git a/lldb/include/lldb/Utility/StringLexer.h b/lldb/include/lldb/Utility/StringLexer.h new file mode 100644 index 000000000000..42c169c5cf94 --- /dev/null +++ b/lldb/include/lldb/Utility/StringLexer.h @@ -0,0 +1,62 @@ +//===--------------------- StringLexer.h -------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef utility_StringLexer_h_ +#define utility_StringLexer_h_ + +#include +#include + +namespace lldb_utility { + +class StringLexer +{ +public: + typedef std::string::size_type Position; + typedef std::string::size_type Size; + + typedef std::string::value_type Character; + + StringLexer (std::string s); + + StringLexer (const StringLexer& rhs); + + Character + Peek (); + + bool + NextIf (Character c); + + Character + Next (); + + bool + HasAtLeast (Size s); + + bool + HasAny (Character c); + + void + PutBack (Character c); + + StringLexer& + operator = (const StringLexer& rhs); + +private: + std::string m_data; + Position m_position; + std::list m_putback_data; + + void + Consume(); +}; + +} // namespace lldb_private + +#endif // #ifndef utility_StringLexer_h_ diff --git a/lldb/lldb.xcodeproj/project.pbxproj b/lldb/lldb.xcodeproj/project.pbxproj index 63a5bcca1469..6c3a3da6a543 100644 --- a/lldb/lldb.xcodeproj/project.pbxproj +++ b/lldb/lldb.xcodeproj/project.pbxproj @@ -617,6 +617,7 @@ 941BCC8014E48C4000BB969C /* SBTypeFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 9461568714E355F2003A195C /* SBTypeFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; 941BCC8114E48C4000BB969C /* SBTypeSummary.h in Headers */ = {isa = PBXBuildFile; fileRef = 9461568814E355F2003A195C /* SBTypeSummary.h */; settings = {ATTRIBUTES = (Public, ); }; }; 941BCC8214E48C4000BB969C /* SBTypeSynthetic.h in Headers */ = {isa = PBXBuildFile; fileRef = 9461568914E355F2003A195C /* SBTypeSynthetic.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 94380B8219940B0A00BFE4A8 /* StringLexer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94380B8119940B0A00BFE4A8 /* StringLexer.cpp */; }; 944372DC171F6B4300E57C32 /* RegisterContextDummy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 944372DA171F6B4300E57C32 /* RegisterContextDummy.cpp */; }; 944372DD171F6B4300E57C32 /* RegisterContextDummy.h in Headers */ = {isa = PBXBuildFile; fileRef = 944372DB171F6B4300E57C32 /* RegisterContextDummy.h */; }; 9443B122140C18C40013457C /* SBData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9443B121140C18C10013457C /* SBData.cpp */; }; @@ -1841,6 +1842,8 @@ 94094C68163B6CCC0083A547 /* ValueObjectCast.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ValueObjectCast.h; path = include/lldb/Core/ValueObjectCast.h; sourceTree = ""; }; 94094C69163B6CD90083A547 /* ValueObjectCast.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ValueObjectCast.cpp; path = source/Core/ValueObjectCast.cpp; sourceTree = ""; }; 94145430175D7FDE00284436 /* lldb-versioning.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "lldb-versioning.h"; path = "include/lldb/lldb-versioning.h"; sourceTree = ""; }; + 94380B8019940B0300BFE4A8 /* StringLexer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = StringLexer.h; path = include/lldb/Utility/StringLexer.h; sourceTree = ""; }; + 94380B8119940B0A00BFE4A8 /* StringLexer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StringLexer.cpp; path = source/Utility/StringLexer.cpp; sourceTree = ""; }; 944372DA171F6B4300E57C32 /* RegisterContextDummy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = RegisterContextDummy.cpp; path = Utility/RegisterContextDummy.cpp; sourceTree = ""; }; 944372DB171F6B4300E57C32 /* RegisterContextDummy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RegisterContextDummy.h; path = Utility/RegisterContextDummy.h; sourceTree = ""; }; 9443B120140C18A90013457C /* SBData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SBData.h; path = include/lldb/API/SBData.h; sourceTree = ""; }; @@ -2821,6 +2824,8 @@ 2660D9F611922A1300958FBD /* StringExtractor.cpp */, 2676A094119C93C8008A98EF /* StringExtractorGDBRemote.h */, 2676A093119C93C8008A98EF /* StringExtractorGDBRemote.cpp */, + 94380B8019940B0300BFE4A8 /* StringLexer.h */, + 94380B8119940B0A00BFE4A8 /* StringLexer.cpp */, 26D1804616CEE12C00EDFB5B /* TimeSpecTimeout.h */, 26D1804016CEDF0700EDFB5B /* TimeSpecTimeout.cpp */, 94EBAC8313D9EE26009BA64E /* PythonPointer.h */, @@ -4851,6 +4856,7 @@ 268900C113353E5F00698AC0 /* DWARFDebugPubnames.cpp in Sources */, 268900C213353E5F00698AC0 /* DWARFDebugPubnamesSet.cpp in Sources */, 268900C313353E5F00698AC0 /* DWARFDebugRanges.cpp in Sources */, + 94380B8219940B0A00BFE4A8 /* StringLexer.cpp in Sources */, 268900C413353E5F00698AC0 /* DWARFDefines.cpp in Sources */, 94D0B10C16D5535900EA9C70 /* LibCxx.cpp in Sources */, 268900C513353E5F00698AC0 /* DWARFDIECollection.cpp in Sources */, diff --git a/lldb/source/Utility/StringLexer.cpp b/lldb/source/Utility/StringLexer.cpp new file mode 100644 index 000000000000..69880d21e961 --- /dev/null +++ b/lldb/source/Utility/StringLexer.cpp @@ -0,0 +1,93 @@ +//===--------------------- StringLexer.cpp -----------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Utility/StringLexer.h" + +using namespace lldb_utility; + +StringLexer::StringLexer (std::string s) : +m_data(s), +m_position(0), +m_putback_data() +{ } + +StringLexer::StringLexer (const StringLexer& rhs) : +m_data(rhs.m_data), +m_position(rhs.m_position), +m_putback_data(rhs.m_putback_data) +{ } + +StringLexer::Character +StringLexer::Peek () +{ + if (m_putback_data.empty()) + return m_data[m_position]; + else + return m_putback_data.front(); +} + +bool +StringLexer::NextIf (Character c) +{ + auto val = Peek(); + if (val == c) + { + Next(); + return true; + } + return false; +} + +StringLexer::Character +StringLexer::Next () +{ + auto val = Peek(); + Consume(); + return val; +} + +bool +StringLexer::HasAtLeast (Size s) +{ + return m_data.size()-m_position >= s; +} + + +void +StringLexer::PutBack (Character c) +{ + m_putback_data.push_back(c); +} + +bool +StringLexer::HasAny (Character c) +{ + return m_data.find(c, m_position) != std::string::npos; +} + +void +StringLexer::Consume() +{ + if (m_putback_data.empty()) + m_position++; + else + m_putback_data.pop_front(); +} + +StringLexer& +StringLexer::operator = (const StringLexer& rhs) +{ + if (this != &rhs) + { + m_data = rhs.m_data; + m_position = rhs.m_position; + m_putback_data = rhs.m_putback_data; + } + return *this; +}