smart_ptr<utakata::utf8_string::UTF8String> str_;
};
- /////////////////////////////////////////////////////////////////
- // <number>がそれぞれのradixに基づいて解析する必要があるため、 //
- // それぞれに対して特化できるようなテンプレートを用意する。 //
- /////////////////////////////////////////////////////////////////
-
- template<class T>
- class NumberLexerTemp
- {
- public:
- NumberLexerTemp() : checker_() {}
- virtual ~NumberLexerTemp() {}
-
- smart_ptr<lexeme::ILexeme> lex(smart_ptr<utakata::utf8::UTF8InputStream> stream,
- smart_ptr<ISubLexer>& next,
- bool exactness)
- {
- // 全体的な流れは同一であり、基数の違いによる
- // 数値の違い程度しか問題は発生しない。
- utakata::lexer_delimiter::Normal nor;
- utakata::utf8_string::UTF8String number;
- while (true) {
- // デリミタまで読んでしまう。
- if (stream->isEOF())
- {
- throw LexException("illegal number format");
- }
-
- utakata::utf8_string::UTF8Char ch(stream->read());
- if (nor(ch))
- {
- stream->unget(ch.getBytes());
- break;
- }
-
- number += ch;
- }
-
- // 読出したnumberを解析してNumberオブジェクトとして返す。
- return lexNumber_(number);
- }
-
- private:
-
- smart_ptr<lexeme::ILexeme> lexNumber_(const utakata::utf8_string::UTF8String& number)
- {
- // デリミタまでを取得したデータを、実際の数値オブジェクトとして解釈させる。
- // 解釈できなかった場合、字句構文エラーとして扱う。
- utakata::utf8_string::UTF8String::const_utf8iterator it = number.begin(),
- end = number.end();
-
- int status = INIT;
- while (begin != end) {
-
- switch (status)
- {
- case INIT:
- {
- // 非終端記号で言えば<complex>に当たる。
- // 全ての整数は原則として +-0iの虚数と等しいため、そのようになる。
-
- // 一文字単位で調べていく。checker_に該当するデータの場合には、
- if (begin->toUTF16Code() == '+' ||
- begin->toUTF16Code() == '-')
- {
- // 符号である場合。
- }
-
-
- }
-
- // チェックを行うための関数オブジェクト。
- T checker_;
- };
};
};