OSDN Git Service

lexer.cpp -- <string>字句構文を返すようにした。
authorderui <derui@user.sourceforge.jp>
Sun, 7 Jun 2009 03:22:51 +0000 (12:22 +0900)
committerderui <derui@user.sourceforge.jp>
Sun, 7 Jun 2009 03:22:51 +0000 (12:22 +0900)
utf8_string.cpp -- CUTF8StringとCUTF8Charをそれぞれ加算可能にした。

lexer.cpp
test/utf8_string_test.cpp
utf8_string.cpp
utf8_string.h

index 2a76332..d0efbb1 100644 (file)
--- a/lexer.cpp
+++ b/lexer.cpp
@@ -22,7 +22,6 @@ smart_ptr<lexer::CLexeme> lexer::CLexer::lex(smart_ptr<utf8::CUTF8InputStream>&
 
         utf8_string::CUTF8Char ch(stream->read());
 
-
         // 最初の一文字で、大体決定されるため、firstをチェックして
         // いく。
         if (first)
@@ -59,16 +58,29 @@ smart_ptr<lexer::CLexeme> lexer::CLexer::lex(smart_ptr<utf8::CUTF8InputStream>&
             {
                 return makeComma();
             }
+
+            if (ch.toUTF16Code() == '"')
+            {
+                // 先頭が"の場合、stringと判断される。
+                return makeString(stream);
+            }
+
         }
         else
         {
+            // それまでに読みだした文字列が固定の文字列かどうか。
+            
             // 読出した文字がデリミタであるかどうか。
             if (isDelimiter(ch))
             {
                 // デリミタ文字である場合、このデリミタ文字に来るまでの間に
                 // 保存した文字列から、実際のデータを作成する。
+                // ここに来るまでにすでに型は決定されているはずなので、
+                // その型を基にして作成する。
                 
             }
+
+            
         }
     }
 }
index 9e12bba..d8680e1 100644 (file)
@@ -49,11 +49,13 @@ bool utf8_string_test(smart_ptr<simpletest::CSimpleTestAsserter> asserter)
     // マルチバイトとascii文字の混在文字も正しく扱うことのできる
     // CUTF8Stringのテスト
     
-    std::string tmp("あいうえsssお");
+    std::string tmp("ã\81\82ã\81\82ã\81\84ã\81\86ã\81\88sssã\81\8a");
 
     smart_ptr<std::istream> ss(new std::stringstream(tmp));
     utakata::utf8::CUTF8InputStream stream(ss);
 
+    utakata::utf8_string::CUTF8Char ch(stream.read());
+
     utakata::utf8_string::CUTF8String str(stream.read(5));
     asserter->check(str.begin()->toStr(), "あ");
     asserter->check(str.size(), 5);
@@ -72,6 +74,10 @@ bool utf8_string_test(smart_ptr<simpletest::CSimpleTestAsserter> asserter)
     // 文字列とするのは自身の関数だけで可能。
     asserter->check(str.toStr(), "あいうえsあいうえs");
 
+    // 文字との加算も可能。
+    str += ch;
+    asserter->check(str.toStr(), "ああいうえsあいうえs");
+
     return asserter->isOk();
 }
 
index c5dce3f..5e85ef3 100644 (file)
@@ -85,13 +85,6 @@ bool utakata::utf8_string::is_eof(const CUTF8Char& ch)
     return ch.getBytes()[0] == 0xff ? true : false;
 }
 
-CUTF8String utakata::utf8_string::operator+(const CUTF8String& lh, const CUTF8String& rh)
-{
-    // 双方をコピーして加算して返す。凄い負荷が高い。
-    CUTF8String str(lh);
-    str += rh;
-    return str;
-}
 
 //================================================================================
 
@@ -160,6 +153,25 @@ CUTF8String& CUTF8String::operator+=(const CUTF8String& str)
     return *this;
 }
 
+CUTF8String& CUTF8String::operator+=(const std::vector<unsigned char>& ch)
+{
+    // 実際には文字を設定するのに利用される。
+    // また、これを定義しておくことで、streamからの結果を直接設定することができる。
+    CUTF8String tmp(ch);
+    chars_.insert(chars_.end(), tmp.chars_.begin(), tmp.chars_.end());
+    return *this;
+}
+
+CUTF8String& CUTF8String::operator+=(const CUTF8Char& ch)
+{
+    // 実際には文字を設定するのに利用される。
+    // また、これを定義しておくことで、streamからの結果を直接設定することができる。
+    CUTF8String tmp(ch.getBytes());
+    chars_.insert(chars_.end(), tmp.chars_.begin(), tmp.chars_.end());
+    return *this;
+}
+
+
 std::string CUTF8String::toStr() const
 {
     // 文字列に変換する。
@@ -211,4 +223,25 @@ std::string utakata::utf8_string::substring(const CUTF8String& str, size_t begin
     }
 }
 
+CUTF8String utakata::utf8_string::operator+(const CUTF8String& lh, const CUTF8String& rh)
+{
+    // 双方をコピーして加算して返す。凄い負荷が高い。
+    CUTF8String str(lh);
+    str += rh;
+    return str;
+}
+
+CUTF8String utakata::utf8_string::operator+(const CUTF8String& lh, const CUTF8Char& rh)
+{
+    // 文字と加算する。
+    CUTF8String tmp(lh);
+    tmp += rh.getBytes();
+    return tmp;
+}
 
+CUTF8String utakata::utf8_string::operator+(const CUTF8Char& lh, const CUTF8String& rh)
+{
+    CUTF8String tmp(lh.getBytes());
+    tmp += rh;
+    return tmp;
+}
index 59451de..dc5547b 100644 (file)
@@ -125,7 +125,6 @@ namespace utakata {
             // 実体に代入する。代入が行われなかった場合、元のデータ
             // は保存される。
             void assign(const std::vector<unsigned char>& bytes);
-            void assign(const std::vector<CUTF8Char>& chars);
             void assign(const CUTF8String& str);
 
             // iteratorを取得する。
@@ -151,6 +150,8 @@ namespace utakata {
 
             // 加算のみをサポートする。
             CUTF8String& operator+=(const CUTF8String& str);
+            CUTF8String& operator+=(const std::vector<unsigned char>& ch);
+            CUTF8String& operator+=(const CUTF8Char& ch);
 
             // std::stringへ変換する。ただし、std::string上でのinsertなどは
             // 保証できない。
@@ -168,6 +169,9 @@ namespace utakata {
         };
 
         CUTF8String operator+(const CUTF8String& lh, const CUTF8String& rh);
+        CUTF8String operator+(const CUTF8String& lh, const CUTF8Char& rh);
+        CUTF8String operator+(const CUTF8Char& lh, const CUTF8String& rh);
+        
 
         // substringの実装を行う。
         // [begin, end)までの文字を文字列として返す。