+++ /dev/null
-#ifndef _LEXEME_ID_H_
-#define _LEXEME_ID_H_
-
-#include <string>
-
-// utakata::lexemeで利用される全てのIDを集約するヘッダ。
-// すべてのIDは、以下のlexeme::LexemeIDから利用するようにする。
-
-namespace utakata {
-
-namespace lexeme {
-
-class LexemeID {
- public:
- enum private_LEXEMEID_ {
- EOS = -1, // EOF
- OPENPARENTHESIS, // ([
- STRING, // <STRING>
- CLOSEPARENTHESIS, // ])
- BACKQUOTE, // `
- DOT, // .
- QUOTE, // '
- UNQUOTE, // ,
- UNQUOTESPLICING, // ,@
- SYNTAX, // #'
- QUASISYNTAX, // #`
- UNSYNTAX, // #,
- UNSYNTAXSPLICING, // #,@
- IDENTIFIER, // <IDENTIFIER>
- NUMBER, // <NUMBER>
- CHARACTOR, // <CHARACTOR>
- BOOLEAN, // <BOOLEAN>
- BYTEVECTOR, // #VU8
- VECTOR, // #(
- };
-
- private:
-
- typedef private_LEXEMEID_ LEXEMEID_;
- LEXEMEID_ S_;
-
- template<LEXEMEID_> class Literal;
-
- public:
-
- template<LEXEMEID_ S>
- explicit LexemeID(const Literal<S>&) : S_(S) {}
-
- LEXEMEID_ toEnum() const {return S_;}
-
- friend bool operator==(LexemeID s, LexemeID t) {return s.S_ == t.S_;}
- friend bool operator!=(LexemeID s, LexemeID t) {return !(s == t);}
-
- static const Literal<OPENPARENTHESIS> openParenthesis;
- static const Literal<STRING> string;
- static const Literal<CLOSEPARENTHESIS> closeParenthesis;
- static const Literal<BACKQUOTE> backquote;
- static const Literal<DOT> dot;
- static const Literal<QUOTE> quote;
- static const Literal<UNQUOTE> unquote;
- static const Literal<UNQUOTESPLICING> unquoteSplicing;
- static const Literal<SYNTAX> syntax;
- static const Literal<QUASISYNTAX> quasiSyntax;
- static const Literal<UNSYNTAX> unsyntax;
- static const Literal<UNSYNTAXSPLICING> unsyntaxSplicing;
- static const Literal<IDENTIFIER> identifier;
- static const Literal<NUMBER> number;
- static const Literal<CHARACTOR> charactor;
- static const Literal<BOOLEAN> boolean;
- static const Literal<BYTEVECTOR> byteVector;
- static const Literal<VECTOR> vector;
- static const Literal<EOS> eos;
-};
-
-// 内部クラスかつ、単に該当するEnumを返すだけのクラステンプレート
-template<LexemeID::private_LEXEMEID_ S>
-class LexemeID::Literal : private LexemeID {
- public:
-
- LexemeID::private_LEXEMEID_ toEnum() const {return S;}
-
- private:
-
- friend class LexemeID;
- // 暗黙的なコピーコンストラクタを利用する。
- Literal() : LexemeID(*this) {}
- ~Literal() {}
-
- void* operator new(size_t size);
- void operator delete(void* ptr);
- void operator=(const Literal& literal);
- void* operator&() const; // NOLINT
-};
-};
-};
-
-#endif /* _LEXEME_ID_H_ */