OSDN Git Service

<identify>、<number>、<boolean>を解釈するそれぞれの部分字句解析を行うLexerを追加。
[simplecms/utakata.git] / src / lexer / term_lexer.h
index ac9780e..a6698bc 100755 (executable)
@@ -20,21 +20,37 @@ namespace utakata {
 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_() {}
@@ -43,11 +59,11 @@ class TermLexer {
   // 読出せる場合、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()によって判別されたトークンを読み飛ばします。
@@ -64,25 +80,8 @@ class TermLexer {
 
   // ()を定義した関数オブジェクトです。
   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_ */