OSDN Git Service

delimiter.h/cppを、term_lexer、term_checkerとしてテンプレートを利用するように分離した。
[simplecms/utakata.git] / src / lexer / charactor_lexer.h
1 // Scheme構文における文字を判定するためのLexerです。
2 // ここで定義されるLexerは、IPartOfLexerから派生しており、以下の条件
3 // をもってLexerDispatcherからディスパッチします。
4 // :検索対象文字列の先頭 = #\ の場合:
5 #ifndef _UTAKATA_SRC_LEXER_CHARACTOR_LEXER_H_
6 #define _UTAKATA_SRC_LEXER_CHARACTOR_LEXER_H_
7
8 #include <map>
9 #include "src/lexer/lexer_interface.h"
10
11 namespace utakata {
12 namespace unicode {
13 class UniString;
14 class UniChar;
15 }
16
17 namespace reader {
18 class EncodingReader;
19 }
20
21 namespace lexer {
22 class Lexeme;
23
24 // Schemeの文字名に関係する処理及び定数をまとめたクラスです。
25 // このクラスにて文字名として処理を行う文字列は以下の通りです。
26 // nul       U+0000
27 // alarm     U+0007
28 // backspace U+0008
29 // tab       U+0009
30 // linefeed  U+000A
31 // newline   U+000A
32 // vtab      U+000B
33 // page      U+000C
34 // return    U+000D
35 // esc       U+001B
36 // space     U+0020
37 // delete    U+007F
38 class CharactorNameLexer {
39  public:
40   // charactor nameと対応するUnicode値の固定値を列挙します。
41   static const std::pair<unicode::UniString, int> kNul;
42   static const std::pair<unicode::UniString, int> kAlarm;
43   static const std::pair<unicode::UniString, int> kBackspace;
44   static const std::pair<unicode::UniString, int> kTab;
45   static const std::pair<unicode::UniString, int> kLinefeed;
46   static const std::pair<unicode::UniString, int> kNewline;
47   static const std::pair<unicode::UniString, int> kVTab;
48   static const std::pair<unicode::UniString, int> kPage;
49   static const std::pair<unicode::UniString, int> kReturn;
50   static const std::pair<unicode::UniString, int> kEsc;
51   static const std::pair<unicode::UniString, int> kSpace;
52   static const std::pair<unicode::UniString, int> kDelete;
53
54   // 渡された文字列が文字名に一致する場合、valueに該当した文字の文字コード
55   // を返却します。
56   bool Lex(const unicode::UniString& string, unsigned int* value);
57
58  private:
59
60   // 検索用mapを初期化します。この初期化の際には、このクラスで宣言されている
61   // 定数を利用します。
62   static void InitializeCharactorMap();
63
64   // 文字名と文字に対応するunicodeを保持するmapです。
65   // いずれかの関数が実行された際に一度だけ初期化が行われます。
66   static std::map<unicode::UniString, int> charactor_map_;
67 };
68
69 // Scheme構文における文字のチェックを行います。
70 // Scheme構文における文字リテラルは、以下のような形式となります。
71 //   #\<any charactor>
72 //   #\<charactor name>
73 //   #\x<hex scalar value>
74 // ただし、<any charactor>はかならず一文字の文字であり、デリミタか
75 // 入力の終端が続かない場合、charactor nameかhex xcalar value
76 // に該当しなければなりません。
77 class CharactorLexer : public IPartOfLexer {
78  public:
79
80   CharactorLexer() {}
81   virtual ~CharactorLexer() {}
82
83   // 読出しストリームへのポインタを受け取って、結果として生成した
84   // Lexemeクラスを返します。
85   // Charactorの字句として異常である文字列であった場合、LexException例外が
86   // 送出されます。
87   // Charactorの開始記号が見つからない場合、NULLが返されます。
88   virtual Lexeme* Lex(reader::EncodingReader* reader);
89  private:
90
91   // 渡されたUniStringに対して、対応する文字コードを返します。
92   // 問題無く返却された場合には、trueが返されます。
93   // resultには、有効であるUniCharへのポインタを渡さなければなりません。
94   bool ConvertStringToCharactor(const unicode::UniString& string,
95                                 unicode::UniChar* result);
96
97   static std::string kCharactorStart;
98 };
99
100 class CharactorLexerFactory : public ILexerCreator {
101   // CharactorLexerをIPartOfLexerとして生成するファクトリです。
102  public:
103   CharactorLexerFactory() {}
104   virtual ~CharactorLexerFactory() {}
105
106   // ChractorLexerを新たに割り当てて返します。
107   // 返されたインスタンスは、取得側で開放する必要があります。
108   virtual IPartOfLexer* Create() const {return new CharactorLexer();}
109 };
110 }
111 }
112
113 #endif /* _UTAKATA_SRC_LEXER_CHARACTOR_LEXER_H_ */