OSDN Git Service

a6698bc9abee1006b514e6c4af40d50bba08f654
[simplecms/utakata.git] / src / lexer / term_lexer.h
1 // lexer内部で利用されるデリミタ群
2 //
3 // lexer名前空間内の、IPartOfLexer派生クラスの内部で利用される、
4 // 各非終端記号及び終端記号を定義しています。
5 // これらは本来、通常のLexerとして定義されるべきデータですが、
6 // それぞれ単体で登場することはなく、またこれらのデータは全て
7 // より上位の非終端記号として取り扱われるため、デリミタとして定義されています。
8 // 各デリミタは、unicode::UniCharを渡すことで、各非終端記号、及び
9 // 終端記号であるかを表すような関数オブジェクトとしてのみ振舞います。
10 //
11 // それぞれのデリミタには、非終端記号/終端記号で異なるプレフィックスが
12 // 付与されます。
13 // また、一文字の判定のみで問題無い場合にはUniCharを、複数文字の
14 // 判定が必要である場合、UniStringを渡します。
15 #ifndef _UTAKATA_SRC_LEXER_DELIMITERS_H_
16 #define _UTAKATA_SRC_LEXER_DELIMITERS_H_
17
18 namespace utakata {
19
20 namespace unicode {
21 class UniChar;
22 class UniString;
23 }
24
25 namespace reader {
26 class EncodingReader;
27 }
28
29 namespace lexer {
30
31 // 渡されたEncodingReaderについて、トークンの存在チェックと
32 // トークンの読み捨てを行ないます。
33 class TermLexerBase {
34  public:
35   virtual ~TermLexerBase() {}
36
37   // 渡されたreaderの先頭から、T()によって判別されるトークンが
38   // 読出せる場合、trueが返されます。
39   // 渡されたreaderの読み出し位置は更新されません。
40   virtual bool CheckToken(reader::EncodingReader* reader) = 0;
41
42   // 渡されたreaderより、T()によって判別されたトークンを読み飛ばします。
43   // 読み出しが行われた場合、readerの読み出し位置は更新されます。
44   virtual int ReadToken(reader::EncodingReader* reader) = 0;
45 };
46
47 // 関数オブジェクトを渡すことで、渡した関数オブジェクトによって
48 // トークンの読み出しを行います。
49 // 関数オブジェクトのインターフェースは、
50 // bool operator()(EncodingReader*, unsigned int*)
51 // という形でなければなりません。
52 template<class T>
53 class TermLexer : public TermLexerBase {
54  public:
55
56   TermLexer() : checker_() {}
57
58   // 渡されたreaderの先頭から、T()によって判別されるトークンが
59   // 読出せる場合、trueが返されます。
60   // 渡されたreaderの読み出し位置は更新されません。
61   bool CheckToken(reader::EncodingReader* reader) {
62     unsigned int size = 0;
63     if (!checker_(reader, &size)) {
64       return false;
65     }
66     return true;
67   }
68
69   // 渡されたreaderより、T()によって判別されたトークンを読み飛ばします。
70   // 読み出しが行われた場合、readerの読み出し位置は更新されます。
71   int ReadToken(reader::EncodingReader* reader) {
72     unsigned int size = 0;
73     if (!checker_(reader, &size)) {
74       return 0;
75     }
76     return size;
77   }
78
79  private:
80
81   // ()を定義した関数オブジェクトです。
82   T checker_;
83 };
84
85 }
86 }
87 #endif /* _UTAKATA_SRC_LEXER_DELIMITERS_H_ */