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_
9 #include "src/lexer/lexer_interface.h"
24 // Schemeの文字名に関係する処理及び定数をまとめたクラスです。
25 // このクラスにて文字名として処理を行う文字列は以下の通りです。
38 class CharactorNameLexer {
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;
54 // 渡された文字列が文字名に一致する場合、valueに該当した文字の文字コード
56 bool Lex(const unicode::UniString& string, unsigned int* value);
60 // 検索用mapを初期化します。この初期化の際には、このクラスで宣言されている
62 static void InitializeCharactorMap();
64 // 文字名と文字に対応するunicodeを保持するmapです。
65 // いずれかの関数が実行された際に一度だけ初期化が行われます。
66 static std::map<unicode::UniString, int> charactor_map_;
69 // Scheme構文における文字のチェックを行います。
70 // Scheme構文における文字リテラルは、以下のような形式となります。
73 // #\x<hex scalar value>
74 // ただし、<any charactor>はかならず一文字の文字であり、デリミタか
75 // 入力の終端が続かない場合、charactor nameかhex xcalar value
77 class CharactorLexer : public IPartOfLexer {
81 virtual ~CharactorLexer() {}
83 // 読出しストリームへのポインタを受け取って、結果として生成した
85 // Charactorの字句として異常である文字列であった場合、LexException例外が
87 // Charactorの開始記号が見つからない場合、NULLが返されます。
88 virtual Lexeme* Lex(reader::EncodingReader* reader);
91 // 渡されたUniStringに対して、対応する文字コードを返します。
92 // 問題無く返却された場合には、trueが返されます。
93 // resultには、有効であるUniCharへのポインタを渡さなければなりません。
94 bool ConvertStringToCharactor(const unicode::UniString& string,
95 unicode::UniChar* result);
97 static std::string kCharactorStart;
100 class CharactorLexerFactory : public ILexerCreator {
101 // CharactorLexerをIPartOfLexerとして生成するファクトリです。
103 CharactorLexerFactory() {}
104 virtual ~CharactorLexerFactory() {}
106 // ChractorLexerを新たに割り当てて返します。
107 // 返されたインスタンスは、取得側で開放する必要があります。
108 virtual IPartOfLexer* Create() const {return new CharactorLexer();}
113 #endif /* _UTAKATA_SRC_LEXER_CHARACTOR_LEXER_H_ */