OSDN Git Service

parser_testをDatumParserに対応。
[simplecms/utakata.git] / src / parser / datum.h
index ca63923..3046064 100755 (executable)
@@ -16,6 +16,10 @@ class UniString;
 class UniChar;
 }
 
+namespace lexer {
+class Token;
+}  // namespace lexer
+
 namespace datum {
 
 class Environment;
@@ -26,9 +30,7 @@ class Environment;
 // ます。
 class String : public Datum {
  public:
-  String(const lexer::Token& token, const unicode::UniString& string)
-      : Datum(token),
-        string_(new unicode::UniString(string)) {}
+  String(const lexer::Token& token, const unicode::UniString& string);
   virtual ~String() {}
 
   // このオブジェクトの文字列表現を返します。
@@ -54,9 +56,7 @@ class String : public Datum {
 // stringと同じく、symbolを構成する文字列のみを保持します。
 class Symbol : public Datum {
  public:
-  Symbol(const lexer::Token& token, const unicode::UniString& symbol)
-      : Datum(token),
-        symbol_(new unicode::UniString(symbol)) {}
+  Symbol(const lexer::Token& token, const unicode::UniString& symbol);
   virtual ~Symbol() {}
 
   // このオブジェクトの文字列表現を返します。
@@ -79,11 +79,8 @@ class Symbol : public Datum {
 class Charactor : public Datum {
  public:
   Charactor(const lexer::Token& token,
-            const unicode::UniString& charactor_name,
-            const unicode::UniChar& charactor)
-      : Datum(token),
-        charactor_(new unicode::UniChar(charactor)),
-        charactor_name_(new unicode::UniString(charactor_name)) {}
+            const unicode::UniChar& charactor,
+            const unicode::UniString& charactor_name);
   virtual ~Charactor() {}
 
   // このオブジェクトの文字列表現を返します。
@@ -114,9 +111,7 @@ class Charactor : public Datum {
 // そのように変更される場合があります。
 class Boolean : public datum::Datum {
  public:
-  Boolean(const lexer::Token& token, const unicode::UniString& base, bool auth)
-      : Datum(token),
-        boolean_value_(auth), original_string_(new unicode::UniString(base)) {}
+  Boolean(const lexer::Token& token, bool auth);
   virtual ~Boolean() {}
 
   // このオブジェクトの文字列表現を返します。
@@ -137,9 +132,6 @@ class Boolean : public datum::Datum {
 
   // 真偽値を直接保存します。
   bool boolean_value_;
-
-  // 真偽値の文字列をそのまま保存します。
-  akebono::scoped_ptr<unicode::UniString> original_string_;
 };
 
 // datum syntaxにおける<number>を表現します。
@@ -149,9 +141,7 @@ class Boolean : public datum::Datum {
 // そのように変更される場合があります。
 class Number : public datum::Datum {
  public:
-  Number(const lexer::Token& token, const unicode::UniString& base, int number)
-      : Datum(token),
-        tmp_number_(number), original_string_(new unicode::UniString(base)) {}
+  Number(const lexer::Token& token, int number);
   virtual ~Number() {}
 
   // このオブジェクトの文字列表現を返します。
@@ -170,22 +160,17 @@ class Number : public datum::Datum {
 
   virtual datum::DatumType type() const {return datum::kNumber;}
 
-  virtual const lexer::Token& GetBaseToken() const;
-
  private:
 
   // 数値オブジェクトを設定します。
   int tmp_number_;
-
-  // 真偽値の文字列をそのまま保存します。
-  akebono::scoped_ptr<unicode::UniString> original_string_;
 };
 
 // compound datum内のlist>を構築するためのconsセルです。
 // Consセル自体はいかなるデータも保存しません。
 class Cons : public datum::Datum {
  public:
-  explicit Cons(const lexer::Token& token) : Datum(token) {}
+  explicit Cons(const lexer::Token& token);
   virtual ~Cons() {}
 
   // このオブジェクトの文字列表現を返します。
@@ -206,7 +191,7 @@ class Cons : public datum::Datum {
 // しているのみとなります。
 class Vector : public datum::Datum {
 public:
-  explicit Vector(const lexer::Token& token) : Datum(token) {}
+  explicit Vector(const lexer::Token& token);
   virtual ~Vector() {}
 
   // このオブジェクトの文字列表現を返します。
@@ -226,8 +211,7 @@ public:
 // 行いません。
 class Bytevector : public datum::Datum {
 public:
-  explicit Bytevector(const lexer::Token& token)
-      : Datum(token), datum_list_() {}
+  explicit Bytevector(const lexer::Token& token);
   virtual ~Bytevector() {}
 
   // このオブジェクトの文字列表現を返します。
@@ -239,13 +223,13 @@ public:
   virtual datum::IDatumBase* Eval(interpreter::Environment* env);
 
   // 内部で保持しているdatumのvectorを返します。
-  virtual const std::vector<akebono::smart_ptr<Datum> >& GetBytevector() const {
+  virtual const std::vector<akebono::smart_ptr<IDatumBase> >& GetBytevector() const {
     return datum_list_;
   }
 
   // 渡されたvectorを設定します。
   virtual void SetBytevector(
-      const std::vector<akebono::smart_ptr<Datum> >& vector) {
+      const std::vector<akebono::smart_ptr<IDatumBase> >& vector) {
     datum_list_ = vector;
   }
 
@@ -256,7 +240,7 @@ public:
   // 内部に内包しているDatumのリストとなります。
   // 内部に内包することが可能なのは、任意のdatumであるため、この時点
   // では一意に確定はしません。
-  std::vector<akebono::smart_ptr<Datum> > datum_list_;
+  std::vector<akebono::smart_ptr<IDatumBase> > datum_list_;
 };
 
 }