OSDN Git Service

SchemeLexerの実装により、字句解析部分の作成を完了。
[simplecms/utakata.git] / src / lexer / lexeme_lexer.h
1 // Scheme字句構文中において、<token>に該当する字句を解析して返却する
2 // 機能を提供します。
3 // <token>に一致する字句構文は以下の通りです。
4 // <token> - <identifier> | <boolean> | <number>
5 //          | <character> | <string>
6 //          | ( | ) | [ | ] | #( | #vu8( | ' | `  | , | ,@ | .
7 //          | #' | #` | #, | #,@
8 // 非終端記号については、それぞれに対応したLexerによって解析が行われます。
9 #ifndef _UTAKATA_SRC_LEXER_LEXEME_LEXER_H_
10 #define _UTAKATA_SRC_LEXER_LEXEME_LEXER_H_
11
12
13
14 #include <vector>
15 #include "src/lexer/lexer_interface.h"
16
17 namespace utakata {
18 namespace unicode {
19 class UniString;
20 }
21
22 namespace reader {
23 class EncodingReader;
24 }
25
26 namespace lexer {
27
28 namespace detail {
29 class LexemeTermBinderBase;
30 }
31
32 class Token;
33
34 // Scheme字句構文における<token>中の終端記号に該当する字句を解析して返却する機能を
35 // 提供します。
36 class LexemeLexer : public IPartOfLexer {
37  public:
38
39   // 内部で利用するTermBinderを定義します。
40   LexemeLexer();
41
42   // TermBinder内部の各TermBinderをdeleteします。
43   ~LexemeLexer();
44
45   // readerの先頭から、<token>に一致する字句を解析して、それぞれのToken
46   // として返却します。
47   // <token>に一致する構文が存在しない場合、NULLが返却されます。
48   // 返却された有効なTokenは、利用する側に解体責任が発生します。
49   virtual akebono::smart_ptr<lexer::Token> Lex(reader::EncodingReader* reader);
50
51  private:
52
53   // readerの先頭から、<token>中の終端記号にマッチするかどうかをチェック
54   // し、結果を返却します。
55   // それぞれに一致しない場合、NULLを返却します。
56   akebono::smart_ptr<lexer::Token> LexTermOfLexeme(reader::EncodingReader* reader);
57
58   // 内部で利用されるTermBinder群です。コンストラクタで初期化されます。
59   std::vector<lexer::detail::LexemeTermBinderBase*> term_binders_;
60 };
61
62 class LexemeLexerFactory : public ILexerCreator {
63   // LexemeLexerをIPartOfLexerとして生成するファクトリです。
64  public:
65   LexemeLexerFactory() {}
66   virtual ~LexemeLexerFactory() {}
67
68   // ChractorLexerを新たに割り当てて返します。
69   // 返されたインスタンスは、取得側で開放する必要があります。
70   virtual IPartOfLexer* Create() const {return new LexemeLexer();}
71 };
72 }
73 }
74
75 #endif /* _UTAKATA_SRC_LEXER_LEXEME_LEXER_H_ */