namespace unicode {
class UniChar;
class UniString;
-};
+}
namespace reader {
class EncodingReader;
-};
+}
namespace lexer {
+// 渡されたEncodingReaderについて、トークンの存在チェックと
+// トークンの読み捨てを行ないます。
+class TermLexerBase {
+ public:
+ virtual ~TermLexerBase() {}
+
+ // 渡されたreaderの先頭から、T()によって判別されるトークンが
+ // 読出せる場合、trueが返されます。
+ // 渡されたreaderの読み出し位置は更新されません。
+ virtual bool CheckToken(reader::EncodingReader* reader) = 0;
+
+ // 渡されたreaderより、T()によって判別されたトークンを読み飛ばします。
+ // 読み出しが行われた場合、readerの読み出し位置は更新されます。
+ virtual int ReadToken(reader::EncodingReader* reader) = 0;
+};
+
// 関数オブジェクトを渡すことで、渡した関数オブジェクトによって
// トークンの読み出しを行います。
// 関数オブジェクトのインターフェースは、
// bool operator()(EncodingReader*, unsigned int*)
// という形でなければなりません。
template<class T>
-class TermLexer {
+class TermLexer : public TermLexerBase {
public:
TermLexer() : checker_() {}
// 読出せる場合、trueが返されます。
// 渡されたreaderの読み出し位置は更新されません。
bool CheckToken(reader::EncodingReader* reader) {
- unsigned int size = 0;
- if (!checker_(reader, &size)) {
- return false;
- }
- return true;
+ unsigned int size = 0;
+ if (!checker_(reader, &size)) {
+ return false;
+ }
+ return true;
}
// 渡されたreaderより、T()によって判別されたトークンを読み飛ばします。
// ()を定義した関数オブジェクトです。
T checker_;
-}
-
-class NumberPrefixChecker {
- // <number>のプレフィックスであるかどうか調査します。
- public:
-
- // プレフィックスは以下の形式です。
- // #[ b | B | o | O | d | D | h | H ]
- bool operator()(reader::EncodingReader* reader);
};
-class NumberExactnessChecker {
- // <number>の正確性のデリミタであるかどうか調査します。
- public:
-
- // exactnessのデリミタは以下の形式です。
- // #[ i | I | e | E ]
- bool operator()(const unicode::UniString& str);
-};
}
}
#endif /* _UTAKATA_SRC_LEXER_DELIMITERS_H_ */