321 lines
9.1 KiB
C++
321 lines
9.1 KiB
C++
/******************************************************************************/
|
|
/* SRD - PARSER DEFINITIONS ***************************************************/
|
|
/******************************************************************************/
|
|
|
|
#ifndef _H_LW_LIB_SRDDEFINITIONS
|
|
#define _H_LW_LIB_SRDDEFINITIONS
|
|
#include <lw/lib/SRDData.hh>
|
|
#include <lw/lib/HashTables.hh>
|
|
namespace lw {
|
|
|
|
|
|
/*= DEFINITION DATA ==========================================================*/
|
|
|
|
// Full definition -> {contexts}, default context, {enums}
|
|
// Context -> name, {rules}
|
|
// Rule -> Accepted input, [context, [init], [exit]], [executor]
|
|
// Input def -> Word
|
|
// | Enum
|
|
// | Token type
|
|
// | Alternatives
|
|
// | Repetition
|
|
// Alternatives -> {input def}
|
|
// Repetition -> Input sequence, min count, max count
|
|
|
|
// Forward declarations
|
|
struct T_SRDParserData;
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
// F_SRDHandler - Parser callbacks
|
|
using F_SRDHandler = std::function< bool( T_SRDParserData const& ) >;
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
// T_SRDEnum - an enumeration
|
|
// i.e. set of words with associated sequence of integers, that can be
|
|
// recognized as a single input token.
|
|
class T_SRDEnum
|
|
{
|
|
private:
|
|
T_String name_;
|
|
T_HashIndex index_;
|
|
T_Array< T_String > words_;
|
|
|
|
public:
|
|
T_SRDEnum( ) = delete;
|
|
|
|
T_SRDEnum( T_String name );
|
|
T_SRDEnum( T_SRDEnum const& ) = default;
|
|
T_SRDEnum( T_SRDEnum && ) = default;
|
|
|
|
T_SRDEnum & operator <<( T_String && word );
|
|
T_SRDEnum & operator <<( char const* word );
|
|
|
|
T_String const& name( ) const;
|
|
auto size( ) const;
|
|
|
|
T_String const& operator[]( int index ) const;
|
|
T_String const& operator[]( uint32_t index ) const;
|
|
|
|
uint32_t operator[]( T_String const& word ) const;
|
|
uint32_t operator[]( char const* word ) const;
|
|
|
|
bool contains( T_String const& word ) const;
|
|
bool contains( char const* word ) const;
|
|
};
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
// E_SRDInputItem - Possible types for input definition elements
|
|
enum class E_SRDInputItem
|
|
{
|
|
WORD , // A specific word
|
|
ENUM , // A word from an enumeration
|
|
TOKEN , // An arbitrary token
|
|
ALTERNATIVE , // A set of alternative rules
|
|
REPETITION , // Repetition of a sequence
|
|
};
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
// T_SRDInputItem - An element from an input definition
|
|
class T_SRDInputItem
|
|
{
|
|
public:
|
|
struct T_ListHelper {
|
|
T_Array< T_SRDInputItem > items;
|
|
T_ListHelper( );
|
|
T_ListHelper& operator <<( T_SRDInputItem item );
|
|
};
|
|
|
|
private:
|
|
E_SRDInputItem type_;
|
|
T_String word_;
|
|
E_SRDTokenType token_;
|
|
T_Array< T_SRDInputItem > items_;
|
|
uint32_t min_ , max_;
|
|
|
|
public:
|
|
// Construct an ALTERNATIVE input element
|
|
T_SRDInputItem( );
|
|
// Construct either a WORD or an ENUM input element
|
|
T_SRDInputItem( T_String wordOrName , bool isWord );
|
|
// Construct a WORD from a C string
|
|
T_SRDInputItem( char const* cString );
|
|
// Construct a TOKEN input element
|
|
T_SRDInputItem( E_SRDTokenType type );
|
|
// Construct a REPETITION input element
|
|
T_SRDInputItem( uint32_t min , uint32_t max );
|
|
|
|
friend void swap( T_SRDInputItem & lhs , T_SRDInputItem & rhs ) noexcept;
|
|
|
|
T_SRDInputItem( T_SRDInputItem const& ) = default;
|
|
T_SRDInputItem( T_SRDInputItem && ) noexcept = default;
|
|
T_SRDInputItem & operator=( T_SRDInputItem const& ) = default;
|
|
T_SRDInputItem & operator=( T_SRDInputItem && ) = default;
|
|
|
|
E_SRDInputItem type( ) const;
|
|
T_String const& word( ) const;
|
|
E_SRDTokenType token( ) const;
|
|
T_Array< T_SRDInputItem > items( ) const;
|
|
uint32_t min( ) const;
|
|
uint32_t max( ) const;
|
|
|
|
T_SRDInputItem & operator <<( T_SRDInputItem item );
|
|
T_SRDInputItem& operator <<( T_ListHelper list );
|
|
|
|
// This operator is not actually used. It's only here to make the template
|
|
// instantiation happy. It actually returns false.
|
|
bool operator ==( T_SRDInputItem const& other ) const;
|
|
};
|
|
void swap( T_SRDInputItem & lhs , T_SRDInputItem & rhs ) noexcept;
|
|
T_StringBuilder & operator <<( T_StringBuilder & sb , T_SRDInputItem const& item );
|
|
|
|
T_Array< T_SRDInputItem >& operator <<( T_Array< T_SRDInputItem > & items ,
|
|
T_SRDInputItem::T_ListHelper& list );
|
|
|
|
extern template class T_Array< T_SRDInputItem >;
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
// T_SRDInputRule - A full rule from a context
|
|
class T_SRDInputRule
|
|
{
|
|
public:
|
|
struct T_SetContextExecutor {
|
|
const bool exit;
|
|
const F_SRDHandler executor;
|
|
T_SetContextExecutor( bool exit , F_SRDHandler executor );
|
|
};
|
|
struct T_SetContext {
|
|
const T_String name;
|
|
T_SetContext( T_String string );
|
|
};
|
|
|
|
private:
|
|
F_SRDHandler executor_;
|
|
T_Array< T_SRDInputItem > items_;
|
|
|
|
T_String context_;
|
|
F_SRDHandler contextEnter_;
|
|
F_SRDHandler contextExit_;
|
|
|
|
public:
|
|
T_SRDInputRule & operator <<( T_SRDInputItem item );
|
|
T_SRDInputRule & operator <<( F_SRDHandler executor );
|
|
T_SRDInputRule & operator <<( T_SetContextExecutor sce );
|
|
T_SRDInputRule & operator <<( T_SetContext sc );
|
|
T_SRDInputRule & operator <<( T_SRDInputItem::T_ListHelper sc );
|
|
|
|
F_SRDHandler const& handler( ) const;
|
|
T_Array< T_SRDInputItem > const& rule( ) const;
|
|
T_String const& context( ) const;
|
|
F_SRDHandler const& onEnter( ) const;
|
|
F_SRDHandler const& onExit( ) const;
|
|
};
|
|
T_StringBuilder & operator <<( T_StringBuilder & sb , T_SRDInputRule const& item );
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
// T_SRDContext - A set of rules that will share common data
|
|
class T_SRDContext
|
|
{
|
|
private:
|
|
T_String name_;
|
|
T_String parent_;
|
|
T_Array< T_SRDInputRule > rules_;
|
|
|
|
public:
|
|
T_SRDContext( ) = delete;
|
|
|
|
explicit T_SRDContext( T_String name , T_String parent = T_String( ) );
|
|
|
|
T_SRDContext & operator <<( T_SRDInputRule rule );
|
|
|
|
T_String const& name( ) const;
|
|
T_String const& parent( ) const;
|
|
T_Array< T_SRDInputRule > const& rules( ) const;
|
|
|
|
T_StringBuilder & dump( T_StringBuilder & sb , T_String const& separator );
|
|
};
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
// T_SRDParserDefs - All definitions for a parser
|
|
class T_SRDParserDefs
|
|
{
|
|
public:
|
|
// SetHandler - Used to set start/end handlers
|
|
struct SetHandler
|
|
{
|
|
const F_SRDHandler handler;
|
|
const bool start;
|
|
SetHandler( F_SRDHandler const& handler , bool start );
|
|
};
|
|
|
|
private:
|
|
T_String dfCtx_;
|
|
T_ObjectTable< T_String , T_SRDContext > ctx_;
|
|
T_ObjectTable< T_String , T_SRDEnum > enums_;
|
|
|
|
F_SRDHandler onStart_;
|
|
F_SRDHandler onFinish_;
|
|
|
|
public:
|
|
T_SRDParserDefs( ) = delete;
|
|
|
|
explicit T_SRDParserDefs( T_String defaultContext );
|
|
explicit T_SRDParserDefs( char const* defaultContext );
|
|
|
|
T_String const& defaultContext( ) const;
|
|
void defaultContext( T_String const& name );
|
|
void defaultContext( char const* name );
|
|
|
|
T_SRDParserDefs & operator <<( SetHandler sh );
|
|
F_SRDHandler const& onStart( ) const;
|
|
F_SRDHandler const& onFinish( ) const;
|
|
|
|
uint32_t contexts( ) const;
|
|
T_SRDContext & operator[]( uint32_t idx );
|
|
T_SRDContext const& operator[]( uint32_t idx ) const;
|
|
|
|
uint32_t contextId( T_String const& name ) const;
|
|
|
|
T_SRDContext & context( T_String const& name );
|
|
T_SRDContext & context( char const* name );
|
|
T_SRDContext & context( T_String const& name , T_String const& parent );
|
|
T_SRDContext & context( char const* name , char const* parent );
|
|
|
|
uint32_t enums( ) const;
|
|
bool hasEnum( T_String const& name ) const;
|
|
T_SRDEnum & enumeration( char const* name );
|
|
T_SRDEnum & enumeration( T_String const& name );
|
|
T_SRDEnum const& enumeration( T_String const& name ) const;
|
|
};
|
|
M_CLASS_POINTERS( SRDParserDefs );
|
|
|
|
|
|
/*= PARSER DEFINITIONS HELPERS ===============================================*/
|
|
|
|
namespace SRD {
|
|
|
|
T_SRDParserDefs::SetHandler OnStart( F_SRDHandler const& handler );
|
|
T_SRDParserDefs::SetHandler OnFinish( F_SRDHandler const& handler );
|
|
|
|
T_SRDContext Context( T_String name );
|
|
T_SRDContext Context( char const* name );
|
|
|
|
T_SRDContext Context( char const* name , char const* parent );
|
|
T_SRDContext Context( T_String name , T_String parent );
|
|
|
|
T_SRDInputRule Rule( );
|
|
|
|
T_SRDEnum CreateEnum( T_String name );
|
|
T_SRDEnum CreateEnum( char const* name );
|
|
|
|
T_SRDInputItem Word( T_String const& word );
|
|
T_SRDInputItem Word( char const* word );
|
|
|
|
T_SRDInputItem Word( );
|
|
T_SRDInputItem String( );
|
|
T_SRDInputItem Binary( );
|
|
T_SRDInputItem LStart( );
|
|
T_SRDInputItem LEnd( );
|
|
T_SRDInputItem Int32( );
|
|
T_SRDInputItem Int64( );
|
|
T_SRDInputItem Float( );
|
|
|
|
T_SRDInputItem Enum( T_String name );
|
|
T_SRDInputItem Enum( char const* name );
|
|
|
|
T_SRDInputItem::T_ListHelper List( );
|
|
|
|
T_SRDInputItem Alt( );
|
|
|
|
T_SRDInputItem Sub( );
|
|
|
|
T_SRDInputItem Opt( );
|
|
T_SRDInputItem Opt( T_SRDInputItem item );
|
|
|
|
T_SRDInputItem AtLeast( uint32_t n );
|
|
T_SRDInputItem AtMost( uint32_t n );
|
|
T_SRDInputItem Times( uint32_t n );
|
|
T_SRDInputItem Between( uint32_t a , uint32_t b );
|
|
|
|
T_SRDInputItem Integer( );
|
|
T_SRDInputItem Numeric( );
|
|
T_SRDInputItem Text( );
|
|
|
|
T_SRDInputRule::T_SetContext EnterContext( T_String name );
|
|
T_SRDInputRule::T_SetContext EnterContext( char const* name );
|
|
|
|
T_SRDInputRule::T_SetContextExecutor OnEnter( F_SRDHandler f );
|
|
T_SRDInputRule::T_SetContextExecutor OnExit( F_SRDHandler f );
|
|
|
|
} // namespace SRD
|
|
|
|
|
|
} // namespace
|
|
#include <lw/lib/inline/SRDDefinitions.hh>
|
|
#endif // _H_LW_LIB_SRDDEFINITIONS
|