12459 lines
364 KiB
C++
12459 lines
364 KiB
C++
/*
|
|
|
|
Welcome to the Parsing Expression Grammar Template Library (PEGTL).
|
|
See https://github.com/taocpp/PEGTL/ for more information, documentation, etc.
|
|
|
|
The library is licensed as follows:
|
|
|
|
The MIT License (MIT)
|
|
|
|
Copyright (c) 2007-2020 Dr. Colin Hirsch and Daniel Frey
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in all
|
|
copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
SOFTWARE.
|
|
|
|
*/
|
|
|
|
#line 1 "amalgamated.hpp"
|
|
#line 1 "<built-in>"
|
|
#line 1 "<command-line>"
|
|
#line 1 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl.hpp"
|
|
|
|
#line 1 "tao/pegtl.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_HPP
|
|
#define TAO_PEGTL_HPP
|
|
|
|
#line 1 "tao/pegtl/config.hpp"
|
|
|
|
#line 1 "tao/pegtl/config.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONFIG_HPP
|
|
#define TAO_PEGTL_CONFIG_HPP
|
|
|
|
// Compatibility, remove with 3.0.0
|
|
#ifdef TAOCPP_PEGTL_NAMESPACE
|
|
#define TAO_PEGTL_NAMESPACE TAOCPP_PEGTL_NAMESPACE
|
|
#endif
|
|
|
|
#ifndef TAO_PEGTL_NAMESPACE
|
|
#define TAO_PEGTL_NAMESPACE pegtl
|
|
#endif
|
|
|
|
// Enable some improvements to the readability of
|
|
// demangled type names under some circumstances.
|
|
// #define TAO_PEGTL_PRETTY_DEMANGLE
|
|
|
|
#endif
|
|
#line 8 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/version.hpp"
|
|
|
|
#line 1 "tao/pegtl/version.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_VERSION_HPP
|
|
#define TAO_PEGTL_VERSION_HPP
|
|
|
|
#define TAO_PEGTL_VERSION "2.8.3"
|
|
|
|
#define TAO_PEGTL_VERSION_MAJOR 2
|
|
#define TAO_PEGTL_VERSION_MINOR 8
|
|
#define TAO_PEGTL_VERSION_PATCH 3
|
|
|
|
// Compatibility, remove with 3.0.0
|
|
#define TAOCPP_PEGTL_VERSION TAO_PEGTL_VERSION
|
|
#define TAOCPP_PEGTL_VERSION_MAJOR TAO_PEGTL_VERSION_MAJOR
|
|
#define TAOCPP_PEGTL_VERSION_MINOR TAO_PEGTL_VERSION_MINOR
|
|
#define TAOCPP_PEGTL_VERSION_PATCH TAO_PEGTL_VERSION_PATCH
|
|
|
|
#endif
|
|
#line 9 "tao/pegtl.hpp"
|
|
|
|
#line 1 "tao/pegtl/parse.hpp"
|
|
|
|
#line 1 "tao/pegtl/parse.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_PARSE_HPP
|
|
#define TAO_PEGTL_PARSE_HPP
|
|
|
|
#include <cassert>
|
|
|
|
#line 1 "tao/pegtl/apply_mode.hpp"
|
|
|
|
#line 1 "tao/pegtl/apply_mode.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_APPLY_MODE_HPP
|
|
#define TAO_PEGTL_APPLY_MODE_HPP
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
enum class apply_mode : bool
|
|
{
|
|
action = true,
|
|
nothing = false,
|
|
|
|
// Compatibility, remove with 3.0.0
|
|
ACTION = action,
|
|
NOTHING = nothing
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/parse.hpp"
|
|
|
|
#line 1 "tao/pegtl/normal.hpp"
|
|
|
|
#line 1 "tao/pegtl/normal.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_NORMAL_HPP
|
|
#define TAO_PEGTL_NORMAL_HPP
|
|
|
|
#include <type_traits>
|
|
#include <utility>
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/match.hpp"
|
|
|
|
#line 1 "tao/pegtl/match.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_MATCH_HPP
|
|
#define TAO_PEGTL_MATCH_HPP
|
|
|
|
#include <type_traits>
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/nothing.hpp"
|
|
|
|
#line 1 "tao/pegtl/nothing.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_NOTHING_HPP
|
|
#define TAO_PEGTL_NOTHING_HPP
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< typename Rule >
|
|
struct nothing
|
|
{
|
|
};
|
|
|
|
using maybe_nothing = nothing< void >;
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 12 "tao/pegtl/match.hpp"
|
|
#line 1 "tao/pegtl/require_apply.hpp"
|
|
|
|
#line 1 "tao/pegtl/require_apply.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_REQUIRE_APPLY_HPP
|
|
#define TAO_PEGTL_REQUIRE_APPLY_HPP
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
struct require_apply
|
|
{};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 13 "tao/pegtl/match.hpp"
|
|
#line 1 "tao/pegtl/require_apply0.hpp"
|
|
|
|
#line 1 "tao/pegtl/require_apply0.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_REQUIRE_APPLY0_HPP
|
|
#define TAO_PEGTL_REQUIRE_APPLY0_HPP
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
struct require_apply0
|
|
{};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 14 "tao/pegtl/match.hpp"
|
|
#line 1 "tao/pegtl/rewind_mode.hpp"
|
|
|
|
#line 1 "tao/pegtl/rewind_mode.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_REWIND_MODE_HPP
|
|
#define TAO_PEGTL_REWIND_MODE_HPP
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
enum class rewind_mode : char
|
|
{
|
|
active,
|
|
required,
|
|
dontcare,
|
|
|
|
// Compatibility, remove with 3.0.0
|
|
ACTIVE = active,
|
|
REQUIRED = required,
|
|
DONTCARE = dontcare
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 15 "tao/pegtl/match.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/dusel_mode.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/dusel_mode.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_DUSEL_MODE_HPP
|
|
#define TAO_PEGTL_INTERNAL_DUSEL_MODE_HPP
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
enum class dusel_mode : char
|
|
{
|
|
nothing = 0,
|
|
control = 1,
|
|
control_and_apply_void = 2,
|
|
control_and_apply_bool = 3,
|
|
control_and_apply0_void = 4,
|
|
control_and_apply0_bool = 5,
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 17 "tao/pegtl/match.hpp"
|
|
#line 1 "tao/pegtl/internal/duseltronik.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/duseltronik.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_DUSELTRONIK_HPP
|
|
#define TAO_PEGTL_INTERNAL_DUSELTRONIK_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
dusel_mode = dusel_mode::nothing >
|
|
struct duseltronik;
|
|
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control >
|
|
struct duseltronik< Rule, A, M, Action, Control, dusel_mode::nothing >
|
|
{
|
|
template< typename Input, typename... States >
|
|
static auto match( Input& in, States&&... st )
|
|
-> decltype( Rule::template match< A, M, Action, Control >( in, st... ), true )
|
|
{
|
|
return Rule::template match< A, M, Action, Control >( in, st... );
|
|
}
|
|
|
|
// NOTE: The additional "int = 0" is a work-around for missing expression SFINAE in VS2015.
|
|
|
|
template< typename Input, typename... States, int = 0 >
|
|
static auto match( Input& in, States&&... /*unused*/ )
|
|
-> decltype( Rule::match( in ), true )
|
|
{
|
|
return Rule::match( in );
|
|
}
|
|
};
|
|
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control >
|
|
struct duseltronik< Rule, A, M, Action, Control, dusel_mode::control >
|
|
{
|
|
template< typename Input, typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
Control< Rule >::start( static_cast< const Input& >( in ), st... );
|
|
|
|
if( duseltronik< Rule, A, M, Action, Control, dusel_mode::nothing >::match( in, st... ) ) {
|
|
Control< Rule >::success( static_cast< const Input& >( in ), st... );
|
|
return true;
|
|
}
|
|
Control< Rule >::failure( static_cast< const Input& >( in ), st... );
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control >
|
|
struct duseltronik< Rule, A, M, Action, Control, dusel_mode::control_and_apply_void >
|
|
{
|
|
template< typename Input, typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
auto m = in.template mark< rewind_mode::required >();
|
|
|
|
Control< Rule >::start( static_cast< const Input& >( in ), st... );
|
|
|
|
if( duseltronik< Rule, A, rewind_mode::active, Action, Control, dusel_mode::nothing >::match( in, st... ) ) {
|
|
Control< Rule >::template apply< Action >( m.iterator(), static_cast< const Input& >( in ), st... );
|
|
Control< Rule >::success( static_cast< const Input& >( in ), st... );
|
|
return m( true );
|
|
}
|
|
Control< Rule >::failure( static_cast< const Input& >( in ), st... );
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control >
|
|
struct duseltronik< Rule, A, M, Action, Control, dusel_mode::control_and_apply_bool >
|
|
{
|
|
template< typename Input, typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
auto m = in.template mark< rewind_mode::required >();
|
|
|
|
Control< Rule >::start( static_cast< const Input& >( in ), st... );
|
|
|
|
if( duseltronik< Rule, A, rewind_mode::active, Action, Control, dusel_mode::nothing >::match( in, st... ) ) {
|
|
if( Control< Rule >::template apply< Action >( m.iterator(), static_cast< const Input& >( in ), st... ) ) {
|
|
Control< Rule >::success( static_cast< const Input& >( in ), st... );
|
|
return m( true );
|
|
}
|
|
}
|
|
Control< Rule >::failure( static_cast< const Input& >( in ), st... );
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control >
|
|
struct duseltronik< Rule, A, M, Action, Control, dusel_mode::control_and_apply0_void >
|
|
{
|
|
template< typename Input, typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
Control< Rule >::start( static_cast< const Input& >( in ), st... );
|
|
|
|
if( duseltronik< Rule, A, M, Action, Control, dusel_mode::nothing >::match( in, st... ) ) {
|
|
Control< Rule >::template apply0< Action >( static_cast< const Input& >( in ), st... );
|
|
Control< Rule >::success( static_cast< const Input& >( in ), st... );
|
|
return true;
|
|
}
|
|
Control< Rule >::failure( static_cast< const Input& >( in ), st... );
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control >
|
|
struct duseltronik< Rule, A, M, Action, Control, dusel_mode::control_and_apply0_bool >
|
|
{
|
|
template< typename Input, typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
auto m = in.template mark< rewind_mode::required >();
|
|
|
|
Control< Rule >::start( static_cast< const Input& >( in ), st... );
|
|
|
|
if( duseltronik< Rule, A, rewind_mode::active, Action, Control, dusel_mode::nothing >::match( in, st... ) ) {
|
|
if( Control< Rule >::template apply0< Action >( static_cast< const Input& >( in ), st... ) ) {
|
|
Control< Rule >::success( static_cast< const Input& >( in ), st... );
|
|
return m( true );
|
|
}
|
|
}
|
|
Control< Rule >::failure( static_cast< const Input& >( in ), st... );
|
|
return false;
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 18 "tao/pegtl/match.hpp"
|
|
#line 1 "tao/pegtl/internal/has_apply.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/has_apply.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_HAS_APPLY_HPP
|
|
#define TAO_PEGTL_INTERNAL_HAS_APPLY_HPP
|
|
|
|
#include <type_traits>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename, typename, template< typename... > class, typename... >
|
|
struct has_apply
|
|
: std::false_type
|
|
{};
|
|
|
|
template< typename C, template< typename... > class Action, typename... S >
|
|
struct has_apply< C, decltype( C::template apply< Action >( std::declval< S >()... ) ), Action, S... >
|
|
: std::true_type
|
|
{};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 19 "tao/pegtl/match.hpp"
|
|
#line 1 "tao/pegtl/internal/has_apply0.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/has_apply0.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_HAS_APPLY0_HPP
|
|
#define TAO_PEGTL_INTERNAL_HAS_APPLY0_HPP
|
|
|
|
#include <type_traits>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename, typename, template< typename... > class, typename... >
|
|
struct has_apply0
|
|
: std::false_type
|
|
{};
|
|
|
|
template< typename C, template< typename... > class Action, typename... S >
|
|
struct has_apply0< C, decltype( C::template apply0< Action >( std::declval< S >()... ) ), Action, S... >
|
|
: std::true_type
|
|
{};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 20 "tao/pegtl/match.hpp"
|
|
#line 1 "tao/pegtl/internal/if_missing.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/if_missing.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_IF_MISSING_HPP
|
|
#define TAO_PEGTL_INTERNAL_IF_MISSING_HPP
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< bool >
|
|
struct if_missing;
|
|
|
|
template<>
|
|
struct if_missing< true >
|
|
{
|
|
template< typename Control,
|
|
template< typename... >
|
|
class Action,
|
|
typename Input,
|
|
typename... States >
|
|
static void apply( Input& in, States&&... st )
|
|
{
|
|
auto m = in.template mark< rewind_mode::required >();
|
|
Control::template apply< Action >( m.iterator(), in, st... );
|
|
}
|
|
|
|
template< typename Control,
|
|
template< typename... >
|
|
class Action,
|
|
typename Input,
|
|
typename... States >
|
|
static void apply0( Input& in, States&&... st )
|
|
{
|
|
Control::template apply0< Action >( in, st... );
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct if_missing< false >
|
|
{
|
|
template< typename Control,
|
|
template< typename... >
|
|
class Action,
|
|
typename Input,
|
|
typename... States >
|
|
static void apply( Input& /*unused*/, States&&... /*unused*/ )
|
|
{
|
|
}
|
|
|
|
template< typename Control,
|
|
template< typename... >
|
|
class Action,
|
|
typename Input,
|
|
typename... States >
|
|
static void apply0( Input& /*unused*/, States&&... /*unused*/ )
|
|
{
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 21 "tao/pegtl/match.hpp"
|
|
#line 1 "tao/pegtl/internal/skip_control.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/skip_control.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_SKIP_CONTROL_HPP
|
|
#define TAO_PEGTL_INTERNAL_SKIP_CONTROL_HPP
|
|
|
|
#include <type_traits>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
// This class is a simple tagging mechanism.
|
|
// By default, skip_control< Rule >::value
|
|
// is 'false'. Each internal (!) rule that should
|
|
// be hidden from the control and action class'
|
|
// callbacks simply specializes skip_control<>
|
|
// to return 'true' for the above expression.
|
|
|
|
template< typename Rule >
|
|
struct skip_control : std::false_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 22 "tao/pegtl/match.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
bool match( Input& in, States&&... st )
|
|
{
|
|
constexpr bool enable_control = !internal::skip_control< Rule >::value;
|
|
constexpr bool enable_action = enable_control && ( A == apply_mode::action );
|
|
|
|
using iterator_t = typename Input::iterator_t;
|
|
constexpr bool has_apply_void = enable_action && internal::has_apply< Control< Rule >, void, Action, const iterator_t&, const Input&, States... >::value;
|
|
constexpr bool has_apply_bool = enable_action && internal::has_apply< Control< Rule >, bool, Action, const iterator_t&, const Input&, States... >::value;
|
|
constexpr bool has_apply = has_apply_void || has_apply_bool;
|
|
|
|
constexpr bool has_apply0_void = enable_action && internal::has_apply0< Control< Rule >, void, Action, const Input&, States... >::value;
|
|
constexpr bool has_apply0_bool = enable_action && internal::has_apply0< Control< Rule >, bool, Action, const Input&, States... >::value;
|
|
constexpr bool has_apply0 = has_apply0_void || has_apply0_bool;
|
|
|
|
static_assert( !( has_apply && has_apply0 ), "both apply() and apply0() defined" );
|
|
|
|
constexpr bool is_nothing = std::is_base_of< nothing< Rule >, Action< Rule > >::value;
|
|
static_assert( !( has_apply && is_nothing ), "unexpected apply() defined" );
|
|
static_assert( !( has_apply0 && is_nothing ), "unexpected apply0() defined" );
|
|
|
|
internal::if_missing< !has_apply && std::is_base_of< require_apply, Action< Rule > >::value >::template apply< Control< Rule >, Action >( in, st... );
|
|
internal::if_missing< !has_apply0 && std::is_base_of< require_apply0, Action< Rule > >::value >::template apply0< Control< Rule >, Action >( in, st... );
|
|
|
|
constexpr bool validate_nothing = std::is_base_of< maybe_nothing, Action< void > >::value;
|
|
constexpr bool is_maybe_nothing = std::is_base_of< maybe_nothing, Action< Rule > >::value;
|
|
static_assert( !enable_action || !validate_nothing || is_nothing || is_maybe_nothing || has_apply || has_apply0, "either apply() or apply0() must be defined" );
|
|
|
|
constexpr auto mode = static_cast< internal::dusel_mode >( enable_control + has_apply_void + 2 * has_apply_bool + 3 * has_apply0_void + 4 * has_apply0_bool );
|
|
return internal::duseltronik< Rule, A, M, Action, Control, mode >::match( in, st... );
|
|
}
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 13 "tao/pegtl/normal.hpp"
|
|
#line 1 "tao/pegtl/parse_error.hpp"
|
|
|
|
#line 1 "tao/pegtl/parse_error.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_PARSE_ERROR_HPP
|
|
#define TAO_PEGTL_PARSE_ERROR_HPP
|
|
|
|
#include <stdexcept>
|
|
#include <vector>
|
|
|
|
|
|
#line 1 "tao/pegtl/position.hpp"
|
|
|
|
#line 1 "tao/pegtl/position.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_POSITION_HPP
|
|
#define TAO_PEGTL_POSITION_HPP
|
|
|
|
#include <cstdlib>
|
|
#include <ostream>
|
|
#include <sstream>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/iterator.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/iterator.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ITERATOR_HPP
|
|
#define TAO_PEGTL_INTERNAL_ITERATOR_HPP
|
|
|
|
#include <cstdlib>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct iterator
|
|
{
|
|
iterator() noexcept = default;
|
|
|
|
explicit iterator( const char* in_data ) noexcept
|
|
: data( in_data )
|
|
{
|
|
}
|
|
|
|
iterator( const char* in_data, const std::size_t in_byte, const std::size_t in_line, const std::size_t in_byte_in_line ) noexcept
|
|
: data( in_data ),
|
|
byte( in_byte ),
|
|
line( in_line ),
|
|
byte_in_line( in_byte_in_line )
|
|
{
|
|
}
|
|
|
|
iterator( const iterator& ) = default;
|
|
iterator( iterator&& ) = default;
|
|
|
|
~iterator() = default;
|
|
|
|
iterator& operator=( const iterator& ) = default;
|
|
iterator& operator=( iterator&& ) = default;
|
|
|
|
void reset() noexcept
|
|
{
|
|
*this = iterator();
|
|
}
|
|
|
|
const char* data = nullptr;
|
|
|
|
std::size_t byte = 0;
|
|
std::size_t line = 1;
|
|
std::size_t byte_in_line = 0;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 16 "tao/pegtl/position.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
struct position
|
|
{
|
|
template< typename T >
|
|
position( const internal::iterator& in_iter, T&& in_source )
|
|
: byte( in_iter.byte ),
|
|
line( in_iter.line ),
|
|
byte_in_line( in_iter.byte_in_line ),
|
|
source( std::forward< T >( in_source ) )
|
|
{
|
|
}
|
|
|
|
std::size_t byte;
|
|
std::size_t line;
|
|
std::size_t byte_in_line;
|
|
std::string source;
|
|
};
|
|
|
|
inline std::ostream& operator<<( std::ostream& o, const position& p )
|
|
{
|
|
return o << p.source << ':' << p.line << ':' << p.byte_in_line << '(' << p.byte << ')';
|
|
}
|
|
|
|
inline std::string to_string( const position& p )
|
|
{
|
|
std::ostringstream o;
|
|
o << p;
|
|
return o.str();
|
|
}
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 12 "tao/pegtl/parse_error.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
struct parse_error
|
|
: public std::runtime_error
|
|
{
|
|
parse_error( const std::string& msg, std::vector< position >&& in_positions )
|
|
: std::runtime_error( msg ),
|
|
positions( std::move( in_positions ) )
|
|
{
|
|
}
|
|
|
|
template< typename Input >
|
|
parse_error( const std::string& msg, const Input& in )
|
|
: parse_error( msg, in.position() )
|
|
{
|
|
}
|
|
|
|
parse_error( const std::string& msg, const position& pos )
|
|
: std::runtime_error( to_string( pos ) + ": " + msg ),
|
|
positions( 1, pos )
|
|
{
|
|
}
|
|
|
|
parse_error( const std::string& msg, position&& pos )
|
|
: std::runtime_error( to_string( pos ) + ": " + msg )
|
|
{
|
|
positions.emplace_back( std::move( pos ) );
|
|
}
|
|
|
|
std::vector< position > positions;
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 14 "tao/pegtl/normal.hpp"
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/demangle.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/demangle.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_DEMANGLE_HPP
|
|
#define TAO_PEGTL_INTERNAL_DEMANGLE_HPP
|
|
|
|
#include <string>
|
|
#include <typeinfo>
|
|
|
|
|
|
|
|
#if defined( __clang__ )
|
|
#if __has_feature( cxx_rtti )
|
|
#define TAO_PEGTL_RTTI_ENABLED
|
|
#endif
|
|
#elif defined( __GNUC__ )
|
|
#if defined( __GXX_RTTI )
|
|
#define TAO_PEGTL_RTTI_ENABLED
|
|
#endif
|
|
#elif defined( _MSC_VER )
|
|
#if defined( _CPPRTTI )
|
|
#define TAO_PEGTL_RTTI_ENABLED
|
|
#endif
|
|
#else
|
|
#define TAO_PEGTL_RTTI_ENABLED
|
|
#endif
|
|
|
|
#if !defined( TAO_PEGTL_RTTI_ENABLED )
|
|
#include <cassert>
|
|
#include <cstring>
|
|
#endif
|
|
|
|
#if defined( TAO_PEGTL_RTTI_ENABLED )
|
|
#if defined( __GLIBCXX__ )
|
|
#define TAO_PEGTL_USE_CXXABI_DEMANGLE
|
|
#elif defined( __has_include )
|
|
#if __has_include( <cxxabi.h> )
|
|
#define TAO_PEGTL_USE_CXXABI_DEMANGLE
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
#if defined( TAO_PEGTL_USE_CXXABI_DEMANGLE )
|
|
#line 1 "tao/pegtl/internal/demangle_cxxabi.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/demangle_cxxabi.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_DEMANGLE_CXXABI_HPP
|
|
#define TAO_PEGTL_INTERNAL_DEMANGLE_CXXABI_HPP
|
|
|
|
#include <cstdlib>
|
|
#include <cxxabi.h>
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/demangle_sanitise.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/demangle_sanitise.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_DEMANGLE_SANITISE_HPP
|
|
#define TAO_PEGTL_INTERNAL_DEMANGLE_SANITISE_HPP
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
inline void demangle_sanitise_chars( std::string& s )
|
|
{
|
|
std::string::size_type p;
|
|
while( ( p = s.find( "(char)" ) ) != std::string::npos ) {
|
|
int c = 0;
|
|
std::string::size_type q;
|
|
for( q = p + 6; ( q < s.size() ) && ( s[ q ] >= '0' ) && ( s[ q ] <= '9' ); ++q ) {
|
|
c *= 10;
|
|
c += s[ q ] - '0';
|
|
}
|
|
if( c == '\'' ) {
|
|
s.replace( p, q - p, "'\\''" );
|
|
}
|
|
else if( c == '\\' ) {
|
|
s.replace( p, q - p, "'\\\\'" );
|
|
}
|
|
else if( ( c < 32 ) || ( c > 126 ) ) {
|
|
s.replace( p, 6, std::string() );
|
|
}
|
|
else {
|
|
s.replace( p, q - p, std::string( 1, '\'' ) + char( c ) + '\'' );
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 15 "tao/pegtl/internal/demangle_cxxabi.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
inline std::string demangle( const char* symbol )
|
|
{
|
|
const std::unique_ptr< char, decltype( &std::free ) > demangled( abi::__cxa_demangle( symbol, nullptr, nullptr, nullptr ), &std::free );
|
|
if( !demangled ) {
|
|
return symbol;
|
|
}
|
|
std::string result( demangled.get() );
|
|
#ifdef TAO_PEGTL_PRETTY_DEMANGLE
|
|
demangle_sanitise_chars( result ); // LCOV_EXCL_LINE
|
|
#endif
|
|
return result;
|
|
}
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 45 "tao/pegtl/internal/demangle.hpp"
|
|
#undef TAO_PEGTL_USE_CXXABI_DEMANGLE
|
|
#else
|
|
#line 1 "tao/pegtl/internal/demangle_nop.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/demangle_nop.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_DEMANGLE_NOP_HPP
|
|
#define TAO_PEGTL_INTERNAL_DEMANGLE_NOP_HPP
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
inline std::string demangle( const char* symbol )
|
|
{
|
|
return symbol;
|
|
}
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 48 "tao/pegtl/internal/demangle.hpp"
|
|
#endif
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename T >
|
|
std::string demangle()
|
|
{
|
|
#if defined( TAO_PEGTL_RTTI_ENABLED )
|
|
return demangle( typeid( T ).name() );
|
|
#else
|
|
const char* start = nullptr;
|
|
const char* stop = nullptr;
|
|
#if defined( __clang__ ) || defined( __GNUC__ )
|
|
start = std::strchr( __PRETTY_FUNCTION__, '=' ) + 2;
|
|
stop = std::strrchr( start, ';' );
|
|
#elif defined( _MSC_VER )
|
|
start = std::strstr( __FUNCSIG__, "demangle<" ) + ( sizeof( "demangle<" ) - 1 );
|
|
stop = std::strrchr( start, '>' );
|
|
#else
|
|
static_assert( false, "expected to use rtti with this compiler" );
|
|
#endif
|
|
assert( start != nullptr );
|
|
assert( stop != nullptr );
|
|
return { start, std::size_t( stop - start ) };
|
|
#endif
|
|
}
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 17 "tao/pegtl/normal.hpp"
|
|
#line 1 "tao/pegtl/internal/has_match.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/has_match.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_HAS_MATCH_HPP
|
|
#define TAO_PEGTL_INTERNAL_HAS_MATCH_HPP
|
|
|
|
#include <type_traits>
|
|
#include <utility>
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename,
|
|
typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
struct has_match
|
|
: std::false_type
|
|
{};
|
|
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
struct has_match< decltype( Action< Rule >::template match< Rule, A, M, Action, Control >( std::declval< Input& >(), std::declval< States&& >()... ), void() ), Rule, A, M, Action, Control, Input, States... >
|
|
: std::true_type
|
|
{};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 18 "tao/pegtl/normal.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< typename Rule >
|
|
struct normal
|
|
{
|
|
template< typename Input, typename... States >
|
|
static void start( const Input& /*unused*/, States&&... /*unused*/ ) noexcept
|
|
{
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void success( const Input& /*unused*/, States&&... /*unused*/ ) noexcept
|
|
{
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void failure( const Input& /*unused*/, States&&... /*unused*/ ) noexcept
|
|
{
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void raise( const Input& in, States&&... /*unused*/ )
|
|
{
|
|
throw parse_error( "parse error matching " + internal::demangle< Rule >(), in );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Input, typename... States >
|
|
static auto apply0( const Input& /*unused*/, States&&... st )
|
|
-> decltype( Action< Rule >::apply0( st... ) )
|
|
{
|
|
return Action< Rule >::apply0( st... );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Iterator, typename Input, typename... States >
|
|
static auto apply( const Iterator& begin, const Input& in, States&&... st )
|
|
-> decltype( Action< Rule >::apply( std::declval< typename Input::action_t >(), st... ) )
|
|
{
|
|
const typename Input::action_t action_input( begin, in );
|
|
return Action< Rule >::apply( action_input, st... );
|
|
}
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static auto match( Input& in, States&&... st )
|
|
-> typename std::enable_if< internal::has_match< void, Rule, A, M, Action, Control, Input, States... >::value, bool >::type
|
|
{
|
|
return Action< Rule >::template match< Rule, A, M, Action, Control >( in, st... );
|
|
}
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States,
|
|
int = 1 >
|
|
static auto match( Input& in, States&&... st )
|
|
-> typename std::enable_if< !internal::has_match< void, Rule, A, M, Action, Control, Input, States... >::value, bool >::type
|
|
{
|
|
return TAO_PEGTL_NAMESPACE::match< Rule, A, M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 12 "tao/pegtl/parse.hpp"
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/action_input.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/action_input.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ACTION_INPUT_HPP
|
|
#define TAO_PEGTL_INTERNAL_ACTION_INPUT_HPP
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <string>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
inline const char* begin_c_ptr( const char* p ) noexcept
|
|
{
|
|
return p;
|
|
}
|
|
|
|
inline const char* begin_c_ptr( const iterator& it ) noexcept
|
|
{
|
|
return it.data;
|
|
}
|
|
|
|
template< typename Input >
|
|
class action_input
|
|
{
|
|
public:
|
|
using input_t = Input;
|
|
using iterator_t = typename Input::iterator_t;
|
|
|
|
action_input( const iterator_t& in_begin, const Input& in_input ) noexcept
|
|
: m_begin( in_begin ),
|
|
m_input( in_input )
|
|
{
|
|
}
|
|
|
|
action_input( const action_input& ) = delete;
|
|
action_input( action_input&& ) = delete;
|
|
|
|
~action_input() = default;
|
|
|
|
action_input& operator=( const action_input& ) = delete;
|
|
action_input& operator=( action_input&& ) = delete;
|
|
|
|
const iterator_t& iterator() const noexcept
|
|
{
|
|
return m_begin;
|
|
}
|
|
|
|
const Input& input() const noexcept
|
|
{
|
|
return m_input;
|
|
}
|
|
|
|
const char* begin() const noexcept
|
|
{
|
|
return begin_c_ptr( iterator() );
|
|
}
|
|
|
|
const char* end() const noexcept
|
|
{
|
|
return input().current();
|
|
}
|
|
|
|
bool empty() const noexcept
|
|
{
|
|
return begin() == end();
|
|
}
|
|
|
|
std::size_t size() const noexcept
|
|
{
|
|
return std::size_t( end() - begin() );
|
|
}
|
|
|
|
std::string string() const
|
|
{
|
|
return std::string( begin(), end() );
|
|
}
|
|
|
|
char peek_char( const std::size_t offset = 0 ) const noexcept
|
|
{
|
|
return begin()[ offset ];
|
|
}
|
|
|
|
std::uint8_t peek_uint8( const std::size_t offset = 0 ) const noexcept
|
|
{
|
|
return static_cast< std::uint8_t >( peek_char( offset ) );
|
|
}
|
|
|
|
// Compatibility, remove with 3.0.0
|
|
std::uint8_t peek_byte( const std::size_t offset = 0 ) const noexcept
|
|
{
|
|
return static_cast< std::uint8_t >( peek_char( offset ) );
|
|
}
|
|
|
|
TAO_PEGTL_NAMESPACE::position position() const
|
|
{
|
|
return input().position( iterator() ); // NOTE: Not efficient with lazy inputs.
|
|
}
|
|
|
|
protected:
|
|
const iterator_t m_begin;
|
|
const Input& m_input;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 17 "tao/pegtl/parse.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< typename Rule,
|
|
template< typename... > class Action = nothing,
|
|
template< typename... > class Control = normal,
|
|
apply_mode A = apply_mode::action,
|
|
rewind_mode M = rewind_mode::required,
|
|
typename Input,
|
|
typename... States >
|
|
bool parse( Input&& in, States&&... st )
|
|
{
|
|
return Control< Rule >::template match< A, M, Action, Control >( in, st... );
|
|
}
|
|
|
|
template< typename Rule,
|
|
template< typename... > class Action = nothing,
|
|
template< typename... > class Control = normal,
|
|
apply_mode A = apply_mode::action,
|
|
rewind_mode M = rewind_mode::required,
|
|
typename Outer,
|
|
typename Input,
|
|
typename... States >
|
|
bool parse_nested( const Outer& oi, Input&& in, States&&... st )
|
|
{
|
|
try {
|
|
return parse< Rule, Action, Control, A, M >( in, st... );
|
|
}
|
|
catch( parse_error& e ) {
|
|
e.positions.push_back( oi.position() );
|
|
throw;
|
|
}
|
|
}
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 11 "tao/pegtl.hpp"
|
|
|
|
#line 1 "tao/pegtl/ascii.hpp"
|
|
|
|
#line 1 "tao/pegtl/ascii.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_ASCII_HPP
|
|
#define TAO_PEGTL_ASCII_HPP
|
|
|
|
|
|
#line 1 "tao/pegtl/eol.hpp"
|
|
|
|
#line 1 "tao/pegtl/eol.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_EOL_HPP
|
|
#define TAO_PEGTL_EOL_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/eol.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/eol.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_EOL_HPP
|
|
#define TAO_PEGTL_INTERNAL_EOL_HPP
|
|
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/../analysis/generic.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/../analysis/generic.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_ANALYSIS_GENERIC_HPP
|
|
#define TAO_PEGTL_ANALYSIS_GENERIC_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/../analysis/grammar_info.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/../analysis/grammar_info.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_ANALYSIS_GRAMMAR_INFO_HPP
|
|
#define TAO_PEGTL_ANALYSIS_GRAMMAR_INFO_HPP
|
|
|
|
#include <map>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/../analysis/rule_info.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/../analysis/rule_info.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_ANALYSIS_RULE_INFO_HPP
|
|
#define TAO_PEGTL_ANALYSIS_RULE_INFO_HPP
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/../analysis/rule_type.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/../analysis/rule_type.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_ANALYSIS_RULE_TYPE_HPP
|
|
#define TAO_PEGTL_ANALYSIS_RULE_TYPE_HPP
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace analysis
|
|
{
|
|
enum class rule_type : char
|
|
{
|
|
any, // Consumption-on-success is always true; assumes bounded repetition of conjunction of sub-rules.
|
|
opt, // Consumption-on-success not necessarily true; assumes bounded repetition of conjunction of sub-rules.
|
|
seq, // Consumption-on-success depends on consumption of (non-zero bounded repetition of) conjunction of sub-rules.
|
|
sor, // Consumption-on-success depends on consumption of (non-zero bounded repetition of) disjunction of sub-rules.
|
|
|
|
// Compatibility, remove with 3.0.0
|
|
ANY = any,
|
|
OPT = opt,
|
|
SEQ = seq,
|
|
SOR = sor
|
|
};
|
|
|
|
} // namespace analysis
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 13 "tao/pegtl/internal/../analysis/rule_info.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace analysis
|
|
{
|
|
struct rule_info
|
|
{
|
|
explicit rule_info( const rule_type in_type ) noexcept
|
|
: type( in_type )
|
|
{
|
|
}
|
|
|
|
rule_type type;
|
|
std::vector< std::string > rules;
|
|
};
|
|
|
|
} // namespace analysis
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 15 "tao/pegtl/internal/../analysis/grammar_info.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace analysis
|
|
{
|
|
struct grammar_info
|
|
{
|
|
using map_t = std::map< std::string, rule_info >;
|
|
map_t map;
|
|
|
|
template< typename Name >
|
|
std::pair< map_t::iterator, bool > insert( const rule_type type )
|
|
{
|
|
return map.insert( map_t::value_type( internal::demangle< Name >(), rule_info( type ) ) );
|
|
}
|
|
};
|
|
|
|
} // namespace analysis
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/internal/../analysis/generic.hpp"
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace analysis
|
|
{
|
|
template< rule_type Type, typename... Rules >
|
|
struct generic
|
|
{
|
|
template< typename Name >
|
|
static std::string insert( grammar_info& g )
|
|
{
|
|
const auto r = g.insert< Name >( Type );
|
|
if( r.second ) {
|
|
#ifdef __cpp_fold_expressions
|
|
( r.first->second.rules.push_back( Rules::analyze_t::template insert< Rules >( g ) ), ... );
|
|
#else
|
|
using swallow = bool[];
|
|
(void)swallow{ ( r.first->second.rules.push_back( Rules::analyze_t::template insert< Rules >( g ) ), true )..., true };
|
|
#endif
|
|
}
|
|
return r.first->first;
|
|
}
|
|
};
|
|
|
|
} // namespace analysis
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 12 "tao/pegtl/internal/eol.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct eol
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::any >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept( noexcept( Input::eol_t::match( in ) ) )
|
|
{
|
|
return Input::eol_t::match( in ).first;
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct skip_control< eol > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/eol.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/cr_crlf_eol.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/cr_crlf_eol.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_CR_CRLF_EOL_HPP
|
|
#define TAO_PEGTL_INTERNAL_CR_CRLF_EOL_HPP
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/../eol_pair.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/../eol_pair.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_EOL_PAIR_HPP
|
|
#define TAO_PEGTL_EOL_PAIR_HPP
|
|
|
|
#include <cstddef>
|
|
#include <utility>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
using eol_pair = std::pair< bool, std::size_t >;
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 9 "tao/pegtl/internal/cr_crlf_eol.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct cr_crlf_eol
|
|
{
|
|
static constexpr int ch = '\r';
|
|
|
|
template< typename Input >
|
|
static eol_pair match( Input& in ) noexcept( noexcept( in.size( 2 ) ) )
|
|
{
|
|
eol_pair p = { false, in.size( 2 ) };
|
|
if( p.second ) {
|
|
if( in.peek_char() == '\r' ) {
|
|
in.bump_to_next_line( 1 + ( ( p.second > 1 ) && ( in.peek_char( 1 ) == '\n' ) ) );
|
|
p.first = true;
|
|
}
|
|
}
|
|
return p;
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 12 "tao/pegtl/eol.hpp"
|
|
#line 1 "tao/pegtl/internal/cr_eol.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/cr_eol.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_CR_EOL_HPP
|
|
#define TAO_PEGTL_INTERNAL_CR_EOL_HPP
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct cr_eol
|
|
{
|
|
static constexpr int ch = '\r';
|
|
|
|
template< typename Input >
|
|
static eol_pair match( Input& in ) noexcept( noexcept( in.size( 1 ) ) )
|
|
{
|
|
eol_pair p = { false, in.size( 1 ) };
|
|
if( p.second ) {
|
|
if( in.peek_char() == '\r' ) {
|
|
in.bump_to_next_line();
|
|
p.first = true;
|
|
}
|
|
}
|
|
return p;
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 13 "tao/pegtl/eol.hpp"
|
|
#line 1 "tao/pegtl/internal/crlf_eol.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/crlf_eol.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_CRLF_EOL_HPP
|
|
#define TAO_PEGTL_INTERNAL_CRLF_EOL_HPP
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct crlf_eol
|
|
{
|
|
static constexpr int ch = '\n';
|
|
|
|
template< typename Input >
|
|
static eol_pair match( Input& in ) noexcept( noexcept( in.size( 2 ) ) )
|
|
{
|
|
eol_pair p = { false, in.size( 2 ) };
|
|
if( p.second > 1 ) {
|
|
if( ( in.peek_char() == '\r' ) && ( in.peek_char( 1 ) == '\n' ) ) {
|
|
in.bump_to_next_line( 2 );
|
|
p.first = true;
|
|
}
|
|
}
|
|
return p;
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 14 "tao/pegtl/eol.hpp"
|
|
#line 1 "tao/pegtl/internal/lf_crlf_eol.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/lf_crlf_eol.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_LF_CRLF_EOL_HPP
|
|
#define TAO_PEGTL_INTERNAL_LF_CRLF_EOL_HPP
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct lf_crlf_eol
|
|
{
|
|
static constexpr int ch = '\n';
|
|
|
|
template< typename Input >
|
|
static eol_pair match( Input& in ) noexcept( noexcept( in.size( 2 ) ) )
|
|
{
|
|
eol_pair p = { false, in.size( 2 ) };
|
|
if( p.second ) {
|
|
const auto a = in.peek_char();
|
|
if( a == '\n' ) {
|
|
in.bump_to_next_line();
|
|
p.first = true;
|
|
}
|
|
else if( ( a == '\r' ) && ( p.second > 1 ) && ( in.peek_char( 1 ) == '\n' ) ) {
|
|
in.bump_to_next_line( 2 );
|
|
p.first = true;
|
|
}
|
|
}
|
|
return p;
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 15 "tao/pegtl/eol.hpp"
|
|
#line 1 "tao/pegtl/internal/lf_eol.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/lf_eol.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_LF_EOL_HPP
|
|
#define TAO_PEGTL_INTERNAL_LF_EOL_HPP
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct lf_eol
|
|
{
|
|
static constexpr int ch = '\n';
|
|
|
|
template< typename Input >
|
|
static eol_pair match( Input& in ) noexcept( noexcept( in.size( 1 ) ) )
|
|
{
|
|
eol_pair p = { false, in.size( 1 ) };
|
|
if( p.second ) {
|
|
if( in.peek_char() == '\n' ) {
|
|
in.bump_to_next_line();
|
|
p.first = true;
|
|
}
|
|
}
|
|
return p;
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 16 "tao/pegtl/eol.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
inline namespace ascii
|
|
{
|
|
// this is both a rule and a pseudo-namespace for eol::cr, ...
|
|
struct eol : internal::eol
|
|
{
|
|
// clang-format off
|
|
struct cr : internal::cr_eol {};
|
|
struct cr_crlf : internal::cr_crlf_eol {};
|
|
struct crlf : internal::crlf_eol {};
|
|
struct lf : internal::lf_eol {};
|
|
struct lf_crlf : internal::lf_crlf_eol {};
|
|
// clang-format on
|
|
};
|
|
|
|
} // namespace ascii
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 9 "tao/pegtl/ascii.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/always_false.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/always_false.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ALWAYS_FALSE_HPP
|
|
#define TAO_PEGTL_INTERNAL_ALWAYS_FALSE_HPP
|
|
|
|
|
|
|
|
#include <type_traits>
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename... >
|
|
struct always_false
|
|
: std::false_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 11 "tao/pegtl/ascii.hpp"
|
|
#line 1 "tao/pegtl/internal/result_on_found.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/result_on_found.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_RESULT_ON_FOUND_HPP
|
|
#define TAO_PEGTL_INTERNAL_RESULT_ON_FOUND_HPP
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
enum class result_on_found : bool
|
|
{
|
|
success = true,
|
|
failure = false,
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 12 "tao/pegtl/ascii.hpp"
|
|
#line 1 "tao/pegtl/internal/rules.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/rules.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_RULES_HPP
|
|
#define TAO_PEGTL_INTERNAL_RULES_HPP
|
|
|
|
#line 1 "tao/pegtl/internal/action.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/action.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ACTION_HPP
|
|
#define TAO_PEGTL_INTERNAL_ACTION_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/seq.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/seq.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_SEQ_HPP
|
|
#define TAO_PEGTL_INTERNAL_SEQ_HPP
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/trivial.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/trivial.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_TRIVIAL_HPP
|
|
#define TAO_PEGTL_INTERNAL_TRIVIAL_HPP
|
|
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/../analysis/counted.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/../analysis/counted.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_ANALYSIS_COUNTED_HPP
|
|
#define TAO_PEGTL_ANALYSIS_COUNTED_HPP
|
|
|
|
|
|
|
|
#include <cstddef>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace analysis
|
|
{
|
|
template< rule_type Type, std::size_t Count, typename... Rules >
|
|
struct counted
|
|
: generic< ( Count != 0 ) ? Type : rule_type::opt, Rules... >
|
|
{
|
|
};
|
|
|
|
} // namespace analysis
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 12 "tao/pegtl/internal/trivial.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< bool Result >
|
|
struct trivial
|
|
{
|
|
using analyze_t = analysis::counted< analysis::rule_type::any, unsigned( !Result ) >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& /*unused*/ ) noexcept
|
|
{
|
|
return Result;
|
|
}
|
|
};
|
|
|
|
template< bool Result >
|
|
struct skip_control< trivial< Result > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 11 "tao/pegtl/internal/seq.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename... Rules >
|
|
struct seq;
|
|
|
|
template<>
|
|
struct seq<>
|
|
: trivial< true >
|
|
{
|
|
};
|
|
|
|
template< typename Rule >
|
|
struct seq< Rule >
|
|
{
|
|
using analyze_t = typename Rule::analyze_t;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return Control< Rule >::template match< A, M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
template< typename... Rules >
|
|
struct seq
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::seq, Rules... >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
auto m = in.template mark< M >();
|
|
using m_t = decltype( m );
|
|
#ifdef __cpp_fold_expressions
|
|
return m( ( Control< Rules >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) && ... ) );
|
|
#else
|
|
bool result = true;
|
|
using swallow = bool[];
|
|
(void)swallow{ result = result && Control< Rules >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... )... };
|
|
return m( result );
|
|
#endif
|
|
}
|
|
|
|
}; // namespace internal
|
|
|
|
template< typename... Rules >
|
|
struct skip_control< seq< Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/internal/action.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< template< typename... > class Action, typename... Rules >
|
|
struct action
|
|
: action< Action, seq< Rules... > >
|
|
{
|
|
};
|
|
|
|
template< template< typename... > class Action, typename Rule >
|
|
struct action< Action, Rule >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::seq, Rule >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return Control< Rule >::template match< A, M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
template< template< typename... > class Action, typename... Rules >
|
|
struct skip_control< action< Action, Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 8 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/alnum.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/alnum.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ALNUM_HPP
|
|
#define TAO_PEGTL_INTERNAL_ALNUM_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/peek_char.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/peek_char.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_PEEK_CHAR_HPP
|
|
#define TAO_PEGTL_INTERNAL_PEEK_CHAR_HPP
|
|
|
|
#include <cstddef>
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/input_pair.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/input_pair.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_INPUT_PAIR_HPP
|
|
#define TAO_PEGTL_INTERNAL_INPUT_PAIR_HPP
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Data >
|
|
struct input_pair
|
|
{
|
|
Data data;
|
|
std::uint8_t size;
|
|
|
|
using data_t = Data;
|
|
|
|
explicit operator bool() const noexcept
|
|
{
|
|
return size > 0;
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 12 "tao/pegtl/internal/peek_char.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct peek_char
|
|
{
|
|
using data_t = char;
|
|
using pair_t = input_pair< char >;
|
|
|
|
template< typename Input >
|
|
static pair_t peek( Input& in ) noexcept( noexcept( in.empty() ) )
|
|
{
|
|
if( in.empty() ) {
|
|
return { 0, 0 };
|
|
}
|
|
return { in.peek_char(), 1 };
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/internal/alnum.hpp"
|
|
#line 1 "tao/pegtl/internal/ranges.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/ranges.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_RANGES_HPP
|
|
#define TAO_PEGTL_INTERNAL_RANGES_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/bump_help.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/bump_help.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_BUMP_HELP_HPP
|
|
#define TAO_PEGTL_INTERNAL_BUMP_HELP_HPP
|
|
|
|
#include <cstddef>
|
|
#include <type_traits>
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< bool >
|
|
struct bump_impl;
|
|
|
|
template<>
|
|
struct bump_impl< true >
|
|
{
|
|
template< typename Input >
|
|
static void bump( Input& in, const std::size_t count ) noexcept
|
|
{
|
|
in.bump( count );
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct bump_impl< false >
|
|
{
|
|
template< typename Input >
|
|
static void bump( Input& in, const std::size_t count ) noexcept
|
|
{
|
|
in.bump_in_this_line( count );
|
|
}
|
|
};
|
|
|
|
template< bool... >
|
|
struct bool_list
|
|
{
|
|
};
|
|
|
|
template< bool... Bs >
|
|
using bool_and = std::is_same< bool_list< Bs..., true >, bool_list< true, Bs... > >;
|
|
|
|
template< result_on_found R, typename Input, typename Char, Char... Cs >
|
|
void bump_help( Input& in, const std::size_t count ) noexcept
|
|
{
|
|
bump_impl< bool_and< ( Cs != Input::eol_t::ch )... >::value != bool( R ) >::bump( in, count );
|
|
}
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/internal/ranges.hpp"
|
|
#line 1 "tao/pegtl/internal/range.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/range.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_RANGE_HPP
|
|
#define TAO_PEGTL_INTERNAL_RANGE_HPP
|
|
#line 15 "tao/pegtl/internal/range.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< result_on_found R, typename Peek, typename Peek::data_t Lo, typename Peek::data_t Hi >
|
|
struct range
|
|
{
|
|
static_assert( Lo <= Hi, "invalid range detected" );
|
|
|
|
using analyze_t = analysis::generic< analysis::rule_type::any >;
|
|
|
|
template< int Eol >
|
|
struct can_match_eol
|
|
{
|
|
static constexpr bool value = ( ( ( Lo <= Eol ) && ( Eol <= Hi ) ) == bool( R ) );
|
|
};
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept( noexcept( Peek::peek( in ) ) )
|
|
{
|
|
if( const auto t = Peek::peek( in ) ) {
|
|
if( ( ( Lo <= t.data ) && ( t.data <= Hi ) ) == bool( R ) ) {
|
|
bump_impl< can_match_eol< Input::eol_t::ch >::value >::bump( in, t.size );
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< result_on_found R, typename Peek, typename Peek::data_t Lo, typename Peek::data_t Hi >
|
|
struct skip_control< range< R, Peek, Lo, Hi > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 11 "tao/pegtl/internal/ranges.hpp"
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< int Eol, typename Char, Char... Cs >
|
|
struct ranges_impl;
|
|
|
|
template< int Eol, typename Char >
|
|
struct ranges_impl< Eol, Char >
|
|
{
|
|
static constexpr bool can_match_eol = false;
|
|
|
|
static bool match( const Char /*unused*/ ) noexcept
|
|
{
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< int Eol, typename Char, Char Eq >
|
|
struct ranges_impl< Eol, Char, Eq >
|
|
{
|
|
static constexpr bool can_match_eol = ( Eq == Eol );
|
|
|
|
static bool match( const Char c ) noexcept
|
|
{
|
|
return c == Eq;
|
|
}
|
|
};
|
|
|
|
template< int Eol, typename Char, Char Lo, Char Hi, Char... Cs >
|
|
struct ranges_impl< Eol, Char, Lo, Hi, Cs... >
|
|
{
|
|
static_assert( Lo <= Hi, "invalid range detected" );
|
|
|
|
static constexpr bool can_match_eol = ( ( ( Lo <= Eol ) && ( Eol <= Hi ) ) || ranges_impl< Eol, Char, Cs... >::can_match_eol );
|
|
|
|
static bool match( const Char c ) noexcept
|
|
{
|
|
return ( ( Lo <= c ) && ( c <= Hi ) ) || ranges_impl< Eol, Char, Cs... >::match( c );
|
|
}
|
|
};
|
|
|
|
template< typename Peek, typename Peek::data_t... Cs >
|
|
struct ranges
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::any >;
|
|
|
|
template< int Eol >
|
|
struct can_match_eol
|
|
{
|
|
static constexpr bool value = ranges_impl< Eol, typename Peek::data_t, Cs... >::can_match_eol;
|
|
};
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept( noexcept( Peek::peek( in ) ) )
|
|
{
|
|
if( const auto t = Peek::peek( in ) ) {
|
|
if( ranges_impl< Input::eol_t::ch, typename Peek::data_t, Cs... >::match( t.data ) ) {
|
|
bump_impl< can_match_eol< Input::eol_t::ch >::value >::bump( in, t.size );
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< typename Peek, typename Peek::data_t Lo, typename Peek::data_t Hi >
|
|
struct ranges< Peek, Lo, Hi >
|
|
: range< result_on_found::success, Peek, Lo, Hi >
|
|
{
|
|
};
|
|
|
|
template< typename Peek, typename Peek::data_t... Cs >
|
|
struct skip_control< ranges< Peek, Cs... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 11 "tao/pegtl/internal/alnum.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
using alnum = ranges< peek_char, 'a', 'z', 'A', 'Z', '0', '9' >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 9 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/alpha.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/alpha.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ALPHA_HPP
|
|
#define TAO_PEGTL_INTERNAL_ALPHA_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
using alpha = ranges< peek_char, 'a', 'z', 'A', 'Z' >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/any.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/any.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ANY_HPP
|
|
#define TAO_PEGTL_INTERNAL_ANY_HPP
|
|
#line 14 "tao/pegtl/internal/any.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Peek >
|
|
struct any;
|
|
|
|
template<>
|
|
struct any< peek_char >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::any >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept( noexcept( in.empty() ) )
|
|
{
|
|
if( !in.empty() ) {
|
|
in.bump();
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< typename Peek >
|
|
struct any
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::any >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept( noexcept( Peek::peek( in ) ) )
|
|
{
|
|
if( const auto t = Peek::peek( in ) ) {
|
|
in.bump( t.size );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< typename Peek >
|
|
struct skip_control< any< Peek > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 11 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/apply.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/apply.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_APPLY_HPP
|
|
#define TAO_PEGTL_INTERNAL_APPLY_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/apply_single.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/apply_single.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_APPLY_SINGLE_HPP
|
|
#define TAO_PEGTL_INTERNAL_APPLY_SINGLE_HPP
|
|
|
|
|
|
|
|
#include <type_traits>
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Action >
|
|
struct apply_single
|
|
{
|
|
template< typename Input, typename... States >
|
|
static auto match( const Input& i2, States&&... st )
|
|
-> typename std::enable_if< std::is_same< decltype( Action::apply( i2, st... ) ), void >::value, bool >::type
|
|
{
|
|
Action::apply( i2, st... );
|
|
return true;
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static auto match( const Input& i2, States&&... st )
|
|
-> typename std::enable_if< std::is_same< decltype( Action::apply( i2, st... ) ), bool >::value, bool >::type
|
|
{
|
|
return Action::apply( i2, st... );
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/internal/apply.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< apply_mode A, typename... Actions >
|
|
struct apply_impl;
|
|
|
|
template<>
|
|
struct apply_impl< apply_mode::action >
|
|
{
|
|
template< typename Input, typename... States >
|
|
static bool match( Input& /*unused*/, States&&... /*unused*/ )
|
|
{
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template< typename... Actions >
|
|
struct apply_impl< apply_mode::action, Actions... >
|
|
{
|
|
template< typename Input, typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
using action_t = typename Input::action_t;
|
|
const action_t i2( in.iterator(), in ); // No data -- range is from begin to begin.
|
|
#ifdef __cpp_fold_expressions
|
|
return ( apply_single< Actions >::match( i2, st... ) && ... );
|
|
#else
|
|
bool result = true;
|
|
using swallow = bool[];
|
|
(void)swallow{ result = result && apply_single< Actions >::match( i2, st... )... };
|
|
return result;
|
|
#endif
|
|
}
|
|
};
|
|
|
|
template< typename... Actions >
|
|
struct apply_impl< apply_mode::nothing, Actions... >
|
|
{
|
|
template< typename Input, typename... States >
|
|
static bool match( Input& /*unused*/, States&&... /*unused*/ )
|
|
{
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template< typename... Actions >
|
|
struct apply
|
|
{
|
|
using analyze_t = analysis::counted< analysis::rule_type::any, 0 >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return apply_impl< A, Actions... >::match( in, st... );
|
|
}
|
|
};
|
|
|
|
template< typename... Actions >
|
|
struct skip_control< apply< Actions... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 12 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/apply0.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/apply0.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_APPLY0_HPP
|
|
#define TAO_PEGTL_INTERNAL_APPLY0_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/apply0_single.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/apply0_single.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_APPLY0_SINGLE_HPP
|
|
#define TAO_PEGTL_INTERNAL_APPLY0_SINGLE_HPP
|
|
|
|
|
|
|
|
#include <type_traits>
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Action >
|
|
struct apply0_single
|
|
{
|
|
template< typename... States >
|
|
static auto match( States&&... st )
|
|
-> typename std::enable_if< std::is_same< decltype( Action::apply0( st... ) ), void >::value, bool >::type
|
|
{
|
|
Action::apply0( st... );
|
|
return true;
|
|
}
|
|
|
|
template< typename... States >
|
|
static auto match( States&&... st )
|
|
-> typename std::enable_if< std::is_same< decltype( Action::apply0( st... ) ), bool >::value, bool >::type
|
|
{
|
|
return Action::apply0( st... );
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/internal/apply0.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< apply_mode A, typename... Actions >
|
|
struct apply0_impl;
|
|
|
|
template<>
|
|
struct apply0_impl< apply_mode::action >
|
|
{
|
|
template< typename... States >
|
|
static bool match( States&&... /*unused*/ ) noexcept
|
|
{
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template< typename... Actions >
|
|
struct apply0_impl< apply_mode::action, Actions... >
|
|
{
|
|
template< typename... States >
|
|
static bool match( States&&... st )
|
|
{
|
|
#ifdef __cpp_fold_expressions
|
|
return ( apply0_single< Actions >::match( st... ) && ... );
|
|
#else
|
|
bool result = true;
|
|
using swallow = bool[];
|
|
(void)swallow{ result = result && apply0_single< Actions >::match( st... )... };
|
|
return result;
|
|
#endif
|
|
}
|
|
};
|
|
|
|
template< typename... Actions >
|
|
struct apply0_impl< apply_mode::nothing, Actions... >
|
|
{
|
|
template< typename... States >
|
|
static bool match( States&&... /*unused*/ ) noexcept
|
|
{
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template< typename... Actions >
|
|
struct apply0
|
|
{
|
|
using analyze_t = analysis::counted< analysis::rule_type::any, 0 >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& /*unused*/, States&&... st )
|
|
{
|
|
return apply0_impl< A, Actions... >::match( st... );
|
|
}
|
|
};
|
|
|
|
template< typename... Actions >
|
|
struct skip_control< apply0< Actions... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 13 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/at.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/at.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_AT_HPP
|
|
#define TAO_PEGTL_INTERNAL_AT_HPP
|
|
#line 18 "tao/pegtl/internal/at.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename... Rules >
|
|
struct at
|
|
: at< seq< Rules... > >
|
|
{
|
|
};
|
|
|
|
template<>
|
|
struct at<>
|
|
: trivial< true >
|
|
{
|
|
};
|
|
|
|
template< typename Rule >
|
|
struct at< Rule >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::opt, Rule >;
|
|
|
|
template< apply_mode,
|
|
rewind_mode,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
const auto m = in.template mark< rewind_mode::required >();
|
|
return Control< Rule >::template match< apply_mode::nothing, rewind_mode::active, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
template< typename... Rules >
|
|
struct skip_control< at< Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 14 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/bof.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/bof.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_BOF_HPP
|
|
#define TAO_PEGTL_INTERNAL_BOF_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct bof
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::opt >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept
|
|
{
|
|
return in.byte() == 0;
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct skip_control< bof > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 15 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/bol.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/bol.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_BOL_HPP
|
|
#define TAO_PEGTL_INTERNAL_BOL_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct bol
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::opt >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept
|
|
{
|
|
return in.byte_in_line() == 0;
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct skip_control< bol > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 16 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/bytes.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/bytes.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_BYTES_HPP
|
|
#define TAO_PEGTL_INTERNAL_BYTES_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< unsigned Num >
|
|
struct bytes
|
|
{
|
|
using analyze_t = analysis::counted< analysis::rule_type::any, Num >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept( noexcept( in.size( 0 ) ) )
|
|
{
|
|
if( in.size( Num ) >= Num ) {
|
|
in.bump( Num );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< unsigned Num >
|
|
struct skip_control< bytes< Num > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 17 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/control.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/control.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_CONTROL_HPP
|
|
#define TAO_PEGTL_INTERNAL_CONTROL_HPP
|
|
#line 17 "tao/pegtl/internal/control.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< template< typename... > class Control, typename... Rules >
|
|
struct control
|
|
: control< Control, seq< Rules... > >
|
|
{
|
|
};
|
|
|
|
template< template< typename... > class Control, typename Rule >
|
|
struct control< Control, Rule >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::seq, Rule >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return Control< Rule >::template match< A, M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
template< template< typename... > class Control, typename... Rules >
|
|
struct skip_control< control< Control, Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 18 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/disable.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/disable.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_DISABLE_HPP
|
|
#define TAO_PEGTL_INTERNAL_DISABLE_HPP
|
|
#line 17 "tao/pegtl/internal/disable.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename... Rules >
|
|
struct disable
|
|
: disable< seq< Rules... > >
|
|
{
|
|
};
|
|
|
|
template< typename Rule >
|
|
struct disable< Rule >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::seq, Rule >;
|
|
|
|
template< apply_mode,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return Control< Rule >::template match< apply_mode::nothing, M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
template< typename... Rules >
|
|
struct skip_control< disable< Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 19 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/discard.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/discard.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_DISCARD_HPP
|
|
#define TAO_PEGTL_INTERNAL_DISCARD_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct discard
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::opt >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept
|
|
{
|
|
static_assert( noexcept( in.discard() ), "an input's discard()-method must be noexcept" );
|
|
in.discard();
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct skip_control< discard > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 20 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/enable.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/enable.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ENABLE_HPP
|
|
#define TAO_PEGTL_INTERNAL_ENABLE_HPP
|
|
#line 17 "tao/pegtl/internal/enable.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename... Rules >
|
|
struct enable
|
|
: enable< seq< Rules... > >
|
|
{
|
|
};
|
|
|
|
template< typename Rule >
|
|
struct enable< Rule >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::seq, Rule >;
|
|
|
|
template< apply_mode,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return Control< Rule >::template match< apply_mode::action, M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
template< typename... Rules >
|
|
struct skip_control< enable< Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 21 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/eof.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/eof.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_EOF_HPP
|
|
#define TAO_PEGTL_INTERNAL_EOF_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct eof
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::opt >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept( noexcept( in.empty() ) )
|
|
{
|
|
return in.empty();
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct skip_control< eof > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 22 "tao/pegtl/internal/rules.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/eolf.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/eolf.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_EOLF_HPP
|
|
#define TAO_PEGTL_INTERNAL_EOLF_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct eolf
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::opt >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept( noexcept( Input::eol_t::match( in ) ) )
|
|
{
|
|
const auto p = Input::eol_t::match( in );
|
|
return p.first || ( !p.second );
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct skip_control< eolf > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 24 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/identifier.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/identifier.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_IDENTIFIER_HPP
|
|
#define TAO_PEGTL_INTERNAL_IDENTIFIER_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/star.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/star.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_STAR_HPP
|
|
#define TAO_PEGTL_INTERNAL_STAR_HPP
|
|
|
|
#include <type_traits>
|
|
#line 19 "tao/pegtl/internal/star.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Rule, typename... Rules >
|
|
struct star
|
|
: star< seq< Rule, Rules... > >
|
|
{};
|
|
|
|
template< typename Rule >
|
|
struct star< Rule >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::opt, Rule, star >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
while( Control< Rule >::template match< A, rewind_mode::required, Action, Control >( in, st... ) ) {
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template< typename Rule, typename... Rules >
|
|
struct skip_control< star< Rule, Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 13 "tao/pegtl/internal/identifier.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
using identifier_first = ranges< peek_char, 'a', 'z', 'A', 'Z', '_' >;
|
|
using identifier_other = ranges< peek_char, 'a', 'z', 'A', 'Z', '0', '9', '_' >;
|
|
using identifier = seq< identifier_first, star< identifier_other > >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 25 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/if_apply.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/if_apply.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_IF_APPLY_HPP
|
|
#define TAO_PEGTL_INTERNAL_IF_APPLY_HPP
|
|
#line 16 "tao/pegtl/internal/if_apply.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< apply_mode A, typename Rule, typename... Actions >
|
|
struct if_apply_impl;
|
|
|
|
template< typename Rule >
|
|
struct if_apply_impl< apply_mode::action, Rule >
|
|
{
|
|
template< rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return Control< Rule >::template match< apply_mode::action, M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
template< typename Rule, typename... Actions >
|
|
struct if_apply_impl< apply_mode::action, Rule, Actions... >
|
|
{
|
|
template< rewind_mode,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
using action_t = typename Input::action_t;
|
|
|
|
auto m = in.template mark< rewind_mode::required >();
|
|
|
|
if( Control< Rule >::template match< apply_mode::action, rewind_mode::active, Action, Control >( in, st... ) ) {
|
|
const action_t i2( m.iterator(), in );
|
|
#ifdef __cpp_fold_expressions
|
|
return m( ( apply_single< Actions >::match( i2, st... ) && ... ) );
|
|
#else
|
|
bool result = true;
|
|
using swallow = bool[];
|
|
(void)swallow{ result = result && apply_single< Actions >::match( i2, st... )... };
|
|
return m( result );
|
|
#endif
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< typename Rule, typename... Actions >
|
|
struct if_apply_impl< apply_mode::nothing, Rule, Actions... >
|
|
{
|
|
template< rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return Control< Rule >::template match< apply_mode::nothing, M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
template< typename Rule, typename... Actions >
|
|
struct if_apply
|
|
{
|
|
using analyze_t = typename Rule::analyze_t;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return if_apply_impl< A, Rule, Actions... >::template match< M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
template< typename Rule, typename... Actions >
|
|
struct skip_control< if_apply< Rule, Actions... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 26 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/if_must.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/if_must.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_IF_MUST_HPP
|
|
#define TAO_PEGTL_INTERNAL_IF_MUST_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/must.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/must.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_MUST_HPP
|
|
#define TAO_PEGTL_INTERNAL_MUST_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/raise.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/raise.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_RAISE_HPP
|
|
#define TAO_PEGTL_INTERNAL_RAISE_HPP
|
|
|
|
#include <cstdlib>
|
|
#include <stdexcept>
|
|
#include <type_traits>
|
|
#line 19 "tao/pegtl/internal/raise.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename T >
|
|
struct raise
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::any >;
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma warning( push )
|
|
#pragma warning( disable : 4702 )
|
|
#endif
|
|
template< apply_mode,
|
|
rewind_mode,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
Control< T >::raise( static_cast< const Input& >( in ), st... );
|
|
throw std::logic_error( "code should be unreachable: Control< T >::raise() did not throw an exception" ); // NOLINT, LCOV_EXCL_LINE
|
|
#ifdef _MSC_VER
|
|
#pragma warning( pop )
|
|
#endif
|
|
}
|
|
};
|
|
|
|
template< typename T >
|
|
struct skip_control< raise< T > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/internal/must.hpp"
|
|
#line 18 "tao/pegtl/internal/must.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
// The general case applies must<> to each of the
|
|
// rules in the 'Rules' parameter pack individually.
|
|
|
|
template< typename... Rules >
|
|
struct must
|
|
: seq< must< Rules >... >
|
|
{
|
|
};
|
|
|
|
// While in theory the implementation for a single rule could
|
|
// be simplified to must< Rule > = sor< Rule, raise< Rule > >, this
|
|
// would result in some unnecessary run-time overhead.
|
|
|
|
template< typename Rule >
|
|
struct must< Rule >
|
|
{
|
|
using analyze_t = typename Rule::analyze_t;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
if( !Control< Rule >::template match< A, rewind_mode::dontcare, Action, Control >( in, st... ) ) {
|
|
raise< Rule >::template match< A, rewind_mode::dontcare, Action, Control >( in, st... );
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template< typename... Rules >
|
|
struct skip_control< must< Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/internal/if_must.hpp"
|
|
#line 18 "tao/pegtl/internal/if_must.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< bool Default, typename Cond, typename... Rules >
|
|
struct if_must
|
|
{
|
|
using analyze_t = analysis::counted< analysis::rule_type::seq, Default ? 0 : 1, Cond, must< Rules... > >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
if( Control< Cond >::template match< A, M, Action, Control >( in, st... ) ) {
|
|
Control< must< Rules... > >::template match< A, M, Action, Control >( in, st... );
|
|
return true;
|
|
}
|
|
return Default;
|
|
}
|
|
};
|
|
|
|
template< bool Default, typename Cond, typename... Rules >
|
|
struct skip_control< if_must< Default, Cond, Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 27 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/if_must_else.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/if_must_else.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_IF_MUST_ELSE_HPP
|
|
#define TAO_PEGTL_INTERNAL_IF_MUST_ELSE_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/if_then_else.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/if_then_else.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_IF_THEN_ELSE_HPP
|
|
#define TAO_PEGTL_INTERNAL_IF_THEN_ELSE_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/not_at.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/not_at.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_NOT_AT_HPP
|
|
#define TAO_PEGTL_INTERNAL_NOT_AT_HPP
|
|
#line 18 "tao/pegtl/internal/not_at.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename... Rules >
|
|
struct not_at
|
|
: not_at< seq< Rules... > >
|
|
{
|
|
};
|
|
|
|
template<>
|
|
struct not_at<>
|
|
: trivial< false >
|
|
{
|
|
};
|
|
|
|
template< typename Rule >
|
|
struct not_at< Rule >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::opt, Rule >;
|
|
|
|
template< apply_mode,
|
|
rewind_mode,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
const auto m = in.template mark< rewind_mode::required >();
|
|
return !Control< Rule >::template match< apply_mode::nothing, rewind_mode::active, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
template< typename... Rules >
|
|
struct skip_control< not_at< Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/internal/if_then_else.hpp"
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/sor.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/sor.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_SOR_HPP
|
|
#define TAO_PEGTL_INTERNAL_SOR_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/integer_sequence.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/integer_sequence.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_INTEGER_SEQUENCE_HPP
|
|
#define TAO_PEGTL_INTERNAL_INTEGER_SEQUENCE_HPP
|
|
|
|
#include <cstddef>
|
|
#include <type_traits>
|
|
#include <utility>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename T, T... Ns >
|
|
struct integer_sequence
|
|
{
|
|
using value_type = T;
|
|
|
|
static constexpr std::size_t size() noexcept
|
|
{
|
|
return sizeof...( Ns );
|
|
}
|
|
};
|
|
|
|
template< std::size_t... Ns >
|
|
using index_sequence = integer_sequence< std::size_t, Ns... >;
|
|
|
|
template< bool V, bool E >
|
|
struct generate_sequence;
|
|
|
|
template<>
|
|
struct generate_sequence< false, true >
|
|
{
|
|
template< typename T, T M, T N, std::size_t S, T... Ns >
|
|
using f = integer_sequence< T, Ns... >;
|
|
};
|
|
|
|
template<>
|
|
struct generate_sequence< true, true >
|
|
{
|
|
template< typename T, T M, T N, std::size_t S, T... Ns >
|
|
using f = integer_sequence< T, Ns..., S >;
|
|
};
|
|
|
|
template<>
|
|
struct generate_sequence< false, false >
|
|
{
|
|
template< typename T, T M, T N, std::size_t S, T... Ns >
|
|
using f = typename generate_sequence< ( N & ( M / 2 ) ) != 0, ( M / 2 ) == 0 >::template f< T, M / 2, N, 2 * S, Ns..., ( Ns + S )... >;
|
|
};
|
|
|
|
template<>
|
|
struct generate_sequence< true, false >
|
|
{
|
|
template< typename T, T M, T N, std::size_t S, T... Ns >
|
|
using f = typename generate_sequence< ( N & ( M / 2 ) ) != 0, ( M / 2 ) == 0 >::template f< T, M / 2, N, 2 * S + 1, Ns..., ( Ns + S )..., 2 * S >;
|
|
};
|
|
|
|
template< typename T, T N >
|
|
struct memoize_sequence
|
|
{
|
|
static_assert( N < T( 1 << 20 ), "N too large" );
|
|
using type = typename generate_sequence< false, false >::template f< T, ( N < T( 1 << 1 ) ) ? T( 1 << 1 ) : ( N < T( 1 << 2 ) ) ? T( 1 << 2 ) : ( N < T( 1 << 3 ) ) ? T( 1 << 3 ) : ( N < T( 1 << 4 ) ) ? T( 1 << 4 ) : ( N < T( 1 << 5 ) ) ? T( 1 << 5 ) : ( N < T( 1 << 6 ) ) ? T( 1 << 6 ) : ( N < T( 1 << 7 ) ) ? T( 1 << 7 ) : ( N < T( 1 << 8 ) ) ? T( 1 << 8 ) : ( N < T( 1 << 9 ) ) ? T( 1 << 9 ) : ( N < T( 1 << 10 ) ) ? T( 1 << 10 ) : ( N < T( 1 << 11 ) ) ? T( 1 << 11 ) : ( N < T( 1 << 12 ) ) ? T( 1 << 12 ) : ( N < T( 1 << 13 ) ) ? T( 1 << 13 ) : ( N < T( 1 << 14 ) ) ? T( 1 << 14 ) : ( N < T( 1 << 15 ) ) ? T( 1 << 15 ) : ( N < T( 1 << 16 ) ) ? T( 1 << 16 ) : ( N < T( 1 << 17 ) ) ? T( 1 << 17 ) : ( N < T( 1 << 18 ) ) ? T( 1 << 18 ) : ( N < T( 1 << 19 ) ) ? T( 1 << 19 ) : T( 1 << 20 ), N, 0 >;
|
|
};
|
|
|
|
template< typename T, T N >
|
|
using make_integer_sequence = typename memoize_sequence< T, N >::type;
|
|
|
|
template< std::size_t N >
|
|
using make_index_sequence = make_integer_sequence< std::size_t, N >;
|
|
|
|
template< typename... Ts >
|
|
using index_sequence_for = make_index_sequence< sizeof...( Ts ) >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/internal/sor.hpp"
|
|
#line 18 "tao/pegtl/internal/sor.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename... Rules >
|
|
struct sor;
|
|
|
|
template<>
|
|
struct sor<>
|
|
: trivial< false >
|
|
{
|
|
};
|
|
|
|
template< typename... Rules >
|
|
struct sor
|
|
: sor< index_sequence_for< Rules... >, Rules... >
|
|
{
|
|
};
|
|
|
|
template< std::size_t... Indices, typename... Rules >
|
|
struct sor< index_sequence< Indices... >, Rules... >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::sor, Rules... >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
#ifdef __cpp_fold_expressions
|
|
return ( Control< Rules >::template match < A, ( Indices == ( sizeof...( Rules ) - 1 ) ) ? M : rewind_mode::required, Action, Control > ( in, st... ) || ... );
|
|
#else
|
|
bool result = false;
|
|
using swallow = bool[];
|
|
(void)swallow{ result = result || Control< Rules >::template match < A, ( Indices == ( sizeof...( Rules ) - 1 ) ) ? M : rewind_mode::required, Action, Control > ( in, st... )... };
|
|
return result;
|
|
#endif
|
|
}
|
|
};
|
|
|
|
template< typename... Rules >
|
|
struct skip_control< sor< Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 13 "tao/pegtl/internal/if_then_else.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Cond, typename Then, typename Else >
|
|
struct if_then_else
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::sor, seq< Cond, Then >, seq< not_at< Cond >, Else > >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
auto m = in.template mark< M >();
|
|
using m_t = decltype( m );
|
|
|
|
if( Control< Cond >::template match< A, rewind_mode::required, Action, Control >( in, st... ) ) {
|
|
return m( Control< Then >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) );
|
|
}
|
|
return m( Control< Else >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) );
|
|
}
|
|
};
|
|
|
|
template< typename Cond, typename Then, typename Else >
|
|
struct skip_control< if_then_else< Cond, Then, Else > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/internal/if_must_else.hpp"
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Cond, typename Then, typename Else >
|
|
using if_must_else = if_then_else< Cond, must< Then >, must< Else > >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 28 "tao/pegtl/internal/rules.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/istring.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/istring.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ISTRING_HPP
|
|
#define TAO_PEGTL_INTERNAL_ISTRING_HPP
|
|
|
|
#include <type_traits>
|
|
#line 18 "tao/pegtl/internal/istring.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< char C >
|
|
using is_alpha = std::integral_constant< bool, ( ( 'a' <= C ) && ( C <= 'z' ) ) || ( ( 'A' <= C ) && ( C <= 'Z' ) ) >;
|
|
|
|
template< char C, bool A = is_alpha< C >::value >
|
|
struct ichar_equal;
|
|
|
|
template< char C >
|
|
struct ichar_equal< C, true >
|
|
{
|
|
static bool match( const char c ) noexcept
|
|
{
|
|
return ( C | 0x20 ) == ( c | 0x20 );
|
|
}
|
|
};
|
|
|
|
template< char C >
|
|
struct ichar_equal< C, false >
|
|
{
|
|
static bool match( const char c ) noexcept
|
|
{
|
|
return c == C;
|
|
}
|
|
};
|
|
|
|
template< char... Cs >
|
|
struct istring_equal;
|
|
|
|
template<>
|
|
struct istring_equal<>
|
|
{
|
|
static bool match( const char* /*unused*/ ) noexcept
|
|
{
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template< char C, char... Cs >
|
|
struct istring_equal< C, Cs... >
|
|
{
|
|
static bool match( const char* r ) noexcept
|
|
{
|
|
return ichar_equal< C >::match( *r ) && istring_equal< Cs... >::match( r + 1 );
|
|
}
|
|
};
|
|
|
|
template< char... Cs >
|
|
struct istring;
|
|
|
|
template<>
|
|
struct istring<>
|
|
: trivial< true >
|
|
{
|
|
};
|
|
|
|
template< char... Cs >
|
|
struct istring
|
|
{
|
|
using analyze_t = analysis::counted< analysis::rule_type::any, sizeof...( Cs ) >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept( noexcept( in.size( 0 ) ) )
|
|
{
|
|
if( in.size( sizeof...( Cs ) ) >= sizeof...( Cs ) ) {
|
|
if( istring_equal< Cs... >::match( in.current() ) ) {
|
|
bump_help< result_on_found::success, Input, char, Cs... >( in, sizeof...( Cs ) );
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< char... Cs >
|
|
struct skip_control< istring< Cs... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 30 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/list.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/list.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_LIST_HPP
|
|
#define TAO_PEGTL_INTERNAL_LIST_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Rule, typename Sep >
|
|
using list = seq< Rule, star< Sep, Rule > >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 31 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/list_must.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/list_must.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_LIST_MUST_HPP
|
|
#define TAO_PEGTL_INTERNAL_LIST_MUST_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Rule, typename Sep >
|
|
using list_must = seq< Rule, star< Sep, must< Rule > > >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 32 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/list_tail.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/list_tail.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_LIST_TAIL_HPP
|
|
#define TAO_PEGTL_INTERNAL_LIST_TAIL_HPP
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/opt.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/opt.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_OPT_HPP
|
|
#define TAO_PEGTL_INTERNAL_OPT_HPP
|
|
|
|
#include <type_traits>
|
|
#line 20 "tao/pegtl/internal/opt.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename... Rules >
|
|
struct opt
|
|
: opt< seq< Rules... > >
|
|
{
|
|
};
|
|
|
|
template<>
|
|
struct opt<>
|
|
: trivial< true >
|
|
{
|
|
};
|
|
|
|
template< typename Rule >
|
|
struct opt< Rule >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::opt, Rule >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
Control< Rule >::template match< A, rewind_mode::required, Action, Control >( in, st... );
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template< typename... Rules >
|
|
struct skip_control< opt< Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 11 "tao/pegtl/internal/list_tail.hpp"
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Rule, typename Sep >
|
|
using list_tail = seq< list< Rule, Sep >, opt< Sep > >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 33 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/list_tail_pad.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/list_tail_pad.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_LIST_TAIL_PAD_HPP
|
|
#define TAO_PEGTL_INTERNAL_LIST_TAIL_PAD_HPP
|
|
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/pad.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/pad.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_PAD_HPP
|
|
#define TAO_PEGTL_INTERNAL_PAD_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Rule, typename Pad1, typename Pad2 = Pad1 >
|
|
using pad = seq< star< Pad1 >, Rule, star< Pad2 > >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 12 "tao/pegtl/internal/list_tail_pad.hpp"
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Rule, typename Sep, typename Pad >
|
|
using list_tail_pad = seq< list< Rule, pad< Sep, Pad > >, opt< star< Pad >, Sep > >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 34 "tao/pegtl/internal/rules.hpp"
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/one.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/one.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ONE_HPP
|
|
#define TAO_PEGTL_INTERNAL_ONE_HPP
|
|
|
|
#include <algorithm>
|
|
#include <utility>
|
|
#line 18 "tao/pegtl/internal/one.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Char >
|
|
bool contains( const Char c, const std::initializer_list< Char >& l ) noexcept
|
|
{
|
|
return std::find( l.begin(), l.end(), c ) != l.end();
|
|
}
|
|
|
|
template< result_on_found R, typename Peek, typename Peek::data_t... Cs >
|
|
struct one
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::any >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept( noexcept( Peek::peek( in ) ) )
|
|
{
|
|
if( const auto t = Peek::peek( in ) ) {
|
|
if( contains( t.data, { Cs... } ) == bool( R ) ) {
|
|
bump_help< R, Input, typename Peek::data_t, Cs... >( in, t.size );
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< result_on_found R, typename Peek, typename Peek::data_t C >
|
|
struct one< R, Peek, C >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::any >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept( noexcept( Peek::peek( in ) ) )
|
|
{
|
|
if( const auto t = Peek::peek( in ) ) {
|
|
if( ( t.data == C ) == bool( R ) ) {
|
|
bump_help< R, Input, typename Peek::data_t, C >( in, t.size );
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< result_on_found R, typename Peek, typename Peek::data_t... Cs >
|
|
struct skip_control< one< R, Peek, Cs... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 37 "tao/pegtl/internal/rules.hpp"
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/pad_opt.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/pad_opt.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_PAD_OPT_HPP
|
|
#define TAO_PEGTL_INTERNAL_PAD_OPT_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Rule, typename Pad >
|
|
using pad_opt = seq< star< Pad >, opt< Rule, star< Pad > > >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 40 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/plus.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/plus.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_PLUS_HPP
|
|
#define TAO_PEGTL_INTERNAL_PLUS_HPP
|
|
|
|
#include <type_traits>
|
|
#line 21 "tao/pegtl/internal/plus.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
// While plus<> could easily be implemented with
|
|
// seq< Rule, Rules ..., star< Rule, Rules ... > > we
|
|
// provide an explicit implementation to optimise away
|
|
// the otherwise created input mark.
|
|
|
|
template< typename Rule, typename... Rules >
|
|
struct plus
|
|
: plus< seq< Rule, Rules... > >
|
|
{
|
|
};
|
|
|
|
template< typename Rule >
|
|
struct plus< Rule >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::seq, Rule, opt< plus > >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return Control< Rule >::template match< A, M, Action, Control >( in, st... ) && Control< star< Rule > >::template match< A, M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
template< typename Rule, typename... Rules >
|
|
struct skip_control< plus< Rule, Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 41 "tao/pegtl/internal/rules.hpp"
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/rematch.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/rematch.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_REMATCH_HPP
|
|
#define TAO_PEGTL_INTERNAL_REMATCH_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/../memory_input.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/../memory_input.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_MEMORY_INPUT_HPP
|
|
#define TAO_PEGTL_MEMORY_INPUT_HPP
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
#include <string>
|
|
#include <type_traits>
|
|
#include <utility>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/../tracking_mode.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/../tracking_mode.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_TRACKING_MODE_HPP
|
|
#define TAO_PEGTL_TRACKING_MODE_HPP
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
enum class tracking_mode : bool
|
|
{
|
|
eager,
|
|
lazy,
|
|
|
|
// Compatibility, remove with 3.0.0
|
|
IMMEDIATE = eager,
|
|
LAZY = lazy
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 20 "tao/pegtl/internal/../memory_input.hpp"
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/../internal/bump.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/../internal/bump.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_BUMP_HPP
|
|
#define TAO_PEGTL_INTERNAL_BUMP_HPP
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
inline void bump( iterator& iter, const std::size_t count, const int ch ) noexcept
|
|
{
|
|
for( std::size_t i = 0; i < count; ++i ) {
|
|
if( iter.data[ i ] == ch ) {
|
|
++iter.line;
|
|
iter.byte_in_line = 0;
|
|
}
|
|
else {
|
|
++iter.byte_in_line;
|
|
}
|
|
}
|
|
iter.byte += count;
|
|
iter.data += count;
|
|
}
|
|
|
|
inline void bump_in_this_line( iterator& iter, const std::size_t count ) noexcept
|
|
{
|
|
iter.data += count;
|
|
iter.byte += count;
|
|
iter.byte_in_line += count;
|
|
}
|
|
|
|
inline void bump_to_next_line( iterator& iter, const std::size_t count ) noexcept
|
|
{
|
|
++iter.line;
|
|
iter.byte += count;
|
|
iter.byte_in_line = 0;
|
|
iter.data += count;
|
|
}
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 24 "tao/pegtl/internal/../memory_input.hpp"
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/../internal/marker.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/../internal/marker.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_MARKER_HPP
|
|
#define TAO_PEGTL_INTERNAL_MARKER_HPP
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Iterator, rewind_mode M >
|
|
class marker
|
|
{
|
|
public:
|
|
static constexpr rewind_mode next_rewind_mode = M;
|
|
|
|
explicit marker( const Iterator& /*unused*/ ) noexcept
|
|
{
|
|
}
|
|
|
|
marker( const marker& ) = delete;
|
|
|
|
marker( marker&& /*unused*/ ) noexcept
|
|
{
|
|
}
|
|
|
|
~marker() = default;
|
|
|
|
void operator=( const marker& ) = delete;
|
|
void operator=( marker&& ) = delete;
|
|
|
|
bool operator()( const bool result ) const noexcept
|
|
{
|
|
return result;
|
|
}
|
|
};
|
|
|
|
template< typename Iterator >
|
|
class marker< Iterator, rewind_mode::required >
|
|
{
|
|
public:
|
|
static constexpr rewind_mode next_rewind_mode = rewind_mode::active;
|
|
|
|
explicit marker( Iterator& i ) noexcept
|
|
: m_saved( i ),
|
|
m_input( &i )
|
|
{
|
|
}
|
|
|
|
marker( const marker& ) = delete;
|
|
|
|
marker( marker&& i ) noexcept
|
|
: m_saved( i.m_saved ),
|
|
m_input( i.m_input )
|
|
{
|
|
i.m_input = nullptr;
|
|
}
|
|
|
|
~marker() noexcept
|
|
{
|
|
if( m_input != nullptr ) {
|
|
( *m_input ) = m_saved;
|
|
}
|
|
}
|
|
|
|
void operator=( const marker& ) = delete;
|
|
void operator=( marker&& ) = delete;
|
|
|
|
bool operator()( const bool result ) noexcept
|
|
{
|
|
if( result ) {
|
|
m_input = nullptr;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
const Iterator& iterator() const noexcept
|
|
{
|
|
return m_saved;
|
|
}
|
|
|
|
private:
|
|
const Iterator m_saved;
|
|
Iterator* m_input;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 27 "tao/pegtl/internal/../memory_input.hpp"
|
|
#line 1 "tao/pegtl/internal/../internal/until.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/../internal/until.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_UNTIL_HPP
|
|
#define TAO_PEGTL_INTERNAL_UNTIL_HPP
|
|
#line 21 "tao/pegtl/internal/../internal/until.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Cond, typename... Rules >
|
|
struct until
|
|
: until< Cond, seq< Rules... > >
|
|
{
|
|
};
|
|
|
|
template< typename Cond >
|
|
struct until< Cond >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::seq, star< not_at< Cond >, not_at< eof >, bytes< 1 > >, Cond >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
auto m = in.template mark< M >();
|
|
|
|
while( !Control< Cond >::template match< A, rewind_mode::required, Action, Control >( in, st... ) ) {
|
|
if( in.empty() ) {
|
|
return false;
|
|
}
|
|
in.bump();
|
|
}
|
|
return m( true );
|
|
}
|
|
};
|
|
|
|
template< typename Cond, typename Rule >
|
|
struct until< Cond, Rule >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::seq, star< not_at< Cond >, not_at< eof >, Rule >, Cond >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
auto m = in.template mark< M >();
|
|
using m_t = decltype( m );
|
|
|
|
while( !Control< Cond >::template match< A, rewind_mode::required, Action, Control >( in, st... ) ) {
|
|
if( !Control< Rule >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) ) {
|
|
return false;
|
|
}
|
|
}
|
|
return m( true );
|
|
}
|
|
};
|
|
|
|
template< typename Cond, typename... Rules >
|
|
struct skip_control< until< Cond, Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 28 "tao/pegtl/internal/../memory_input.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< tracking_mode, typename Eol, typename Source >
|
|
class memory_input_base;
|
|
|
|
template< typename Eol, typename Source >
|
|
class memory_input_base< tracking_mode::eager, Eol, Source >
|
|
{
|
|
public:
|
|
using iterator_t = internal::iterator;
|
|
|
|
template< typename T >
|
|
memory_input_base( const iterator_t& in_begin, const char* in_end, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value )
|
|
: m_begin( in_begin.data ),
|
|
m_current( in_begin ),
|
|
m_end( in_end ),
|
|
m_source( std::forward< T >( in_source ) )
|
|
{
|
|
}
|
|
|
|
template< typename T >
|
|
memory_input_base( const char* in_begin, const char* in_end, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value )
|
|
: m_begin( in_begin ),
|
|
m_current( in_begin ),
|
|
m_end( in_end ),
|
|
m_source( std::forward< T >( in_source ) )
|
|
{
|
|
}
|
|
|
|
memory_input_base( const memory_input_base& ) = delete;
|
|
memory_input_base( memory_input_base&& ) = delete;
|
|
|
|
~memory_input_base() = default;
|
|
|
|
memory_input_base operator=( const memory_input_base& ) = delete;
|
|
memory_input_base operator=( memory_input_base&& ) = delete;
|
|
|
|
const char* current() const noexcept
|
|
{
|
|
return m_current.data;
|
|
}
|
|
|
|
const char* begin() const noexcept
|
|
{
|
|
return m_begin;
|
|
}
|
|
|
|
const char* end( const std::size_t /*unused*/ = 0 ) const noexcept
|
|
{
|
|
return m_end;
|
|
}
|
|
|
|
std::size_t byte() const noexcept
|
|
{
|
|
return m_current.byte;
|
|
}
|
|
|
|
std::size_t line() const noexcept
|
|
{
|
|
return m_current.line;
|
|
}
|
|
|
|
std::size_t byte_in_line() const noexcept
|
|
{
|
|
return m_current.byte_in_line;
|
|
}
|
|
|
|
void bump( const std::size_t in_count = 1 ) noexcept
|
|
{
|
|
internal::bump( m_current, in_count, Eol::ch );
|
|
}
|
|
|
|
void bump_in_this_line( const std::size_t in_count = 1 ) noexcept
|
|
{
|
|
internal::bump_in_this_line( m_current, in_count );
|
|
}
|
|
|
|
void bump_to_next_line( const std::size_t in_count = 1 ) noexcept
|
|
{
|
|
internal::bump_to_next_line( m_current, in_count );
|
|
}
|
|
|
|
TAO_PEGTL_NAMESPACE::position position( const iterator_t& it ) const
|
|
{
|
|
return TAO_PEGTL_NAMESPACE::position( it, m_source );
|
|
}
|
|
|
|
void restart( const std::size_t in_byte = 0, const std::size_t in_line = 1, const std::size_t in_byte_in_line = 0 )
|
|
{
|
|
m_current.data = m_begin;
|
|
m_current.byte = in_byte;
|
|
m_current.line = in_line;
|
|
m_current.byte_in_line = in_byte_in_line;
|
|
}
|
|
|
|
protected:
|
|
const char* const m_begin;
|
|
iterator_t m_current;
|
|
const char* const m_end;
|
|
const Source m_source;
|
|
};
|
|
|
|
template< typename Eol, typename Source >
|
|
class memory_input_base< tracking_mode::lazy, Eol, Source >
|
|
{
|
|
public:
|
|
using iterator_t = const char*;
|
|
|
|
template< typename T >
|
|
memory_input_base( const internal::iterator& in_begin, const char* in_end, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value )
|
|
: m_begin( in_begin ),
|
|
m_current( in_begin.data ),
|
|
m_end( in_end ),
|
|
m_source( std::forward< T >( in_source ) )
|
|
{
|
|
}
|
|
|
|
template< typename T >
|
|
memory_input_base( const char* in_begin, const char* in_end, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value )
|
|
: m_begin( in_begin ),
|
|
m_current( in_begin ),
|
|
m_end( in_end ),
|
|
m_source( std::forward< T >( in_source ) )
|
|
{
|
|
}
|
|
|
|
memory_input_base( const memory_input_base& ) = delete;
|
|
memory_input_base( memory_input_base&& ) = delete;
|
|
|
|
~memory_input_base() = default;
|
|
|
|
memory_input_base operator=( const memory_input_base& ) = delete;
|
|
memory_input_base operator=( memory_input_base&& ) = delete;
|
|
|
|
const char* current() const noexcept
|
|
{
|
|
return m_current;
|
|
}
|
|
|
|
const char* begin() const noexcept
|
|
{
|
|
return m_begin.data;
|
|
}
|
|
|
|
const char* end( const std::size_t /*unused*/ = 0 ) const noexcept
|
|
{
|
|
return m_end;
|
|
}
|
|
|
|
std::size_t byte() const noexcept
|
|
{
|
|
return std::size_t( current() - m_begin.data );
|
|
}
|
|
|
|
void bump( const std::size_t in_count = 1 ) noexcept
|
|
{
|
|
m_current += in_count;
|
|
}
|
|
|
|
void bump_in_this_line( const std::size_t in_count = 1 ) noexcept
|
|
{
|
|
m_current += in_count;
|
|
}
|
|
|
|
void bump_to_next_line( const std::size_t in_count = 1 ) noexcept
|
|
{
|
|
m_current += in_count;
|
|
}
|
|
|
|
TAO_PEGTL_NAMESPACE::position position( const iterator_t it ) const
|
|
{
|
|
internal::iterator c( m_begin );
|
|
internal::bump( c, std::size_t( it - m_begin.data ), Eol::ch );
|
|
return TAO_PEGTL_NAMESPACE::position( c, m_source );
|
|
}
|
|
|
|
void restart()
|
|
{
|
|
m_current = m_begin.data;
|
|
}
|
|
|
|
protected:
|
|
const internal::iterator m_begin;
|
|
iterator_t m_current;
|
|
const char* const m_end;
|
|
const Source m_source;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
template< tracking_mode P = tracking_mode::eager, typename Eol = eol::lf_crlf, typename Source = std::string >
|
|
class memory_input
|
|
: public internal::memory_input_base< P, Eol, Source >
|
|
{
|
|
public:
|
|
static constexpr tracking_mode tracking_mode_v = P;
|
|
|
|
using eol_t = Eol;
|
|
using source_t = Source;
|
|
|
|
using typename internal::memory_input_base< P, Eol, Source >::iterator_t;
|
|
|
|
using action_t = internal::action_input< memory_input >;
|
|
|
|
using internal::memory_input_base< P, Eol, Source >::memory_input_base;
|
|
|
|
template< typename T >
|
|
memory_input( const char* in_begin, const std::size_t in_size, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value )
|
|
: memory_input( in_begin, in_begin + in_size, std::forward< T >( in_source ) )
|
|
{
|
|
}
|
|
|
|
template< typename T >
|
|
memory_input( const std::string& in_string, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value )
|
|
: memory_input( in_string.data(), in_string.size(), std::forward< T >( in_source ) )
|
|
{
|
|
}
|
|
|
|
template< typename T >
|
|
memory_input( std::string&&, T&& ) = delete;
|
|
|
|
template< typename T >
|
|
memory_input( const char* in_begin, T&& in_source ) noexcept( std::is_nothrow_constructible< Source, T&& >::value )
|
|
: memory_input( in_begin, std::strlen( in_begin ), std::forward< T >( in_source ) )
|
|
{
|
|
}
|
|
|
|
template< typename T >
|
|
memory_input( const char* in_begin, const char* in_end, T&& in_source, const std::size_t in_byte, const std::size_t in_line, const std::size_t in_byte_in_line ) noexcept( std::is_nothrow_constructible< Source, T&& >::value )
|
|
: memory_input( { in_begin, in_byte, in_line, in_byte_in_line }, in_end, std::forward< T >( in_source ) )
|
|
{
|
|
}
|
|
|
|
memory_input( const memory_input& ) = delete;
|
|
memory_input( memory_input&& ) = delete;
|
|
|
|
~memory_input() = default;
|
|
|
|
memory_input operator=( const memory_input& ) = delete;
|
|
memory_input operator=( memory_input&& ) = delete;
|
|
|
|
const Source& source() const noexcept
|
|
{
|
|
return this->m_source;
|
|
}
|
|
|
|
bool empty() const noexcept
|
|
{
|
|
return this->current() == this->end();
|
|
}
|
|
|
|
std::size_t size( const std::size_t /*unused*/ = 0 ) const noexcept
|
|
{
|
|
return std::size_t( this->end() - this->current() );
|
|
}
|
|
|
|
char peek_char( const std::size_t offset = 0 ) const noexcept
|
|
{
|
|
return this->current()[ offset ];
|
|
}
|
|
|
|
std::uint8_t peek_uint8( const std::size_t offset = 0 ) const noexcept
|
|
{
|
|
return static_cast< std::uint8_t >( peek_char( offset ) );
|
|
}
|
|
|
|
// Compatibility, remove with 3.0.0
|
|
std::uint8_t peek_byte( const std::size_t offset = 0 ) const noexcept
|
|
{
|
|
return static_cast< std::uint8_t >( peek_char( offset ) );
|
|
}
|
|
|
|
iterator_t& iterator() noexcept
|
|
{
|
|
return this->m_current;
|
|
}
|
|
|
|
const iterator_t& iterator() const noexcept
|
|
{
|
|
return this->m_current;
|
|
}
|
|
|
|
using internal::memory_input_base< P, Eol, Source >::restart;
|
|
|
|
template< rewind_mode M >
|
|
void restart( const internal::marker< iterator_t, M >& m )
|
|
{
|
|
iterator() = m.iterator();
|
|
}
|
|
|
|
using internal::memory_input_base< P, Eol, Source >::position;
|
|
|
|
TAO_PEGTL_NAMESPACE::position position() const
|
|
{
|
|
return position( iterator() );
|
|
}
|
|
|
|
void discard() const noexcept
|
|
{
|
|
}
|
|
|
|
void require( const std::size_t /*unused*/ ) const noexcept
|
|
{
|
|
}
|
|
|
|
template< rewind_mode M >
|
|
internal::marker< iterator_t, M > mark() noexcept
|
|
{
|
|
return internal::marker< iterator_t, M >( iterator() );
|
|
}
|
|
|
|
const char* at( const TAO_PEGTL_NAMESPACE::position& p ) const noexcept
|
|
{
|
|
return this->begin() + p.byte;
|
|
}
|
|
|
|
const char* begin_of_line( const TAO_PEGTL_NAMESPACE::position& p ) const noexcept
|
|
{
|
|
return at( p ) - p.byte_in_line;
|
|
}
|
|
|
|
const char* end_of_line( const TAO_PEGTL_NAMESPACE::position& p ) const noexcept
|
|
{
|
|
using input_t = memory_input< tracking_mode::lazy, Eol, const char* >;
|
|
input_t in( at( p ), this->end(), "" );
|
|
using grammar = internal::until< internal::at< internal::eolf > >;
|
|
normal< grammar >::match< apply_mode::nothing, rewind_mode::dontcare, nothing, normal >( in );
|
|
return in.current();
|
|
}
|
|
|
|
std::string line_at( const TAO_PEGTL_NAMESPACE::position& p ) const
|
|
{
|
|
return std::string( begin_of_line( p ), end_of_line( p ) );
|
|
}
|
|
};
|
|
|
|
#ifdef __cpp_deduction_guides
|
|
template< typename... Ts >
|
|
memory_input( Ts&&... )->memory_input<>;
|
|
#endif
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 13 "tao/pegtl/internal/rematch.hpp"
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Head, typename... Rules >
|
|
struct rematch;
|
|
|
|
template< typename Head >
|
|
struct rematch< Head >
|
|
{
|
|
using analyze_t = typename Head::analyze_t;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return Control< Head >::template match< A, M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
template< typename Head, typename Rule, typename... Rules >
|
|
struct rematch< Head, Rule, Rules... >
|
|
{
|
|
using analyze_t = typename Head::analyze_t; // NOTE: Rule and Rules are ignored for analyze().
|
|
|
|
template< apply_mode A,
|
|
rewind_mode,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
auto m = in.template mark< rewind_mode::required >();
|
|
|
|
if( Control< Head >::template match< A, rewind_mode::active, Action, Control >( in, st... ) ) {
|
|
memory_input< Input::tracking_mode_v, typename Input::eol_t, typename Input::source_t > i2( m.iterator(), in.current(), in.source() );
|
|
#ifdef __cpp_fold_expressions
|
|
return m( ( Control< Rule >::template match< A, rewind_mode::active, Action, Control >( i2, st... ) && ... && ( i2.restart( m ), Control< Rules >::template match< A, rewind_mode::active, Action, Control >( i2, st... ) ) ) );
|
|
#else
|
|
bool result = Control< Rule >::template match< A, rewind_mode::active, Action, Control >( i2, st... );
|
|
using swallow = bool[];
|
|
(void)swallow{ result = result && ( i2.restart( m ), Control< Rules >::template match< A, rewind_mode::active, Action, Control >( i2, st... ) )..., true };
|
|
return m( result );
|
|
#endif
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< typename Head, typename... Rules >
|
|
struct skip_control< rematch< Head, Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 45 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/rep.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/rep.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_REP_HPP
|
|
#define TAO_PEGTL_INTERNAL_REP_HPP
|
|
#line 18 "tao/pegtl/internal/rep.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< unsigned Num, typename... Rules >
|
|
struct rep
|
|
: rep< Num, seq< Rules... > >
|
|
{
|
|
};
|
|
|
|
template< unsigned Num >
|
|
struct rep< Num >
|
|
: trivial< true >
|
|
{
|
|
};
|
|
|
|
template< typename Rule >
|
|
struct rep< 0, Rule >
|
|
: trivial< true >
|
|
{
|
|
};
|
|
|
|
template< unsigned Num, typename Rule >
|
|
struct rep< Num, Rule >
|
|
{
|
|
using analyze_t = analysis::counted< analysis::rule_type::seq, Num, Rule >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
auto m = in.template mark< M >();
|
|
using m_t = decltype( m );
|
|
|
|
for( unsigned i = 0; i != Num; ++i ) {
|
|
if( !Control< Rule >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) ) {
|
|
return false;
|
|
}
|
|
}
|
|
return m( true );
|
|
}
|
|
};
|
|
|
|
template< unsigned Num, typename... Rules >
|
|
struct skip_control< rep< Num, Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 46 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/rep_min.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/rep_min.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_REP_MIN_HPP
|
|
#define TAO_PEGTL_INTERNAL_REP_MIN_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< unsigned Min, typename Rule, typename... Rules >
|
|
using rep_min = seq< rep< Min, Rule, Rules... >, star< Rule, Rules... > >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 47 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/rep_min_max.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/rep_min_max.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_REP_MIN_MAX_HPP
|
|
#define TAO_PEGTL_INTERNAL_REP_MIN_MAX_HPP
|
|
|
|
#include <type_traits>
|
|
#line 21 "tao/pegtl/internal/rep_min_max.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< unsigned Min, unsigned Max, typename... Rules >
|
|
struct rep_min_max
|
|
: rep_min_max< Min, Max, seq< Rules... > >
|
|
{
|
|
};
|
|
|
|
template< unsigned Min, unsigned Max >
|
|
struct rep_min_max< Min, Max >
|
|
: trivial< false >
|
|
{
|
|
static_assert( Min <= Max, "invalid rep_min_max rule (maximum number of repetitions smaller than minimum)" );
|
|
};
|
|
|
|
template< typename Rule >
|
|
struct rep_min_max< 0, 0, Rule >
|
|
: not_at< Rule >
|
|
{
|
|
};
|
|
|
|
template< unsigned Min, unsigned Max, typename Rule >
|
|
struct rep_min_max< Min, Max, Rule >
|
|
{
|
|
using analyze_t = analysis::counted< analysis::rule_type::seq, Min, Rule >;
|
|
|
|
static_assert( Min <= Max, "invalid rep_min_max rule (maximum number of repetitions smaller than minimum)" );
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
auto m = in.template mark< M >();
|
|
using m_t = decltype( m );
|
|
|
|
for( unsigned i = 0; i != Min; ++i ) {
|
|
if( !Control< Rule >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) ) {
|
|
return false;
|
|
}
|
|
}
|
|
for( unsigned i = Min; i != Max; ++i ) {
|
|
if( !Control< Rule >::template match< A, rewind_mode::required, Action, Control >( in, st... ) ) {
|
|
return m( true );
|
|
}
|
|
}
|
|
return m( Control< not_at< Rule > >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) ); // NOTE that not_at<> will always rewind.
|
|
}
|
|
};
|
|
|
|
template< unsigned Min, unsigned Max, typename... Rules >
|
|
struct skip_control< rep_min_max< Min, Max, Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 48 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/rep_opt.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/rep_opt.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_REP_OPT_HPP
|
|
#define TAO_PEGTL_INTERNAL_REP_OPT_HPP
|
|
#line 17 "tao/pegtl/internal/rep_opt.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< unsigned Max, typename... Rules >
|
|
struct rep_opt
|
|
: rep_opt< Max, seq< Rules... > >
|
|
{
|
|
};
|
|
|
|
template< unsigned Max, typename Rule >
|
|
struct rep_opt< Max, Rule >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::opt, Rule >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
for( unsigned i = 0; ( i != Max ) && Control< Rule >::template match< A, rewind_mode::required, Action, Control >( in, st... ); ++i ) {
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template< unsigned Max, typename... Rules >
|
|
struct skip_control< rep_opt< Max, Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 49 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/require.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/require.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_REQUIRE_HPP
|
|
#define TAO_PEGTL_INTERNAL_REQUIRE_HPP
|
|
#line 14 "tao/pegtl/internal/require.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< unsigned Amount >
|
|
struct require;
|
|
|
|
template<>
|
|
struct require< 0 >
|
|
: trivial< true >
|
|
{
|
|
};
|
|
|
|
template< unsigned Amount >
|
|
struct require
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::opt >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept( noexcept( in.size( 0 ) ) )
|
|
{
|
|
return in.size( Amount ) >= Amount;
|
|
}
|
|
};
|
|
|
|
template< unsigned Amount >
|
|
struct skip_control< require< Amount > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 50 "tao/pegtl/internal/rules.hpp"
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/star_must.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/star_must.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_STAR_MUST_HPP
|
|
#define TAO_PEGTL_INTERNAL_STAR_MUST_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Cond, typename... Rules >
|
|
using star_must = star< if_must< false, Cond, Rules... > >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 55 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/state.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/state.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_STATE_HPP
|
|
#define TAO_PEGTL_INTERNAL_STATE_HPP
|
|
#line 17 "tao/pegtl/internal/state.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename State, typename... Rules >
|
|
struct state
|
|
: state< State, seq< Rules... > >
|
|
{
|
|
};
|
|
|
|
template< typename State, typename Rule >
|
|
struct state< State, Rule >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::seq, Rule >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static auto success( State& s, const Input& in, States&&... st )
|
|
-> decltype( s.template success< A, M, Action, Control >( in, st... ), void() )
|
|
{
|
|
s.template success< A, M, Action, Control >( in, st... );
|
|
}
|
|
|
|
// NOTE: The additional "int = 0" is a work-around for missing expression SFINAE in VS2015.
|
|
|
|
template< apply_mode,
|
|
rewind_mode,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States,
|
|
int = 0 >
|
|
static auto success( State& s, const Input& in, States&&... st )
|
|
-> decltype( s.success( in, st... ), void() )
|
|
{
|
|
s.success( in, st... );
|
|
}
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
State s( static_cast< const Input& >( in ), st... );
|
|
|
|
if( Control< Rule >::template match< A, M, Action, Control >( in, s ) ) {
|
|
success< A, M, Action, Control >( s, in, st... );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< typename State, typename... Rules >
|
|
struct skip_control< state< State, Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 56 "tao/pegtl/internal/rules.hpp"
|
|
#line 1 "tao/pegtl/internal/string.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/string.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_STRING_HPP
|
|
#define TAO_PEGTL_INTERNAL_STRING_HPP
|
|
|
|
#include <cstring>
|
|
#include <utility>
|
|
#line 19 "tao/pegtl/internal/string.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
inline bool unsafe_equals( const char* s, const std::initializer_list< char >& l ) noexcept
|
|
{
|
|
return std::memcmp( s, &*l.begin(), l.size() ) == 0;
|
|
}
|
|
|
|
template< char... Cs >
|
|
struct string;
|
|
|
|
template<>
|
|
struct string<>
|
|
: trivial< true >
|
|
{
|
|
};
|
|
|
|
template< char... Cs >
|
|
struct string
|
|
{
|
|
using analyze_t = analysis::counted< analysis::rule_type::any, sizeof...( Cs ) >;
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in ) noexcept( noexcept( in.size( 0 ) ) )
|
|
{
|
|
if( in.size( sizeof...( Cs ) ) >= sizeof...( Cs ) ) {
|
|
if( unsafe_equals( in.current(), { Cs... } ) ) {
|
|
bump_help< result_on_found::success, Input, char, Cs... >( in, sizeof...( Cs ) );
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< char... Cs >
|
|
struct skip_control< string< Cs... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 57 "tao/pegtl/internal/rules.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/try_catch_type.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/try_catch_type.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_TRY_CATCH_TYPE_HPP
|
|
#define TAO_PEGTL_INTERNAL_TRY_CATCH_TYPE_HPP
|
|
|
|
#include <type_traits>
|
|
#line 20 "tao/pegtl/internal/try_catch_type.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Exception, typename... Rules >
|
|
struct try_catch_type
|
|
: try_catch_type< Exception, seq< Rules... > >
|
|
{
|
|
};
|
|
|
|
template< typename Exception >
|
|
struct try_catch_type< Exception >
|
|
: trivial< true >
|
|
{
|
|
};
|
|
|
|
template< typename Exception, typename Rule >
|
|
struct try_catch_type< Exception, Rule >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::seq, Rule >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
auto m = in.template mark< M >();
|
|
using m_t = decltype( m );
|
|
|
|
try {
|
|
return m( Control< Rule >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) );
|
|
}
|
|
catch( const Exception& ) {
|
|
return false;
|
|
}
|
|
}
|
|
};
|
|
|
|
template< typename Exception, typename... Rules >
|
|
struct skip_control< try_catch_type< Exception, Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 59 "tao/pegtl/internal/rules.hpp"
|
|
|
|
|
|
#endif
|
|
#line 13 "tao/pegtl/ascii.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
inline namespace ascii
|
|
{
|
|
// clang-format off
|
|
struct alnum : internal::alnum {};
|
|
struct alpha : internal::alpha {};
|
|
struct any : internal::any< internal::peek_char > {};
|
|
struct blank : internal::one< internal::result_on_found::success, internal::peek_char, ' ', '\t' > {};
|
|
struct digit : internal::range< internal::result_on_found::success, internal::peek_char, '0', '9' > {};
|
|
struct ellipsis : internal::string< '.', '.', '.' > {};
|
|
struct eolf : internal::eolf {};
|
|
template< char... Cs > struct forty_two : internal::rep< 42, internal::one< internal::result_on_found::success, internal::peek_char, Cs... > > {};
|
|
struct identifier_first : internal::identifier_first {};
|
|
struct identifier_other : internal::identifier_other {};
|
|
struct identifier : internal::identifier {};
|
|
template< char... Cs > struct istring : internal::istring< Cs... > {};
|
|
template< char... Cs > struct keyword : internal::seq< internal::string< Cs... >, internal::not_at< internal::identifier_other > > {};
|
|
struct lower : internal::range< internal::result_on_found::success, internal::peek_char, 'a', 'z' > {};
|
|
template< char... Cs > struct not_one : internal::one< internal::result_on_found::failure, internal::peek_char, Cs... > {};
|
|
template< char Lo, char Hi > struct not_range : internal::range< internal::result_on_found::failure, internal::peek_char, Lo, Hi > {};
|
|
struct nul : internal::one< internal::result_on_found::success, internal::peek_char, char( 0 ) > {};
|
|
template< char... Cs > struct one : internal::one< internal::result_on_found::success, internal::peek_char, Cs... > {};
|
|
struct print : internal::range< internal::result_on_found::success, internal::peek_char, char( 32 ), char( 126 ) > {};
|
|
template< char Lo, char Hi > struct range : internal::range< internal::result_on_found::success, internal::peek_char, Lo, Hi > {};
|
|
template< char... Cs > struct ranges : internal::ranges< internal::peek_char, Cs... > {};
|
|
struct seven : internal::range< internal::result_on_found::success, internal::peek_char, char( 0 ), char( 127 ) > {};
|
|
struct shebang : internal::if_must< false, internal::string< '#', '!' >, internal::until< internal::eolf > > {};
|
|
struct space : internal::one< internal::result_on_found::success, internal::peek_char, ' ', '\n', '\r', '\t', '\v', '\f' > {};
|
|
template< char... Cs > struct string : internal::string< Cs... > {};
|
|
template< char C > struct three : internal::string< C, C, C > {};
|
|
template< char C > struct two : internal::string< C, C > {};
|
|
struct upper : internal::range< internal::result_on_found::success, internal::peek_char, 'A', 'Z' > {};
|
|
struct xdigit : internal::ranges< internal::peek_char, '0', '9', 'a', 'f', 'A', 'F' > {};
|
|
// clang-format on
|
|
|
|
template<>
|
|
struct keyword<>
|
|
{
|
|
template< typename Input >
|
|
static bool match( Input& /*unused*/ ) noexcept
|
|
{
|
|
static_assert( internal::always_false< Input >::value, "empty keywords not allowed" );
|
|
return false;
|
|
}
|
|
};
|
|
|
|
} // namespace ascii
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#line 1 "tao/pegtl/internal/pegtl_string.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/pegtl_string.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_PEGTL_STRING_HPP
|
|
#define TAO_PEGTL_INTERNAL_PEGTL_STRING_HPP
|
|
|
|
#include <cstddef>
|
|
#include <type_traits>
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
// Inspired by https://github.com/irrequietus/typestring
|
|
// Rewritten and reduced to what is needed for the PEGTL
|
|
// and to work with Visual Studio 2015.
|
|
|
|
namespace internal
|
|
{
|
|
template< typename, typename, typename, typename, typename, typename, typename, typename >
|
|
struct string_join;
|
|
|
|
template< template< char... > class S, char... C0s, char... C1s, char... C2s, char... C3s, char... C4s, char... C5s, char... C6s, char... C7s >
|
|
struct string_join< S< C0s... >, S< C1s... >, S< C2s... >, S< C3s... >, S< C4s... >, S< C5s... >, S< C6s... >, S< C7s... > >
|
|
{
|
|
using type = S< C0s..., C1s..., C2s..., C3s..., C4s..., C5s..., C6s..., C7s... >;
|
|
};
|
|
|
|
template< template< char... > class S, char, bool >
|
|
struct string_at
|
|
{
|
|
using type = S<>;
|
|
};
|
|
|
|
template< template< char... > class S, char C >
|
|
struct string_at< S, C, true >
|
|
{
|
|
using type = S< C >;
|
|
};
|
|
|
|
template< typename T, std::size_t S >
|
|
struct string_max_length
|
|
{
|
|
static_assert( S <= 512, "String longer than 512 (excluding terminating \\0)!" );
|
|
using type = T;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#define TAO_PEGTL_INTERNAL_EMPTY()
|
|
#define TAO_PEGTL_INTERNAL_DEFER( X ) X TAO_PEGTL_INTERNAL_EMPTY()
|
|
#define TAO_PEGTL_INTERNAL_EXPAND( ... ) __VA_ARGS__
|
|
|
|
#define TAO_PEGTL_INTERNAL_STRING_AT( S, x, n ) tao::TAO_PEGTL_NAMESPACE::internal::string_at< S, ( 0##n < ( sizeof( x ) / sizeof( char ) ) ) ? ( x )[ 0##n ] : 0, ( 0##n < ( sizeof( x ) / sizeof( char ) ) - 1 ) >::type
|
|
|
|
|
|
#define TAO_PEGTL_INTERNAL_JOIN_8( M, S, x, n ) tao::TAO_PEGTL_NAMESPACE::internal::string_join< TAO_PEGTL_INTERNAL_DEFER( M )( S, x, n##0 ), TAO_PEGTL_INTERNAL_DEFER( M )( S, x, n##1 ), TAO_PEGTL_INTERNAL_DEFER( M )( S, x, n##2 ), TAO_PEGTL_INTERNAL_DEFER( M )( S, x, n##3 ), TAO_PEGTL_INTERNAL_DEFER( M )( S, x, n##4 ), TAO_PEGTL_INTERNAL_DEFER( M )( S, x, n##5 ), TAO_PEGTL_INTERNAL_DEFER( M )( S, x, n##6 ), TAO_PEGTL_INTERNAL_DEFER( M )( S, x, n##7 ) >::type
|
|
#line 74 "tao/pegtl/internal/pegtl_string.hpp"
|
|
#define TAO_PEGTL_INTERNAL_STRING_8( S, x, n ) TAO_PEGTL_INTERNAL_JOIN_8( TAO_PEGTL_INTERNAL_STRING_AT, S, x, n )
|
|
|
|
|
|
#define TAO_PEGTL_INTERNAL_STRING_64( S, x, n ) TAO_PEGTL_INTERNAL_JOIN_8( TAO_PEGTL_INTERNAL_STRING_8, S, x, n )
|
|
|
|
|
|
#define TAO_PEGTL_INTERNAL_STRING_512( S, x, n ) TAO_PEGTL_INTERNAL_JOIN_8( TAO_PEGTL_INTERNAL_STRING_64, S, x, n )
|
|
|
|
|
|
#define TAO_PEGTL_INTERNAL_STRING( S, x ) TAO_PEGTL_INTERNAL_EXPAND( TAO_PEGTL_INTERNAL_EXPAND( TAO_PEGTL_INTERNAL_EXPAND( tao::TAO_PEGTL_NAMESPACE::internal::string_max_length< TAO_PEGTL_INTERNAL_STRING_512( S, x, ), sizeof( x ) - 1 >::type ) ) )
|
|
|
|
|
|
|
|
|
|
|
|
#define TAO_PEGTL_STRING( x ) TAO_PEGTL_INTERNAL_STRING( tao::TAO_PEGTL_NAMESPACE::ascii::string, x )
|
|
|
|
|
|
#define TAO_PEGTL_ISTRING( x ) TAO_PEGTL_INTERNAL_STRING( tao::TAO_PEGTL_NAMESPACE::ascii::istring, x )
|
|
|
|
|
|
#define TAO_PEGTL_KEYWORD( x ) TAO_PEGTL_INTERNAL_STRING( tao::TAO_PEGTL_NAMESPACE::ascii::keyword, x )
|
|
|
|
|
|
// Compatibility, remove with 3.0.0
|
|
#define TAOCPP_PEGTL_STRING( x ) TAO_PEGTL_STRING( x )
|
|
#define TAOCPP_PEGTL_ISTRING( x ) TAO_PEGTL_ISTRING( x )
|
|
#define TAOCPP_PEGTL_KEYWORD( x ) TAO_PEGTL_KEYWORD( x )
|
|
|
|
#endif
|
|
#line 70 "tao/pegtl/ascii.hpp"
|
|
|
|
#endif
|
|
#line 13 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/rules.hpp"
|
|
|
|
#line 1 "tao/pegtl/rules.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_RULES_HPP
|
|
#define TAO_PEGTL_RULES_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
// clang-format off
|
|
template< typename... Actions > struct apply : internal::apply< Actions... > {};
|
|
template< typename... Actions > struct apply0 : internal::apply0< Actions... > {};
|
|
template< template< typename... > class Action, typename... Rules > struct action : internal::action< Action, Rules... > {};
|
|
template< typename... Rules > struct at : internal::at< Rules... > {};
|
|
struct bof : internal::bof {};
|
|
struct bol : internal::bol {};
|
|
template< unsigned Num > struct bytes : internal::bytes< Num > {};
|
|
template< template< typename... > class Control, typename... Rules > struct control : internal::control< Control, Rules... > {};
|
|
template< typename... Rules > struct disable : internal::disable< Rules... > {};
|
|
struct discard : internal::discard {};
|
|
template< typename... Rules > struct enable : internal::enable< Rules... > {};
|
|
struct eof : internal::eof {};
|
|
struct failure : internal::trivial< false > {};
|
|
template< typename Rule, typename... Actions > struct if_apply : internal::if_apply< Rule, Actions... > {};
|
|
template< typename Cond, typename... Thens > struct if_must : internal::if_must< false, Cond, Thens... > {};
|
|
template< typename Cond, typename Then, typename Else > struct if_must_else : internal::if_must_else< Cond, Then, Else > {};
|
|
template< typename Cond, typename Then, typename Else > struct if_then_else : internal::if_then_else< Cond, Then, Else > {};
|
|
template< typename Rule, typename Sep, typename Pad = void > struct list : internal::list< Rule, internal::pad< Sep, Pad > > {};
|
|
template< typename Rule, typename Sep > struct list< Rule, Sep, void > : internal::list< Rule, Sep > {};
|
|
template< typename Rule, typename Sep, typename Pad = void > struct list_must : internal::list_must< Rule, internal::pad< Sep, Pad > > {};
|
|
template< typename Rule, typename Sep > struct list_must< Rule, Sep, void > : internal::list_must< Rule, Sep > {};
|
|
template< typename Rule, typename Sep, typename Pad = void > struct list_tail : internal::list_tail_pad< Rule, Sep, Pad > {};
|
|
template< typename Rule, typename Sep > struct list_tail< Rule, Sep, void > : internal::list_tail< Rule, Sep > {};
|
|
template< typename M, typename S > struct minus : internal::rematch< M, internal::not_at< S, internal::eof > > {};
|
|
template< typename... Rules > struct must : internal::must< Rules... > {};
|
|
template< typename... Rules > struct not_at : internal::not_at< Rules... > {};
|
|
template< typename... Rules > struct opt : internal::opt< Rules... > {};
|
|
template< typename Cond, typename... Rules > struct opt_must : internal::if_must< true, Cond, Rules... > {};
|
|
template< typename Rule, typename Pad1, typename Pad2 = Pad1 > struct pad : internal::pad< Rule, Pad1, Pad2 > {};
|
|
template< typename Rule, typename Pad > struct pad_opt : internal::pad_opt< Rule, Pad > {};
|
|
template< typename Rule, typename... Rules > struct plus : internal::plus< Rule, Rules... > {};
|
|
template< typename Exception > struct raise : internal::raise< Exception > {};
|
|
template< typename Head, typename... Rules > struct rematch : internal::rematch< Head, Rules... > {};
|
|
template< unsigned Num, typename... Rules > struct rep : internal::rep< Num, Rules... > {};
|
|
template< unsigned Max, typename... Rules > struct rep_max : internal::rep_min_max< 0, Max, Rules... > {};
|
|
template< unsigned Min, typename Rule, typename... Rules > struct rep_min : internal::rep_min< Min, Rule, Rules... > {};
|
|
template< unsigned Min, unsigned Max, typename... Rules > struct rep_min_max : internal::rep_min_max< Min, Max, Rules... > {};
|
|
template< unsigned Max, typename... Rules > struct rep_opt : internal::rep_opt< Max, Rules... > {};
|
|
template< unsigned Amount > struct require : internal::require< Amount > {};
|
|
template< typename... Rules > struct seq : internal::seq< Rules... > {};
|
|
template< typename... Rules > struct sor : internal::sor< Rules... > {};
|
|
template< typename Rule, typename... Rules > struct star : internal::star< Rule, Rules... > {};
|
|
template< typename Cond, typename... Rules > struct star_must : internal::star_must< Cond, Rules... > {};
|
|
template< typename State, typename... Rules > struct state : internal::state< State, Rules... > {};
|
|
struct success : internal::trivial< true > {};
|
|
template< typename... Rules > struct try_catch : internal::seq< internal::try_catch_type< parse_error, Rules... > > {};
|
|
template< typename Exception, typename... Rules > struct try_catch_type : internal::seq< internal::try_catch_type< Exception, Rules... > > {};
|
|
template< typename Cond, typename... Rules > struct until : internal::until< Cond, Rules... > {};
|
|
// clang-format on
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 14 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/uint16.hpp"
|
|
|
|
#line 1 "tao/pegtl/uint16.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_UINT16_HPP
|
|
#define TAO_PEGTL_UINT16_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/peek_mask_uint.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/peek_mask_uint.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_PEEK_MASK_UINT_HPP
|
|
#define TAO_PEGTL_INTERNAL_PEEK_MASK_UINT_HPP
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/read_uint.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/read_uint.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_READ_UINT_HPP
|
|
#define TAO_PEGTL_INTERNAL_READ_UINT_HPP
|
|
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/endian.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/endian.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ENDIAN_HPP
|
|
#define TAO_PEGTL_INTERNAL_ENDIAN_HPP
|
|
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
|
|
|
|
|
|
#if defined( _WIN32 ) && !defined( __MINGW32__ )
|
|
#line 1 "tao/pegtl/internal/endian_win.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/endian_win.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ENDIAN_WIN_HPP
|
|
#define TAO_PEGTL_INTERNAL_ENDIAN_WIN_HPP
|
|
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
|
|
#include <stdlib.h>
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< std::size_t S >
|
|
struct to_and_from_le
|
|
{
|
|
template< typename T >
|
|
static T convert( const T t ) noexcept
|
|
{
|
|
return t;
|
|
}
|
|
};
|
|
|
|
template< std::size_t S >
|
|
struct to_and_from_be;
|
|
|
|
template<>
|
|
struct to_and_from_be< 1 >
|
|
{
|
|
static std::int8_t convert( const std::int8_t n ) noexcept
|
|
{
|
|
return n;
|
|
}
|
|
|
|
static std::uint8_t convert( const std::uint8_t n ) noexcept
|
|
{
|
|
return n;
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct to_and_from_be< 2 >
|
|
{
|
|
static std::int16_t convert( const std::int16_t n ) noexcept
|
|
{
|
|
return std::int16_t( _byteswap_ushort( std::uint16_t( n ) ) );
|
|
}
|
|
|
|
static std::uint16_t convert( const std::uint16_t n ) noexcept
|
|
{
|
|
return _byteswap_ushort( n );
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct to_and_from_be< 4 >
|
|
{
|
|
static float convert( float n ) noexcept
|
|
{
|
|
std::uint32_t u;
|
|
std::memcpy( &u, &n, 4 );
|
|
u = convert( u );
|
|
std::memcpy( &n, &u, 4 );
|
|
return n;
|
|
}
|
|
|
|
static std::int32_t convert( const std::int32_t n ) noexcept
|
|
{
|
|
return std::int32_t( _byteswap_ulong( std::uint32_t( n ) ) );
|
|
}
|
|
|
|
static std::uint32_t convert( const std::uint32_t n ) noexcept
|
|
{
|
|
return _byteswap_ulong( n );
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct to_and_from_be< 8 >
|
|
{
|
|
static double convert( double n ) noexcept
|
|
{
|
|
std::uint64_t u;
|
|
std::memcpy( &u, &n, 8 );
|
|
u = convert( u );
|
|
std::memcpy( &n, &u, 8 );
|
|
return n;
|
|
}
|
|
|
|
static std::int64_t convert( const std::int64_t n ) noexcept
|
|
{
|
|
return std::int64_t( _byteswap_uint64( std::uint64_t( n ) ) );
|
|
}
|
|
|
|
static std::uint64_t convert( const std::uint64_t n ) noexcept
|
|
{
|
|
return _byteswap_uint64( n );
|
|
}
|
|
};
|
|
|
|
#define TAO_PEGTL_NATIVE_ORDER le
|
|
#define TAO_PEGTL_NATIVE_UTF16 utf16_le
|
|
#define TAO_PEGTL_NATIVE_UTF32 utf32_le
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 14 "tao/pegtl/internal/endian.hpp"
|
|
#else
|
|
#line 1 "tao/pegtl/internal/endian_gcc.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/endian_gcc.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ENDIAN_GCC_HPP
|
|
#define TAO_PEGTL_INTERNAL_ENDIAN_GCC_HPP
|
|
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
#if !defined( __BYTE_ORDER__ )
|
|
#error No byte order defined!
|
|
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
|
|
|
|
template< std::size_t S >
|
|
struct to_and_from_be
|
|
{
|
|
template< typename T >
|
|
static T convert( const T n ) noexcept
|
|
{
|
|
return n;
|
|
}
|
|
};
|
|
|
|
template< std::size_t S >
|
|
struct to_and_from_le;
|
|
|
|
template<>
|
|
struct to_and_from_le< 1 >
|
|
{
|
|
static std::uint8_t convert( const std::uint8_t n ) noexcept
|
|
{
|
|
return n;
|
|
}
|
|
|
|
static std::int8_t convert( const std::int8_t n ) noexcept
|
|
{
|
|
return n;
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct to_and_from_le< 2 >
|
|
{
|
|
static std::int16_t convert( const std::int16_t n ) noexcept
|
|
{
|
|
return static_cast< std::int16_t >( __builtin_bswap16( static_cast< std::uint16_t >( n ) ) );
|
|
}
|
|
|
|
static std::uint16_t convert( const std::uint16_t n ) noexcept
|
|
{
|
|
return __builtin_bswap16( n );
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct to_and_from_le< 4 >
|
|
{
|
|
static float convert( float n ) noexcept
|
|
{
|
|
std::uint32_t u;
|
|
std::memcpy( &u, &n, 4 );
|
|
u = convert( u );
|
|
std::memcpy( &n, &u, 4 );
|
|
return n;
|
|
}
|
|
|
|
static std::int32_t convert( const std::int32_t n ) noexcept
|
|
{
|
|
return static_cast< std::int32_t >( __builtin_bswap32( static_cast< std::uint32_t >( n ) ) );
|
|
}
|
|
|
|
static std::uint32_t convert( const std::uint32_t n ) noexcept
|
|
{
|
|
return __builtin_bswap32( n );
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct to_and_from_le< 8 >
|
|
{
|
|
static double convert( double n ) noexcept
|
|
{
|
|
std::uint64_t u;
|
|
std::memcpy( &u, &n, 8 );
|
|
u = convert( u );
|
|
std::memcpy( &n, &u, 8 );
|
|
return n;
|
|
}
|
|
|
|
static std::int64_t convert( const std::int64_t n ) noexcept
|
|
{
|
|
return static_cast< std::int64_t >( __builtin_bswap64( static_cast< std::uint64_t >( n ) ) );
|
|
}
|
|
|
|
static std::uint64_t convert( const std::uint64_t n ) noexcept
|
|
{
|
|
return __builtin_bswap64( n );
|
|
}
|
|
};
|
|
|
|
#define TAO_PEGTL_NATIVE_ORDER be
|
|
#define TAO_PEGTL_NATIVE_UTF16 utf16_be
|
|
#define TAO_PEGTL_NATIVE_UTF32 utf32_be
|
|
|
|
#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
|
|
|
|
template< std::size_t S >
|
|
struct to_and_from_le
|
|
{
|
|
template< typename T >
|
|
static T convert( const T n ) noexcept
|
|
{
|
|
return n;
|
|
}
|
|
};
|
|
|
|
template< std::size_t S >
|
|
struct to_and_from_be;
|
|
|
|
template<>
|
|
struct to_and_from_be< 1 >
|
|
{
|
|
static std::int8_t convert( const std::int8_t n ) noexcept
|
|
{
|
|
return n;
|
|
}
|
|
|
|
static std::uint8_t convert( const std::uint8_t n ) noexcept
|
|
{
|
|
return n;
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct to_and_from_be< 2 >
|
|
{
|
|
static std::int16_t convert( const std::int16_t n ) noexcept
|
|
{
|
|
return static_cast< std::int16_t >( __builtin_bswap16( static_cast< std::uint16_t >( n ) ) );
|
|
}
|
|
|
|
static std::uint16_t convert( const std::uint16_t n ) noexcept
|
|
{
|
|
return __builtin_bswap16( n );
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct to_and_from_be< 4 >
|
|
{
|
|
static float convert( float n ) noexcept
|
|
{
|
|
std::uint32_t u;
|
|
std::memcpy( &u, &n, 4 );
|
|
u = convert( u );
|
|
std::memcpy( &n, &u, 4 );
|
|
return n;
|
|
}
|
|
|
|
static std::int32_t convert( const std::int32_t n ) noexcept
|
|
{
|
|
return static_cast< std::int32_t >( __builtin_bswap32( static_cast< std::uint32_t >( n ) ) );
|
|
}
|
|
|
|
static std::uint32_t convert( const std::uint32_t n ) noexcept
|
|
{
|
|
return __builtin_bswap32( n );
|
|
}
|
|
};
|
|
|
|
template<>
|
|
struct to_and_from_be< 8 >
|
|
{
|
|
static double convert( double n ) noexcept
|
|
{
|
|
std::uint64_t u;
|
|
std::memcpy( &u, &n, 8 );
|
|
u = convert( u );
|
|
std::memcpy( &n, &u, 8 );
|
|
return n;
|
|
}
|
|
|
|
static std::int64_t convert( const std::int64_t n ) noexcept
|
|
{
|
|
return static_cast< std::int64_t >( __builtin_bswap64( static_cast< std::uint64_t >( n ) ) );
|
|
}
|
|
|
|
static std::uint64_t convert( const std::uint64_t n ) noexcept
|
|
{
|
|
return __builtin_bswap64( n );
|
|
}
|
|
};
|
|
|
|
#define TAO_PEGTL_NATIVE_ORDER le
|
|
#define TAO_PEGTL_NATIVE_UTF16 utf16_le
|
|
#define TAO_PEGTL_NATIVE_UTF32 utf32_le
|
|
|
|
#else
|
|
#error Unknown host byte order!
|
|
#endif
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 16 "tao/pegtl/internal/endian.hpp"
|
|
#endif
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename N >
|
|
N h_to_be( const N n ) noexcept
|
|
{
|
|
return N( to_and_from_be< sizeof( N ) >::convert( n ) );
|
|
}
|
|
|
|
template< typename N >
|
|
N be_to_h( const N n ) noexcept
|
|
{
|
|
return h_to_be( n );
|
|
}
|
|
|
|
template< typename N >
|
|
N be_to_h( const void* p ) noexcept
|
|
{
|
|
N n;
|
|
std::memcpy( &n, p, sizeof( n ) );
|
|
return internal::be_to_h( n );
|
|
}
|
|
|
|
template< typename N >
|
|
N h_to_le( const N n ) noexcept
|
|
{
|
|
return N( to_and_from_le< sizeof( N ) >::convert( n ) );
|
|
}
|
|
|
|
template< typename N >
|
|
N le_to_h( const N n ) noexcept
|
|
{
|
|
return h_to_le( n );
|
|
}
|
|
|
|
template< typename N >
|
|
N le_to_h( const void* p ) noexcept
|
|
{
|
|
N n;
|
|
std::memcpy( &n, p, sizeof( n ) );
|
|
return internal::le_to_h( n );
|
|
}
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 12 "tao/pegtl/internal/read_uint.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct read_uint16_be
|
|
{
|
|
using type = std::uint16_t;
|
|
|
|
static std::uint16_t read( const void* d ) noexcept
|
|
{
|
|
return be_to_h< std::uint16_t >( d );
|
|
}
|
|
};
|
|
|
|
struct read_uint16_le
|
|
{
|
|
using type = std::uint16_t;
|
|
|
|
static std::uint16_t read( const void* d ) noexcept
|
|
{
|
|
return le_to_h< std::uint16_t >( d );
|
|
}
|
|
};
|
|
|
|
struct read_uint32_be
|
|
{
|
|
using type = std::uint32_t;
|
|
|
|
static std::uint32_t read( const void* d ) noexcept
|
|
{
|
|
return be_to_h< std::uint32_t >( d );
|
|
}
|
|
};
|
|
|
|
struct read_uint32_le
|
|
{
|
|
using type = std::uint32_t;
|
|
|
|
static std::uint32_t read( const void* d ) noexcept
|
|
{
|
|
return le_to_h< std::uint32_t >( d );
|
|
}
|
|
};
|
|
|
|
struct read_uint64_be
|
|
{
|
|
using type = std::uint64_t;
|
|
|
|
static std::uint64_t read( const void* d ) noexcept
|
|
{
|
|
return be_to_h< std::uint64_t >( d );
|
|
}
|
|
};
|
|
|
|
struct read_uint64_le
|
|
{
|
|
using type = std::uint64_t;
|
|
|
|
static std::uint64_t read( const void* d ) noexcept
|
|
{
|
|
return le_to_h< std::uint64_t >( d );
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 14 "tao/pegtl/internal/peek_mask_uint.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename R, typename R::type M >
|
|
struct peek_mask_uint_impl
|
|
{
|
|
using data_t = typename R::type;
|
|
using pair_t = input_pair< data_t >;
|
|
|
|
template< typename Input >
|
|
static pair_t peek( Input& in ) noexcept( noexcept( in.size( sizeof( data_t ) ) ) )
|
|
{
|
|
if( in.size( sizeof( data_t ) ) < sizeof( data_t ) ) {
|
|
return { 0, 0 };
|
|
}
|
|
const data_t data = R::read( in.current() ) & M;
|
|
return { data, sizeof( data_t ) };
|
|
}
|
|
};
|
|
|
|
template< std::uint16_t M >
|
|
using peek_mask_uint16_be = peek_mask_uint_impl< read_uint16_be, M >;
|
|
|
|
template< std::uint16_t M >
|
|
using peek_mask_uint16_le = peek_mask_uint_impl< read_uint16_le, M >;
|
|
|
|
template< std::uint32_t M >
|
|
using peek_mask_uint32_be = peek_mask_uint_impl< read_uint32_be, M >;
|
|
|
|
template< std::uint32_t M >
|
|
using peek_mask_uint32_le = peek_mask_uint_impl< read_uint32_le, M >;
|
|
|
|
template< std::uint64_t M >
|
|
using peek_mask_uint64_be = peek_mask_uint_impl< read_uint64_be, M >;
|
|
|
|
template< std::uint64_t M >
|
|
using peek_mask_uint64_le = peek_mask_uint_impl< read_uint64_le, M >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/uint16.hpp"
|
|
#line 1 "tao/pegtl/internal/peek_uint.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/peek_uint.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_PEEK_UINT_HPP
|
|
#define TAO_PEGTL_INTERNAL_PEEK_UINT_HPP
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename R >
|
|
struct peek_uint_impl
|
|
{
|
|
using data_t = typename R::type;
|
|
using pair_t = input_pair< data_t >;
|
|
|
|
template< typename Input >
|
|
static pair_t peek( Input& in ) noexcept( noexcept( in.size( sizeof( data_t ) ) ) )
|
|
{
|
|
if( in.size( sizeof( data_t ) ) < sizeof( data_t ) ) {
|
|
return { 0, 0 };
|
|
}
|
|
const data_t data = R::read( in.current() );
|
|
return { data, sizeof( data_t ) };
|
|
}
|
|
};
|
|
|
|
using peek_uint16_be = peek_uint_impl< read_uint16_be >;
|
|
using peek_uint16_le = peek_uint_impl< read_uint16_le >;
|
|
|
|
using peek_uint32_be = peek_uint_impl< read_uint32_be >;
|
|
using peek_uint32_le = peek_uint_impl< read_uint32_le >;
|
|
|
|
using peek_uint64_be = peek_uint_impl< read_uint64_be >;
|
|
using peek_uint64_le = peek_uint_impl< read_uint64_le >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 11 "tao/pegtl/uint16.hpp"
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace uint16_be
|
|
{
|
|
// clang-format off
|
|
struct any : internal::any< internal::peek_uint16_be > {};
|
|
|
|
template< std::uint16_t... Cs > struct not_one : internal::one< internal::result_on_found::failure, internal::peek_uint16_be, Cs... > {};
|
|
template< std::uint16_t Lo, std::uint16_t Hi > struct not_range : internal::range< internal::result_on_found::failure, internal::peek_uint16_be, Lo, Hi > {};
|
|
template< std::uint16_t... Cs > struct one : internal::one< internal::result_on_found::success, internal::peek_uint16_be, Cs... > {};
|
|
template< std::uint16_t Lo, std::uint16_t Hi > struct range : internal::range< internal::result_on_found::success, internal::peek_uint16_be, Lo, Hi > {};
|
|
template< std::uint16_t... Cs > struct ranges : internal::ranges< internal::peek_uint16_be, Cs... > {};
|
|
template< std::uint16_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_uint16_be, Cs >... > {};
|
|
|
|
template< std::uint16_t M, std::uint16_t... Cs > struct mask_not_one : internal::one< internal::result_on_found::failure, internal::peek_mask_uint16_be< M >, Cs... > {};
|
|
template< std::uint16_t M, std::uint16_t Lo, std::uint16_t Hi > struct mask_not_range : internal::range< internal::result_on_found::failure, internal::peek_mask_uint16_be< M >, Lo, Hi > {};
|
|
template< std::uint16_t M, std::uint16_t... Cs > struct mask_one : internal::one< internal::result_on_found::success, internal::peek_mask_uint16_be< M >, Cs... > {};
|
|
template< std::uint16_t M, std::uint16_t Lo, std::uint16_t Hi > struct mask_range : internal::range< internal::result_on_found::success, internal::peek_mask_uint16_be< M >, Lo, Hi > {};
|
|
template< std::uint16_t M, std::uint16_t... Cs > struct mask_ranges : internal::ranges< internal::peek_mask_uint16_be< M >, Cs... > {};
|
|
template< std::uint16_t M, std::uint16_t... Cs > struct mask_string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_mask_uint16_be< M >, Cs >... > {};
|
|
// clang-format on
|
|
|
|
} // namespace uint16_be
|
|
|
|
namespace uint16_le
|
|
{
|
|
// clang-format off
|
|
struct any : internal::any< internal::peek_uint16_le > {};
|
|
|
|
template< std::uint16_t... Cs > struct not_one : internal::one< internal::result_on_found::failure, internal::peek_uint16_le, Cs... > {};
|
|
template< std::uint16_t Lo, std::uint16_t Hi > struct not_range : internal::range< internal::result_on_found::failure, internal::peek_uint16_le, Lo, Hi > {};
|
|
template< std::uint16_t... Cs > struct one : internal::one< internal::result_on_found::success, internal::peek_uint16_le, Cs... > {};
|
|
template< std::uint16_t Lo, std::uint16_t Hi > struct range : internal::range< internal::result_on_found::success, internal::peek_uint16_le, Lo, Hi > {};
|
|
template< std::uint16_t... Cs > struct ranges : internal::ranges< internal::peek_uint16_le, Cs... > {};
|
|
template< std::uint16_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_uint16_le, Cs >... > {};
|
|
|
|
template< std::uint16_t M, std::uint16_t... Cs > struct mask_not_one : internal::one< internal::result_on_found::failure, internal::peek_mask_uint16_le< M >, Cs... > {};
|
|
template< std::uint16_t M, std::uint16_t Lo, std::uint16_t Hi > struct mask_not_range : internal::range< internal::result_on_found::failure, internal::peek_mask_uint16_le< M >, Lo, Hi > {};
|
|
template< std::uint16_t M, std::uint16_t... Cs > struct mask_one : internal::one< internal::result_on_found::success, internal::peek_mask_uint16_le< M >, Cs... > {};
|
|
template< std::uint16_t M, std::uint16_t Lo, std::uint16_t Hi > struct mask_range : internal::range< internal::result_on_found::success, internal::peek_mask_uint16_le< M >, Lo, Hi > {};
|
|
template< std::uint16_t M, std::uint16_t... Cs > struct mask_ranges : internal::ranges< internal::peek_mask_uint16_le< M >, Cs... > {};
|
|
template< std::uint16_t M, std::uint16_t... Cs > struct mask_string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_mask_uint16_le< M >, Cs >... > {};
|
|
// clang-format on
|
|
|
|
} // namespace uint16_le
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 15 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/uint32.hpp"
|
|
|
|
#line 1 "tao/pegtl/uint32.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_UINT32_HPP
|
|
#define TAO_PEGTL_UINT32_HPP
|
|
#line 14 "tao/pegtl/uint32.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace uint32_be
|
|
{
|
|
// clang-format off
|
|
struct any : internal::any< internal::peek_uint32_be > {};
|
|
|
|
template< std::uint32_t... Cs > struct not_one : internal::one< internal::result_on_found::failure, internal::peek_uint32_be, Cs... > {};
|
|
template< std::uint32_t Lo, std::uint32_t Hi > struct not_range : internal::range< internal::result_on_found::failure, internal::peek_uint32_be, Lo, Hi > {};
|
|
template< std::uint32_t... Cs > struct one : internal::one< internal::result_on_found::success, internal::peek_uint32_be, Cs... > {};
|
|
template< std::uint32_t Lo, std::uint32_t Hi > struct range : internal::range< internal::result_on_found::success, internal::peek_uint32_be, Lo, Hi > {};
|
|
template< std::uint32_t... Cs > struct ranges : internal::ranges< internal::peek_uint32_be, Cs... > {};
|
|
template< std::uint32_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_uint32_be, Cs >... > {};
|
|
|
|
template< std::uint32_t M, std::uint32_t... Cs > struct mask_not_one : internal::one< internal::result_on_found::failure, internal::peek_mask_uint32_be< M >, Cs... > {};
|
|
template< std::uint32_t M, std::uint32_t Lo, std::uint32_t Hi > struct mask_not_range : internal::range< internal::result_on_found::failure, internal::peek_mask_uint32_be< M >, Lo, Hi > {};
|
|
template< std::uint32_t M, std::uint32_t... Cs > struct mask_one : internal::one< internal::result_on_found::success, internal::peek_mask_uint32_be< M >, Cs... > {};
|
|
template< std::uint32_t M, std::uint32_t Lo, std::uint32_t Hi > struct mask_range : internal::range< internal::result_on_found::success, internal::peek_mask_uint32_be< M >, Lo, Hi > {};
|
|
template< std::uint32_t M, std::uint32_t... Cs > struct mask_ranges : internal::ranges< internal::peek_mask_uint32_be< M >, Cs... > {};
|
|
template< std::uint32_t M, std::uint32_t... Cs > struct mask_string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_mask_uint32_be< M >, Cs >... > {};
|
|
// clang-format on
|
|
|
|
} // namespace uint32_be
|
|
|
|
namespace uint32_le
|
|
{
|
|
// clang-format off
|
|
struct any : internal::any< internal::peek_uint32_le > {};
|
|
|
|
template< std::uint32_t... Cs > struct not_one : internal::one< internal::result_on_found::failure, internal::peek_uint32_le, Cs... > {};
|
|
template< std::uint32_t Lo, std::uint32_t Hi > struct not_range : internal::range< internal::result_on_found::failure, internal::peek_uint32_le, Lo, Hi > {};
|
|
template< std::uint32_t... Cs > struct one : internal::one< internal::result_on_found::success, internal::peek_uint32_le, Cs... > {};
|
|
template< std::uint32_t Lo, std::uint32_t Hi > struct range : internal::range< internal::result_on_found::success, internal::peek_uint32_le, Lo, Hi > {};
|
|
template< std::uint32_t... Cs > struct ranges : internal::ranges< internal::peek_uint32_le, Cs... > {};
|
|
template< std::uint32_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_uint32_le, Cs >... > {};
|
|
|
|
template< std::uint32_t M, std::uint32_t... Cs > struct mask_not_one : internal::one< internal::result_on_found::failure, internal::peek_mask_uint32_le< M >, Cs... > {};
|
|
template< std::uint32_t M, std::uint32_t Lo, std::uint32_t Hi > struct mask_not_range : internal::range< internal::result_on_found::failure, internal::peek_mask_uint32_le< M >, Lo, Hi > {};
|
|
template< std::uint32_t M, std::uint32_t... Cs > struct mask_one : internal::one< internal::result_on_found::success, internal::peek_mask_uint32_le< M >, Cs... > {};
|
|
template< std::uint32_t M, std::uint32_t Lo, std::uint32_t Hi > struct mask_range : internal::range< internal::result_on_found::success, internal::peek_mask_uint32_le< M >, Lo, Hi > {};
|
|
template< std::uint32_t M, std::uint32_t... Cs > struct mask_ranges : internal::ranges< internal::peek_mask_uint32_le< M >, Cs... > {};
|
|
template< std::uint32_t M, std::uint32_t... Cs > struct mask_string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_mask_uint32_le< M >, Cs >... > {};
|
|
// clang-format on
|
|
|
|
} // namespace uint32_le
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 16 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/uint64.hpp"
|
|
|
|
#line 1 "tao/pegtl/uint64.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_UINT64_HPP
|
|
#define TAO_PEGTL_UINT64_HPP
|
|
#line 14 "tao/pegtl/uint64.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace uint64_be
|
|
{
|
|
// clang-format off
|
|
struct any : internal::any< internal::peek_uint64_be > {};
|
|
|
|
template< std::uint64_t... Cs > struct not_one : internal::one< internal::result_on_found::failure, internal::peek_uint64_be, Cs... > {};
|
|
template< std::uint64_t Lo, std::uint64_t Hi > struct not_range : internal::range< internal::result_on_found::failure, internal::peek_uint64_be, Lo, Hi > {};
|
|
template< std::uint64_t... Cs > struct one : internal::one< internal::result_on_found::success, internal::peek_uint64_be, Cs... > {};
|
|
template< std::uint64_t Lo, std::uint64_t Hi > struct range : internal::range< internal::result_on_found::success, internal::peek_uint64_be, Lo, Hi > {};
|
|
template< std::uint64_t... Cs > struct ranges : internal::ranges< internal::peek_uint64_be, Cs... > {};
|
|
template< std::uint64_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_uint64_be, Cs >... > {};
|
|
|
|
|
|
template< std::uint64_t M, std::uint64_t... Cs > struct mask_not_one : internal::one< internal::result_on_found::failure, internal::peek_mask_uint64_be< M >, Cs... > {};
|
|
template< std::uint64_t M, std::uint64_t Lo, std::uint64_t Hi > struct mask_not_range : internal::range< internal::result_on_found::failure, internal::peek_mask_uint64_be< M >, Lo, Hi > {};
|
|
template< std::uint64_t M, std::uint64_t... Cs > struct mask_one : internal::one< internal::result_on_found::success, internal::peek_mask_uint64_be< M >, Cs... > {};
|
|
template< std::uint64_t M, std::uint64_t Lo, std::uint64_t Hi > struct mask_range : internal::range< internal::result_on_found::success, internal::peek_mask_uint64_be< M >, Lo, Hi > {};
|
|
template< std::uint64_t M, std::uint64_t... Cs > struct mask_ranges : internal::ranges< internal::peek_mask_uint64_be< M >, Cs... > {};
|
|
template< std::uint64_t M, std::uint64_t... Cs > struct mask_string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_mask_uint64_be< M >, Cs >... > {};
|
|
// clang-format on
|
|
|
|
} // namespace uint64_be
|
|
|
|
namespace uint64_le
|
|
{
|
|
// clang-format off
|
|
struct any : internal::any< internal::peek_uint64_le > {};
|
|
|
|
template< std::uint64_t... Cs > struct not_one : internal::one< internal::result_on_found::failure, internal::peek_uint64_le, Cs... > {};
|
|
template< std::uint64_t Lo, std::uint64_t Hi > struct not_range : internal::range< internal::result_on_found::failure, internal::peek_uint64_le, Lo, Hi > {};
|
|
template< std::uint64_t... Cs > struct one : internal::one< internal::result_on_found::success, internal::peek_uint64_le, Cs... > {};
|
|
template< std::uint64_t Lo, std::uint64_t Hi > struct range : internal::range< internal::result_on_found::success, internal::peek_uint64_le, Lo, Hi > {};
|
|
template< std::uint64_t... Cs > struct ranges : internal::ranges< internal::peek_uint64_le, Cs... > {};
|
|
template< std::uint64_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_uint64_le, Cs >... > {};
|
|
|
|
template< std::uint64_t M, std::uint64_t... Cs > struct mask_not_one : internal::one< internal::result_on_found::failure, internal::peek_mask_uint64_le< M >, Cs... > {};
|
|
template< std::uint64_t M, std::uint64_t Lo, std::uint64_t Hi > struct mask_not_range : internal::range< internal::result_on_found::failure, internal::peek_mask_uint64_le< M >, Lo, Hi > {};
|
|
template< std::uint64_t M, std::uint64_t... Cs > struct mask_one : internal::one< internal::result_on_found::success, internal::peek_mask_uint64_le< M >, Cs... > {};
|
|
template< std::uint64_t M, std::uint64_t Lo, std::uint64_t Hi > struct mask_range : internal::range< internal::result_on_found::success, internal::peek_mask_uint64_le< M >, Lo, Hi > {};
|
|
template< std::uint64_t M, std::uint64_t... Cs > struct mask_ranges : internal::ranges< internal::peek_mask_uint64_le< M >, Cs... > {};
|
|
template< std::uint64_t M, std::uint64_t... Cs > struct mask_string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_mask_uint64_le< M >, Cs >... > {};
|
|
// clang-format on
|
|
|
|
} // namespace uint64_le
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 17 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/uint8.hpp"
|
|
|
|
#line 1 "tao/pegtl/uint8.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_UINT8_HPP
|
|
#define TAO_PEGTL_UINT8_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/peek_mask_uint8.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/peek_mask_uint8.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_PEEK_MASK_UINT8_HPP
|
|
#define TAO_PEGTL_INTERNAL_PEEK_MASK_UINT8_HPP
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< std::uint8_t M >
|
|
struct peek_mask_uint8
|
|
{
|
|
using data_t = std::uint8_t;
|
|
using pair_t = input_pair< std::uint8_t >;
|
|
|
|
template< typename Input >
|
|
static pair_t peek( Input& in ) noexcept( noexcept( in.empty() ) )
|
|
{
|
|
if( in.empty() ) {
|
|
return { 0, 0 };
|
|
}
|
|
return { std::uint8_t( in.peek_uint8() & M ), 1 };
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/uint8.hpp"
|
|
#line 1 "tao/pegtl/internal/peek_uint8.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/peek_uint8.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_PEEK_UINT8_HPP
|
|
#define TAO_PEGTL_INTERNAL_PEEK_UINT8_HPP
|
|
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct peek_uint8
|
|
{
|
|
using data_t = std::uint8_t;
|
|
using pair_t = input_pair< std::uint8_t >;
|
|
|
|
template< typename Input >
|
|
static pair_t peek( Input& in ) noexcept( noexcept( in.empty() ) )
|
|
{
|
|
if( in.empty() ) {
|
|
return { 0, 0 };
|
|
}
|
|
return { in.peek_uint8(), 1 };
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 11 "tao/pegtl/uint8.hpp"
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace uint8
|
|
{
|
|
// clang-format off
|
|
struct any : internal::any< internal::peek_uint8 > {};
|
|
|
|
template< std::uint8_t... Cs > struct not_one : internal::one< internal::result_on_found::failure, internal::peek_uint8, Cs... > {};
|
|
template< std::uint8_t Lo, std::uint8_t Hi > struct not_range : internal::range< internal::result_on_found::failure, internal::peek_uint8, Lo, Hi > {};
|
|
template< std::uint8_t... Cs > struct one : internal::one< internal::result_on_found::success, internal::peek_uint8, Cs... > {};
|
|
template< std::uint8_t Lo, std::uint8_t Hi > struct range : internal::range< internal::result_on_found::success, internal::peek_uint8, Lo, Hi > {};
|
|
template< std::uint8_t... Cs > struct ranges : internal::ranges< internal::peek_uint8, Cs... > {};
|
|
template< std::uint8_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_uint8, Cs >... > {};
|
|
|
|
template< std::uint8_t M, std::uint8_t... Cs > struct mask_not_one : internal::one< internal::result_on_found::failure, internal::peek_mask_uint8< M >, Cs... > {};
|
|
template< std::uint8_t M, std::uint8_t Lo, std::uint8_t Hi > struct mask_not_range : internal::range< internal::result_on_found::failure, internal::peek_mask_uint8< M >, Lo, Hi > {};
|
|
template< std::uint8_t M, std::uint8_t... Cs > struct mask_one : internal::one< internal::result_on_found::success, internal::peek_mask_uint8< M >, Cs... > {};
|
|
template< std::uint8_t M, std::uint8_t Lo, std::uint8_t Hi > struct mask_range : internal::range< internal::result_on_found::success, internal::peek_mask_uint8< M >, Lo, Hi > {};
|
|
template< std::uint8_t M, std::uint8_t... Cs > struct mask_ranges : internal::ranges< internal::peek_mask_uint8< M >, Cs... > {};
|
|
template< std::uint8_t M, std::uint8_t... Cs > struct mask_string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_mask_uint8< M >, Cs >... > {};
|
|
// clang-format on
|
|
|
|
} // namespace uint8
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 18 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/utf16.hpp"
|
|
|
|
#line 1 "tao/pegtl/utf16.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_UTF16_HPP
|
|
#define TAO_PEGTL_UTF16_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/peek_utf16.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/peek_utf16.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_PEEK_UTF16_HPP
|
|
#define TAO_PEGTL_INTERNAL_PEEK_UTF16_HPP
|
|
|
|
#include <type_traits>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename R >
|
|
struct peek_utf16_impl
|
|
{
|
|
using data_t = char32_t;
|
|
using pair_t = input_pair< char32_t >;
|
|
|
|
using short_t = std::make_unsigned< char16_t >::type;
|
|
|
|
static_assert( sizeof( short_t ) == 2, "expected size 2 for 16bit value" );
|
|
static_assert( sizeof( char16_t ) == 2, "expected size 2 for 16bit value" );
|
|
|
|
template< typename Input >
|
|
static pair_t peek( Input& in ) noexcept( noexcept( in.size( 4 ) ) )
|
|
{
|
|
if( in.size( 2 ) < 2 ) {
|
|
return { 0, 0 };
|
|
}
|
|
const char32_t t = R::read( in.current() );
|
|
if( ( t < 0xd800 ) || ( t > 0xdfff ) ) {
|
|
return { t, 2 };
|
|
}
|
|
if( ( t >= 0xdc00 ) || ( in.size( 4 ) < 4 ) ) {
|
|
return { 0, 0 };
|
|
}
|
|
const char32_t u = R::read( in.current() + 2 );
|
|
if( ( u >= 0xdc00 ) && ( u <= 0xdfff ) ) {
|
|
const auto cp = ( ( ( t & 0x03ff ) << 10 ) | ( u & 0x03ff ) ) + 0x10000;
|
|
return { cp, 4 };
|
|
}
|
|
return { 0, 0 };
|
|
}
|
|
};
|
|
|
|
using peek_utf16_be = peek_utf16_impl< read_uint16_be >;
|
|
using peek_utf16_le = peek_utf16_impl< read_uint16_le >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/utf16.hpp"
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace utf16_be
|
|
{
|
|
// clang-format off
|
|
struct any : internal::any< internal::peek_utf16_be > {};
|
|
struct bom : internal::one< internal::result_on_found::success, internal::peek_utf16_be, 0xfeff > {};
|
|
template< char32_t... Cs > struct not_one : internal::one< internal::result_on_found::failure, internal::peek_utf16_be, Cs... > {};
|
|
template< char32_t Lo, char32_t Hi > struct not_range : internal::range< internal::result_on_found::failure, internal::peek_utf16_be, Lo, Hi > {};
|
|
template< char32_t... Cs > struct one : internal::one< internal::result_on_found::success, internal::peek_utf16_be, Cs... > {};
|
|
template< char32_t Lo, char32_t Hi > struct range : internal::range< internal::result_on_found::success, internal::peek_utf16_be, Lo, Hi > {};
|
|
template< char32_t... Cs > struct ranges : internal::ranges< internal::peek_utf16_be, Cs... > {};
|
|
template< char32_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_utf16_be, Cs >... > {};
|
|
// clang-format on
|
|
|
|
} // namespace utf16_be
|
|
|
|
namespace utf16_le
|
|
{
|
|
// clang-format off
|
|
struct any : internal::any< internal::peek_utf16_le > {};
|
|
struct bom : internal::one< internal::result_on_found::success, internal::peek_utf16_le, 0xfeff > {};
|
|
template< char32_t... Cs > struct not_one : internal::one< internal::result_on_found::failure, internal::peek_utf16_le, Cs... > {};
|
|
template< char32_t Lo, char32_t Hi > struct not_range : internal::range< internal::result_on_found::failure, internal::peek_utf16_le, Lo, Hi > {};
|
|
template< char32_t... Cs > struct one : internal::one< internal::result_on_found::success, internal::peek_utf16_le, Cs... > {};
|
|
template< char32_t Lo, char32_t Hi > struct range : internal::range< internal::result_on_found::success, internal::peek_utf16_le, Lo, Hi > {};
|
|
template< char32_t... Cs > struct ranges : internal::ranges< internal::peek_utf16_le, Cs... > {};
|
|
template< char32_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_utf16_le, Cs >... > {};
|
|
// clang-format on
|
|
|
|
} // namespace utf16_le
|
|
|
|
namespace utf16 = TAO_PEGTL_NATIVE_UTF16;
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 19 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/utf32.hpp"
|
|
|
|
#line 1 "tao/pegtl/utf32.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_UTF32_HPP
|
|
#define TAO_PEGTL_UTF32_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/peek_utf32.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/peek_utf32.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_PEEK_UTF32_HPP
|
|
#define TAO_PEGTL_INTERNAL_PEEK_UTF32_HPP
|
|
|
|
#include <cstddef>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename R >
|
|
struct peek_utf32_impl
|
|
{
|
|
using data_t = char32_t;
|
|
using pair_t = input_pair< char32_t >;
|
|
|
|
static_assert( sizeof( char32_t ) == 4, "expected size 4 for 32bit value" );
|
|
|
|
template< typename Input >
|
|
static pair_t peek( Input& in ) noexcept( noexcept( in.size( 4 ) ) )
|
|
{
|
|
if( in.size( 4 ) < 4 ) {
|
|
return { 0, 0 };
|
|
}
|
|
const char32_t t = R::read( in.current() );
|
|
if( ( t <= 0x10ffff ) && !( t >= 0xd800 && t <= 0xdfff ) ) {
|
|
return { t, 4 };
|
|
}
|
|
return { 0, 0 };
|
|
}
|
|
};
|
|
|
|
using peek_utf32_be = peek_utf32_impl< read_uint32_be >;
|
|
using peek_utf32_le = peek_utf32_impl< read_uint32_le >;
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/utf32.hpp"
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace utf32_be
|
|
{
|
|
// clang-format off
|
|
struct any : internal::any< internal::peek_utf32_be > {};
|
|
struct bom : internal::one< internal::result_on_found::success, internal::peek_utf32_be, 0xfeff > {};
|
|
template< char32_t... Cs > struct not_one : internal::one< internal::result_on_found::failure, internal::peek_utf32_be, Cs... > {};
|
|
template< char32_t Lo, char32_t Hi > struct not_range : internal::range< internal::result_on_found::failure, internal::peek_utf32_be, Lo, Hi > {};
|
|
template< char32_t... Cs > struct one : internal::one< internal::result_on_found::success, internal::peek_utf32_be, Cs... > {};
|
|
template< char32_t Lo, char32_t Hi > struct range : internal::range< internal::result_on_found::success, internal::peek_utf32_be, Lo, Hi > {};
|
|
template< char32_t... Cs > struct ranges : internal::ranges< internal::peek_utf32_be, Cs... > {};
|
|
template< char32_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_utf32_be, Cs >... > {};
|
|
// clang-format on
|
|
|
|
} // namespace utf32_be
|
|
|
|
namespace utf32_le
|
|
{
|
|
// clang-format off
|
|
struct any : internal::any< internal::peek_utf32_le > {};
|
|
struct bom : internal::one< internal::result_on_found::success, internal::peek_utf32_le, 0xfeff > {};
|
|
template< char32_t... Cs > struct not_one : internal::one< internal::result_on_found::failure, internal::peek_utf32_le, Cs... > {};
|
|
template< char32_t Lo, char32_t Hi > struct not_range : internal::range< internal::result_on_found::failure, internal::peek_utf32_le, Lo, Hi > {};
|
|
template< char32_t... Cs > struct one : internal::one< internal::result_on_found::success, internal::peek_utf32_le, Cs... > {};
|
|
template< char32_t Lo, char32_t Hi > struct range : internal::range< internal::result_on_found::success, internal::peek_utf32_le, Lo, Hi > {};
|
|
template< char32_t... Cs > struct ranges : internal::ranges< internal::peek_utf32_le, Cs... > {};
|
|
template< char32_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_utf32_le, Cs >... > {};
|
|
// clang-format on
|
|
|
|
} // namespace utf32_le
|
|
|
|
namespace utf32 = TAO_PEGTL_NATIVE_UTF32;
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 20 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/utf8.hpp"
|
|
|
|
#line 1 "tao/pegtl/utf8.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_UTF8_HPP
|
|
#define TAO_PEGTL_UTF8_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/peek_utf8.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/peek_utf8.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_PEEK_UTF8_HPP
|
|
#define TAO_PEGTL_INTERNAL_PEEK_UTF8_HPP
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct peek_utf8
|
|
{
|
|
using data_t = char32_t;
|
|
using pair_t = input_pair< char32_t >;
|
|
|
|
template< typename Input >
|
|
static pair_t peek( Input& in ) noexcept( noexcept( in.empty() ) )
|
|
{
|
|
if( in.empty() ) {
|
|
return { 0, 0 };
|
|
}
|
|
char32_t c0 = in.peek_uint8();
|
|
if( ( c0 & 0x80 ) == 0 ) {
|
|
return { c0, 1 };
|
|
}
|
|
return peek_impl( in, c0 );
|
|
}
|
|
|
|
private:
|
|
template< typename Input >
|
|
static pair_t peek_impl( Input& in, char32_t c0 ) noexcept( noexcept( in.size( 4 ) ) )
|
|
{
|
|
if( ( c0 & 0xE0 ) == 0xC0 ) {
|
|
if( in.size( 2 ) >= 2 ) {
|
|
const char32_t c1 = in.peek_uint8( 1 );
|
|
if( ( c1 & 0xC0 ) == 0x80 ) {
|
|
c0 &= 0x1F;
|
|
c0 <<= 6;
|
|
c0 |= ( c1 & 0x3F );
|
|
if( c0 >= 0x80 ) {
|
|
return { c0, 2 };
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if( ( c0 & 0xF0 ) == 0xE0 ) {
|
|
if( in.size( 3 ) >= 3 ) {
|
|
const char32_t c1 = in.peek_uint8( 1 );
|
|
const char32_t c2 = in.peek_uint8( 2 );
|
|
if( ( ( c1 & 0xC0 ) == 0x80 ) && ( ( c2 & 0xC0 ) == 0x80 ) ) {
|
|
c0 &= 0x0F;
|
|
c0 <<= 6;
|
|
c0 |= ( c1 & 0x3F );
|
|
c0 <<= 6;
|
|
c0 |= ( c2 & 0x3F );
|
|
if( c0 >= 0x800 && !( c0 >= 0xD800 && c0 <= 0xDFFF ) ) {
|
|
return { c0, 3 };
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if( ( c0 & 0xF8 ) == 0xF0 ) {
|
|
if( in.size( 4 ) >= 4 ) {
|
|
const char32_t c1 = in.peek_uint8( 1 );
|
|
const char32_t c2 = in.peek_uint8( 2 );
|
|
const char32_t c3 = in.peek_uint8( 3 );
|
|
if( ( ( c1 & 0xC0 ) == 0x80 ) && ( ( c2 & 0xC0 ) == 0x80 ) && ( ( c3 & 0xC0 ) == 0x80 ) ) {
|
|
c0 &= 0x07;
|
|
c0 <<= 6;
|
|
c0 |= ( c1 & 0x3F );
|
|
c0 <<= 6;
|
|
c0 |= ( c2 & 0x3F );
|
|
c0 <<= 6;
|
|
c0 |= ( c3 & 0x3F );
|
|
if( c0 >= 0x10000 && c0 <= 0x10FFFF ) {
|
|
return { c0, 4 };
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return { 0, 0 };
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/utf8.hpp"
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace utf8
|
|
{
|
|
// clang-format off
|
|
struct any : internal::any< internal::peek_utf8 > {};
|
|
struct bom : internal::one< internal::result_on_found::success, internal::peek_utf8, 0xfeff > {};
|
|
template< char32_t... Cs > struct not_one : internal::one< internal::result_on_found::failure, internal::peek_utf8, Cs... > {};
|
|
template< char32_t Lo, char32_t Hi > struct not_range : internal::range< internal::result_on_found::failure, internal::peek_utf8, Lo, Hi > {};
|
|
template< char32_t... Cs > struct one : internal::one< internal::result_on_found::success, internal::peek_utf8, Cs... > {};
|
|
template< char32_t Lo, char32_t Hi > struct range : internal::range< internal::result_on_found::success, internal::peek_utf8, Lo, Hi > {};
|
|
template< char32_t... Cs > struct ranges : internal::ranges< internal::peek_utf8, Cs... > {};
|
|
template< char32_t... Cs > struct string : internal::seq< internal::one< internal::result_on_found::success, internal::peek_utf8, Cs >... > {};
|
|
// clang-format on
|
|
|
|
} // namespace utf8
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 21 "tao/pegtl.hpp"
|
|
|
|
#line 1 "tao/pegtl/argv_input.hpp"
|
|
|
|
#line 1 "tao/pegtl/argv_input.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_ARGV_INPUT_HPP
|
|
#define TAO_PEGTL_ARGV_INPUT_HPP
|
|
|
|
#include <cstddef>
|
|
#include <sstream>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
inline std::string make_argv_source( const std::size_t argn )
|
|
{
|
|
std::ostringstream os;
|
|
os << "argv[" << argn << ']';
|
|
return os.str();
|
|
}
|
|
|
|
} // namespace internal
|
|
|
|
template< tracking_mode P = tracking_mode::eager, typename Eol = eol::lf_crlf >
|
|
struct argv_input
|
|
: public memory_input< P, Eol >
|
|
{
|
|
template< typename T >
|
|
argv_input( char** argv, const std::size_t argn, T&& in_source )
|
|
: memory_input< P, Eol >( static_cast< const char* >( argv[ argn ] ), std::forward< T >( in_source ) )
|
|
{
|
|
}
|
|
|
|
argv_input( char** argv, const std::size_t argn )
|
|
: argv_input( argv, argn, internal::make_argv_source( argn ) )
|
|
{
|
|
}
|
|
};
|
|
|
|
#ifdef __cpp_deduction_guides
|
|
template< typename... Ts >
|
|
argv_input( Ts&&... )->argv_input<>;
|
|
#endif
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 23 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/buffer_input.hpp"
|
|
|
|
#line 1 "tao/pegtl/buffer_input.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_BUFFER_INPUT_HPP
|
|
#define TAO_PEGTL_BUFFER_INPUT_HPP
|
|
|
|
#include <algorithm>
|
|
#include <cassert>
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
#include <cstring>
|
|
#include <memory>
|
|
#include <stdexcept>
|
|
#include <string>
|
|
#line 27 "tao/pegtl/buffer_input.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< typename Reader, typename Eol = eol::lf_crlf, typename Source = std::string, std::size_t Chunk = 64 >
|
|
class buffer_input
|
|
{
|
|
public:
|
|
using reader_t = Reader;
|
|
|
|
using eol_t = Eol;
|
|
using source_t = Source;
|
|
|
|
using iterator_t = internal::iterator;
|
|
|
|
using action_t = internal::action_input< buffer_input >;
|
|
|
|
static constexpr std::size_t chunk_size = Chunk;
|
|
static constexpr tracking_mode tracking_mode_v = tracking_mode::eager;
|
|
|
|
template< typename T, typename... As >
|
|
buffer_input( T&& in_source, const std::size_t maximum, As&&... as )
|
|
: m_reader( std::forward< As >( as )... ),
|
|
m_maximum( maximum + Chunk ),
|
|
m_buffer( new char[ maximum + Chunk ] ),
|
|
m_current( m_buffer.get() ),
|
|
m_end( m_buffer.get() ),
|
|
m_source( std::forward< T >( in_source ) )
|
|
{
|
|
static_assert( Chunk != 0, "zero chunk size not implemented" );
|
|
assert( m_maximum > maximum ); // Catches overflow; change to >= when zero chunk size is implemented.
|
|
}
|
|
|
|
buffer_input( const buffer_input& ) = delete;
|
|
buffer_input( buffer_input&& ) = delete;
|
|
|
|
~buffer_input() = default;
|
|
|
|
void operator=( const buffer_input& ) = delete;
|
|
void operator=( buffer_input&& ) = delete;
|
|
|
|
bool empty()
|
|
{
|
|
require( 1 );
|
|
return m_current.data == m_end;
|
|
}
|
|
|
|
std::size_t size( const std::size_t amount )
|
|
{
|
|
require( amount );
|
|
return buffer_occupied();
|
|
}
|
|
|
|
const char* current() const noexcept
|
|
{
|
|
return m_current.data;
|
|
}
|
|
|
|
const char* end( const std::size_t amount )
|
|
{
|
|
require( amount );
|
|
return m_end;
|
|
}
|
|
|
|
std::size_t byte() const noexcept
|
|
{
|
|
return m_current.byte;
|
|
}
|
|
|
|
std::size_t line() const noexcept
|
|
{
|
|
return m_current.line;
|
|
}
|
|
|
|
std::size_t byte_in_line() const noexcept
|
|
{
|
|
return m_current.byte_in_line;
|
|
}
|
|
|
|
const Source& source() const noexcept
|
|
{
|
|
return m_source;
|
|
}
|
|
|
|
char peek_char( const std::size_t offset = 0 ) const noexcept
|
|
{
|
|
return m_current.data[ offset ];
|
|
}
|
|
|
|
std::uint8_t peek_uint8( const std::size_t offset = 0 ) const noexcept
|
|
{
|
|
return static_cast< std::uint8_t >( peek_char( offset ) );
|
|
}
|
|
|
|
// Compatibility, remove with 3.0.0
|
|
std::uint8_t peek_byte( const std::size_t offset = 0 ) const noexcept
|
|
{
|
|
return static_cast< std::uint8_t >( peek_char( offset ) );
|
|
}
|
|
|
|
void bump( const std::size_t in_count = 1 ) noexcept
|
|
{
|
|
internal::bump( m_current, in_count, Eol::ch );
|
|
}
|
|
|
|
void bump_in_this_line( const std::size_t in_count = 1 ) noexcept
|
|
{
|
|
internal::bump_in_this_line( m_current, in_count );
|
|
}
|
|
|
|
void bump_to_next_line( const std::size_t in_count = 1 ) noexcept
|
|
{
|
|
internal::bump_to_next_line( m_current, in_count );
|
|
}
|
|
|
|
void discard() noexcept
|
|
{
|
|
if( m_current.data > m_buffer.get() + Chunk ) {
|
|
const auto s = m_end - m_current.data;
|
|
std::memmove( m_buffer.get(), m_current.data, s );
|
|
m_current.data = m_buffer.get();
|
|
m_end = m_buffer.get() + s;
|
|
}
|
|
}
|
|
|
|
void require( const std::size_t amount )
|
|
{
|
|
if( m_current.data + amount <= m_end ) {
|
|
return;
|
|
}
|
|
if( m_current.data + amount > m_buffer.get() + m_maximum ) {
|
|
throw std::overflow_error( "require beyond end of buffer" );
|
|
}
|
|
if( const auto r = m_reader( m_end, ( std::min )( buffer_free_after_end(), ( std::max )( amount - buffer_occupied(), Chunk ) ) ) ) {
|
|
m_end += r;
|
|
}
|
|
}
|
|
|
|
template< rewind_mode M >
|
|
internal::marker< iterator_t, M > mark() noexcept
|
|
{
|
|
return internal::marker< iterator_t, M >( m_current );
|
|
}
|
|
|
|
TAO_PEGTL_NAMESPACE::position position( const iterator_t& it ) const
|
|
{
|
|
return TAO_PEGTL_NAMESPACE::position( it, m_source );
|
|
}
|
|
|
|
TAO_PEGTL_NAMESPACE::position position() const
|
|
{
|
|
return position( m_current );
|
|
}
|
|
|
|
const iterator_t& iterator() const noexcept
|
|
{
|
|
return m_current;
|
|
}
|
|
|
|
std::size_t buffer_capacity() const noexcept
|
|
{
|
|
return m_maximum;
|
|
}
|
|
|
|
std::size_t buffer_occupied() const noexcept
|
|
{
|
|
assert( m_end >= m_current.data );
|
|
return std::size_t( m_end - m_current.data );
|
|
}
|
|
|
|
std::size_t buffer_free_before_current() const noexcept
|
|
{
|
|
assert( m_current.data >= m_buffer.get() );
|
|
return std::size_t( m_current.data - m_buffer.get() );
|
|
}
|
|
|
|
std::size_t buffer_free_after_end() const noexcept
|
|
{
|
|
assert( m_buffer.get() + m_maximum >= m_end );
|
|
return std::size_t( m_buffer.get() + m_maximum - m_end );
|
|
}
|
|
|
|
private:
|
|
Reader m_reader;
|
|
std::size_t m_maximum;
|
|
std::unique_ptr< char[] > m_buffer; // NOLINT
|
|
iterator_t m_current;
|
|
char* m_end;
|
|
const Source m_source;
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 24 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/cstream_input.hpp"
|
|
|
|
#line 1 "tao/pegtl/cstream_input.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CSTREAM_INPUT_HPP
|
|
#define TAO_PEGTL_CSTREAM_INPUT_HPP
|
|
|
|
#include <cstdio>
|
|
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/cstream_reader.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/cstream_reader.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_CSTREAM_READER_HPP
|
|
#define TAO_PEGTL_INTERNAL_CSTREAM_READER_HPP
|
|
|
|
#include <cassert>
|
|
#include <cstddef>
|
|
#include <cstdio>
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/../input_error.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/../input_error.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INPUT_ERROR_HPP
|
|
#define TAO_PEGTL_INPUT_ERROR_HPP
|
|
|
|
#include <cerrno>
|
|
#include <sstream>
|
|
#include <stdexcept>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
struct input_error
|
|
: std::runtime_error
|
|
{
|
|
input_error( const std::string& message, const int in_errorno )
|
|
: std::runtime_error( message ),
|
|
errorno( in_errorno )
|
|
{
|
|
}
|
|
|
|
int errorno;
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#define TAO_PEGTL_INTERNAL_UNWRAP( ... ) __VA_ARGS__
|
|
|
|
#define TAO_PEGTL_THROW_INPUT_ERROR( MESSAGE ) do { const int errorno = errno; std::ostringstream oss; oss << "pegtl: " << TAO_PEGTL_INTERNAL_UNWRAP( MESSAGE ) << " errno " << errorno; throw tao::TAO_PEGTL_NAMESPACE::input_error( oss.str(), errorno ); } while( false )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define TAO_PEGTL_THROW_INPUT_WIN32_ERROR( MESSAGE ) do { const int errorno = GetLastError(); std::ostringstream oss; oss << "pegtl: " << TAO_PEGTL_INTERNAL_UNWRAP( MESSAGE ) << " GetLastError() " << errorno; throw tao::TAO_PEGTL_NAMESPACE::input_error( oss.str(), errorno ); } while( false )
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
#line 13 "tao/pegtl/internal/cstream_reader.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct cstream_reader
|
|
{
|
|
explicit cstream_reader( std::FILE* s ) noexcept
|
|
: m_cstream( s )
|
|
{
|
|
assert( m_cstream != nullptr );
|
|
}
|
|
|
|
std::size_t operator()( char* buffer, const std::size_t length ) const
|
|
{
|
|
if( const auto r = std::fread( buffer, 1, length, m_cstream ) ) {
|
|
return r;
|
|
}
|
|
if( std::feof( m_cstream ) != 0 ) {
|
|
return 0;
|
|
}
|
|
// Please contact us if you know how to provoke the following exception.
|
|
// The example on cppreference.com doesn't work, at least not on macOS.
|
|
TAO_PEGTL_THROW_INPUT_ERROR( "error in fread() from cstream" ); // LCOV_EXCL_LINE
|
|
}
|
|
|
|
std::FILE* m_cstream;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 14 "tao/pegtl/cstream_input.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< typename Eol = eol::lf_crlf, std::size_t Chunk = 64 >
|
|
struct cstream_input
|
|
: buffer_input< internal::cstream_reader, Eol, std::string, Chunk >
|
|
{
|
|
template< typename T >
|
|
cstream_input( std::FILE* in_stream, const std::size_t in_maximum, T&& in_source )
|
|
: buffer_input< internal::cstream_reader, Eol, std::string, Chunk >( std::forward< T >( in_source ), in_maximum, in_stream )
|
|
{
|
|
}
|
|
};
|
|
|
|
#ifdef __cpp_deduction_guides
|
|
template< typename... Ts >
|
|
cstream_input( Ts&&... )->cstream_input<>;
|
|
#endif
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 25 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/istream_input.hpp"
|
|
|
|
#line 1 "tao/pegtl/istream_input.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_ISTREAM_INPUT_HPP
|
|
#define TAO_PEGTL_ISTREAM_INPUT_HPP
|
|
|
|
#include <istream>
|
|
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/istream_reader.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/istream_reader.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_ISTREAM_READER_HPP
|
|
#define TAO_PEGTL_INTERNAL_ISTREAM_READER_HPP
|
|
|
|
#include <istream>
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct istream_reader
|
|
{
|
|
explicit istream_reader( std::istream& s ) noexcept
|
|
: m_istream( s )
|
|
{
|
|
}
|
|
|
|
std::size_t operator()( char* buffer, const std::size_t length )
|
|
{
|
|
m_istream.read( buffer, std::streamsize( length ) );
|
|
|
|
if( const auto r = m_istream.gcount() ) {
|
|
return std::size_t( r );
|
|
}
|
|
if( m_istream.eof() ) {
|
|
return 0;
|
|
}
|
|
TAO_PEGTL_THROW_INPUT_ERROR( "error in istream.read()" );
|
|
}
|
|
|
|
std::istream& m_istream;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 14 "tao/pegtl/istream_input.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< typename Eol = eol::lf_crlf, std::size_t Chunk = 64 >
|
|
struct istream_input
|
|
: buffer_input< internal::istream_reader, Eol, std::string, Chunk >
|
|
{
|
|
template< typename T >
|
|
istream_input( std::istream& in_stream, const std::size_t in_maximum, T&& in_source )
|
|
: buffer_input< internal::istream_reader, Eol, std::string, Chunk >( std::forward< T >( in_source ), in_maximum, in_stream )
|
|
{
|
|
}
|
|
};
|
|
|
|
#ifdef __cpp_deduction_guides
|
|
template< typename... Ts >
|
|
istream_input( Ts&&... )->istream_input<>;
|
|
#endif
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 26 "tao/pegtl.hpp"
|
|
|
|
#line 1 "tao/pegtl/read_input.hpp"
|
|
|
|
#line 1 "tao/pegtl/read_input.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_READ_INPUT_HPP
|
|
#define TAO_PEGTL_READ_INPUT_HPP
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/string_input.hpp"
|
|
|
|
#line 1 "tao/pegtl/string_input.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_STRING_INPUT_HPP
|
|
#define TAO_PEGTL_STRING_INPUT_HPP
|
|
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct string_holder
|
|
{
|
|
const std::string data;
|
|
|
|
template< typename T >
|
|
explicit string_holder( T&& in_data )
|
|
: data( std::forward< T >( in_data ) )
|
|
{
|
|
}
|
|
|
|
string_holder( const string_holder& ) = delete;
|
|
string_holder( string_holder&& ) = delete;
|
|
|
|
~string_holder() = default;
|
|
|
|
void operator=( const string_holder& ) = delete;
|
|
void operator=( string_holder&& ) = delete;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
template< tracking_mode P = tracking_mode::eager, typename Eol = eol::lf_crlf, typename Source = std::string >
|
|
struct string_input
|
|
: private internal::string_holder,
|
|
public memory_input< P, Eol, Source >
|
|
{
|
|
template< typename V, typename T, typename... Ts >
|
|
explicit string_input( V&& in_data, T&& in_source, Ts&&... ts )
|
|
: internal::string_holder( std::forward< V >( in_data ) ),
|
|
memory_input< P, Eol, Source >( data.data(), data.size(), std::forward< T >( in_source ), std::forward< Ts >( ts )... )
|
|
{
|
|
}
|
|
|
|
string_input( const string_input& ) = delete;
|
|
string_input( string_input&& ) = delete;
|
|
|
|
~string_input() = default;
|
|
|
|
void operator=( const string_input& ) = delete;
|
|
void operator=( string_input&& ) = delete;
|
|
};
|
|
|
|
#ifdef __cpp_deduction_guides
|
|
template< typename... Ts >
|
|
explicit string_input( Ts&&... )->string_input<>;
|
|
#endif
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 12 "tao/pegtl/read_input.hpp"
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/file_reader.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/file_reader.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_FILE_READER_HPP
|
|
#define TAO_PEGTL_INTERNAL_FILE_READER_HPP
|
|
|
|
#include <cstdio>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
inline std::FILE* file_open( const char* filename )
|
|
{
|
|
errno = 0;
|
|
#if defined( _MSC_VER )
|
|
std::FILE* file;
|
|
if( ::fopen_s( &file, filename, "rb" ) == 0 )
|
|
#elif defined( __MINGW32__ )
|
|
if( auto* file = std::fopen( filename, "rb" ) ) // NOLINT
|
|
#else
|
|
if( auto* file = std::fopen( filename, "rbe" ) ) // NOLINT
|
|
#endif
|
|
{
|
|
return file;
|
|
}
|
|
TAO_PEGTL_THROW_INPUT_ERROR( "unable to fopen() file " << filename << " for reading" );
|
|
}
|
|
|
|
struct file_close
|
|
{
|
|
void operator()( FILE* f ) const noexcept
|
|
{
|
|
std::fclose( f ); // NOLINT
|
|
}
|
|
};
|
|
|
|
class file_reader
|
|
{
|
|
public:
|
|
explicit file_reader( const char* filename )
|
|
: m_source( filename ),
|
|
m_file( file_open( m_source ) )
|
|
{
|
|
}
|
|
|
|
file_reader( FILE* file, const char* filename ) noexcept
|
|
: m_source( filename ),
|
|
m_file( file )
|
|
{
|
|
}
|
|
|
|
file_reader( const file_reader& ) = delete;
|
|
file_reader( file_reader&& ) = delete;
|
|
|
|
~file_reader() = default;
|
|
|
|
void operator=( const file_reader& ) = delete;
|
|
void operator=( file_reader&& ) = delete;
|
|
|
|
std::size_t size() const
|
|
{
|
|
errno = 0;
|
|
if( std::fseek( m_file.get(), 0, SEEK_END ) != 0 ) {
|
|
TAO_PEGTL_THROW_INPUT_ERROR( "unable to fseek() to end of file " << m_source ); // LCOV_EXCL_LINE
|
|
}
|
|
errno = 0;
|
|
const auto s = std::ftell( m_file.get() );
|
|
if( s < 0 ) {
|
|
TAO_PEGTL_THROW_INPUT_ERROR( "unable to ftell() file size of file " << m_source ); // LCOV_EXCL_LINE
|
|
}
|
|
errno = 0;
|
|
if( std::fseek( m_file.get(), 0, SEEK_SET ) != 0 ) {
|
|
TAO_PEGTL_THROW_INPUT_ERROR( "unable to fseek() to beginning of file " << m_source ); // LCOV_EXCL_LINE
|
|
}
|
|
return std::size_t( s );
|
|
}
|
|
|
|
std::string read() const
|
|
{
|
|
std::string nrv;
|
|
nrv.resize( size() );
|
|
errno = 0;
|
|
if( !nrv.empty() && ( std::fread( &nrv[ 0 ], nrv.size(), 1, m_file.get() ) != 1 ) ) {
|
|
TAO_PEGTL_THROW_INPUT_ERROR( "unable to fread() file " << m_source << " size " << nrv.size() ); // LCOV_EXCL_LINE
|
|
}
|
|
return nrv;
|
|
}
|
|
|
|
private:
|
|
const char* const m_source;
|
|
const std::unique_ptr< std::FILE, file_close > m_file;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 15 "tao/pegtl/read_input.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct filename_holder
|
|
{
|
|
const std::string filename;
|
|
|
|
template< typename T >
|
|
explicit filename_holder( T&& in_filename )
|
|
: filename( std::forward< T >( in_filename ) )
|
|
{
|
|
}
|
|
|
|
filename_holder( const filename_holder& ) = delete;
|
|
filename_holder( filename_holder&& ) = delete;
|
|
|
|
~filename_holder() = default;
|
|
|
|
void operator=( const filename_holder& ) = delete;
|
|
void operator=( filename_holder&& ) = delete;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
template< tracking_mode P = tracking_mode::eager, typename Eol = eol::lf_crlf >
|
|
struct read_input
|
|
: private internal::filename_holder,
|
|
public string_input< P, Eol, const char* >
|
|
{
|
|
template< typename T >
|
|
explicit read_input( T&& in_filename )
|
|
: internal::filename_holder( std::forward< T >( in_filename ) ),
|
|
string_input< P, Eol, const char* >( internal::file_reader( filename.c_str() ).read(), filename.c_str() )
|
|
{
|
|
}
|
|
|
|
template< typename T >
|
|
read_input( FILE* in_file, T&& in_filename )
|
|
: internal::filename_holder( std::forward< T >( in_filename ) ),
|
|
string_input< P, Eol, const char* >( internal::file_reader( in_file, filename.c_str() ).read(), filename.c_str() )
|
|
{
|
|
}
|
|
|
|
read_input( const read_input& ) = delete;
|
|
read_input( read_input&& ) = delete;
|
|
|
|
~read_input() = default;
|
|
|
|
void operator=( const read_input& ) = delete;
|
|
void operator=( read_input&& ) = delete;
|
|
};
|
|
|
|
#ifdef __cpp_deduction_guides
|
|
template< typename... Ts >
|
|
explicit read_input( Ts&&... )->read_input<>;
|
|
#endif
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 28 "tao/pegtl.hpp"
|
|
|
|
|
|
// this has to be included *after* the above inputs,
|
|
// otherwise the amalgamated header will not work!
|
|
#line 1 "tao/pegtl/file_input.hpp"
|
|
|
|
#line 1 "tao/pegtl/file_input.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_FILE_INPUT_HPP
|
|
#define TAO_PEGTL_FILE_INPUT_HPP
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( __unix__ ) || ( defined( __APPLE__ ) && defined( __MACH__ ) )
|
|
#include <unistd.h> // Required for _POSIX_MAPPED_FILES
|
|
#endif
|
|
|
|
#if defined( _POSIX_MAPPED_FILES ) || defined( _WIN32 )
|
|
#line 1 "tao/pegtl/mmap_input.hpp"
|
|
|
|
#line 1 "tao/pegtl/mmap_input.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_MMAP_INPUT_HPP
|
|
#define TAO_PEGTL_MMAP_INPUT_HPP
|
|
|
|
#include <string>
|
|
#include <utility>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined( __unix__ ) || ( defined( __APPLE__ ) && defined( __MACH__ ) )
|
|
#include <unistd.h> // Required for _POSIX_MAPPED_FILES
|
|
#endif
|
|
|
|
#if defined( _POSIX_MAPPED_FILES )
|
|
#line 1 "tao/pegtl/internal/file_mapper_posix.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/file_mapper_posix.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_FILE_MAPPER_POSIX_HPP
|
|
#define TAO_PEGTL_INTERNAL_FILE_MAPPER_POSIX_HPP
|
|
|
|
#include <sys/mman.h>
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/internal/file_opener.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/file_opener.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_FILE_OPENER_HPP
|
|
#define TAO_PEGTL_INTERNAL_FILE_OPENER_HPP
|
|
|
|
#include <fcntl.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
|
|
#include <utility>
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct file_opener
|
|
{
|
|
explicit file_opener( const char* filename )
|
|
: m_source( filename ),
|
|
m_fd( open() )
|
|
{
|
|
}
|
|
|
|
file_opener( const file_opener& ) = delete;
|
|
file_opener( file_opener&& ) = delete;
|
|
|
|
~file_opener() noexcept
|
|
{
|
|
::close( m_fd );
|
|
}
|
|
|
|
void operator=( const file_opener& ) = delete;
|
|
void operator=( file_opener&& ) = delete;
|
|
|
|
std::size_t size() const
|
|
{
|
|
struct stat st; // NOLINT
|
|
errno = 0;
|
|
if( ::fstat( m_fd, &st ) < 0 ) {
|
|
TAO_PEGTL_THROW_INPUT_ERROR( "unable to fstat() file " << m_source << " descriptor " << m_fd );
|
|
}
|
|
return std::size_t( st.st_size );
|
|
}
|
|
|
|
const char* const m_source;
|
|
const int m_fd;
|
|
|
|
private:
|
|
int open() const
|
|
{
|
|
errno = 0;
|
|
const int fd = ::open( m_source, // NOLINT
|
|
O_RDONLY
|
|
#ifdef O_CLOEXEC
|
|
| O_CLOEXEC
|
|
#endif
|
|
);
|
|
if( fd >= 0 ) {
|
|
return fd;
|
|
}
|
|
TAO_PEGTL_THROW_INPUT_ERROR( "unable to open() file " << m_source << " for reading" );
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 13 "tao/pegtl/internal/file_mapper_posix.hpp"
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
class file_mapper
|
|
{
|
|
public:
|
|
explicit file_mapper( const char* filename )
|
|
: file_mapper( file_opener( filename ) )
|
|
{
|
|
}
|
|
|
|
explicit file_mapper( const file_opener& reader )
|
|
: m_size( reader.size() ),
|
|
m_data( static_cast< const char* >( ::mmap( nullptr, m_size, PROT_READ, MAP_PRIVATE, reader.m_fd, 0 ) ) )
|
|
{
|
|
if( ( m_size != 0 ) && ( intptr_t( m_data ) == -1 ) ) {
|
|
TAO_PEGTL_THROW_INPUT_ERROR( "unable to mmap() file " << reader.m_source << " descriptor " << reader.m_fd );
|
|
}
|
|
}
|
|
|
|
file_mapper( const file_mapper& ) = delete;
|
|
file_mapper( file_mapper&& ) = delete;
|
|
|
|
~file_mapper() noexcept
|
|
{
|
|
// Legacy C interface requires pointer-to-mutable but does not write through the pointer.
|
|
::munmap( const_cast< char* >( m_data ), m_size ); // NOLINT
|
|
}
|
|
|
|
void operator=( const file_mapper& ) = delete;
|
|
void operator=( file_mapper&& ) = delete;
|
|
|
|
bool empty() const noexcept
|
|
{
|
|
return m_size == 0;
|
|
}
|
|
|
|
std::size_t size() const noexcept
|
|
{
|
|
return m_size;
|
|
}
|
|
|
|
using iterator = const char*;
|
|
using const_iterator = const char*;
|
|
|
|
iterator data() const noexcept
|
|
{
|
|
return m_data;
|
|
}
|
|
|
|
iterator begin() const noexcept
|
|
{
|
|
return m_data;
|
|
}
|
|
|
|
iterator end() const noexcept
|
|
{
|
|
return m_data + m_size;
|
|
}
|
|
|
|
std::string string() const
|
|
{
|
|
return std::string( m_data, m_size );
|
|
}
|
|
|
|
private:
|
|
const std::size_t m_size;
|
|
const char* const m_data;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 21 "tao/pegtl/mmap_input.hpp"
|
|
#elif defined( _WIN32 )
|
|
#line 1 "tao/pegtl/internal/file_mapper_win32.hpp"
|
|
|
|
#line 1 "tao/pegtl/internal/file_mapper_win32.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_INTERNAL_FILE_MAPPER_WIN32_HPP
|
|
#define TAO_PEGTL_INTERNAL_FILE_MAPPER_WIN32_HPP
|
|
|
|
#if !defined( NOMINMAX )
|
|
#define NOMINMAX
|
|
#define TAO_PEGTL_NOMINMAX_WAS_DEFINED
|
|
#endif
|
|
|
|
#if !defined( WIN32_LEAN_AND_MEAN )
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#define TAO_PEGTL_WIN32_LEAN_AND_MEAN_WAS_DEFINED
|
|
#endif
|
|
|
|
#include <windows.h>
|
|
|
|
#if defined( TAO_PEGTL_NOMINMAX_WAS_DEFINED )
|
|
#undef NOMINMAX
|
|
#undef TAO_PEGTL_NOMINMAX_WAS_DEFINED
|
|
#endif
|
|
|
|
#if defined( TAO_PEGTL_WIN32_LEAN_AND_MEAN_WAS_DEFINED )
|
|
#undef WIN32_LEAN_AND_MEAN
|
|
#undef TAO_PEGTL_WIN32_LEAN_AND_MEAN_WAS_DEFINED
|
|
#endif
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct win32_file_opener
|
|
{
|
|
explicit win32_file_opener( const char* filename )
|
|
: m_source( filename ),
|
|
m_handle( open() )
|
|
{
|
|
}
|
|
|
|
win32_file_opener( const win32_file_opener& ) = delete;
|
|
win32_file_opener( win32_file_opener&& ) = delete;
|
|
|
|
~win32_file_opener() noexcept
|
|
{
|
|
::CloseHandle( m_handle );
|
|
}
|
|
|
|
void operator=( const win32_file_opener& ) = delete;
|
|
void operator=( win32_file_opener&& ) = delete;
|
|
|
|
std::size_t size() const
|
|
{
|
|
LARGE_INTEGER size;
|
|
if( !::GetFileSizeEx( m_handle, &size ) ) {
|
|
TAO_PEGTL_THROW_INPUT_WIN32_ERROR( "unable to GetFileSizeEx() file " << m_source << " handle " << m_handle );
|
|
}
|
|
return std::size_t( size.QuadPart );
|
|
}
|
|
|
|
const char* const m_source;
|
|
const HANDLE m_handle;
|
|
|
|
private:
|
|
HANDLE open() const
|
|
{
|
|
SetLastError( 0 );
|
|
std::wstring ws( m_source, m_source + strlen( m_source ) );
|
|
|
|
#if( _WIN32_WINNT >= 0x0602 )
|
|
const HANDLE handle = ::CreateFile2( ws.c_str(),
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
OPEN_EXISTING,
|
|
nullptr );
|
|
if( handle != INVALID_HANDLE_VALUE ) {
|
|
return handle;
|
|
}
|
|
TAO_PEGTL_THROW_INPUT_WIN32_ERROR( "CreateFile2() failed opening file " << m_source << " for reading" );
|
|
#else
|
|
const HANDLE handle = ::CreateFileW( ws.c_str(),
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
nullptr,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
nullptr );
|
|
if( handle != INVALID_HANDLE_VALUE ) {
|
|
return handle;
|
|
}
|
|
TAO_PEGTL_THROW_INPUT_WIN32_ERROR( "CreateFileW() failed opening file " << m_source << " for reading" );
|
|
#endif
|
|
}
|
|
};
|
|
|
|
struct win32_file_mapper
|
|
{
|
|
explicit win32_file_mapper( const char* filename )
|
|
: win32_file_mapper( win32_file_opener( filename ) )
|
|
{
|
|
}
|
|
|
|
explicit win32_file_mapper( const win32_file_opener& reader )
|
|
: m_size( reader.size() ),
|
|
m_handle( open( reader ) )
|
|
{
|
|
}
|
|
|
|
win32_file_mapper( const win32_file_mapper& ) = delete;
|
|
win32_file_mapper( win32_file_mapper&& ) = delete;
|
|
|
|
~win32_file_mapper() noexcept
|
|
{
|
|
::CloseHandle( m_handle );
|
|
}
|
|
|
|
void operator=( const win32_file_mapper& ) = delete;
|
|
void operator=( win32_file_mapper&& ) = delete;
|
|
|
|
const size_t m_size;
|
|
const HANDLE m_handle;
|
|
|
|
private:
|
|
HANDLE open( const win32_file_opener& reader ) const
|
|
{
|
|
const uint64_t file_size = reader.size();
|
|
SetLastError( 0 );
|
|
// Use `CreateFileMappingW` because a) we're not specifying a
|
|
// mapping name, so the character type is of no consequence, and
|
|
// b) it's defined in `memoryapi.h`, unlike
|
|
// `CreateFileMappingA`(?!)
|
|
const HANDLE handle = ::CreateFileMappingW( reader.m_handle,
|
|
nullptr,
|
|
PAGE_READONLY,
|
|
DWORD( file_size >> 32 ),
|
|
DWORD( file_size & 0xffffffff ),
|
|
nullptr );
|
|
if( handle != NULL || file_size == 0 ) {
|
|
return handle;
|
|
}
|
|
TAO_PEGTL_THROW_INPUT_WIN32_ERROR( "unable to CreateFileMappingW() file " << reader.m_source << " for reading" );
|
|
}
|
|
};
|
|
|
|
class file_mapper
|
|
{
|
|
public:
|
|
explicit file_mapper( const char* filename )
|
|
: file_mapper( win32_file_mapper( filename ) )
|
|
{
|
|
}
|
|
|
|
explicit file_mapper( const win32_file_mapper& mapper )
|
|
: m_size( mapper.m_size ),
|
|
m_data( static_cast< const char* >( ::MapViewOfFile( mapper.m_handle,
|
|
FILE_MAP_READ,
|
|
0,
|
|
0,
|
|
0 ) ) )
|
|
{
|
|
if( ( m_size != 0 ) && ( intptr_t( m_data ) == 0 ) ) {
|
|
TAO_PEGTL_THROW_INPUT_WIN32_ERROR( "unable to MapViewOfFile() file mapping object with handle " << mapper.m_handle );
|
|
}
|
|
}
|
|
|
|
file_mapper( const file_mapper& ) = delete;
|
|
file_mapper( file_mapper&& ) = delete;
|
|
|
|
~file_mapper() noexcept
|
|
{
|
|
::UnmapViewOfFile( LPCVOID( m_data ) );
|
|
}
|
|
|
|
void operator=( const file_mapper& ) = delete;
|
|
void operator=( file_mapper&& ) = delete;
|
|
|
|
bool empty() const noexcept
|
|
{
|
|
return m_size == 0;
|
|
}
|
|
|
|
std::size_t size() const noexcept
|
|
{
|
|
return m_size;
|
|
}
|
|
|
|
using iterator = const char*;
|
|
using const_iterator = const char*;
|
|
|
|
iterator data() const noexcept
|
|
{
|
|
return m_data;
|
|
}
|
|
|
|
iterator begin() const noexcept
|
|
{
|
|
return m_data;
|
|
}
|
|
|
|
iterator end() const noexcept
|
|
{
|
|
return m_data + m_size;
|
|
}
|
|
|
|
std::string string() const
|
|
{
|
|
return std::string( m_data, m_size );
|
|
}
|
|
|
|
private:
|
|
const std::size_t m_size;
|
|
const char* const m_data;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 23 "tao/pegtl/mmap_input.hpp"
|
|
#else
|
|
#endif
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
struct mmap_holder
|
|
{
|
|
const std::string filename;
|
|
const file_mapper data;
|
|
|
|
template< typename T >
|
|
explicit mmap_holder( T&& in_filename )
|
|
: filename( std::forward< T >( in_filename ) ),
|
|
data( filename.c_str() )
|
|
{
|
|
}
|
|
|
|
mmap_holder( const mmap_holder& ) = delete;
|
|
mmap_holder( mmap_holder&& ) = delete;
|
|
|
|
~mmap_holder() = default;
|
|
|
|
void operator=( const mmap_holder& ) = delete;
|
|
void operator=( mmap_holder&& ) = delete;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
template< tracking_mode P = tracking_mode::eager, typename Eol = eol::lf_crlf >
|
|
struct mmap_input
|
|
: private internal::mmap_holder,
|
|
public memory_input< P, Eol, const char* >
|
|
{
|
|
template< typename T >
|
|
explicit mmap_input( T&& in_filename )
|
|
: internal::mmap_holder( std::forward< T >( in_filename ) ),
|
|
memory_input< P, Eol, const char* >( data.begin(), data.end(), filename.c_str() )
|
|
{
|
|
}
|
|
|
|
mmap_input( const mmap_input& ) = delete;
|
|
mmap_input( mmap_input&& ) = delete;
|
|
|
|
~mmap_input() = default;
|
|
|
|
void operator=( const mmap_input& ) = delete;
|
|
void operator=( mmap_input&& ) = delete;
|
|
};
|
|
|
|
#ifdef __cpp_deduction_guides
|
|
template< typename... Ts >
|
|
explicit mmap_input( Ts&&... )->mmap_input<>;
|
|
#endif
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 17 "tao/pegtl/file_input.hpp"
|
|
#else
|
|
|
|
#endif
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
#if defined( _POSIX_MAPPED_FILES ) || defined( _WIN32 )
|
|
template< tracking_mode P = tracking_mode::eager, typename Eol = eol::lf_crlf >
|
|
struct file_input
|
|
: mmap_input< P, Eol >
|
|
{
|
|
using mmap_input< P, Eol >::mmap_input;
|
|
};
|
|
#else
|
|
template< tracking_mode P = tracking_mode::eager, typename Eol = eol::lf_crlf >
|
|
struct file_input
|
|
: read_input< P, Eol >
|
|
{
|
|
using read_input< P, Eol >::read_input;
|
|
};
|
|
#endif
|
|
|
|
#ifdef __cpp_deduction_guides
|
|
template< typename... Ts >
|
|
explicit file_input( Ts&&... )->file_input<>;
|
|
#endif
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 33 "tao/pegtl.hpp"
|
|
|
|
#line 1 "tao/pegtl/change_action.hpp"
|
|
|
|
#line 1 "tao/pegtl/change_action.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CHANGE_ACTION_HPP
|
|
#define TAO_PEGTL_CHANGE_ACTION_HPP
|
|
|
|
#include <type_traits>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< template< typename... > class NewAction >
|
|
struct change_action
|
|
: maybe_nothing
|
|
{
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
static_assert( !std::is_same< Action< void >, NewAction< void > >::value, "old and new action class templates are identical" );
|
|
return Control< Rule >::template match< A, M, NewAction, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 35 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/change_action_and_state.hpp"
|
|
|
|
#line 1 "tao/pegtl/change_action_and_state.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CHANGE_ACTION_AND_STATE_HPP
|
|
#define TAO_PEGTL_CHANGE_ACTION_AND_STATE_HPP
|
|
|
|
#include <type_traits>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< template< typename... > class NewAction, typename NewState >
|
|
struct change_action_and_state
|
|
: maybe_nothing
|
|
{
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static auto match( Input& in, States&&... st )
|
|
-> typename std::enable_if< ( A == apply_mode::action ), bool >::type
|
|
{
|
|
static_assert( !std::is_same< Action< void >, NewAction< void > >::value, "old and new action class templates are identical" );
|
|
NewState s( static_cast< const Input& >( in ), st... );
|
|
if( Control< Rule >::template match< A, M, NewAction, Control >( in, s ) ) {
|
|
Action< Rule >::success( static_cast< const Input& >( in ), s, st... );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States,
|
|
int = 1 >
|
|
static auto match( Input& in, States&&... st )
|
|
-> typename std::enable_if< ( A == apply_mode::nothing ), bool >::type
|
|
{
|
|
static_assert( !std::is_same< Action< void >, NewAction< void > >::value, "old and new action class templates are identical" );
|
|
NewState s( static_cast< const Input& >( in ), st... );
|
|
return Control< Rule >::template match< A, M, NewAction, Control >( in, s );
|
|
}
|
|
|
|
template< typename Input,
|
|
typename... States >
|
|
static void success( const Input& in, NewState& s, States&&... st ) noexcept( noexcept( s.success( in, st... ) ) )
|
|
{
|
|
s.success( in, st... );
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 36 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/change_action_and_states.hpp"
|
|
|
|
#line 1 "tao/pegtl/change_action_and_states.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CHANGE_ACTION_AND_STATES_HPP
|
|
#define TAO_PEGTL_CHANGE_ACTION_AND_STATES_HPP
|
|
|
|
#include <tuple>
|
|
#include <type_traits>
|
|
#line 17 "tao/pegtl/change_action_and_states.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< template< typename... > class NewAction, typename... NewStates >
|
|
struct change_action_and_states
|
|
: maybe_nothing
|
|
{
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
std::size_t... Ns,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( TAO_PEGTL_NAMESPACE::internal::index_sequence< Ns... >, Input& in, States&&... st )
|
|
{
|
|
auto t = std::tie( st... );
|
|
if( Control< Rule >::template match< A, M, NewAction, Control >( in, std::get< Ns >( t )... ) ) {
|
|
Action< Rule >::success( static_cast< const Input& >( in ), st... );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static auto match( Input& in, States&&... st )
|
|
-> typename std::enable_if< ( A == apply_mode::action ), bool >::type
|
|
{
|
|
static_assert( !std::is_same< Action< void >, NewAction< void > >::value, "old and new action class templates are identical" );
|
|
return match< Rule, A, M, Action, Control >( TAO_PEGTL_NAMESPACE::internal::index_sequence_for< NewStates... >(), in, NewStates()..., st... );
|
|
}
|
|
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States,
|
|
int = 1 >
|
|
static auto match( Input& in, States&&... /*unused*/ )
|
|
-> typename std::enable_if< ( A == apply_mode::nothing ), bool >::type
|
|
{
|
|
static_assert( !std::is_same< Action< void >, NewAction< void > >::value, "old and new action class templates are identical" );
|
|
return Control< Rule >::template match< A, M, NewAction, Control >( in, NewStates()... );
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 37 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/change_control.hpp"
|
|
|
|
#line 1 "tao/pegtl/change_control.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CHANGE_CONTROL_HPP
|
|
#define TAO_PEGTL_CHANGE_CONTROL_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< template< typename... > class NewControl >
|
|
struct change_control
|
|
: maybe_nothing
|
|
{
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return TAO_PEGTL_NAMESPACE::match< Rule, A, M, Action, NewControl >( in, st... );
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 38 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/change_state.hpp"
|
|
|
|
#line 1 "tao/pegtl/change_state.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CHANGE_STATE_HPP
|
|
#define TAO_PEGTL_CHANGE_STATE_HPP
|
|
|
|
#include <type_traits>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< typename NewState >
|
|
struct change_state
|
|
: maybe_nothing
|
|
{
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static auto match( Input& in, States&&... st )
|
|
-> typename std::enable_if< ( A == apply_mode::action ), bool >::type
|
|
{
|
|
NewState s( static_cast< const Input& >( in ), st... );
|
|
if( TAO_PEGTL_NAMESPACE::match< Rule, A, M, Action, Control >( in, s ) ) {
|
|
Action< Rule >::success( static_cast< const Input& >( in ), s, st... );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States,
|
|
int = 1 >
|
|
static auto match( Input& in, States&&... st )
|
|
-> typename std::enable_if< ( A == apply_mode::nothing ), bool >::type
|
|
{
|
|
NewState s( static_cast< const Input& >( in ), st... );
|
|
return TAO_PEGTL_NAMESPACE::match< Rule, A, M, Action, Control >( in, s );
|
|
}
|
|
|
|
template< typename Input,
|
|
typename... States >
|
|
static void success( const Input& in, NewState& s, States&&... st ) noexcept( noexcept( s.success( in, st... ) ) )
|
|
{
|
|
s.success( in, st... );
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 39 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/change_states.hpp"
|
|
|
|
#line 1 "tao/pegtl/change_states.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CHANGE_STATES_HPP
|
|
#define TAO_PEGTL_CHANGE_STATES_HPP
|
|
|
|
#include <tuple>
|
|
#line 17 "tao/pegtl/change_states.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< typename... NewStates >
|
|
struct change_states
|
|
: maybe_nothing
|
|
{
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
std::size_t... Ns,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( TAO_PEGTL_NAMESPACE::internal::index_sequence< Ns... >, Input& in, States&&... st )
|
|
{
|
|
auto t = std::tie( st... );
|
|
if( TAO_PEGTL_NAMESPACE::match< Rule, A, M, Action, Control >( in, std::get< Ns >( t )... ) ) {
|
|
Action< Rule >::success( static_cast< const Input& >( in ), st... );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static auto match( Input& in, States&&... st )
|
|
-> typename std::enable_if< ( A == apply_mode::action ), bool >::type
|
|
{
|
|
return match< Rule, A, M, Action, Control >( TAO_PEGTL_NAMESPACE::internal::index_sequence_for< NewStates... >(), in, NewStates()..., st... );
|
|
}
|
|
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States,
|
|
int = 1 >
|
|
static auto match( Input& in, States&&... /*unused*/ )
|
|
-> typename std::enable_if< ( A == apply_mode::nothing ), bool >::type
|
|
{
|
|
return TAO_PEGTL_NAMESPACE::match< Rule, A, M, Action, Control >( in, NewStates()... );
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 40 "tao/pegtl.hpp"
|
|
|
|
#line 1 "tao/pegtl/disable_action.hpp"
|
|
|
|
#line 1 "tao/pegtl/disable_action.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_DISABLE_ACTION_HPP
|
|
#define TAO_PEGTL_DISABLE_ACTION_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
struct disable_action
|
|
: maybe_nothing
|
|
{
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return TAO_PEGTL_NAMESPACE::match< Rule, apply_mode::nothing, M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 42 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/enable_action.hpp"
|
|
|
|
#line 1 "tao/pegtl/enable_action.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_ENABLE_ACTION_HPP
|
|
#define TAO_PEGTL_ENABLE_ACTION_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
struct enable_action
|
|
: maybe_nothing
|
|
{
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
return TAO_PEGTL_NAMESPACE::match< Rule, apply_mode::action, M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 43 "tao/pegtl.hpp"
|
|
|
|
#line 1 "tao/pegtl/discard_input.hpp"
|
|
|
|
#line 1 "tao/pegtl/discard_input.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_DISCARD_INPUT_HPP
|
|
#define TAO_PEGTL_DISCARD_INPUT_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
struct discard_input
|
|
: maybe_nothing
|
|
{
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
const bool result = TAO_PEGTL_NAMESPACE::match< Rule, A, M, Action, Control >( in, st... );
|
|
in.discard();
|
|
return result;
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 45 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/discard_input_on_failure.hpp"
|
|
|
|
#line 1 "tao/pegtl/discard_input_on_failure.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_DISCARD_INPUT_ON_FAILURE_HPP
|
|
#define TAO_PEGTL_DISCARD_INPUT_ON_FAILURE_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
struct discard_input_on_failure
|
|
: maybe_nothing
|
|
{
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
const bool result = TAO_PEGTL_NAMESPACE::match< Rule, A, M, Action, Control >( in, st... );
|
|
if( !result ) {
|
|
in.discard();
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 46 "tao/pegtl.hpp"
|
|
#line 1 "tao/pegtl/discard_input_on_success.hpp"
|
|
|
|
#line 1 "tao/pegtl/discard_input_on_success.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_DISCARD_INPUT_ON_SUCCESS_HPP
|
|
#define TAO_PEGTL_DISCARD_INPUT_ON_SUCCESS_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
struct discard_input_on_success
|
|
: maybe_nothing
|
|
{
|
|
template< typename Rule,
|
|
apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
const bool result = TAO_PEGTL_NAMESPACE::match< Rule, A, M, Action, Control >( in, st... );
|
|
if( result ) {
|
|
in.discard();
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 47 "tao/pegtl.hpp"
|
|
|
|
// The following are not included by
|
|
// default because they include <iostream>.
|
|
|
|
// #include "pegtl/analyze.hpp"
|
|
|
|
#endif
|
|
#line 2 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/analyze.hpp"
|
|
|
|
#line 1 "tao/pegtl/analyze.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_ANALYZE_HPP
|
|
#define TAO_PEGTL_ANALYZE_HPP
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/analysis/analyze_cycles.hpp"
|
|
|
|
#line 1 "tao/pegtl/analysis/analyze_cycles.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_ANALYSIS_ANALYZE_CYCLES_HPP
|
|
#define TAO_PEGTL_ANALYSIS_ANALYZE_CYCLES_HPP
|
|
|
|
#include <cassert>
|
|
|
|
#include <map>
|
|
#include <set>
|
|
#include <stdexcept>
|
|
|
|
#include <iostream>
|
|
#include <utility>
|
|
|
|
|
|
|
|
|
|
#line 1 "tao/pegtl/analysis/insert_guard.hpp"
|
|
|
|
#line 1 "tao/pegtl/analysis/insert_guard.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_ANALYSIS_INSERT_GUARD_HPP
|
|
#define TAO_PEGTL_ANALYSIS_INSERT_GUARD_HPP
|
|
|
|
#include <utility>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace analysis
|
|
{
|
|
template< typename C >
|
|
class insert_guard
|
|
{
|
|
public:
|
|
insert_guard( C& container, const typename C::value_type& value )
|
|
: m_i( container.insert( value ) ),
|
|
m_c( &container )
|
|
{
|
|
}
|
|
|
|
insert_guard( const insert_guard& ) = delete;
|
|
|
|
insert_guard( insert_guard&& other ) noexcept
|
|
: m_i( other.m_i ),
|
|
m_c( other.m_c )
|
|
{
|
|
other.m_c = nullptr;
|
|
}
|
|
|
|
~insert_guard()
|
|
{
|
|
if( m_c && m_i.second ) {
|
|
m_c->erase( m_i.first );
|
|
}
|
|
}
|
|
|
|
void operator=( const insert_guard& ) = delete;
|
|
void operator=( insert_guard&& ) = delete;
|
|
|
|
explicit operator bool() const noexcept
|
|
{
|
|
return m_i.second;
|
|
}
|
|
|
|
private:
|
|
const std::pair< typename C::iterator, bool > m_i;
|
|
C* m_c;
|
|
};
|
|
|
|
template< typename C >
|
|
insert_guard< C > make_insert_guard( C& container, const typename C::value_type& value )
|
|
{
|
|
return insert_guard< C >( container, value );
|
|
}
|
|
|
|
} // namespace analysis
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 20 "tao/pegtl/analysis/analyze_cycles.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace analysis
|
|
{
|
|
class analyze_cycles_impl
|
|
{
|
|
protected:
|
|
explicit analyze_cycles_impl( const bool verbose ) noexcept
|
|
: m_verbose( verbose ),
|
|
m_problems( 0 )
|
|
{
|
|
}
|
|
|
|
const bool m_verbose;
|
|
unsigned m_problems;
|
|
grammar_info m_info;
|
|
std::set< std::string > m_stack;
|
|
std::map< std::string, bool > m_cache;
|
|
std::map< std::string, bool > m_results;
|
|
|
|
std::map< std::string, rule_info >::const_iterator find( const std::string& name ) const noexcept
|
|
{
|
|
const auto iter = m_info.map.find( name );
|
|
assert( iter != m_info.map.end() );
|
|
return iter;
|
|
}
|
|
|
|
bool work( const std::map< std::string, rule_info >::const_iterator& start, const bool accum )
|
|
{
|
|
const auto j = m_cache.find( start->first );
|
|
|
|
if( j != m_cache.end() ) {
|
|
return j->second;
|
|
}
|
|
if( const auto g = make_insert_guard( m_stack, start->first ) ) {
|
|
switch( start->second.type ) {
|
|
case rule_type::any: {
|
|
bool a = false;
|
|
for( const auto& r : start->second.rules ) {
|
|
a = a || work( find( r ), accum || a );
|
|
}
|
|
return m_cache[ start->first ] = true;
|
|
}
|
|
case rule_type::opt: {
|
|
bool a = false;
|
|
for( const auto& r : start->second.rules ) {
|
|
a = a || work( find( r ), accum || a );
|
|
}
|
|
return m_cache[ start->first ] = false;
|
|
}
|
|
case rule_type::seq: {
|
|
bool a = false;
|
|
for( const auto& r : start->second.rules ) {
|
|
a = a || work( find( r ), accum || a );
|
|
}
|
|
return m_cache[ start->first ] = a;
|
|
}
|
|
case rule_type::sor: {
|
|
bool a = true;
|
|
for( const auto& r : start->second.rules ) {
|
|
a = a && work( find( r ), accum );
|
|
}
|
|
return m_cache[ start->first ] = a;
|
|
}
|
|
}
|
|
throw std::logic_error( "code should be unreachable: invalid rule_type value" ); // NOLINT, LCOV_EXCL_LINE
|
|
}
|
|
if( !accum ) {
|
|
++m_problems;
|
|
if( m_verbose ) {
|
|
std::cout << "problem: cycle without progress detected at rule class " << start->first << std::endl; // LCOV_EXCL_LINE
|
|
}
|
|
}
|
|
return m_cache[ start->first ] = accum;
|
|
}
|
|
};
|
|
|
|
template< typename Grammar >
|
|
class analyze_cycles
|
|
: private analyze_cycles_impl
|
|
{
|
|
public:
|
|
explicit analyze_cycles( const bool verbose )
|
|
: analyze_cycles_impl( verbose )
|
|
{
|
|
Grammar::analyze_t::template insert< Grammar >( m_info );
|
|
}
|
|
|
|
std::size_t problems()
|
|
{
|
|
for( auto i = m_info.map.begin(); i != m_info.map.end(); ++i ) {
|
|
m_results[ i->first ] = work( i, false );
|
|
m_cache.clear();
|
|
}
|
|
return m_problems;
|
|
}
|
|
|
|
template< typename Rule >
|
|
bool consumes() const noexcept
|
|
{
|
|
const auto i = m_results.find( internal::demangle< Rule >() );
|
|
assert( i != m_results.end() );
|
|
return i->second;
|
|
}
|
|
};
|
|
|
|
} // namespace analysis
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "tao/pegtl/analyze.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
template< typename Rule >
|
|
std::size_t analyze( const bool verbose = true )
|
|
{
|
|
return analysis::analyze_cycles< Rule >( verbose ).problems();
|
|
}
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 3 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/abnf.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/abnf.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_ABNF_HPP
|
|
#define TAO_PEGTL_CONTRIB_ABNF_HPP
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace abnf
|
|
{
|
|
// Core ABNF rules according to RFC 5234, Appendix B
|
|
|
|
// clang-format off
|
|
struct ALPHA : internal::ranges< internal::peek_char, 'a', 'z', 'A', 'Z' > {};
|
|
struct BIT : internal::one< internal::result_on_found::success, internal::peek_char, '0', '1' > {};
|
|
struct CHAR : internal::range< internal::result_on_found::success, internal::peek_char, char( 1 ), char( 127 ) > {};
|
|
struct CR : internal::one< internal::result_on_found::success, internal::peek_char, '\r' > {};
|
|
struct CRLF : internal::string< '\r', '\n' > {};
|
|
struct CTL : internal::ranges< internal::peek_char, char( 0 ), char( 31 ), char( 127 ) > {};
|
|
struct DIGIT : internal::range< internal::result_on_found::success, internal::peek_char, '0', '9' > {};
|
|
struct DQUOTE : internal::one< internal::result_on_found::success, internal::peek_char, '"' > {};
|
|
struct HEXDIG : internal::ranges< internal::peek_char, '0', '9', 'a', 'f', 'A', 'F' > {};
|
|
struct HTAB : internal::one< internal::result_on_found::success, internal::peek_char, '\t' > {};
|
|
struct LF : internal::one< internal::result_on_found::success, internal::peek_char, '\n' > {};
|
|
struct LWSP : internal::star< internal::sor< internal::string< '\r', '\n' >, internal::one< internal::result_on_found::success, internal::peek_char, ' ', '\t' > >, internal::one< internal::result_on_found::success, internal::peek_char, ' ', '\t' > > {};
|
|
struct OCTET : internal::any< internal::peek_char > {};
|
|
struct SP : internal::one< internal::result_on_found::success, internal::peek_char, ' ' > {};
|
|
struct VCHAR : internal::range< internal::result_on_found::success, internal::peek_char, char( 33 ), char( 126 ) > {};
|
|
struct WSP : internal::one< internal::result_on_found::success, internal::peek_char, ' ', '\t' > {};
|
|
// clang-format on
|
|
|
|
} // namespace abnf
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 4 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/alphabet.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/alphabet.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_ALPHABET_HPP
|
|
#define TAO_PEGTL_CONTRIB_ALPHABET_HPP
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace alphabet
|
|
{
|
|
static const int a = 'a'; // NOLINT
|
|
static const int b = 'b'; // NOLINT
|
|
static const int c = 'c'; // NOLINT
|
|
static const int d = 'd'; // NOLINT
|
|
static const int e = 'e'; // NOLINT
|
|
static const int f = 'f'; // NOLINT
|
|
static const int g = 'g'; // NOLINT
|
|
static const int h = 'h'; // NOLINT
|
|
static const int i = 'i'; // NOLINT
|
|
static const int j = 'j'; // NOLINT
|
|
static const int k = 'k'; // NOLINT
|
|
static const int l = 'l'; // NOLINT
|
|
static const int m = 'm'; // NOLINT
|
|
static const int n = 'n'; // NOLINT
|
|
static const int o = 'o'; // NOLINT
|
|
static const int p = 'p'; // NOLINT
|
|
static const int q = 'q'; // NOLINT
|
|
static const int r = 'r'; // NOLINT
|
|
static const int s = 's'; // NOLINT
|
|
static const int t = 't'; // NOLINT
|
|
static const int u = 'u'; // NOLINT
|
|
static const int v = 'v'; // NOLINT
|
|
static const int w = 'w'; // NOLINT
|
|
static const int x = 'x'; // NOLINT
|
|
static const int y = 'y'; // NOLINT
|
|
static const int z = 'z'; // NOLINT
|
|
|
|
static const int A = 'A'; // NOLINT
|
|
static const int B = 'B'; // NOLINT
|
|
static const int C = 'C'; // NOLINT
|
|
static const int D = 'D'; // NOLINT
|
|
static const int E = 'E'; // NOLINT
|
|
static const int F = 'F'; // NOLINT
|
|
static const int G = 'G'; // NOLINT
|
|
static const int H = 'H'; // NOLINT
|
|
static const int I = 'I'; // NOLINT
|
|
static const int J = 'J'; // NOLINT
|
|
static const int K = 'K'; // NOLINT
|
|
static const int L = 'L'; // NOLINT
|
|
static const int M = 'M'; // NOLINT
|
|
static const int N = 'N'; // NOLINT
|
|
static const int O = 'O'; // NOLINT
|
|
static const int P = 'P'; // NOLINT
|
|
static const int Q = 'Q'; // NOLINT
|
|
static const int R = 'R'; // NOLINT
|
|
static const int S = 'S'; // NOLINT
|
|
static const int T = 'T'; // NOLINT
|
|
static const int U = 'U'; // NOLINT
|
|
static const int V = 'V'; // NOLINT
|
|
static const int W = 'W'; // NOLINT
|
|
static const int X = 'X'; // NOLINT
|
|
static const int Y = 'Y'; // NOLINT
|
|
static const int Z = 'Z'; // NOLINT
|
|
|
|
} // namespace alphabet
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 5 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/counter.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/counter.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_COUNTER_HPP
|
|
#define TAO_PEGTL_CONTRIB_COUNTER_HPP
|
|
|
|
#include <map>
|
|
#include <string>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
struct counter_data
|
|
{
|
|
unsigned start = 0;
|
|
unsigned success = 0;
|
|
unsigned failure = 0;
|
|
};
|
|
|
|
struct counter_state
|
|
{
|
|
std::map< std::string, counter_data > counts;
|
|
};
|
|
|
|
template< typename Rule >
|
|
struct counter
|
|
: normal< Rule >
|
|
{
|
|
template< typename Input >
|
|
static void start( const Input& /*unused*/, counter_state& ts )
|
|
{
|
|
++ts.counts[ internal::demangle< Rule >() ].start;
|
|
}
|
|
|
|
template< typename Input >
|
|
static void success( const Input& /*unused*/, counter_state& ts )
|
|
{
|
|
++ts.counts[ internal::demangle< Rule >() ].success;
|
|
}
|
|
|
|
template< typename Input >
|
|
static void failure( const Input& /*unused*/, counter_state& ts )
|
|
{
|
|
++ts.counts[ internal::demangle< Rule >() ].failure;
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 6 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/http.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/http.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_HTTP_HPP
|
|
#define TAO_PEGTL_CONTRIB_HTTP_HPP
|
|
#line 14 "tao/pegtl/contrib/http.hpp"
|
|
#line 1 "tao/pegtl/contrib/remove_first_state.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/remove_first_state.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_REMOVE_FIRST_STATE_HPP
|
|
#define TAO_PEGTL_CONTRIB_REMOVE_FIRST_STATE_HPP
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
// Applies to start(), success(), failure(), raise(), apply(), and apply0():
|
|
// The first state is removed when the call is forwarded to Base.
|
|
template< typename Base >
|
|
struct remove_first_state
|
|
: Base
|
|
{
|
|
template< typename Input, typename State, typename... States >
|
|
static void start( const Input& in, State&& /*unused*/, States&&... st ) noexcept( noexcept( Base::start( in, st... ) ) )
|
|
{
|
|
Base::start( in, st... );
|
|
}
|
|
|
|
template< typename Input, typename State, typename... States >
|
|
static void success( const Input& in, State&& /*unused*/, States&&... st ) noexcept( noexcept( Base::success( in, st... ) ) )
|
|
{
|
|
Base::success( in, st... );
|
|
}
|
|
|
|
template< typename Input, typename State, typename... States >
|
|
static void failure( const Input& in, State&& /*unused*/, States&&... st ) noexcept( noexcept( Base::failure( in, st... ) ) )
|
|
{
|
|
Base::failure( in, st... );
|
|
}
|
|
|
|
template< typename Input, typename State, typename... States >
|
|
static void raise( const Input& in, State&& /*unused*/, States&&... st )
|
|
{
|
|
Base::raise( in, st... );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Iterator, typename Input, typename State, typename... States >
|
|
static auto apply( const Iterator& begin, const Input& in, State&& /*unused*/, States&&... st ) noexcept( noexcept( Base::template apply< Action >( begin, in, st... ) ) )
|
|
-> decltype( Base::template apply< Action >( begin, in, st... ) )
|
|
{
|
|
return Base::template apply< Action >( begin, in, st... );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Input, typename State, typename... States >
|
|
static auto apply0( const Input& in, State&& /*unused*/, States&&... st ) noexcept( noexcept( Base::template apply0< Action >( in, st... ) ) )
|
|
-> decltype( Base::template apply0< Action >( in, st... ) )
|
|
{
|
|
return Base::template apply0< Action >( in, st... );
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 15 "tao/pegtl/contrib/http.hpp"
|
|
#line 1 "tao/pegtl/contrib/uri.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/uri.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_URI_HPP
|
|
#define TAO_PEGTL_CONTRIB_URI_HPP
|
|
#line 14 "tao/pegtl/contrib/uri.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace uri
|
|
{
|
|
// URI grammar according to RFC 3986.
|
|
|
|
// This grammar is a direct PEG translation of the original URI grammar.
|
|
// It should be considered experimental -- in case of any issues, in particular
|
|
// missing rules for attached actions, please contact the developers.
|
|
|
|
// Note that this grammar has multiple top-level rules.
|
|
|
|
using dot = one< '.' >;
|
|
using colon = one< ':' >;
|
|
|
|
// clang-format off
|
|
struct dec_octet : sor< one< '0' >,
|
|
rep_min_max< 1, 2, abnf::DIGIT >,
|
|
seq< one< '1' >, abnf::DIGIT, abnf::DIGIT >,
|
|
seq< one< '2' >, range< '0', '4' >, abnf::DIGIT >,
|
|
seq< string< '2', '5' >, range< '0', '5' > > > {};
|
|
|
|
struct IPv4address : seq< dec_octet, dot, dec_octet, dot, dec_octet, dot, dec_octet > {};
|
|
|
|
struct h16 : rep_min_max< 1, 4, abnf::HEXDIG > {};
|
|
struct ls32 : sor< seq< h16, colon, h16 >, IPv4address > {};
|
|
|
|
struct dcolon : two< ':' > {};
|
|
|
|
struct IPv6address : sor< seq< rep< 6, h16, colon >, ls32 >,
|
|
seq< dcolon, rep< 5, h16, colon >, ls32 >,
|
|
seq< opt< h16 >, dcolon, rep< 4, h16, colon >, ls32 >,
|
|
seq< opt< h16, opt< colon, h16 > >, dcolon, rep< 3, h16, colon >, ls32 >,
|
|
seq< opt< h16, rep_opt< 2, colon, h16 > >, dcolon, rep< 2, h16, colon >, ls32 >,
|
|
seq< opt< h16, rep_opt< 3, colon, h16 > >, dcolon, h16, colon, ls32 >,
|
|
seq< opt< h16, rep_opt< 4, colon, h16 > >, dcolon, ls32 >,
|
|
seq< opt< h16, rep_opt< 5, colon, h16 > >, dcolon, h16 >,
|
|
seq< opt< h16, rep_opt< 6, colon, h16 > >, dcolon > > {};
|
|
|
|
struct gen_delims : one< ':', '/', '?', '#', '[', ']', '@' > {};
|
|
struct sub_delims : one< '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=' > {};
|
|
|
|
struct unreserved : sor< abnf::ALPHA, abnf::DIGIT, one< '-', '.', '_', '~' > > {};
|
|
struct reserved : sor< gen_delims, sub_delims > {};
|
|
|
|
struct IPvFuture : if_must< one< 'v' >, plus< abnf::HEXDIG >, dot, plus< sor< unreserved, sub_delims, colon > > > {};
|
|
|
|
struct IP_literal : if_must< one< '[' >, sor< IPvFuture, IPv6address >, one< ']' > > {};
|
|
|
|
struct pct_encoded : if_must< one< '%' >, abnf::HEXDIG, abnf::HEXDIG > {};
|
|
struct pchar : sor< unreserved, pct_encoded, sub_delims, one< ':', '@' > > {};
|
|
|
|
struct query : star< sor< pchar, one< '/', '?' > > > {};
|
|
struct fragment : star< sor< pchar, one< '/', '?' > > > {};
|
|
|
|
struct segment : star< pchar > {};
|
|
struct segment_nz : plus< pchar > {};
|
|
struct segment_nz_nc : plus< sor< unreserved, pct_encoded, sub_delims, one< '@' > > > {}; // non-zero-length segment without any colon ":"
|
|
|
|
struct path_abempty : star< one< '/' >, segment > {};
|
|
struct path_absolute : seq< one< '/' >, opt< segment_nz, star< one< '/' >, segment > > > {};
|
|
struct path_noscheme : seq< segment_nz_nc, star< one< '/' >, segment > > {};
|
|
struct path_rootless : seq< segment_nz, star< one< '/' >, segment > > {};
|
|
struct path_empty : success {};
|
|
|
|
struct path : sor< path_noscheme, // begins with a non-colon segment
|
|
path_rootless, // begins with a segment
|
|
path_absolute, // begins with "/" but not "//"
|
|
path_abempty > {}; // begins with "/" or is empty
|
|
|
|
struct reg_name : star< sor< unreserved, pct_encoded, sub_delims > > {};
|
|
|
|
struct port : star< abnf::DIGIT > {};
|
|
struct host : sor< IP_literal, IPv4address, reg_name > {};
|
|
struct userinfo : star< sor< unreserved, pct_encoded, sub_delims, colon > > {};
|
|
struct opt_userinfo : opt< userinfo, one< '@' > > {};
|
|
struct authority : seq< opt_userinfo, host, opt< colon, port > > {};
|
|
|
|
struct scheme : seq< abnf::ALPHA, star< sor< abnf::ALPHA, abnf::DIGIT, one< '+', '-', '.' > > > > {};
|
|
|
|
using dslash = two< '/' >;
|
|
using opt_query = opt_must< one< '?' >, query >;
|
|
using opt_fragment = opt_must< one< '#' >, fragment >;
|
|
|
|
struct hier_part : sor< if_must< dslash, authority, path_abempty >, path_rootless, path_absolute, path_empty > {};
|
|
struct relative_part : sor< if_must< dslash, authority, path_abempty >, path_noscheme, path_absolute, path_empty > {};
|
|
struct relative_ref : seq< relative_part, opt_query, opt_fragment > {};
|
|
|
|
struct URI : seq< scheme, one< ':' >, hier_part, opt_query, opt_fragment > {};
|
|
struct URI_reference : sor< URI, relative_ref > {};
|
|
struct absolute_URI : seq< scheme, one< ':' >, hier_part, opt_query > {};
|
|
// clang-format on
|
|
|
|
} // namespace uri
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 16 "tao/pegtl/contrib/http.hpp"
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace http
|
|
{
|
|
// HTTP 1.1 grammar according to RFC 7230.
|
|
|
|
// This grammar is a direct PEG translation of the original HTTP grammar.
|
|
// It should be considered experimental -- in case of any issues, in particular
|
|
// missing rules for attached actions, please contact the developers.
|
|
|
|
using OWS = star< abnf::WSP >; // optional whitespace
|
|
using RWS = plus< abnf::WSP >; // required whitespace
|
|
using BWS = OWS; // "bad" whitespace
|
|
|
|
using obs_text = not_range< 0x00, 0x7F >;
|
|
using obs_fold = seq< abnf::CRLF, plus< abnf::WSP > >;
|
|
|
|
// clang-format off
|
|
struct tchar : sor< abnf::ALPHA, abnf::DIGIT, one< '!', '#', '$', '%', '&', '\'', '*', '+', '-', '.', '^', '_', '`', '|', '~' > > {};
|
|
struct token : plus< tchar > {};
|
|
|
|
struct field_name : token {};
|
|
|
|
struct field_vchar : sor< abnf::VCHAR, obs_text > {};
|
|
struct field_content : list< field_vchar, plus< abnf::WSP > > {};
|
|
struct field_value : star< sor< field_content, obs_fold > > {};
|
|
|
|
struct header_field : seq< field_name, one< ':' >, OWS, field_value, OWS > {};
|
|
|
|
struct method : token {};
|
|
|
|
struct absolute_path : plus< one< '/' >, uri::segment > {};
|
|
|
|
struct origin_form : seq< absolute_path, uri::opt_query > {};
|
|
struct absolute_form : uri::absolute_URI {};
|
|
struct authority_form : uri::authority {};
|
|
struct asterisk_form : one< '*' > {};
|
|
|
|
struct request_target : sor< origin_form, absolute_form, authority_form, asterisk_form > {};
|
|
|
|
struct status_code : rep< 3, abnf::DIGIT > {};
|
|
struct reason_phrase : star< sor< abnf::VCHAR, obs_text, abnf::WSP > > {};
|
|
|
|
struct HTTP_version : if_must< string< 'H', 'T', 'T', 'P', '/' >, abnf::DIGIT, one< '.' >, abnf::DIGIT > {};
|
|
|
|
struct request_line : if_must< method, abnf::SP, request_target, abnf::SP, HTTP_version, abnf::CRLF > {};
|
|
struct status_line : if_must< HTTP_version, abnf::SP, status_code, abnf::SP, reason_phrase, abnf::CRLF > {};
|
|
struct start_line : sor< status_line, request_line > {};
|
|
|
|
struct message_body : star< abnf::OCTET > {};
|
|
struct HTTP_message : seq< start_line, star< header_field, abnf::CRLF >, abnf::CRLF, opt< message_body > > {};
|
|
|
|
struct Content_Length : plus< abnf::DIGIT > {};
|
|
|
|
struct uri_host : uri::host {};
|
|
struct port : uri::port {};
|
|
|
|
struct Host : seq< uri_host, opt< one< ':' >, port > > {};
|
|
|
|
// PEG are different from CFGs! (this replaces ctext and qdtext)
|
|
using text = sor< abnf::HTAB, range< 0x20, 0x7E >, obs_text >;
|
|
|
|
struct quoted_pair : if_must< one< '\\' >, sor< abnf::VCHAR, obs_text, abnf::WSP > > {};
|
|
struct quoted_string : if_must< abnf::DQUOTE, until< abnf::DQUOTE, sor< quoted_pair, text > > > {};
|
|
|
|
struct transfer_parameter : seq< token, BWS, one< '=' >, BWS, sor< token, quoted_string > > {};
|
|
struct transfer_extension : seq< token, star< OWS, one< ';' >, OWS, transfer_parameter > > {};
|
|
struct transfer_coding : sor< istring< 'c', 'h', 'u', 'n', 'k', 'e', 'd' >,
|
|
istring< 'c', 'o', 'm', 'p', 'r', 'e', 's', 's' >,
|
|
istring< 'd', 'e', 'f', 'l', 'a', 't', 'e' >,
|
|
istring< 'g', 'z', 'i', 'p' >,
|
|
transfer_extension > {};
|
|
|
|
struct rank : sor< seq< one< '0' >, opt< one< '.' >, rep_opt< 3, abnf::DIGIT > > >,
|
|
seq< one< '1' >, opt< one< '.' >, rep_opt< 3, one< '0' > > > > > {};
|
|
|
|
struct t_ranking : seq< OWS, one< ';' >, OWS, one< 'q', 'Q' >, one< '=' >, rank > {};
|
|
struct t_codings : sor< istring< 't', 'r', 'a', 'i', 'l', 'e', 'r', 's' >, seq< transfer_coding, opt< t_ranking > > > {};
|
|
|
|
struct TE : opt< sor< one< ',' >, t_codings >, star< OWS, one< ',' >, opt< OWS, t_codings > > > {};
|
|
|
|
template< typename T >
|
|
using make_comma_list = seq< star< one< ',' >, OWS >, T, star< OWS, one< ',' >, opt< OWS, T > > >;
|
|
|
|
struct connection_option : token {};
|
|
struct Connection : make_comma_list< connection_option > {};
|
|
|
|
struct Trailer : make_comma_list< field_name > {};
|
|
|
|
struct Transfer_Encoding : make_comma_list< transfer_coding > {};
|
|
|
|
struct protocol_name : token {};
|
|
struct protocol_version : token {};
|
|
struct protocol : seq< protocol_name, opt< one< '/' >, protocol_version > > {};
|
|
struct Upgrade : make_comma_list< protocol > {};
|
|
|
|
struct pseudonym : token {};
|
|
|
|
struct received_protocol : seq< opt< protocol_name, one< '/' > >, protocol_version > {};
|
|
struct received_by : sor< seq< uri_host, opt< one< ':' >, port > >, pseudonym > {};
|
|
|
|
struct comment : if_must< one< '(' >, until< one< ')' >, sor< comment, quoted_pair, text > > > {};
|
|
|
|
struct Via : make_comma_list< seq< received_protocol, RWS, received_by, opt< RWS, comment > > > {};
|
|
|
|
struct http_URI : if_must< istring< 'h', 't', 't', 'p', ':', '/', '/' >, uri::authority, uri::path_abempty, uri::opt_query, uri::opt_fragment > {};
|
|
struct https_URI : if_must< istring< 'h', 't', 't', 'p', 's', ':', '/', '/' >, uri::authority, uri::path_abempty, uri::opt_query, uri::opt_fragment > {};
|
|
|
|
struct partial_URI : seq< uri::relative_part, uri::opt_query > {};
|
|
|
|
// clang-format on
|
|
struct chunk_size
|
|
{
|
|
using analyze_t = plus< abnf::HEXDIG >::analyze_t;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, std::size_t& size, States&&... /*unused*/ )
|
|
{
|
|
size = 0;
|
|
std::size_t i = 0;
|
|
while( in.size( i + 1 ) >= i + 1 ) {
|
|
const auto c = in.peek_char( i );
|
|
if( ( '0' <= c ) && ( c <= '9' ) ) {
|
|
size <<= 4;
|
|
size |= std::size_t( c - '0' );
|
|
++i;
|
|
continue;
|
|
}
|
|
if( ( 'a' <= c ) && ( c <= 'f' ) ) {
|
|
size <<= 4;
|
|
size |= std::size_t( c - 'a' + 10 );
|
|
++i;
|
|
continue;
|
|
}
|
|
if( ( 'A' <= c ) && ( c <= 'F' ) ) {
|
|
size <<= 4;
|
|
size |= std::size_t( c - 'A' + 10 );
|
|
++i;
|
|
continue;
|
|
}
|
|
break;
|
|
}
|
|
in.bump_in_this_line( i );
|
|
return i > 0;
|
|
}
|
|
};
|
|
// clang-format off
|
|
|
|
struct chunk_ext_name : token {};
|
|
struct chunk_ext_val : sor< quoted_string, token > {};
|
|
struct chunk_ext : star_must< one< ';' >, chunk_ext_name, if_must< one< '=' >, chunk_ext_val > > {};
|
|
|
|
// clang-format on
|
|
struct chunk_data
|
|
{
|
|
using analyze_t = star< abnf::OCTET >::analyze_t;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, const std::size_t size, States&&... /*unused*/ )
|
|
{
|
|
if( in.size( size ) >= size ) {
|
|
in.bump( size );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
namespace internal
|
|
{
|
|
namespace chunk_helper
|
|
{
|
|
template< typename Base >
|
|
struct control;
|
|
|
|
template< template< typename... > class Control, typename Rule >
|
|
struct control< Control< Rule > >
|
|
: Control< Rule >
|
|
{
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class,
|
|
typename Input,
|
|
typename State,
|
|
typename... States >
|
|
static bool match( Input& in, State&& /*unused*/, States&&... st )
|
|
{
|
|
return Control< Rule >::template match< A, M, Action, Control >( in, st... );
|
|
}
|
|
};
|
|
|
|
template< template< typename... > class Control >
|
|
struct control< Control< chunk_size > >
|
|
: remove_first_state< Control< chunk_size > >
|
|
{};
|
|
|
|
template< template< typename... > class Control >
|
|
struct control< Control< chunk_data > >
|
|
: remove_first_state< Control< chunk_data > >
|
|
{};
|
|
|
|
template< template< typename... > class Control >
|
|
struct bind
|
|
{
|
|
template< typename Rule >
|
|
using type = control< Control< Rule > >;
|
|
};
|
|
|
|
} // namespace chunk_helper
|
|
|
|
} // namespace internal
|
|
|
|
struct chunk
|
|
{
|
|
using impl = seq< chunk_size, chunk_ext, abnf::CRLF, chunk_data, abnf::CRLF >;
|
|
using analyze_t = impl::analyze_t;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
std::size_t size{};
|
|
return impl::template match< A, M, Action, internal::chunk_helper::bind< Control >::template type >( in, size, st... );
|
|
}
|
|
};
|
|
|
|
// clang-format off
|
|
struct last_chunk : seq< plus< one< '0' > >, not_at< digit >, chunk_ext, abnf::CRLF > {};
|
|
|
|
struct trailer_part : star< header_field, abnf::CRLF > {};
|
|
|
|
struct chunked_body : seq< until< last_chunk, chunk >, trailer_part, abnf::CRLF > {};
|
|
// clang-format on
|
|
|
|
} // namespace http
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 7 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/if_then.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/if_then.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_IF_THEN_HPP
|
|
#define TAO_PEGTL_CONTRIB_IF_THEN_HPP
|
|
|
|
#include <type_traits>
|
|
#line 16 "tao/pegtl/contrib/if_then.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Cond, typename Then >
|
|
struct if_pair
|
|
{
|
|
};
|
|
|
|
template< typename... Pairs >
|
|
struct if_then;
|
|
|
|
template< typename Cond, typename Then, typename... Pairs >
|
|
struct if_then< if_pair< Cond, Then >, Pairs... >
|
|
: if_then_else< Cond, Then, if_then< Pairs... > >
|
|
{
|
|
template< typename ElseCond, typename... Thens >
|
|
using else_if_then = if_then< if_pair< Cond, Then >, Pairs..., if_pair< ElseCond, seq< Thens... > > >;
|
|
|
|
template< typename... Thens >
|
|
using else_then = if_then_else< Cond, Then, if_then< Pairs..., if_pair< trivial< true >, seq< Thens... > > > >;
|
|
};
|
|
|
|
template<>
|
|
struct if_then<>
|
|
: trivial< false >
|
|
{
|
|
};
|
|
|
|
template< typename... Pairs >
|
|
struct skip_control< if_then< Pairs... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
template< typename Cond, typename... Thens >
|
|
using if_then = internal::if_then< internal::if_pair< Cond, internal::seq< Thens... > > >;
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 8 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/integer.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/integer.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_INTEGER_HPP
|
|
#define TAO_PEGTL_CONTRIB_INTEGER_HPP
|
|
|
|
#include <limits>
|
|
#include <type_traits>
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace integer
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename I, I Limit, typename Input >
|
|
I actual_convert( const Input& in, std::size_t index )
|
|
{
|
|
static constexpr I cutoff = Limit / 10;
|
|
static constexpr I cutlim = Limit % 10;
|
|
|
|
I out = in.peek_char( index ) - '0';
|
|
while( ++index < in.size() ) {
|
|
const I c = in.peek_char( index ) - '0';
|
|
if( ( out > cutoff ) || ( ( out == cutoff ) && ( c > cutlim ) ) ) {
|
|
throw parse_error( "integer out of range", in );
|
|
}
|
|
out *= 10;
|
|
out += c;
|
|
}
|
|
return out;
|
|
}
|
|
|
|
template< typename I, typename Input >
|
|
I convert_positive( const Input& in, std::size_t index )
|
|
{
|
|
static constexpr I limit = ( std::numeric_limits< I >::max )();
|
|
return actual_convert< I, limit >( in, index );
|
|
}
|
|
|
|
template< typename I, typename Input >
|
|
I convert_negative( const Input& in, std::size_t index )
|
|
{
|
|
using U = typename std::make_unsigned< I >::type;
|
|
static constexpr U limit = static_cast< U >( ( std::numeric_limits< I >::max )() ) + 1;
|
|
return static_cast< I >( ~actual_convert< U, limit >( in, index ) ) + 1;
|
|
}
|
|
|
|
} // namespace internal
|
|
|
|
struct unsigned_rule
|
|
: plus< digit >
|
|
{
|
|
};
|
|
|
|
struct unsigned_action
|
|
{
|
|
// Assumes that 'in' contains a non-empty sequence of ASCII digits.
|
|
|
|
template< typename Input, typename State, typename... States >
|
|
static void apply( const Input& in, State& st, States&&... /*unused*/ )
|
|
{
|
|
using T = typename std::decay< decltype( st.converted ) >::type;
|
|
static_assert( std::is_integral< T >::value, "need integral type" );
|
|
static_assert( std::is_unsigned< T >::value, "need unsigned type" );
|
|
st.converted = internal::convert_positive< T >( in, 0 );
|
|
}
|
|
};
|
|
|
|
struct signed_rule
|
|
: seq< opt< one< '+', '-' > >, plus< digit > >
|
|
{
|
|
};
|
|
|
|
struct signed_action
|
|
{
|
|
// Assumes that 'in' contains a non-empty sequence of ASCII digits,
|
|
// with optional leading sign; with sign, in.size() must be >= 2.
|
|
|
|
template< typename Input, typename State, typename... States >
|
|
static void apply( const Input& in, State& st, States&&... /*unused*/ )
|
|
{
|
|
using T = typename std::decay< decltype( st.converted ) >::type;
|
|
static_assert( std::is_integral< T >::value, "need integral type" );
|
|
static_assert( std::is_signed< T >::value, "need signed type" );
|
|
const auto c = in.peek_char();
|
|
if( c == '-' ) {
|
|
st.converted = internal::convert_negative< T >( in, 1 );
|
|
}
|
|
else {
|
|
st.converted = internal::convert_positive< T >( in, std::size_t( c == '+' ) );
|
|
}
|
|
}
|
|
};
|
|
|
|
} // namespace integer
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 9 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/json.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/json.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_JSON_HPP
|
|
#define TAO_PEGTL_CONTRIB_JSON_HPP
|
|
#line 14 "tao/pegtl/contrib/json.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace json
|
|
{
|
|
// JSON grammar according to RFC 8259
|
|
|
|
// clang-format off
|
|
struct ws : one< ' ', '\t', '\n', '\r' > {};
|
|
|
|
template< typename R, typename P = ws >
|
|
struct padr : internal::seq< R, internal::star< P > > {};
|
|
|
|
struct begin_array : padr< one< '[' > > {};
|
|
struct begin_object : padr< one< '{' > > {};
|
|
struct end_array : one< ']' > {};
|
|
struct end_object : one< '}' > {};
|
|
struct name_separator : pad< one< ':' >, ws > {};
|
|
struct value_separator : padr< one< ',' > > {};
|
|
|
|
struct false_ : string< 'f', 'a', 'l', 's', 'e' > {}; // NOLINT
|
|
struct null : string< 'n', 'u', 'l', 'l' > {};
|
|
struct true_ : string< 't', 'r', 'u', 'e' > {}; // NOLINT
|
|
|
|
struct digits : plus< abnf::DIGIT > {};
|
|
struct exp : seq< one< 'e', 'E' >, opt< one< '-', '+'> >, must< digits > > {};
|
|
struct frac : if_must< one< '.' >, digits > {};
|
|
struct int_ : sor< one< '0' >, digits > {}; // NOLINT
|
|
struct number : seq< opt< one< '-' > >, int_, opt< frac >, opt< exp > > {};
|
|
|
|
struct xdigit : abnf::HEXDIG {};
|
|
struct unicode : list< seq< one< 'u' >, rep< 4, must< xdigit > > >, one< '\\' > > {};
|
|
struct escaped_char : one< '"', '\\', '/', 'b', 'f', 'n', 'r', 't' > {};
|
|
struct escaped : sor< escaped_char, unicode > {};
|
|
struct unescaped : utf8::range< 0x20, 0x10FFFF > {};
|
|
struct char_ : if_then_else< one< '\\' >, must< escaped >, unescaped > {}; // NOLINT
|
|
|
|
struct string_content : until< at< one< '"' > >, must< char_ > > {};
|
|
struct string : seq< one< '"' >, must< string_content >, any >
|
|
{
|
|
using content = string_content;
|
|
};
|
|
|
|
struct key_content : until< at< one< '"' > >, must< char_ > > {};
|
|
struct key : seq< one< '"' >, must< key_content >, any >
|
|
{
|
|
using content = key_content;
|
|
};
|
|
|
|
struct value;
|
|
|
|
struct array_element;
|
|
struct array_content : opt< list_must< array_element, value_separator > > {};
|
|
struct array : seq< begin_array, array_content, must< end_array > >
|
|
{
|
|
using begin = begin_array;
|
|
using end = end_array;
|
|
using element = array_element;
|
|
using content = array_content;
|
|
};
|
|
|
|
struct member : if_must< key, name_separator, value > {};
|
|
struct object_content : opt< list_must< member, value_separator > > {};
|
|
struct object : seq< begin_object, object_content, must< end_object > >
|
|
{
|
|
using begin = begin_object;
|
|
using end = end_object;
|
|
using element = member;
|
|
using content = object_content;
|
|
};
|
|
|
|
struct value : padr< sor< string, number, object, array, false_, true_, null > > {};
|
|
struct array_element : seq< value > {};
|
|
|
|
struct text : seq< star< ws >, value > {};
|
|
// clang-format on
|
|
|
|
} // namespace json
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 10 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/json_pointer.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/json_pointer.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_JSON_POINTER_HPP
|
|
#define TAO_PEGTL_CONTRIB_JSON_POINTER_HPP
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace json_pointer
|
|
{
|
|
// JSON pointer grammar according to RFC 6901
|
|
|
|
// clang-format off
|
|
struct unescaped : utf8::ranges< 0x0, 0x2E, 0x30, 0x7D, 0x7F, 0x10FFFF > {};
|
|
struct escaped : seq< one< '~' >, one< '0', '1' > > {};
|
|
|
|
struct reference_token : star< sor< unescaped, escaped > > {};
|
|
struct json_pointer : star< one< '/' >, reference_token > {};
|
|
// clang-format on
|
|
|
|
// relative JSON pointer, see ...
|
|
|
|
// clang-format off
|
|
struct non_negative_integer : sor< one< '0' >, plus< digit > > {};
|
|
struct relative_json_pointer : seq< non_negative_integer, sor< one< '#' >, json_pointer > > {};
|
|
// clang-format on
|
|
|
|
} // namespace json_pointer
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 11 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/parse_tree.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/parse_tree.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_PARSE_TREE_HPP
|
|
#define TAO_PEGTL_CONTRIB_PARSE_TREE_HPP
|
|
|
|
#include <cassert>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <tuple>
|
|
#include <type_traits>
|
|
#include <typeindex>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
|
|
#line 1 "tao/pegtl/contrib/shuffle_states.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/shuffle_states.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_SHUFFLE_STATES_HPP
|
|
#define TAO_PEGTL_CONTRIB_SHUFFLE_STATES_HPP
|
|
|
|
#include <tuple>
|
|
#include <utility>
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< std::size_t N >
|
|
struct rotate_left
|
|
{
|
|
template< std::size_t I, std::size_t S >
|
|
using type = std::integral_constant< std::size_t, ( I + N ) % S >;
|
|
};
|
|
|
|
template< std::size_t N >
|
|
struct rotate_right
|
|
{
|
|
template< std::size_t I, std::size_t S >
|
|
using type = std::integral_constant< std::size_t, ( I + S - N ) % S >;
|
|
};
|
|
|
|
struct reverse
|
|
{
|
|
template< std::size_t I, std::size_t S >
|
|
using type = std::integral_constant< std::size_t, ( S - 1 ) - I >;
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
// Applies 'Shuffle' to the states of start(), success(), failure(), raise(), apply(), and apply0()
|
|
template< typename Base, typename Shuffle >
|
|
struct shuffle_states
|
|
: Base
|
|
{
|
|
template< typename Input, typename Tuple, std::size_t... Is >
|
|
static void start_impl( const Input& in, const Tuple& t, internal::index_sequence< Is... > /*unused*/ ) noexcept( noexcept( Base::start( in, std::get< Shuffle::template type< Is, sizeof...( Is ) >::value >( t )... ) ) )
|
|
{
|
|
Base::start( in, std::get< Shuffle::template type< Is, sizeof...( Is ) >::value >( t )... );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void start( const Input& in, States&&... st ) noexcept( noexcept( start_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) >() ) ) )
|
|
{
|
|
start_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) >() );
|
|
}
|
|
|
|
template< typename Input, typename State >
|
|
static void start( const Input& in, State&& st ) noexcept( noexcept( Base::start( in, st ) ) )
|
|
{
|
|
Base::start( in, st );
|
|
}
|
|
|
|
template< typename Input, typename Tuple, std::size_t... Is >
|
|
static void success_impl( const Input& in, const Tuple& t, internal::index_sequence< Is... > /*unused*/ ) noexcept( noexcept( Base::success( in, std::get< Shuffle::template type< Is, sizeof...( Is ) >::value >( t )... ) ) )
|
|
{
|
|
Base::success( in, std::get< Shuffle::template type< Is, sizeof...( Is ) >::value >( t )... );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void success( const Input& in, States&&... st ) noexcept( noexcept( success_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) >() ) ) )
|
|
{
|
|
success_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) >() );
|
|
}
|
|
|
|
template< typename Input, typename State >
|
|
static void success( const Input& in, State&& st ) noexcept( noexcept( Base::success( in, st ) ) )
|
|
{
|
|
Base::success( in, st );
|
|
}
|
|
|
|
template< typename Input, typename Tuple, std::size_t... Is >
|
|
static void failure_impl( const Input& in, const Tuple& t, internal::index_sequence< Is... > /*unused*/ ) noexcept( noexcept( Base::failure( in, std::get< Shuffle::template type< Is, sizeof...( Is ) >::value >( t )... ) ) )
|
|
{
|
|
Base::failure( in, std::get< Shuffle::template type< Is, sizeof...( Is ) >::value >( t )... );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void failure( const Input& in, States&&... st ) noexcept( noexcept( failure_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) >() ) ) )
|
|
{
|
|
failure_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) >() );
|
|
}
|
|
|
|
template< typename Input, typename State >
|
|
static void failure( const Input& in, State&& st ) noexcept( noexcept( Base::failure( in, st ) ) )
|
|
{
|
|
Base::failure( in, st );
|
|
}
|
|
|
|
template< typename Input, typename Tuple, std::size_t... Is >
|
|
static void raise_impl( const Input& in, const Tuple& t, internal::index_sequence< Is... > /*unused*/ )
|
|
{
|
|
Base::raise( in, std::get< Shuffle::template type< Is, sizeof...( Is ) >::value >( t )... );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void raise( const Input& in, States&&... st )
|
|
{
|
|
raise_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) >() );
|
|
}
|
|
|
|
template< typename Input, typename State >
|
|
static void raise( const Input& in, State&& st )
|
|
{
|
|
Base::raise( in, st );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Iterator, typename Input, typename Tuple, std::size_t... Is >
|
|
static auto apply_impl( const Iterator& begin, const Input& in, const Tuple& t, internal::index_sequence< Is... > /*unused*/ ) noexcept( noexcept( Base::template apply< Action >( begin, in, std::get< Shuffle::template type< Is, sizeof...( Is ) >::value >( t )... ) ) )
|
|
-> decltype( Base::template apply< Action >( begin, in, std::get< Shuffle::template type< Is, sizeof...( Is ) >::value >( t )... ) )
|
|
{
|
|
return Base::template apply< Action >( begin, in, std::get< Shuffle::template type< Is, sizeof...( Is ) >::value >( t )... );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Iterator, typename Input, typename... States >
|
|
static auto apply( const Iterator& begin, const Input& in, States&&... st ) noexcept( noexcept( apply_impl< Action >( begin, in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) >() ) ) )
|
|
-> decltype( apply_impl< Action >( begin, in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) >() ) )
|
|
{
|
|
return apply_impl< Action >( begin, in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) >() );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Iterator, typename Input, typename State >
|
|
static auto apply( const Iterator& begin, const Input& in, State&& st ) noexcept( noexcept( Base::template apply< Action >( begin, in, st ) ) )
|
|
-> decltype( Base::template apply< Action >( begin, in, st ) )
|
|
{
|
|
return Base::template apply< Action >( begin, in, st );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Input, typename Tuple, std::size_t... Is >
|
|
static auto apply0_impl( const Input& in, const Tuple& t, internal::index_sequence< Is... > /*unused*/ ) noexcept( noexcept( Base::template apply0< Action >( in, std::get< Shuffle::template type< Is, sizeof...( Is ) >::value >( t )... ) ) )
|
|
-> decltype( Base::template apply0< Action >( in, std::get< Shuffle::template type< Is, sizeof...( Is ) >::value >( t )... ) )
|
|
{
|
|
return Base::template apply0< Action >( in, std::get< Shuffle::template type< Is, sizeof...( Is ) >::value >( t )... );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Input, typename... States >
|
|
static auto apply0( const Input& in, States&&... st ) noexcept( noexcept( apply0_impl< Action >( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) >() ) ) )
|
|
-> decltype( apply0_impl< Action >( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) >() ) )
|
|
{
|
|
return apply0_impl< Action >( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) >() );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Input, typename State >
|
|
static auto apply0( const Input& in, State&& st ) noexcept( noexcept( Base::template apply0< Action >( in, st ) ) )
|
|
-> decltype( Base::template apply0< Action >( in, st ) )
|
|
{
|
|
return Base::template apply0< Action >( in, st );
|
|
}
|
|
};
|
|
|
|
template< typename Base, std::size_t N = 1 >
|
|
using rotate_states_left = shuffle_states< Base, internal::rotate_left< N > >;
|
|
|
|
template< typename Base, std::size_t N = 1 >
|
|
using rotate_states_right = shuffle_states< Base, internal::rotate_right< N > >;
|
|
|
|
template< typename Base >
|
|
using reverse_states = shuffle_states< Base, internal::reverse >;
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 18 "tao/pegtl/contrib/parse_tree.hpp"
|
|
#line 35 "tao/pegtl/contrib/parse_tree.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace parse_tree
|
|
{
|
|
template< typename T >
|
|
struct basic_node
|
|
{
|
|
using node_t = T;
|
|
using children_t = std::vector< std::unique_ptr< node_t > >;
|
|
children_t children;
|
|
|
|
std::type_index id = std::type_index( typeid( void ) );
|
|
std::string source;
|
|
|
|
TAO_PEGTL_NAMESPACE::internal::iterator m_begin;
|
|
TAO_PEGTL_NAMESPACE::internal::iterator m_end;
|
|
|
|
// each node will be default constructed
|
|
basic_node() = default;
|
|
|
|
// no copy/move is necessary
|
|
// (nodes are always owned/handled by a std::unique_ptr)
|
|
basic_node( const basic_node& ) = delete;
|
|
basic_node( basic_node&& ) = delete;
|
|
|
|
~basic_node() = default;
|
|
|
|
// no assignment either
|
|
basic_node& operator=( const basic_node& ) = delete;
|
|
basic_node& operator=( basic_node&& ) = delete;
|
|
|
|
bool is_root() const noexcept
|
|
{
|
|
return id == typeid( void );
|
|
}
|
|
|
|
template< typename U >
|
|
bool is() const noexcept
|
|
{
|
|
return id == typeid( U );
|
|
}
|
|
|
|
std::string name() const
|
|
{
|
|
assert( !is_root() );
|
|
return TAO_PEGTL_NAMESPACE::internal::demangle( id.name() );
|
|
}
|
|
|
|
position begin() const
|
|
{
|
|
return position( m_begin, source );
|
|
}
|
|
|
|
position end() const
|
|
{
|
|
return position( m_end, source );
|
|
}
|
|
|
|
bool has_content() const noexcept
|
|
{
|
|
return m_end.data != nullptr;
|
|
}
|
|
|
|
std::string string() const
|
|
{
|
|
assert( has_content() );
|
|
return std::string( m_begin.data, m_end.data );
|
|
}
|
|
|
|
// Compatibility, remove with 3.0.0
|
|
std::string content() const
|
|
{
|
|
return string();
|
|
}
|
|
|
|
template< tracking_mode P = tracking_mode::eager, typename Eol = eol::lf_crlf >
|
|
memory_input< P, Eol > as_memory_input() const
|
|
{
|
|
assert( has_content() );
|
|
return { m_begin.data, m_end.data, source, m_begin.byte, m_begin.line, m_begin.byte_in_line };
|
|
}
|
|
|
|
template< typename... States >
|
|
void remove_content( States&&... /*unused*/ ) noexcept
|
|
{
|
|
m_end.reset();
|
|
}
|
|
|
|
// all non-root nodes are initialized by calling this method
|
|
template< typename Rule, typename Input, typename... States >
|
|
void start( const Input& in, States&&... /*unused*/ )
|
|
{
|
|
id = typeid( Rule );
|
|
source = in.source();
|
|
m_begin = TAO_PEGTL_NAMESPACE::internal::iterator( in.iterator() );
|
|
}
|
|
|
|
// if parsing of the rule succeeded, this method is called
|
|
template< typename Rule, typename Input, typename... States >
|
|
void success( const Input& in, States&&... /*unused*/ ) noexcept
|
|
{
|
|
m_end = TAO_PEGTL_NAMESPACE::internal::iterator( in.iterator() );
|
|
}
|
|
|
|
// if parsing of the rule failed, this method is called
|
|
template< typename Rule, typename Input, typename... States >
|
|
void failure( const Input& /*unused*/, States&&... /*unused*/ ) noexcept
|
|
{
|
|
}
|
|
|
|
// if parsing succeeded and the (optional) transform call
|
|
// did not discard the node, it is appended to its parent.
|
|
// note that "child" is the node whose Rule just succeeded
|
|
// and "*this" is the parent where the node should be appended.
|
|
template< typename... States >
|
|
void emplace_back( std::unique_ptr< node_t >&& child, States&&... /*unused*/ )
|
|
{
|
|
assert( child );
|
|
children.emplace_back( std::move( child ) );
|
|
}
|
|
};
|
|
|
|
struct node
|
|
: basic_node< node >
|
|
{
|
|
};
|
|
|
|
namespace internal
|
|
{
|
|
template< typename >
|
|
struct is_try_catch_type
|
|
: std::false_type
|
|
{
|
|
};
|
|
|
|
template< typename Exception, typename... Rules >
|
|
struct is_try_catch_type< TAO_PEGTL_NAMESPACE::internal::try_catch_type< Exception, Rules... > >
|
|
: std::true_type
|
|
{
|
|
};
|
|
|
|
template< typename Node >
|
|
struct state
|
|
{
|
|
std::vector< std::unique_ptr< Node > > stack;
|
|
|
|
state()
|
|
{
|
|
emplace_back();
|
|
}
|
|
|
|
void emplace_back()
|
|
{
|
|
stack.emplace_back( std::unique_ptr< Node >( new Node ) );
|
|
}
|
|
|
|
std::unique_ptr< Node >& back() noexcept
|
|
{
|
|
assert( !stack.empty() );
|
|
return stack.back();
|
|
}
|
|
|
|
void pop_back() noexcept
|
|
{
|
|
assert( !stack.empty() );
|
|
return stack.pop_back();
|
|
}
|
|
};
|
|
|
|
template< typename Selector, typename... Parameters >
|
|
void transform( Parameters&&... /*unused*/ ) noexcept
|
|
{
|
|
}
|
|
|
|
template< typename Selector, typename Input, typename Node, typename... States >
|
|
auto transform( const Input& in, std::unique_ptr< Node >& n, States&&... st ) noexcept( noexcept( Selector::transform( in, n, st... ) ) )
|
|
-> decltype( Selector::transform( in, n, st... ), void() )
|
|
{
|
|
Selector::transform( in, n, st... );
|
|
}
|
|
|
|
template< typename Selector, typename Input, typename Node, typename... States >
|
|
auto transform( const Input& /*unused*/, std::unique_ptr< Node >& n, States&&... st ) noexcept( noexcept( Selector::transform( n, st... ) ) )
|
|
-> decltype( Selector::transform( n, st... ), void() )
|
|
{
|
|
Selector::transform( n, st... );
|
|
}
|
|
|
|
template< typename Rule, template< typename... > class Selector >
|
|
struct is_selected_node
|
|
: std::integral_constant< bool, !TAO_PEGTL_NAMESPACE::internal::skip_control< Rule >::value && Selector< Rule >::value >
|
|
{
|
|
};
|
|
|
|
template< unsigned Level, typename Analyse, template< typename... > class Selector >
|
|
struct is_leaf
|
|
: std::false_type
|
|
{
|
|
};
|
|
|
|
template< analysis::rule_type Type, template< typename... > class Selector >
|
|
struct is_leaf< 0, analysis::generic< Type >, Selector >
|
|
: std::true_type
|
|
{
|
|
};
|
|
|
|
template< analysis::rule_type Type, std::size_t Count, template< typename... > class Selector >
|
|
struct is_leaf< 0, analysis::counted< Type, Count >, Selector >
|
|
: std::true_type
|
|
{
|
|
};
|
|
|
|
template< analysis::rule_type Type, typename... Rules, template< typename... > class Selector >
|
|
struct is_leaf< 0, analysis::generic< Type, Rules... >, Selector >
|
|
: std::false_type
|
|
{
|
|
};
|
|
|
|
template< analysis::rule_type Type, std::size_t Count, typename... Rules, template< typename... > class Selector >
|
|
struct is_leaf< 0, analysis::counted< Type, Count, Rules... >, Selector >
|
|
: std::false_type
|
|
{
|
|
};
|
|
|
|
template< bool... >
|
|
struct bool_sequence;
|
|
|
|
template< bool... Bs >
|
|
struct is_all
|
|
: std::is_same< bool_sequence< Bs..., true >, bool_sequence< true, Bs... > >
|
|
{
|
|
};
|
|
|
|
template< bool... Bs >
|
|
struct is_none
|
|
: std::integral_constant< bool, !is_all< !Bs... >::value >
|
|
{
|
|
};
|
|
|
|
template< unsigned Level, typename Rule, template< typename... > class Selector >
|
|
using is_unselected_leaf = std::integral_constant< bool, !is_selected_node< Rule, Selector >::value && is_leaf< Level, typename Rule::analyze_t, Selector >::value >;
|
|
|
|
template< unsigned Level, analysis::rule_type Type, typename... Rules, template< typename... > class Selector >
|
|
struct is_leaf< Level, analysis::generic< Type, Rules... >, Selector >
|
|
: is_all< is_unselected_leaf< Level - 1, Rules, Selector >::value... >
|
|
{
|
|
};
|
|
|
|
template< unsigned Level, analysis::rule_type Type, std::size_t Count, typename... Rules, template< typename... > class Selector >
|
|
struct is_leaf< Level, analysis::counted< Type, Count, Rules... >, Selector >
|
|
: is_all< is_unselected_leaf< Level - 1, Rules, Selector >::value... >
|
|
{
|
|
};
|
|
|
|
template< typename Node, template< typename... > class Selector, template< typename... > class Control >
|
|
struct make_control
|
|
{
|
|
template< typename Rule, bool, bool >
|
|
struct state_handler;
|
|
|
|
template< typename Rule >
|
|
using type = rotate_states_right< state_handler< Rule, is_selected_node< Rule, Selector >::value, is_leaf< 8, typename Rule::analyze_t, Selector >::value > >;
|
|
};
|
|
|
|
template< typename Node, template< typename... > class Selector, template< typename... > class Control >
|
|
template< typename Rule >
|
|
struct make_control< Node, Selector, Control >::state_handler< Rule, false, true >
|
|
: remove_first_state< Control< Rule > >
|
|
{
|
|
};
|
|
|
|
template< typename Node, template< typename... > class Selector, template< typename... > class Control >
|
|
template< typename Rule >
|
|
struct make_control< Node, Selector, Control >::state_handler< Rule, false, false >
|
|
: remove_first_state< Control< Rule > >
|
|
{
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control2,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
auto& state = std::get< sizeof...( st ) - 1 >( std::tie( st... ) );
|
|
if( is_try_catch_type< Rule >::value ) {
|
|
internal::state< Node > tmp;
|
|
tmp.emplace_back();
|
|
tmp.stack.swap( state.stack );
|
|
const bool result = Control< Rule >::template match< A, M, Action, Control2 >( in, st... );
|
|
tmp.stack.swap( state.stack );
|
|
if( result ) {
|
|
for( auto& c : tmp.back()->children ) {
|
|
state.back()->children.emplace_back( std::move( c ) );
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
state.emplace_back();
|
|
const bool result = Control< Rule >::template match< A, M, Action, Control2 >( in, st... );
|
|
if( result ) {
|
|
auto n = std::move( state.back() );
|
|
state.pop_back();
|
|
for( auto& c : n->children ) {
|
|
state.back()->children.emplace_back( std::move( c ) );
|
|
}
|
|
}
|
|
else {
|
|
state.pop_back();
|
|
}
|
|
return result;
|
|
}
|
|
};
|
|
|
|
template< typename Node, template< typename... > class Selector, template< typename... > class Control >
|
|
template< typename Rule, bool B >
|
|
struct make_control< Node, Selector, Control >::state_handler< Rule, true, B >
|
|
: remove_first_state< Control< Rule > >
|
|
{
|
|
template< typename Input, typename... States >
|
|
static void start( const Input& in, state< Node >& state, States&&... st )
|
|
{
|
|
Control< Rule >::start( in, st... );
|
|
state.emplace_back();
|
|
state.back()->template start< Rule >( in, st... );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void success( const Input& in, state< Node >& state, States&&... st )
|
|
{
|
|
Control< Rule >::success( in, st... );
|
|
auto n = std::move( state.back() );
|
|
state.pop_back();
|
|
n->template success< Rule >( in, st... );
|
|
transform< Selector< Rule > >( in, n, st... );
|
|
if( n ) {
|
|
state.back()->emplace_back( std::move( n ), st... );
|
|
}
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void failure( const Input& in, state< Node >& state, States&&... st ) noexcept( noexcept( Control< Rule >::failure( in, st... ) ) && noexcept( std::declval< Node& >().template failure< Rule >( in, st... ) ) )
|
|
{
|
|
Control< Rule >::failure( in, st... );
|
|
state.back()->template failure< Rule >( in, st... );
|
|
state.pop_back();
|
|
}
|
|
};
|
|
|
|
template< typename >
|
|
using store_all = std::true_type;
|
|
|
|
template< typename >
|
|
struct selector;
|
|
|
|
template<>
|
|
struct selector< std::tuple<> >
|
|
{
|
|
using type = std::false_type;
|
|
};
|
|
|
|
template< typename T >
|
|
struct selector< std::tuple< T > >
|
|
{
|
|
using type = typename T::type;
|
|
};
|
|
|
|
template< typename... Ts >
|
|
struct selector< std::tuple< Ts... > >
|
|
{
|
|
static_assert( sizeof...( Ts ) == 0, "multiple matches found" );
|
|
};
|
|
|
|
template< typename Rule, typename Collection >
|
|
using select_tuple = typename std::conditional< Collection::template contains< Rule >::value, std::tuple< Collection >, std::tuple<> >::type;
|
|
|
|
} // namespace internal
|
|
|
|
template< typename Rule, typename... Collections >
|
|
struct selector
|
|
: internal::selector< decltype( std::tuple_cat( std::declval< internal::select_tuple< Rule, Collections > >()... ) ) >::type
|
|
{};
|
|
|
|
template< typename Base >
|
|
struct apply
|
|
: std::true_type
|
|
{
|
|
template< typename... Rules >
|
|
struct on
|
|
{
|
|
using type = Base;
|
|
|
|
template< typename Rule >
|
|
using contains = internal::is_none< std::is_same< Rule, Rules >::value... >;
|
|
};
|
|
};
|
|
|
|
struct store_content
|
|
: apply< store_content >
|
|
{};
|
|
|
|
// some nodes don't need to store their content
|
|
struct remove_content
|
|
: apply< remove_content >
|
|
{
|
|
template< typename Node, typename... States >
|
|
static void transform( std::unique_ptr< Node >& n, States&&... st ) noexcept( noexcept( n->Node::remove_content( st... ) ) )
|
|
{
|
|
n->remove_content( st... );
|
|
}
|
|
};
|
|
|
|
// if a node has only one child, replace the node with its child, otherwise remove content
|
|
struct fold_one
|
|
: apply< fold_one >
|
|
{
|
|
template< typename Node, typename... States >
|
|
static void transform( std::unique_ptr< Node >& n, States&&... st ) noexcept( noexcept( n->children.size(), n->Node::remove_content( st... ) ) )
|
|
{
|
|
if( n->children.size() == 1 ) {
|
|
n = std::move( n->children.front() );
|
|
}
|
|
else {
|
|
n->remove_content( st... );
|
|
}
|
|
}
|
|
};
|
|
|
|
// if a node has no children, discard the node, otherwise remove content
|
|
struct discard_empty
|
|
: apply< discard_empty >
|
|
{
|
|
template< typename Node, typename... States >
|
|
static void transform( std::unique_ptr< Node >& n, States&&... st ) noexcept( noexcept( n->children.empty(), n->Node::remove_content( st... ) ) )
|
|
{
|
|
if( n->children.empty() ) {
|
|
n.reset();
|
|
}
|
|
else {
|
|
n->remove_content( st... );
|
|
}
|
|
}
|
|
};
|
|
|
|
template< typename Rule,
|
|
typename Node,
|
|
template< typename... > class Selector = internal::store_all,
|
|
template< typename... > class Action = nothing,
|
|
template< typename... > class Control = normal,
|
|
typename Input,
|
|
typename... States >
|
|
std::unique_ptr< Node > parse( Input&& in, States&&... st )
|
|
{
|
|
internal::state< Node > state;
|
|
if( !TAO_PEGTL_NAMESPACE::parse< Rule, Action, internal::make_control< Node, Selector, Control >::template type >( in, st..., state ) ) {
|
|
return nullptr;
|
|
}
|
|
assert( state.stack.size() == 1 );
|
|
return std::move( state.back() );
|
|
}
|
|
|
|
template< typename Rule,
|
|
template< typename... > class Selector = internal::store_all,
|
|
template< typename... > class Action = nothing,
|
|
template< typename... > class Control = normal,
|
|
typename Input,
|
|
typename... States >
|
|
std::unique_ptr< node > parse( Input&& in, States&&... st )
|
|
{
|
|
return parse< Rule, node, Selector, Action, Control >( in, st... );
|
|
}
|
|
|
|
} // namespace parse_tree
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 12 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/parse_tree_to_dot.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/parse_tree_to_dot.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_PARSE_TREE_TO_DOT_HPP
|
|
#define TAO_PEGTL_CONTRIB_PARSE_TREE_TO_DOT_HPP
|
|
|
|
#include <cassert>
|
|
#include <ostream>
|
|
#include <string>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace parse_tree
|
|
{
|
|
namespace internal
|
|
{
|
|
inline void escape( std::ostream& os, const char* p, const std::size_t s )
|
|
{
|
|
static const char* h = "0123456789abcdef";
|
|
|
|
const char* l = p;
|
|
const char* const e = p + s;
|
|
while( p != e ) {
|
|
const unsigned char c = *p;
|
|
if( c == '\\' ) {
|
|
os.write( l, p - l );
|
|
l = ++p;
|
|
os << "\\\\";
|
|
}
|
|
else if( c == '"' ) {
|
|
os.write( l, p - l );
|
|
l = ++p;
|
|
os << "\\\"";
|
|
}
|
|
else if( c < 32 ) {
|
|
os.write( l, p - l );
|
|
l = ++p;
|
|
switch( c ) {
|
|
case '\b':
|
|
os << "\\b";
|
|
break;
|
|
case '\f':
|
|
os << "\\f";
|
|
break;
|
|
case '\n':
|
|
os << "\\n";
|
|
break;
|
|
case '\r':
|
|
os << "\\r";
|
|
break;
|
|
case '\t':
|
|
os << "\\t";
|
|
break;
|
|
default:
|
|
os << "\\u00" << h[ ( c & 0xf0 ) >> 4 ] << h[ c & 0x0f ];
|
|
}
|
|
}
|
|
else if( c == 127 ) {
|
|
os.write( l, p - l );
|
|
l = ++p;
|
|
os << "\\u007f";
|
|
}
|
|
else {
|
|
++p;
|
|
}
|
|
}
|
|
os.write( l, p - l );
|
|
}
|
|
|
|
inline void escape( std::ostream& os, const std::string& s )
|
|
{
|
|
escape( os, s.data(), s.size() );
|
|
}
|
|
|
|
template< typename Node >
|
|
void print_dot_node( std::ostream& os, const Node& n, const std::string& s )
|
|
{
|
|
os << " x" << &n << " [ label=\"";
|
|
escape( os, s );
|
|
if( n.has_content() ) {
|
|
os << "\\n";
|
|
escape( os, n.m_begin.data, n.m_end.data - n.m_begin.data );
|
|
}
|
|
os << "\" ]\n";
|
|
if( !n.children.empty() ) {
|
|
os << " x" << &n << " -> { ";
|
|
for( auto& up : n.children ) {
|
|
os << "x" << up.get() << ( ( up == n.children.back() ) ? " }\n" : ", " );
|
|
}
|
|
for( auto& up : n.children ) {
|
|
print_dot_node( os, *up, up->name() );
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace internal
|
|
|
|
template< typename Node >
|
|
void print_dot( std::ostream& os, const Node& n )
|
|
{
|
|
os << "digraph parse_tree\n{\n";
|
|
internal::print_dot_node( os, n, n.is_root() ? "ROOT" : n.name() );
|
|
os << "}\n";
|
|
}
|
|
|
|
} // namespace parse_tree
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 13 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/raw_string.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/raw_string.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_RAW_STRING_HPP
|
|
#define TAO_PEGTL_CONTRIB_RAW_STRING_HPP
|
|
|
|
#include <cstddef>
|
|
#include <type_traits>
|
|
#line 25 "tao/pegtl/contrib/raw_string.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< char Open, char Marker >
|
|
struct raw_string_open
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::any >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, std::size_t& marker_size, States&&... /*unused*/ ) noexcept( noexcept( in.size( 0 ) ) )
|
|
{
|
|
if( in.empty() || ( in.peek_char( 0 ) != Open ) ) {
|
|
return false;
|
|
}
|
|
for( std::size_t i = 1; i < in.size( i + 1 ); ++i ) {
|
|
switch( const auto c = in.peek_char( i ) ) {
|
|
case Open:
|
|
marker_size = i + 1;
|
|
in.bump_in_this_line( marker_size );
|
|
eol::match( in );
|
|
return true;
|
|
case Marker:
|
|
break;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< char Open, char Marker >
|
|
struct skip_control< raw_string_open< Open, Marker > > : std::true_type
|
|
{
|
|
};
|
|
|
|
template< char Marker, char Close >
|
|
struct at_raw_string_close
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::opt >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, const std::size_t& marker_size, States&&... /*unused*/ ) noexcept( noexcept( in.size( 0 ) ) )
|
|
{
|
|
if( in.size( marker_size ) < marker_size ) {
|
|
return false;
|
|
}
|
|
if( in.peek_char( 0 ) != Close ) {
|
|
return false;
|
|
}
|
|
if( in.peek_char( marker_size - 1 ) != Close ) {
|
|
return false;
|
|
}
|
|
for( std::size_t i = 0; i < ( marker_size - 2 ); ++i ) {
|
|
if( in.peek_char( i + 1 ) != Marker ) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
|
|
template< char Marker, char Close >
|
|
struct skip_control< at_raw_string_close< Marker, Close > > : std::true_type
|
|
{
|
|
};
|
|
|
|
template< typename Cond, typename... Rules >
|
|
struct raw_string_until;
|
|
|
|
template< typename Cond >
|
|
struct raw_string_until< Cond >
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::seq, star< not_at< Cond >, not_at< eof >, bytes< 1 > >, Cond >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, const std::size_t& marker_size, States&&... st )
|
|
{
|
|
auto m = in.template mark< M >();
|
|
|
|
while( !Control< Cond >::template match< A, rewind_mode::required, Action, Control >( in, marker_size, st... ) ) {
|
|
if( in.empty() ) {
|
|
return false;
|
|
}
|
|
in.bump();
|
|
}
|
|
return m( true );
|
|
}
|
|
};
|
|
|
|
template< typename Cond, typename... Rules >
|
|
struct raw_string_until
|
|
{
|
|
using analyze_t = analysis::generic< analysis::rule_type::seq, star< not_at< Cond >, not_at< eof >, Rules... >, Cond >;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, const std::size_t& marker_size, States&&... st )
|
|
{
|
|
auto m = in.template mark< M >();
|
|
using m_t = decltype( m );
|
|
|
|
while( !Control< Cond >::template match< A, rewind_mode::required, Action, Control >( in, marker_size, st... ) ) {
|
|
if( in.empty() || ( !Control< seq< Rules... > >::template match< A, m_t::next_rewind_mode, Action, Control >( in, st... ) ) ) {
|
|
return false;
|
|
}
|
|
}
|
|
return m( true );
|
|
}
|
|
};
|
|
|
|
template< typename Cond, typename... Rules >
|
|
struct skip_control< raw_string_until< Cond, Rules... > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
// raw_string matches Lua-style long literals.
|
|
//
|
|
// The following description was taken from the Lua documentation
|
|
// (see http://www.lua.org/docs.html):
|
|
//
|
|
// - An "opening long bracket of level n" is defined as an opening square
|
|
// bracket followed by n equal signs followed by another opening square
|
|
// bracket. So, an opening long bracket of level 0 is written as `[[`,
|
|
// an opening long bracket of level 1 is written as `[=[`, and so on.
|
|
// - A "closing long bracket" is defined similarly; for instance, a closing
|
|
// long bracket of level 4 is written as `]====]`.
|
|
// - A "long literal" starts with an opening long bracket of any level and
|
|
// ends at the first closing long bracket of the same level. It can
|
|
// contain any text except a closing bracket of the same level.
|
|
// - Literals in this bracketed form can run for several lines, do not
|
|
// interpret any escape sequences, and ignore long brackets of any other
|
|
// level.
|
|
// - For convenience, when the opening long bracket is immediately followed
|
|
// by a newline, the newline is not included in the string.
|
|
//
|
|
// Note that unlike Lua's long literal, a raw_string is customizable to use
|
|
// other characters than `[`, `=` and `]` for matching. Also note that Lua
|
|
// introduced newline-specific replacements in Lua 5.2, which we do not
|
|
// support on the grammar level.
|
|
|
|
template< char Open, char Marker, char Close, typename... Contents >
|
|
struct raw_string
|
|
{
|
|
// This is used for binding the apply()-method and for error-reporting
|
|
// when a raw string is not closed properly or has invalid content.
|
|
struct content
|
|
: internal::raw_string_until< internal::at_raw_string_close< Marker, Close >, Contents... >
|
|
{
|
|
};
|
|
|
|
using analyze_t = typename internal::seq< internal::bytes< 1 >, content, internal::bytes< 1 > >::analyze_t;
|
|
|
|
template< apply_mode A,
|
|
rewind_mode M,
|
|
template< typename... >
|
|
class Action,
|
|
template< typename... >
|
|
class Control,
|
|
typename Input,
|
|
typename... States >
|
|
static bool match( Input& in, States&&... st )
|
|
{
|
|
std::size_t marker_size;
|
|
if( internal::raw_string_open< Open, Marker >::template match< A, M, Action, Control >( in, marker_size, st... ) ) {
|
|
internal::must< content >::template match< A, M, Action, Control >( in, marker_size, st... );
|
|
in.bump_in_this_line( marker_size );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 14 "amalgamated.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/remove_last_states.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/remove_last_states.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_REMOVE_LAST_STATES_HPP
|
|
#define TAO_PEGTL_CONTRIB_REMOVE_LAST_STATES_HPP
|
|
|
|
#include <tuple>
|
|
#include <utility>
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
// Remove the last N states of start(), success(), failure(), raise(), apply(), and apply0()
|
|
template< typename Base, std::size_t N >
|
|
struct remove_last_states
|
|
: Base
|
|
{
|
|
template< typename Input, typename Tuple, std::size_t... Is >
|
|
static void start_impl( const Input& in, const Tuple& t, internal::index_sequence< Is... > /*unused*/ ) noexcept( noexcept( Base::start( in, std::get< Is >( t )... ) ) )
|
|
{
|
|
Base::start( in, std::get< Is >( t )... );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void start( const Input& in, States&&... st ) noexcept( noexcept( start_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) - N >() ) ) )
|
|
{
|
|
start_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) - N >() );
|
|
}
|
|
|
|
template< typename Input, typename Tuple, std::size_t... Is >
|
|
static void success_impl( const Input& in, const Tuple& t, internal::index_sequence< Is... > /*unused*/ ) noexcept( noexcept( Base::success( in, std::get< Is >( t )... ) ) )
|
|
{
|
|
Base::success( in, std::get< Is >( t )... );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void success( const Input& in, States&&... st ) noexcept( noexcept( success_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) - N >() ) ) )
|
|
{
|
|
success_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) - N >() );
|
|
}
|
|
|
|
template< typename Input, typename Tuple, std::size_t... Is >
|
|
static void failure_impl( const Input& in, const Tuple& t, internal::index_sequence< Is... > /*unused*/ ) noexcept( noexcept( Base::failure( in, std::get< Is >( t )... ) ) )
|
|
{
|
|
Base::failure( in, std::get< Is >( t )... );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void failure( const Input& in, States&&... st ) noexcept( noexcept( failure_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) - N >() ) ) )
|
|
{
|
|
failure_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) - N >() );
|
|
}
|
|
|
|
template< typename Input, typename Tuple, std::size_t... Is >
|
|
static void raise_impl( const Input& in, const Tuple& t, internal::index_sequence< Is... > /*unused*/ )
|
|
{
|
|
Base::raise( in, std::get< Is >( t )... );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void raise( const Input& in, States&&... st )
|
|
{
|
|
raise_impl( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) - N >() );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Iterator, typename Input, typename Tuple, std::size_t... Is >
|
|
static auto apply_impl( const Iterator& begin, const Input& in, const Tuple& t, internal::index_sequence< Is... > /*unused*/ ) noexcept( noexcept( Base::template apply< Action >( begin, in, std::get< Is >( t )... ) ) )
|
|
-> decltype( Base::template apply< Action >( begin, in, std::get< Is >( t )... ) )
|
|
{
|
|
return Base::template apply< Action >( begin, in, std::get< Is >( t )... );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Iterator, typename Input, typename... States >
|
|
static auto apply( const Iterator& begin, const Input& in, States&&... st ) noexcept( noexcept( apply_impl< Action >( begin, in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) - N >() ) ) )
|
|
-> decltype( apply_impl< Action >( begin, in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) - N >() ) )
|
|
{
|
|
return apply_impl< Action >( begin, in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) - N >() );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Input, typename Tuple, std::size_t... Is >
|
|
static auto apply0_impl( const Input& in, const Tuple& t, internal::index_sequence< Is... > /*unused*/ ) noexcept( noexcept( Base::template apply0< Action >( in, std::get< Is >( t )... ) ) )
|
|
-> decltype( Base::template apply0< Action >( in, std::get< Is >( t )... ) )
|
|
{
|
|
return Base::template apply0< Action >( in, std::get< Is >( t )... );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Input, typename... States >
|
|
static auto apply0( const Input& in, States&&... st ) noexcept( noexcept( apply0_impl< Action >( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) - N >() ) ) )
|
|
-> decltype( apply0_impl< Action >( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) - N >() ) )
|
|
{
|
|
return apply0_impl< Action >( in, std::tie( st... ), internal::make_index_sequence< sizeof...( st ) - N >() );
|
|
}
|
|
};
|
|
|
|
template< typename Base >
|
|
using remove_last_state = remove_last_states< Base, 1 >;
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 16 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/rep_one_min_max.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/rep_one_min_max.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_REP_ONE_MIN_MAX_HPP
|
|
#define TAO_PEGTL_CONTRIB_REP_ONE_MIN_MAX_HPP
|
|
|
|
#include <algorithm>
|
|
#line 16 "tao/pegtl/contrib/rep_one_min_max.hpp"
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< unsigned Min, unsigned Max, char C >
|
|
struct rep_one_min_max
|
|
{
|
|
using analyze_t = analysis::counted< analysis::rule_type::any, Min >;
|
|
|
|
static_assert( Min <= Max, "invalid rep_one_min_max rule (maximum number of repetitions smaller than minimum)" );
|
|
|
|
template< typename Input >
|
|
static bool match( Input& in )
|
|
{
|
|
const auto size = in.size( Max + 1 );
|
|
if( size < Min ) {
|
|
return false;
|
|
}
|
|
std::size_t i = 0;
|
|
while( ( i < size ) && ( in.peek_char( i ) == C ) ) {
|
|
++i;
|
|
}
|
|
if( ( Min <= i ) && ( i <= Max ) ) {
|
|
bump_help< result_on_found::success, Input, char, C >( in, i );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
template< unsigned Min, unsigned Max, char C >
|
|
struct skip_control< rep_one_min_max< Min, Max, C > > : std::true_type
|
|
{
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
inline namespace ascii
|
|
{
|
|
template< unsigned Min, unsigned Max, char C >
|
|
struct rep_one_min_max : internal::rep_one_min_max< Min, Max, C >
|
|
{
|
|
};
|
|
|
|
} // namespace ascii
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 17 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/rep_string.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/rep_string.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_REP_STRING_HPP
|
|
#define TAO_PEGTL_CONTRIB_REP_STRING_HPP
|
|
|
|
#include <cstddef>
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< std::size_t, typename, char... >
|
|
struct make_rep_string;
|
|
|
|
template< char... Ss, char... Cs >
|
|
struct make_rep_string< 0, string< Ss... >, Cs... >
|
|
{
|
|
using type = string< Ss... >;
|
|
};
|
|
|
|
template< std::size_t N, char... Ss, char... Cs >
|
|
struct make_rep_string< N, string< Ss... >, Cs... >
|
|
: make_rep_string< N - 1, string< Ss..., Cs... >, Cs... >
|
|
{};
|
|
|
|
} // namespace internal
|
|
|
|
inline namespace ascii
|
|
{
|
|
template< std::size_t N, char... Cs >
|
|
struct rep_string
|
|
: internal::make_rep_string< N, internal::string<>, Cs... >::type
|
|
{};
|
|
|
|
} // namespace ascii
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 18 "amalgamated.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/to_string.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/to_string.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_TO_STRING_HPP
|
|
#define TAO_PEGTL_CONTRIB_TO_STRING_HPP
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename >
|
|
struct to_string;
|
|
|
|
template< template< char... > class X, char... Cs >
|
|
struct to_string< X< Cs... > >
|
|
{
|
|
static std::string get()
|
|
{
|
|
const char s[] = { Cs..., 0 };
|
|
return std::string( s, sizeof...( Cs ) );
|
|
}
|
|
};
|
|
|
|
} // namespace internal
|
|
|
|
template< typename T >
|
|
std::string to_string()
|
|
{
|
|
return internal::to_string< T >::get();
|
|
}
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 20 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/tracer.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/tracer.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_TRACER_HPP
|
|
#define TAO_PEGTL_CONTRIB_TRACER_HPP
|
|
|
|
#include <cassert>
|
|
#include <iomanip>
|
|
#include <iostream>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace internal
|
|
{
|
|
template< typename Input >
|
|
void print_current( const Input& in )
|
|
{
|
|
if( in.empty() ) {
|
|
std::cerr << "<eof>";
|
|
}
|
|
else {
|
|
const auto c = in.peek_uint8();
|
|
switch( c ) {
|
|
case 0:
|
|
std::cerr << "<nul> = ";
|
|
break;
|
|
case 9:
|
|
std::cerr << "<ht> = ";
|
|
break;
|
|
case 10:
|
|
std::cerr << "<lf> = ";
|
|
break;
|
|
case 13:
|
|
std::cerr << "<cr> = ";
|
|
break;
|
|
default:
|
|
if( isprint( c ) ) {
|
|
std::cerr << '\'' << c << "' = ";
|
|
}
|
|
}
|
|
std::cerr << "(char)" << unsigned( c );
|
|
}
|
|
}
|
|
|
|
} // namespace internal
|
|
|
|
struct trace_state
|
|
{
|
|
unsigned rule = 0;
|
|
unsigned line = 0;
|
|
std::vector< unsigned > stack;
|
|
};
|
|
|
|
#if defined( _MSC_VER ) && ( _MSC_VER < 1910 )
|
|
|
|
template< typename Rule >
|
|
struct tracer
|
|
: normal< Rule >
|
|
{
|
|
template< typename Input, typename... States >
|
|
static void start( const Input& in, States&&... /*unused*/ )
|
|
{
|
|
std::cerr << in.position() << " start " << internal::demangle< Rule >() << "; current ";
|
|
print_current( in );
|
|
std::cerr << std::endl;
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void start( const Input& in, trace_state& ts, States&&... st )
|
|
{
|
|
std::cerr << std::setw( 6 ) << ++ts.line << " " << std::setw( 6 ) << ++ts.rule << " ";
|
|
start( in, st... );
|
|
ts.stack.push_back( ts.rule );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void success( const Input& in, States&&... /*unused*/ )
|
|
{
|
|
std::cerr << in.position() << " success " << internal::demangle< Rule >() << "; next ";
|
|
print_current( in );
|
|
std::cerr << std::endl;
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void success( const Input& in, trace_state& ts, States&&... st )
|
|
{
|
|
assert( !ts.stack.empty() );
|
|
std::cerr << std::setw( 6 ) << ++ts.line << " " << std::setw( 6 ) << ts.stack.back() << " ";
|
|
success( in, st... );
|
|
ts.stack.pop_back();
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void failure( const Input& in, States&&... /*unused*/ )
|
|
{
|
|
std::cerr << in.position() << " failure " << internal::demangle< Rule >() << std::endl;
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void failure( const Input& in, trace_state& ts, States&&... st )
|
|
{
|
|
assert( !ts.stack.empty() );
|
|
std::cerr << std::setw( 6 ) << ++ts.line << " " << std::setw( 6 ) << ts.stack.back() << " ";
|
|
failure( in, st... );
|
|
ts.stack.pop_back();
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Iterator, typename Input, typename... States >
|
|
static auto apply( const Iterator& begin, const Input& in, States&&... st )
|
|
-> decltype( normal< Rule >::template apply< Action >( begin, in, st... ) )
|
|
{
|
|
std::cerr << in.position() << " apply " << internal::demangle< Rule >() << std::endl;
|
|
return normal< Rule >::template apply< Action >( begin, in, st... );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Iterator, typename Input, typename... States >
|
|
static auto apply( const Iterator& begin, const Input& in, trace_state& ts, States&&... st )
|
|
-> decltype( apply< Action >( begin, in, st... ) )
|
|
{
|
|
std::cerr << std::setw( 6 ) << ++ts.line << " ";
|
|
return apply< Action >( begin, in, st... );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Input, typename... States >
|
|
static auto apply0( const Input& in, States&&... st )
|
|
-> decltype( normal< Rule >::template apply0< Action >( in, st... ) )
|
|
{
|
|
std::cerr << in.position() << " apply0 " << internal::demangle< Rule >() << std::endl;
|
|
return normal< Rule >::template apply0< Action >( in, st... );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Input, typename... States >
|
|
static auto apply0( const Input& in, trace_state& ts, States&&... st )
|
|
-> decltype( apply0< Action >( in, st... ) )
|
|
{
|
|
std::cerr << std::setw( 6 ) << ++ts.line << " ";
|
|
return apply0< Action >( in, st... );
|
|
}
|
|
};
|
|
|
|
#else
|
|
|
|
template< template< typename... > class Base >
|
|
struct trace
|
|
{
|
|
template< typename Rule >
|
|
struct control
|
|
: Base< Rule >
|
|
{
|
|
template< typename Input, typename... States >
|
|
static void start( const Input& in, States&&... st )
|
|
{
|
|
std::cerr << in.position() << " start " << internal::demangle< Rule >() << "; current ";
|
|
print_current( in );
|
|
std::cerr << std::endl;
|
|
Base< Rule >::start( in, st... );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void start( const Input& in, trace_state& ts, States&&... st )
|
|
{
|
|
std::cerr << std::setw( 6 ) << ++ts.line << " " << std::setw( 6 ) << ++ts.rule << " ";
|
|
start( in, st... );
|
|
ts.stack.push_back( ts.rule );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void success( const Input& in, States&&... st )
|
|
{
|
|
std::cerr << in.position() << " success " << internal::demangle< Rule >() << "; next ";
|
|
print_current( in );
|
|
std::cerr << std::endl;
|
|
Base< Rule >::success( in, st... );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void success( const Input& in, trace_state& ts, States&&... st )
|
|
{
|
|
assert( !ts.stack.empty() );
|
|
std::cerr << std::setw( 6 ) << ++ts.line << " " << std::setw( 6 ) << ts.stack.back() << " ";
|
|
success( in, st... );
|
|
ts.stack.pop_back();
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void failure( const Input& in, States&&... st )
|
|
{
|
|
std::cerr << in.position() << " failure " << internal::demangle< Rule >() << std::endl;
|
|
Base< Rule >::failure( in, st... );
|
|
}
|
|
|
|
template< typename Input, typename... States >
|
|
static void failure( const Input& in, trace_state& ts, States&&... st )
|
|
{
|
|
assert( !ts.stack.empty() );
|
|
std::cerr << std::setw( 6 ) << ++ts.line << " " << std::setw( 6 ) << ts.stack.back() << " ";
|
|
failure( in, st... );
|
|
ts.stack.pop_back();
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Iterator, typename Input, typename... States >
|
|
static auto apply( const Iterator& begin, const Input& in, States&&... st )
|
|
-> decltype( Base< Rule >::template apply< Action >( begin, in, st... ) )
|
|
{
|
|
std::cerr << in.position() << " apply " << internal::demangle< Rule >() << std::endl;
|
|
return Base< Rule >::template apply< Action >( begin, in, st... );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Iterator, typename Input, typename... States >
|
|
static auto apply( const Iterator& begin, const Input& in, trace_state& ts, States&&... st )
|
|
-> decltype( apply< Action >( begin, in, st... ) )
|
|
{
|
|
std::cerr << std::setw( 6 ) << ++ts.line << " ";
|
|
return apply< Action >( begin, in, st... );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Input, typename... States >
|
|
static auto apply0( const Input& in, States&&... st )
|
|
-> decltype( Base< Rule >::template apply0< Action >( in, st... ) )
|
|
{
|
|
std::cerr << in.position() << " apply0 " << internal::demangle< Rule >() << std::endl;
|
|
return Base< Rule >::template apply0< Action >( in, st... );
|
|
}
|
|
|
|
template< template< typename... > class Action, typename Input, typename... States >
|
|
static auto apply0( const Input& in, trace_state& ts, States&&... st )
|
|
-> decltype( apply0< Action >( in, st... ) )
|
|
{
|
|
std::cerr << std::setw( 6 ) << ++ts.line << " ";
|
|
return apply0< Action >( in, st... );
|
|
}
|
|
};
|
|
};
|
|
|
|
template< typename Rule >
|
|
using tracer = trace< normal >::control< Rule >;
|
|
|
|
#endif
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 21 "amalgamated.hpp"
|
|
#line 1 "tao/pegtl/contrib/unescape.hpp"
|
|
|
|
#line 1 "tao/pegtl/contrib/unescape.hpp"
|
|
|
|
|
|
|
|
#ifndef TAO_PEGTL_CONTRIB_UNESCAPE_HPP
|
|
#define TAO_PEGTL_CONTRIB_UNESCAPE_HPP
|
|
|
|
#include <cassert>
|
|
#include <string>
|
|
|
|
|
|
|
|
|
|
|
|
namespace tao
|
|
{
|
|
namespace TAO_PEGTL_NAMESPACE
|
|
{
|
|
namespace unescape
|
|
{
|
|
// Utility functions for the unescape actions.
|
|
|
|
inline bool utf8_append_utf32( std::string& string, const unsigned utf32 )
|
|
{
|
|
if( utf32 <= 0x7f ) {
|
|
string += char( utf32 & 0xff );
|
|
return true;
|
|
}
|
|
if( utf32 <= 0x7ff ) {
|
|
char tmp[] = { char( ( ( utf32 & 0x7c0 ) >> 6 ) | 0xc0 ), // NOLINT
|
|
char( ( ( utf32 & 0x03f ) ) | 0x80 ) };
|
|
string.append( tmp, sizeof( tmp ) );
|
|
return true;
|
|
}
|
|
if( utf32 <= 0xffff ) {
|
|
if( utf32 >= 0xd800 && utf32 <= 0xdfff ) {
|
|
// nope, this is a UTF-16 surrogate
|
|
return false;
|
|
}
|
|
char tmp[] = { char( ( ( utf32 & 0xf000 ) >> 12 ) | 0xe0 ), // NOLINT
|
|
char( ( ( utf32 & 0x0fc0 ) >> 6 ) | 0x80 ),
|
|
char( ( ( utf32 & 0x003f ) ) | 0x80 ) };
|
|
string.append( tmp, sizeof( tmp ) );
|
|
return true;
|
|
}
|
|
if( utf32 <= 0x10ffff ) {
|
|
char tmp[] = { char( ( ( utf32 & 0x1c0000 ) >> 18 ) | 0xf0 ), // NOLINT
|
|
char( ( ( utf32 & 0x03f000 ) >> 12 ) | 0x80 ),
|
|
char( ( ( utf32 & 0x000fc0 ) >> 6 ) | 0x80 ),
|
|
char( ( ( utf32 & 0x00003f ) ) | 0x80 ) };
|
|
string.append( tmp, sizeof( tmp ) );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// This function MUST only be called for characters matching TAO_PEGTL_NAMESPACE::ascii::xdigit!
|
|
template< typename I >
|
|
I unhex_char( const char c )
|
|
{
|
|
switch( c ) {
|
|
case '0':
|
|
case '1':
|
|
case '2':
|
|
case '3':
|
|
case '4':
|
|
case '5':
|
|
case '6':
|
|
case '7':
|
|
case '8':
|
|
case '9':
|
|
return I( c - '0' );
|
|
case 'a':
|
|
case 'b':
|
|
case 'c':
|
|
case 'd':
|
|
case 'e':
|
|
case 'f':
|
|
return I( c - 'a' + 10 );
|
|
case 'A':
|
|
case 'B':
|
|
case 'C':
|
|
case 'D':
|
|
case 'E':
|
|
case 'F':
|
|
return I( c - 'A' + 10 );
|
|
default: // LCOV_EXCL_LINE
|
|
throw std::runtime_error( "invalid character in unhex" ); // NOLINT, LCOV_EXCL_LINE
|
|
}
|
|
}
|
|
|
|
template< typename I >
|
|
I unhex_string( const char* begin, const char* end )
|
|
{
|
|
I r = 0;
|
|
while( begin != end ) {
|
|
r <<= 4;
|
|
r += unhex_char< I >( *begin++ );
|
|
}
|
|
return r;
|
|
}
|
|
|
|
// Actions for common unescape situations.
|
|
|
|
struct append_all
|
|
{
|
|
template< typename Input >
|
|
static void apply( const Input& in, std::string& s )
|
|
{
|
|
s.append( in.begin(), in.size() );
|
|
}
|
|
};
|
|
|
|
// This action MUST be called for a character matching T which MUST be TAO_PEGTL_NAMESPACE::one< ... >.
|
|
template< typename T, char... Rs >
|
|
struct unescape_c
|
|
{
|
|
template< typename Input >
|
|
static void apply( const Input& in, std::string& s )
|
|
{
|
|
assert( in.size() == 1 );
|
|
s += apply_one( in, static_cast< const T* >( nullptr ) );
|
|
}
|
|
|
|
template< typename Input, char... Qs >
|
|
static char apply_one( const Input& in, const one< Qs... >* /*unused*/ )
|
|
{
|
|
static_assert( sizeof...( Qs ) == sizeof...( Rs ), "size mismatch between escaped characters and their mappings" );
|
|
return apply_two( in, { Qs... }, { Rs... } );
|
|
}
|
|
|
|
template< typename Input >
|
|
static char apply_two( const Input& in, const std::initializer_list< char >& q, const std::initializer_list< char >& r )
|
|
{
|
|
const char c = *in.begin();
|
|
for( std::size_t i = 0; i < q.size(); ++i ) {
|
|
if( *( q.begin() + i ) == c ) {
|
|
return *( r.begin() + i );
|
|
}
|
|
}
|
|
throw parse_error( "invalid character in unescape", in ); // NOLINT, LCOV_EXCL_LINE
|
|
}
|
|
};
|
|
|
|
// See src/example/pegtl/unescape.cpp for why the following two actions
|
|
// skip the first input character. They also MUST be called
|
|
// with non-empty matched inputs!
|
|
|
|
struct unescape_u
|
|
{
|
|
template< typename Input >
|
|
static void apply( const Input& in, std::string& s )
|
|
{
|
|
assert( !in.empty() ); // First character MUST be present, usually 'u' or 'U'.
|
|
if( !utf8_append_utf32( s, unhex_string< unsigned >( in.begin() + 1, in.end() ) ) ) {
|
|
throw parse_error( "invalid escaped unicode code point", in );
|
|
}
|
|
}
|
|
};
|
|
|
|
struct unescape_x
|
|
{
|
|
template< typename Input >
|
|
static void apply( const Input& in, std::string& s )
|
|
{
|
|
assert( !in.empty() ); // First character MUST be present, usually 'x'.
|
|
s += unhex_string< char >( in.begin() + 1, in.end() );
|
|
}
|
|
};
|
|
|
|
// The unescape_j action is similar to unescape_u, however unlike
|
|
// unescape_u it
|
|
// (a) assumes exactly 4 hexdigits per escape sequence,
|
|
// (b) accepts multiple consecutive escaped 16-bit values.
|
|
// When applied to more than one escape sequence, unescape_j
|
|
// translates UTF-16 surrogate pairs in the input into a single
|
|
// UTF-8 sequence in s, as required for JSON by RFC 8259.
|
|
|
|
struct unescape_j
|
|
{
|
|
template< typename Input >
|
|
static void apply( const Input& in, std::string& s )
|
|
{
|
|
assert( ( ( in.size() + 1 ) % 6 ) == 0 ); // Expects multiple "\\u1234", starting with the first "u".
|
|
for( const char* b = in.begin() + 1; b < in.end(); b += 6 ) {
|
|
const auto c = unhex_string< unsigned >( b, b + 4 );
|
|
if( ( 0xd800 <= c ) && ( c <= 0xdbff ) && ( b + 6 < in.end() ) ) {
|
|
const auto d = unhex_string< unsigned >( b + 6, b + 10 );
|
|
if( ( 0xdc00 <= d ) && ( d <= 0xdfff ) ) {
|
|
b += 6;
|
|
(void)utf8_append_utf32( s, ( ( ( c & 0x03ff ) << 10 ) | ( d & 0x03ff ) ) + 0x10000 );
|
|
continue;
|
|
}
|
|
}
|
|
if( !utf8_append_utf32( s, c ) ) {
|
|
throw parse_error( "invalid escaped unicode code point", in );
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
} // namespace unescape
|
|
|
|
} // namespace TAO_PEGTL_NAMESPACE
|
|
|
|
} // namespace tao
|
|
|
|
#endif
|
|
#line 22 "amalgamated.hpp"
|