// 
// b1.c ... 構文木の基本操作の利用例
// 

#include <stdio.h>
#include "tree.h"

// 構文木の表示
void print(char *str, Tree *t) {
  printf("%s: ", str); show_tree(t); putchar('\n');    // 内部構造を表示
  //printf("%s: ", str); print_tree(t); putchar('\n');    // 式の文字列を表示
}

int main(void) {
  // 単純な木の生成
  Tree *tree_123, *tree_abc;
  tree_123 = make_number_tree(123); print("tree_123", tree_123);
  tree_abc = make_name_tree("abc"); print("tree_abc", tree_abc);
  putchar('\n');

  // リスト末尾への要素の追加
  Tree *list = make_list_tree(); print("list", list);
  add_subtree(list, make_name_tree("a")); print("list", list);
  add_subtree(list, make_name_tree("b")); print("list", list);
  add_subtree(list, make_name_tree("c")); print("list", list);
  putchar('\n');

  // 部分木の参照
  int num = num_subtree(list);
  printf("num=%d\n", num);
  int i;
  for (i = 0; i < num; i++) {
    printf("subtree(list, %d)", i);
    print("subtree(list)", get_subtree(list, i));
  }
  putchar('\n');

  // 式を表す構文木の生成
  //【課題b1】式 (* (+ x 1) 2) を表す構文木を生成して表示

  return 0;
}