#include <iostream>
#include <sstream>
#include "model/nonterminal_rules/wfe_nonterminal.h"

using namespace std;

extern list<string> parsed_expressions;

// ---------------------------------------------------------------------------

// Made global so that anyone can call Print_Strings
wfe_nonterminal start;

void Print_Strings(ostream &in_stream)
{
  const list<string> start_string_list = start.Get_String();
  bool need_space = false;

  in_stream << "--" << endl;

  list<string>::const_iterator a_string;
  for (a_string = start_string_list.begin();
       a_string != start_string_list.end();
       a_string++)
  {
    if(need_space)
      in_stream << " ";
    else
      need_space = true;

    in_stream << *a_string;

    if (a_string->size() > 0 && a_string->substr(a_string->size()-1,1) == "\n")
      need_space = false;

    if (*a_string == "-")
      need_space = false;
  }

  in_stream << endl;
}

// ---------------------------------------------------------------------------

int main(int argc, char *argv[])
{
  if (argc != 2)
  {
    cerr << "You must provide a number to generate\n";
    return 1;
  }

  istringstream number_string(argv[1]);

  unsigned int allowed_length;

  number_string >> allowed_length;

  cout << "Initializing grammar..." << endl;

  start.Reset_String(allowed_length);

  cout << "Generating strings..." << endl;

  while(start.Check_For_String())
  {
    Print_Strings(cout);
  }

  return 0;
}