You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
118 lines
3.5 KiB
118 lines
3.5 KiB
/*============================================================================= |
|
Copyright (c) 2001-2003 Joel de Guzman |
|
http://spirit.sourceforge.net/ |
|
|
|
Use, modification and distribution is subject to the Boost Software |
|
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
|
http://www.boost.org/LICENSE_1_0.txt) |
|
=============================================================================*/ |
|
#ifndef BOOST_SPIRIT_SYMBOLS_IPP |
|
#define BOOST_SPIRIT_SYMBOLS_IPP |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
#include <boost/spirit/home/classic/symbols/impl/tst.ipp> |
|
#include <boost/detail/workaround.hpp> |
|
|
|
// MSVC: void warning about the use of 'this' pointer in constructors |
|
#if defined(BOOST_MSVC) |
|
#pragma warning(push) |
|
#pragma warning(disable : 4355) |
|
#endif |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
namespace boost { namespace spirit { |
|
|
|
BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
// |
|
// symbols class implementation |
|
// |
|
/////////////////////////////////////////////////////////////////////////////// |
|
template <typename T, typename CharT, typename SetT> |
|
inline symbols<T, CharT, SetT>::symbols() |
|
: SetT() |
|
, add(*this) |
|
{ |
|
} |
|
|
|
////////////////////////////////// |
|
template <typename T, typename CharT, typename SetT> |
|
symbols<T, CharT, SetT>::symbols(symbols const& other) |
|
: SetT(other) |
|
// Tru64 CXX seems to be confused by the explicit call of the default |
|
// constructor and generates wrong code which invalidates the just contructed |
|
// first base class in the line above. |
|
#if !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590041)) |
|
, parser<symbols<T, CharT, SetT> >() |
|
#endif |
|
, add(*this) |
|
{ |
|
} |
|
|
|
////////////////////////////////// |
|
template <typename T, typename CharT, typename SetT> |
|
inline symbols<T, CharT, SetT>::~symbols() |
|
{} |
|
|
|
////////////////////////////////// |
|
template <typename T, typename CharT, typename SetT> |
|
inline symbols<T, CharT, SetT>& |
|
symbols<T, CharT, SetT>::operator=(symbols const& other) |
|
{ |
|
SetT::operator=(other); |
|
return *this; |
|
} |
|
|
|
////////////////////////////////// |
|
template <typename T, typename CharT, typename SetT> |
|
inline symbol_inserter<T, SetT> const& |
|
symbols<T, CharT, SetT>::operator=(CharT const* str) |
|
{ |
|
return add, str; |
|
} |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
// |
|
// Symbol table utilities |
|
// |
|
/////////////////////////////////////////////////////////////////////////////// |
|
template <typename T, typename CharT, typename SetT> |
|
inline T* |
|
find(symbols<T, CharT, SetT> const& table, CharT const* sym) |
|
{ |
|
CharT const* last = sym; |
|
while (*last) |
|
last++; |
|
scanner<CharT const *> scan(sym, last); |
|
T* result = table.find(scan); |
|
return scan.at_end()? result: 0; |
|
} |
|
|
|
////////////////////////////////// |
|
template <typename T, typename CharT, typename SetT> |
|
inline T* |
|
add(symbols<T, CharT, SetT>& table, CharT const* sym, T const& data) |
|
{ |
|
CharT const* first = sym; |
|
CharT const* last = sym; |
|
while (*last) |
|
last++; |
|
scanner<CharT const *> scan(first, last); |
|
if (table.find(scan) && scan.at_end()) |
|
return 0; // symbol already contained in symbol table |
|
table.add(sym, last, data); |
|
first = sym; |
|
return table.find(scan); // refind the inserted symbol |
|
} |
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
BOOST_SPIRIT_CLASSIC_NAMESPACE_END |
|
|
|
}} // namespace boost::spirit |
|
|
|
#if defined(BOOST_MSVC) |
|
#pragma warning(pop) |
|
#endif |
|
|
|
#endif
|
|
|