13 enum private_DATUMID_ {
18 UNQUOTESPLICING, // ,@
22 UNSYNTAXSPLICING, // #,@
25 CHARACTOR, // <charactor>
27 BYTEVECTOR, // <bytevector>
34 typedef private_DATUMID_ DATUMID_;
37 template<DATUMID_> class Literal;
42 DatumID(const Literal<S>&) : S_(S) {}
44 DATUMID_ toEnum() const {return S_;}
46 friend bool operator==(DatumID s, DatumID t) {return s.S_ == t.S_;}
47 friend bool operator!=(DatumID s, DatumID t) {return !(s == t);}
49 static const Literal<STRING> string;
50 static const Literal<BACKQUOTE> backquote;
51 static const Literal<QUOTE> quote;
52 static const Literal<UNQUOTE> unquote;
53 static const Literal<UNQUOTESPLICING> unquoteSplicing;
54 static const Literal<SYNTAX> syntax;
55 static const Literal<QUASISYNTAX> quasiSyntax;
56 static const Literal<UNSYNTAX> unsyntax;
57 static const Literal<UNSYNTAXSPLICING> unsyntaxSplicing;
58 static const Literal<SYMBOL> symbol;
59 static const Literal<NUMBER> number;
60 static const Literal<CHARACTOR> charactor;
61 static const Literal<BOOLEAN> boolean;
62 static const Literal<BYTEVECTOR> byteVector;
63 static const Literal<VECTOR> vector;
66 // 内部クラスかつ、単に該当するEnumを返すだけのクラステンプレート
67 template<DatumID::private_LEXEMEID_ S>
68 class DatumID::Literal : private DatumID
72 DatumID::private_LEXEMEID_ toEnum() const {return S;}
77 // 暗黙的なコピーコンストラクタを利用する。
78 Literal() : DatumID(*this) {}
81 void* operator new(size_t);
82 void operator delete(void*);
83 void operator=(const Literal&);
84 void* operator&() const;
91 #endif /* _DATUM_ID_H_ */