Syntax tree - Visitors
Syntax trees can return a pre-configured visitor object that can be used to visit all the nodes. Also added a method to create a "root node" handle for the visitor, because I'm a lazy bastard.
This commit is contained in:
parent
a9762a901e
commit
b659f2f237
3 changed files with 159 additions and 1 deletions
include/ebcl/inline
|
@ -10,6 +10,51 @@ namespace ebcl {
|
|||
|
||||
/*= T_SyntaxTree =============================================================*/
|
||||
|
||||
template< typename T , size_t S >
|
||||
T_SyntaxTree< T , S >::T_Node::T_Node(
|
||||
T_Self const& tree ,
|
||||
const uint32_t node ) noexcept
|
||||
: tree{ tree } , node{ node }
|
||||
{
|
||||
// EMPTY
|
||||
}
|
||||
|
||||
template< typename T , size_t S >
|
||||
T_SyntaxTree< T , S >::T_Node::T_Node(
|
||||
T_Node const& other ) noexcept
|
||||
: tree{ other.tree } , node{ other.node }
|
||||
{
|
||||
// EMPTY
|
||||
}
|
||||
|
||||
template< typename T , size_t S >
|
||||
T_SyntaxTree< T , S >::T_Node::T_Node(
|
||||
T_Node&& other ) noexcept
|
||||
: T_Node( other )
|
||||
{
|
||||
// EMPTY
|
||||
}
|
||||
|
||||
template< typename T , size_t S >
|
||||
typename T_SyntaxTree< T , S >::T_Node& T_SyntaxTree< T , S >::T_Node::operator =(
|
||||
T_SyntaxTree< T , S >::T_Node const& other ) noexcept
|
||||
{
|
||||
assert( &other.tree == &tree );
|
||||
node = other.node;
|
||||
return *this;
|
||||
}
|
||||
|
||||
template< typename T , size_t S >
|
||||
typename T_SyntaxTree< T , S >::T_Node& T_SyntaxTree< T , S >::T_Node::operator =(
|
||||
T_SyntaxTree< T , S >::T_Node&& other ) noexcept
|
||||
{
|
||||
assert( &other.tree == &tree );
|
||||
node = other.node;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
template< typename T , size_t S >
|
||||
T_SyntaxTree< T , S >::T_Node_::T_Node_(
|
||||
const T nodeType ,
|
||||
|
@ -157,6 +202,28 @@ D& T_SyntaxTree< T , S >::dataOf(
|
|||
return nodes_[ node ].data.template value< D >( );
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
|
||||
template< typename T , size_t S >
|
||||
typename T_SyntaxTree< T , S >::T_Visitor T_SyntaxTree< T , S >::visitor( ) const noexcept
|
||||
{
|
||||
return T_Visitor{
|
||||
[this]( T_Node node , uint32_t child ) -> T_Optional< T_Node > {
|
||||
auto const& n{ nodes_[ node.node ] };
|
||||
if ( child >= n.children.size( ) ) {
|
||||
return {};
|
||||
}
|
||||
return T_Node{ node.tree , n.children[ child ] };
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
template< typename T , size_t S >
|
||||
typename T_SyntaxTree< T , S >::T_Node T_SyntaxTree< T , S >::root( ) const noexcept
|
||||
{
|
||||
return T_Node{ *this , 0 };
|
||||
}
|
||||
|
||||
|
||||
} // namespace
|
||||
#endif // _H_EBCL_INLINE_SYNTAXTREE
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue