1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| class Symbol
{
public:
Symbol(QString const & n):parent_(0),name_(n){}
Symbol(Symbol * p, QString const & n):parent_(p),name_(n){}
virtual ~Symbol(){}
virtual void addChild(Symbol * toadd) = 0;
Symbol* parent() {return parent_;}
Symbol const * parent() const{return parent_;}
QString const & name() const{return name_;}
bool operator<(Symbol * s) const;
{
return name_<s->name();
}
private:
Symbol * parent_;
QString name_;
};
class SymbolHolder
{
typedef std::set<Symbol*> set;
typedef typename set::const_iterator const_iterator;
public:
SymbolHolder(){}
const_iterator begin() const{return items_.begin();}
const_iterator end() const{return items_.end();}
protected:
~SymbolHolder()
{
for(iterator it=items_.begin();it!=items_.end();++it)
delete (*it);
}
void add(Symbol * toadd)
{
items_.insert(toadd);
}
private:
set items_;
};
class TerminalSymbol : public Symbol
{
public:
TerminalSymbol(Symbol* p, QString const & n):Symbol(p,n){}
virtual ~TerminalSymbol(){}
virtual void addChild(Symbol * toadd)
{
/* just does nothing */
}
};
class NonTerminalSymbol : public Symbol,
public SymbolHolder
{
public:
virtual void addChild(Symbol * toadd)
{
add(toadd);
}
};
bool beginsBy(Symbol* s, QString const &str)
{
return s->name().substr(0,str.size())==str;
}
bool equal(Symbol* s, QString const & str)
{
return s->name()==str;
} |
Partager