13 enum private_DATUMID_ {
15 ABBREVIATIONS, // 各abbrev prefix
18 CHARACTOR, // <charactor>
20 BYTEVECTOR, // <bytevector>
23 LITERAL, // <lexeme datum>
29 typedef private_DATUMID_ DATUMID_;
32 template<DATUMID_> class Literal;
37 DatumID(const Literal<S>&) : S_(S) {}
39 DATUMID_ toEnum() const {return S_;}
41 friend bool operator==(DatumID s, DatumID t) {return s.S_ == t.S_;}
42 friend bool operator!=(DatumID s, DatumID t) {return !(s == t);}
44 static const Literal<STRING> string;
45 static const Literal<ABBREVIATIONS> abbreviations;
46 static const Literal<SYMBOL> symbol;
47 static const Literal<NUMBER> number;
48 static const Literal<CHARACTOR> charactor;
49 static const Literal<BOOLEAN> boolean;
50 static const Literal<BYTEVECTOR> byteVector;
51 static const Literal<VECTOR> vector;
52 static const Literal<LIST> list;
53 static const Literal<LITERAL> literal;
54 static const Literal<NIL> nil;
57 // 内部クラスかつ、単に該当するEnumを返すだけのクラステンプレート
58 template<DatumID::private_DATUMID_ S>
59 class DatumID::Literal : private DatumID
63 DatumID::private_DATUMID_ toEnum() const {return S;}
68 // 暗黙的なコピーコンストラクタを利用する。
69 Literal() : DatumID(*this) {}
72 void* operator new(size_t);
73 void operator delete(void*);
74 void operator=(const Literal&);
75 void* operator&() const;
82 #endif /* _DATUM_ID_H_ */