OSDN Git Service

-lexeme_idを、private inherit Enum idiomで書き直した。なんかよくわからないエラーが出るけど気にしない。
[simplecms/utakata.git] / lexeme_id.h
1 #ifndef _LEXEME_ID_H_
2 #define _LEXEME_ID_H_
3
4 // utakata::lexemeで利用される全てのIDを集約するヘッダ。
5 // すべてのIDは、以下のlexeme::LexemeIDから利用するようにする。
6
7 namespace utakata {
8
9     namespace lexeme {
10
11         class LexemeID
12         {
13         public:
14             enum private_LEXEMEID_ {
15                 EOS             = -1, // EOF
16                 OPENPARENTHESIS,      // ([
17                 STRING,               // <STRING>
18                 CLOSEPARENTHESIS,     // ])
19                 BACKQUOTE,            // `
20                 DOT,                  // .
21                 QUOTE,                // '
22                 UNQUOTE,              //,
23                 UNQUOTESPLICING,      //,@
24                 SYNTAX,               // #'
25                 QUASISYNTAX,          // #`
26                 UNSYNTAX,             // #,
27                 UNSYNTAXSPLICING,     // #,@
28                 IDENTIFIER,           // <IDENTIFIER>
29                 NUMBER,               // <NUMBER>
30                 CHARACTOR,            // <CHARACTOR>
31                 BOOLEAN,              // <BOOLEAN>
32                 BYTEVECTOR,           // #VU8
33                 VECTOR,               // #(
34             };
35
36         private:
37
38             typedef private_LEXEMEID_ LEXEMEID_;
39             LEXEMEID_ S_;
40
41             template<LEXEMEID_> class Literal;
42
43         public:
44
45             template<LEXEMEID_ S>
46             LexemeID(const Literal<S>&) : S_(S) {}
47
48             LEXEMEID_ toEnum() const {return S_;}
49
50             friend bool operator==(LexemeID s, LexemeID t) {return s.S_ == t.S_;}
51             friend bool operator!=(LexemeID s, LexemeID t) {return !(s == t);}
52
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;
72         };
73
74         // 内部クラスかつ、単に該当するEnumを返すだけのクラステンプレート
75         template<LexemeID::private_LEXEMEID_ S>
76         class LexemeID::Literal : private LexemeID
77         {
78         public:
79
80             LexemeID::private_LEXEMEID_ toEnum() const {return S;}
81
82         private:
83
84             friend class LexemeID;
85             // 暗黙的なコピーコンストラクタを利用する。
86             Literal() : LexemeID(*this) {}
87             ~Literal() {}
88
89             void* operator new(size_t);
90             void operator delete(void*);
91             void operator=(const Literal&);
92             void* operator&() const;
93         };
94
95     };
96
97 };
98
99 #endif /* _LEXEME_ID_H_ */