
// Copyright {Jagger Software Limited} 2003

#include "grammar/qualified_symbol_definition.hpp"

#include "grammar/unnamed_symbol_definition.hpp"
#include "grammar/visitor.hpp"
#include <iostream>

using namespace ::std;

namespace grammar // qualified_symbol_definition - 'tors
{
    qualified_symbol_definition::qualified_symbol_definition
    (
         const grammar::symbol_definition & qualified,
         size_t lo, size_t hi
    )
        : symbol_definition(qualified)
        , multiplicity(lo, hi)
        , key(qualified.key)
    {        
    }

    qualified_symbol_definition::qualified_symbol_definition
    (
         const grammar::symbol_definition & qualified,
         size_t lo, infinity_type hi
    )
        : symbol_definition(qualified)
        , multiplicity(lo, hi)
        , key(qualified.key)
    {        
    }
}

namespace grammar // qualified_symbol_definition - visiting
{
    bool qualified_symbol_definition::accept(::grammar::visitor & visitor) const
    {
        return visitor.visit(*this);
    }
}

namespace grammar // qualified_symbol_definition - streaming
{
    ostream & operator<<(ostream & out, const qualified_symbol_definition & to_write)
    {
        const symbol_definition & definition = to_write.symbol_definition;
    
        if (dynamic_cast<const unnamed_symbol_definition *>(&definition))
        {
            out << definition;
        }
        else
        {
            out << definition.name;
        }
        
        out << to_write.multiplicity;
    
        return out;
    }
}

