3 // lexer名前空間内の、IPartOfLexer派生クラスの内部で利用される、
4 // 各非終端記号及び終端記号を定義しています。
5 // これらは本来、通常のLexerとして定義されるべきデータですが、
6 // それぞれ単体で登場することはなく、またこれらのデータは全て
7 // より上位の非終端記号として取り扱われるため、デリミタとして定義されています。
8 // 各デリミタは、unicode::UniCharを渡すことで、各非終端記号、及び
9 // 終端記号であるかを表すような関数オブジェクトとしてのみ振舞います。
11 // それぞれのデリミタには、非終端記号/終端記号で異なるプレフィックスが
13 // また、一文字の判定のみで問題無い場合にはUniCharを、複数文字の
14 // 判定が必要である場合、UniStringを渡します。
15 #ifndef _UTAKATA_SRC_LEXER_DELIMITERS_H_
16 #define _UTAKATA_SRC_LEXER_DELIMITERS_H_
31 // 渡されたEncodingReaderについて、トークンの存在チェックと
35 virtual ~TermLexerBase() {}
37 // 渡されたreaderの先頭から、T()によって判別されるトークンが
39 // 渡されたreaderの読み出し位置は更新されません。
40 virtual bool CheckToken(reader::EncodingReader* reader) = 0;
42 // 渡されたreaderより、T()によって判別されたトークンを読み飛ばします。
43 // 読み出しが行われた場合、readerの読み出し位置は更新されます。
44 virtual int ReadToken(reader::EncodingReader* reader) = 0;
47 // 関数オブジェクトを渡すことで、渡した関数オブジェクトによって
49 // 関数オブジェクトのインターフェースは、
50 // bool operator()(EncodingReader*, unsigned int*)
53 class TermLexer : public TermLexerBase {
56 TermLexer() : checker_() {}
58 // 渡されたreaderの先頭から、T()によって判別されるトークンが
60 // 渡されたreaderの読み出し位置は更新されません。
61 bool CheckToken(reader::EncodingReader* reader) {
62 unsigned int size = 0;
63 if (!checker_(reader, &size)) {
69 // 渡されたreaderより、T()によって判別されたトークンを読み飛ばします。
70 // 読み出しが行われた場合、readerの読み出し位置は更新されます。
71 int ReadToken(reader::EncodingReader* reader) {
72 unsigned int size = 0;
73 if (!checker_(reader, &size)) {
87 #endif /* _UTAKATA_SRC_LEXER_DELIMITERS_H_ */