OSDN Git Service

delimiter.h/cppを、term_lexer、term_checkerとしてテンプレートを利用するように分離した。
[simplecms/utakata.git] / src / lexeme.h
1 // lexerによって作成されたlexemeを格納するためのインターフェースです。
2 // 実体として存在し、内部では解釈された文字列と、lexemeのタイプのみが
3 // 格納されています。
4 // 格納されたlexemeは、評価された時に改めて型にあった値に変更されます。
5 #ifndef _DEVELOP_UTAKATA_SRC_LEXEME_H_
6 #define _DEVELOP_UTAKATA_SRC_LEXEME_H_
7
8 #include "lib/scoped_ptr.h"
9
10 namespace utakata {
11
12 namespace unicode {
13 class UniString;
14 };
15
16 namespace lexer {
17
18 class Lexeme {
19   // 各非終端記号を表すためのクラスです。このクラスは、各Lexerによって
20   // 作成され、一度作成された後は変更されることはありません。
21   // 実際にはこのクラスより、それぞれの値に評価されます。
22  public:
23
24   enum LexemeType {
25     kEOS  = -1,
26     kOpenParenthesis,
27     kCloseParenthesis,
28     kCharactor,
29     kString,
30     kBoolean,
31     kVector,
32     kByteVector,
33     kNumber,
34     kIdentifier,
35     kQuote,
36     kBackquote,
37     kQuasisyntax,
38     kSyntax,
39     kDot,
40     kQuasiquote,
41     kUnsyntax,
42     kUnsyntaxSplicing,
43     kUnquote,
44     kUnquoteSplicing,
45     kUnToken,
46   };
47
48   Lexeme() : string_(), type_(kUnToken) {}
49   Lexeme(const unicode::UniString& lexeme_str, const LexemeType type);
50   Lexeme(const Lexeme& other);
51   virtual ~Lexeme() {}
52
53   Lexeme& operator=(const Lexeme& rh);
54
55   // 各非終端記号などの型を表すenum値を返します。
56   const LexemeType type() const {return type_;}
57
58   // それぞれの型を表すデータです。型によって内容は異なります。
59   const unicode::UniString& string() const {return *string_;}
60
61  private:
62   // lexemeを表す文字列です。
63   akebono::scoped_ptr<unicode::UniString> string_;
64
65   // lexemeの型を表すEnum値です。
66   LexemeType type_;
67 };
68 };
69 };
70
71 #endif /* _DEVELOP_UTAKATA_SRC_LEXEME_H_ */