#include "antlr/config.hpp"
#include "antlr/AST.hpp"
#include "antlr/BaseAST.hpp"
ANTLR_USING_NAMESPACE(std)
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
namespace antlr {
#endif
size_t BaseAST::getNumberOfChildren() const
{
RefBaseAST t = this->down;
size_t n = 0;
if( t )
{
n = 1;
while( t->right )
{
t = t->right;
n++;
}
return n;
}
return n;
}
void BaseAST::doWorkForFindAll(
ANTLR_USE_NAMESPACE(std)vector<RefAST>& v,
RefAST target,bool partialMatch)
{
for (RefAST sibling=this;
sibling;
sibling=sibling->getNextSibling())
{
if ( (partialMatch && sibling->equalsTreePartial(target)) ||
(!partialMatch && sibling->equalsTree(target)) ) {
v.push_back(sibling);
}
if ( sibling->getFirstChild() ) {
RefBaseAST(sibling->getFirstChild())->doWorkForFindAll(v, target, partialMatch);
}
}
}
bool BaseAST::equalsList(RefAST t) const
{
if (!t)
return false;
RefAST sibling=this;
for (;sibling && t;
sibling=sibling->getNextSibling(), t=t->getNextSibling()) {
if (!sibling->equals(t))
return false;
if (sibling->getFirstChild()) {
if (!sibling->getFirstChild()->equalsList(t->getFirstChild()))
return false;
}
else if (t->getFirstChild())
return false;
}
if (!sibling && !t)
return true;
return false;
}
bool BaseAST::equalsListPartial(RefAST sub) const
{
if (!sub)
return true;
RefAST sibling=this;
for (;sibling && sub;
sibling=sibling->getNextSibling(), sub=sub->getNextSibling()) {
if (!sibling->equals(sub))
return false;
if (sibling->getFirstChild())
if (!sibling->getFirstChild()->equalsListPartial(sub->getFirstChild()))
return false;
}
if (!sibling && sub)
return false;
return true;
}
bool BaseAST::equalsTree(RefAST t) const
{
if (!equals(t))
return false;
if (getFirstChild()) {
if (!getFirstChild()->equalsList(t->getFirstChild()))
return false;
}
else if (t->getFirstChild())
return false;
return true;
}
bool BaseAST::equalsTreePartial(RefAST sub) const
{
if (!sub)
return true;
if (!equals(sub))
return false;
if (getFirstChild())
if (!getFirstChild()->equalsListPartial(sub->getFirstChild()))
return false;
return true;
}
ANTLR_USE_NAMESPACE(std)vector<RefAST> BaseAST::findAll(RefAST target)
{
ANTLR_USE_NAMESPACE(std)vector<RefAST> roots;
if (target) {
doWorkForFindAll(roots,target,false); }
return roots;
}
ANTLR_USE_NAMESPACE(std)vector<RefAST> BaseAST::findAllPartial(RefAST target)
{
ANTLR_USE_NAMESPACE(std)vector<RefAST> roots;
if (target)
doWorkForFindAll(roots,target,true);
return roots;
}
ANTLR_USE_NAMESPACE(std)string BaseAST::toStringList() const
{
ANTLR_USE_NAMESPACE(std)string ts="";
if (getFirstChild())
{
ts+=" ( ";
ts+=toString();
ts+=getFirstChild()->toStringList();
ts+=" )";
}
else
{
ts+=" ";
ts+=toString();
}
if (getNextSibling())
ts+=getNextSibling()->toStringList();
return ts;
}
ANTLR_USE_NAMESPACE(std)string BaseAST::toStringTree() const
{
ANTLR_USE_NAMESPACE(std)string ts = "";
if (getFirstChild())
{
ts+=" ( ";
ts+=toString();
ts+=getFirstChild()->toStringList();
ts+=" )";
}
else
{
ts+=" ";
ts+=toString();
}
return ts;
}
#ifdef ANTLR_SUPPORT_XML
bool BaseAST::attributesToStream( ANTLR_USE_NAMESPACE(std)ostream& out ) const
{
out << "text=\"" << this->getText()
<< "\" type=\"" << this->getType() << "\"";
return false;
}
void BaseAST::toStream( ANTLR_USE_NAMESPACE(std)ostream& out ) const
{
for( RefAST node = this; node != 0; node = node->getNextSibling() )
{
out << "<" << this->typeName() << " ";
bool need_close_tag = node->attributesToStream( out );
if( need_close_tag )
{
if( node->getFirstChild() != 0 )
node->getFirstChild()->toStream( out );
out << "</" << node->typeName() << ">" << endl;
}
}
}
#endif
ANTLR_API RefAST nullAST;
#if defined(_MSC_VER) && !defined(__ICL) // Microsoft Visual C++
extern ANTLR_API AST* const nullASTptr = 0;
#else
ANTLR_API AST* const nullASTptr = 0;
#endif
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
}
#endif