lisp2tree.cpp

#include <iostream>
#include <sstream>
#include "tree.h"
using namespace std;
using aed::tree;

/* COMIENZO DE DESCRIPCION

   __USE_WIKI__

   Esta version delega la conversion de string a #T# al
   #operator>>(istream,T)...# entonces se hace generico y
   funciona para cualquier tipo de dato al que se le pueda
   hacer un #cin>>d;#

   keywords: arbol orientado

FIN DE DESCRIPCION */

template<typename T>
bool lisp2tree(stringstream &ss, aed::tree<T> &t,
         typename aed::tree<T>::iterator it) {
  char aux;
  streampos pos = ss.tellg();
  while (ss>>aux) {
    if (aux=='(') {
      T data; if (!(ss>>data)) return false;
      it = t.insert(it, data);
      if (!lisp2tree(ss, t, it.lchild())) return false;
      ++ it;
    } else if (aux == ')') {
      return true;
    } else {
      ss.seekg(pos);
      T data; if (!(ss>>data)) return false;
      it = t.insert(it, data);
      ++ it;
    }
    pos = ss.tellg();
  }
  return true;
}

template<typename T>
bool lisp2tree(string s, tree<T> &t) {
  assert(t.empty());
  stringstream ss; ss<<s;
  return lisp2tree(ss,t,t.begin());
}

int main() {
  tree<char> t2; 
  lisp2tree("(A (B C (D (E F G))) (H I (J K L) (M N)))",t2);
  cout << "t2 = "; t2.lisp_print(); cout << endl;
}

Generated by GNU Enscript 1.6.6.