/* Web Polygraph http://www.web-polygraph.org/
* (C) 2003-2006 The Measurement Factory
* Licensed under the Apache License, Version 2.0 */
#ifndef POLYGRAPH__XPARSER_SYNSYM_H
#define POLYGRAPH__XPARSER_SYNSYM_H
#include "xparser/LexToken.h"
class SynSymTblItem;
// The SynSym class is the base class for all attributes
// that can be found on the generated parser's stack.
class SynSym {
public:
SynSym(const String &aType);
virtual ~SynSym();
const String &type() const { return theType; }
virtual bool isA(const String &type) const;
bool canBe(const String &type) const;
bool equal(const SynSym &s) const;
// aborts if incompatible types
const SynSym &cast(const String &type) const;
SynSym &cast(const String &type);
// creates a copy of itself or compatible type
// returns 0 if incompatible types and by default
SynSym *clone(const String &type) const;
SynSym *clone() const { return clone(type()); }
// optional "nesting" support
virtual SynSymTblItem **memberItem(const String &name);
const TokenLoc &loc() const { return theLoc; }
void loc(const TokenLoc &aLoc) { theLoc = aLoc; }
virtual ostream &print(ostream &os, const String &pfx = 0) const;
protected:
void type(const String &aType);
virtual SynSym *dupe(const String &) const { return 0; }
protected:
TokenLoc theLoc;
private:
String theType;
};
#define SymCast(Type, var) ((Type&)((var).cast(Type::TheType)))
#define ConstSymCast(Type, var) ((const Type&)((var).cast(Type::TheType)))
inline ostream &operator <<(ostream &os, const SynSym &sym) { return sym.print(os); }
#endif
syntax highlighted by Code2HTML, v. 0.9.1