class lex : public lex_scanner {
  protected:
  iter<term>* _yacc;
  int so; int cd; int comment;
  void unso() { so = 0; cd = 0; comment = 0; }
  //int argc;
  //char argv[12][80];
  
  public:
  
  lex(istream* in = &cin, ostream* out = &cout ) : lex_scanner(in,out) {
          unso(); _yacc = 0;
          }
  //~lex() { in << endl; }
  
  term* operator()();
  
  virtual void process(istream* xin) {
                  lex l(xin);
                  l();
                  }
  
  void paths(int argc, char argv[24][256]) {
  //void paths(int argc, char** argv) {
          //cerr << "Calling paths" << endl;
          ::the_paths(argc,argv);
          //cerr << "Called paths" << endl;
          }
  
  void files(char* s, char* ext) {
  int argc=0;
  char argv[12][80];
  cerr << "FILES: " << s << endl;
  argc = unflatten(s,argv);
  for( int i = 1; i <= argc; i++ ) {
          //cerr << "Reading:" << argv[i] << "***" << endl;
          (*yyout) << endl;
          soinc(argv[i],ext);
          (*yyout) << endl;
          //cerr << "end reading:" << argv[i] << "***" << endl;
          }
  }
  
  void directories(char* s, char* ext, char* f = 0) {
  int argc=0;
  char argv[12][80];
  //cerr << "DIRS: " << s << endl;
  argc = unflatten(s,argv);
  for( int i = 1; i <= argc; i++ ) {
          //cerr << "reading " << argv[i];
          char buf[1024];
          strcpy(buf,_prefix);
          cerr << "ORIG PREFIX " << _prefix << endl;
          cdinc(argv[i],f,ext);
          strcpy(_prefix,buf);
          cerr << "RESTORING PREFIX " << _prefix << endl;
          }
  }
          
  void soinc(char* s, char* ext = "") {
                  lex_file f(s,ext);
                  istream* xin = f.stream();
                  this->process(xin);
                  }
  
  void cdinc(char* s, char* f = 0, char* ext = "") {
                  if (f && !strcmp(f,"")) f = 0;
                  (*yyout) << endl;
                  prefix(s);
                  cerr << "PREFIX " << _prefix << endl;
                  lex_directory x(s,ext);
                  char buf[1024];
                  sprintf(buf,"%s",f?f:strip(s));
                  //cerr << "Getting " << buf << endl;
                  soinc( buf, ext);
                  //soinc( strip(s), ext);
                  //istream* xin = f.stream();
                  //this->process(xin);
                  }
  };

slide: lex