10 #include "literal_data.h"
14 using namespace utakata;
15 using namespace utakata::literal;
16 using namespace utakata::unicode;
17 using namespace utakata::syntax;
19 // 原則としてそれぞれ単純に呼びだされるのみ。
23 TreeNode (node_pair p) : list(), datum (p) {}
25 std::vector<smart_ptr<TreeNode> > list;
28 Tree::node_pair datum;
31 ////////////////////////////
32 // syntax::Tree::iterator //
33 ////////////////////////////
35 syntax::Tree::iterator::iterator () : current_()
39 syntax::Tree::iterator::iterator (const Tree::iterator& i)
44 syntax::Tree::iterator& syntax::Tree::iterator::operator=(const Tree::iterator& rh)
51 void syntax::Tree::iterator::swap (const Tree::iterator& t)
53 current_ = t.current_;
56 Tree::iterator& Tree::iterator::operator++ ()
58 // car,cdr をそれぞれ巡回する。 car,cdr それぞれに移動する場合には、
59 // it を元の tree に渡して取得する。
61 // cons -> cdr に繋がっている cons
62 // ただし、 cdr に繋がっている cons が literal の場合、以降は進むことが
63 // 無く、また list として判定されることはない。
69 std::pair<DatumID, smart_ptr<literal::Literal> >& Tree::iterator::operator*()
71 // 現在の current_が指す node のリテラルを返す。
72 return (*current_)->datum;
75 std::pair<DatumID, smart_ptr<literal::Literal> >* Tree::iterator::operator->()
77 // 現在の current_が指す node のリテラルを返す。
78 return &((*current_)->datum);
81 bool Tree::iterator::operator==(const Tree::iterator& rh)
83 // node_が指す先が同一かどうかを返す。
84 // 但し、自身か相手のいずれかが nil である場合だけは例外的に、単純に DatumID のみの
86 return current_ == rh.current_;
93 Tree::Tree () : node_()
96 // smart_ptr<TreeNode> p(new TreeNode(makeNilList()));
97 // 最後尾には常にnilがいることにする。
100 Tree::iterator Tree::begin ()
104 it.current_ = node_.begin();
108 Tree::iterator Tree::end ()
112 it.current_ = node_.end();
116 void Tree::push_back(node_pair datum)
118 // 渡されたdatumを、現在保持しているデータ型に追加する。
119 smart_ptr<TreeNode> p(new TreeNode(datum));
120 node_.insert(node_.end(), p);
123 void Tree::push_back(Tree::iterator it, Tree::iterator it2,
126 // itとit2までを、datumで設定されたdatumidであるcompound datum
128 smart_ptr<TreeNode> p(new TreeNode(datum));
129 p->list.insert(p->list.end(), it.current_, it2.current_);
130 node_.insert(node_.end(), p);
133 Tree::iterator Tree::in_compound_begin(Tree::iterator it)
135 // itがcompound datumである場合に、compound datumの内部リストを返す。
136 if (isCompoundDatum(it))
139 ret.current_ = (*it.current_)->list.begin();
144 // 違う場合には、endを返すことにする。
149 Tree::iterator Tree::in_compound_end(Tree::iterator it)
151 // itがcompound datumである場合に、compound datumの内部リストを返す。
152 if (isCompoundDatum(it))
155 ret.current_ = (*it.current_)->list.end();
160 // 違う場合には、endを返すことにする。
165 //////////////////////
166 // helper functions //
167 //////////////////////
169 bool syntax::isCompoundDatum(Tree::iterator it)
171 if (it->first == syntax::DatumID::list ||
172 it->first == syntax::DatumID::vector ||
173 it->first == syntax::DatumID::byteVector)
183 std::pair<DatumID, smart_ptr<literal::Literal> > syntax::makeCompoundDatum (
186 // datum_id が list である node_pair を返す。
187 return std::pair<DatumID, smart_ptr<literal::Literal> >(id, smart_ptr<literal::Literal>());
190 std::pair<DatumID, smart_ptr<literal::Literal> > syntax::makeNilList ()
192 // datum_id が nil である node_pair を返す。
193 return std::pair<DatumID, smart_ptr<literal::Literal> >(
194 DatumID(DatumID::nil), smart_ptr<literal::Literal>());
197 std::pair<DatumID, smart_ptr<literal::Literal> > syntax::makeLexemeDatum (smart_ptr<literal::Literal> l,
200 // datum_id が各 lexeme であり、 literal として l を持つ
202 return std::pair<DatumID, smart_ptr<literal::Literal> >(
206 std::pair<DatumID, smart_ptr<literal::Literal> > syntax::makeAbbreviation (smart_ptr<literal::Literal> l)
208 // datum_id が literal であり、 literal として l を持つ
210 return std::pair<DatumID, smart_ptr<literal::Literal> >(
211 DatumID (DatumID::abbreviations), l);