 // Purpose.  Interpreter                private:
 //                                         C c;  D d;
 // Define a grammar for a language,     };
 // and map each rule to a class.
                                         class Acti { public:
 #include <iostream.h>                      int eval( char* i, char* o ) {
 #include <string.h>                           if (e.eval(i,o)) return 1;
                                               if (f.eval(i,o)) return 1;
 int sub(char* i, char* o, char* c) {          return 0; }
    strcat(o, c);  strcpy(i, &(i[1]));   private:
    return 1; }                             E e;  F f;
                                         };
 class A { public:                       class Pass { public:
    int eval( char* i, char* o ) {          int eval( char* i, char* o ) {
       if (i[0] == 'a')                        if (g.eval(i,o)) return 1;
          return sub(i,o,"1");                 if (h.eval(i,o)) return 1;
       return 0; } };                          return 0; }
 class B { public:                       private:
    int eval( char* i, char* o ) {          G g;  H h;
       if (i[0] == 'b')                  };
          return sub(i,o,"2");
       return 0; } };                    class NP { public:
 class C { public:                          int eval( char* i, char* o ) {
    int eval( char* i, char* o ) {             if (arti.eval(i,o))
       if (i[0] == 'c')                           if (noun.eval(i,o)) return 1;
          return sub(i,o,"3");                 return 0; }
       return 0; } };                    private:
 class D { public:                          Arti arti;  Noun noun;
    int eval( char* i, char* o ) {       };
       if (i[0] == 'd')                  class Verb { public:
          return sub(i,o,"4");              int eval( char* i, char* o ) {
       return 0; } };                          if (acti.eval(i,o)) return 1;
 class E { public:                             if (pass.eval(i,o)) return 1;
    int eval( char* i, char* o ) {             return 0; }
       if (i[0] == 'e')                  private:
          return sub(i,o,"5");              Acti acti;  Pass pass;
       return 0; } };                    };
 class F { public:
    int eval( char* i, char* o ) {       class Sent { public:
       if (i[0] == 'f')                     int eval( char* i, char* o ) {
          return sub(i,o,"6");                 if (np.eval(i,o))
       return 0; } };                             if (verb.eval(i,o)) return 1;
 class G { public:                             return 0; }
    int eval( char* i, char* o ) {       private:
       if (i[0] == 'g')                     NP np;  Verb verb;
          return sub(i,o,"7");           };
       return 0; } };
 class H { public:                       void main( void )
    int eval( char* i, char* o ) {       {
       if (i[0] == 'h')                     Sent S;  char* t[] = {"ace","bdh",
          return sub(i,o,"8");                            "abc","ceg","bcfgh"};
       return 0; } };                       char  i[10], o[10];
                                            for (int j=0; j < 5; j++) {
 class Arti { public:                          strcpy(i,t[j]); strcpy(o,"");
    int eval( char* i, char* o ) {             cout << i << " is ";
       if (a.eval(i,o)) return 1;              if ( ! S.eval(i,o) || i[0])
       if (b.eval(i,o)) return 1;                 cout << "bad" << endl;
       return 0; }                             else
 private:                                         cout << o << endl; }
    A a;  B b;                           }
 };
 class Noun { public:                    // ace is 135
    int eval( char* i, char* o ) {       // bdh is 248
       if (c.eval(i,o)) return 1;        // abc is bad
       if (d.eval(i,o)) return 1;        // ceg is bad
       return 0; }                       // bcfgh is bad

