4 // utakata::lexemeで利用される全てのIDを集約するヘッダ。
5 // すべてのIDは、以下のlexeme::LexemeIDから利用するようにする。
14 enum private_LEXEMEID_ {
16 OPENPARENTHESIS, // ([
18 CLOSEPARENTHESIS, // ])
27 UNSYNTAXSPLICING, // #,@
28 IDENTIFIER, // <IDENTIFIER>
30 CHARACTOR, // <CHARACTOR>
38 typedef private_LEXEMEID_ LEXEMEID_;
41 template<LEXEMEID_> class Literal;
46 LexemeID(const Literal<S>&) : S_(S) {}
48 LEXEMEID_ toEnum() const {return S_;}
50 friend bool operator==(LexemeID s, LexemeID t) {return s.S_ == t.S_;}
51 friend bool operator!=(LexemeID s, LexemeID t) {return !(s == t);}
53 static const Literal<OPENPARENTHESIS> openParenthesis;
54 static const Literal<STRING> string;
55 static const Literal<CLOSEPARENTHESIS> closeParenthesis;
56 static const Literal<BACKQUOTE> backquote;
57 static const Literal<DOT> dot;
58 static const Literal<QUOTE> quote;
59 static const Literal<UNQUOTE> unquote;
60 static const Literal<UNQUOTESPLICING> unquoteSplicing;
61 static const Literal<SYNTAX> syntax;
62 static const Literal<QUASISYNTAX> quasiSyntax;
63 static const Literal<UNSYNTAX> unsyntax;
64 static const Literal<UNSYNTAXSPLICING> unsyntaxSplicing;
65 static const Literal<IDENTIFIER> identifier;
66 static const Literal<NUMBER> number;
67 static const Literal<CHARACTOR> charactor;
68 static const Literal<BOOLEAN> boolean;
69 static const Literal<BYTEVECTOR> byteVector;
70 static const Literal<VECTOR> vector;
71 static const Literal<EOS> eos;
74 // 内部クラスかつ、単に該当するEnumを返すだけのクラステンプレート
75 template<LexemeID::private_LEXEMEID_ S>
76 class LexemeID::Literal : private LexemeID
80 LexemeID::private_LEXEMEID_ toEnum() const {return S;}
84 friend class LexemeID;
85 // 暗黙的なコピーコンストラクタを利用する。
86 Literal() : LexemeID(*this) {}
89 void* operator new(size_t);
90 void operator delete(void*);
91 void operator=(const Literal&);
92 void* operator&() const;
99 #endif /* _LEXEME_ID_H_ */