ВУЗ:
Составители:
55
ifstream fi(fname); 
    N.clear(); 
    T.clear(); 
    P.clear(); 
    // ввод нетерминалов 
    fi >> n; 
    for (i = 0; i < n; i++){ 
        fi >> c; 
        N.insert(c); 
    } 
    // ввод терминалов 
    fi >> n; 
    for (i = 0; i < n; i++){ 
        fi >> c; 
        T.insert(c); 
    } 
    // ввод правил 
    fi >> n; 
    for (i = 0; i < n; i++){ 
        fi >> r.first >> r.second; 
        P.insert(r); 
    } 
    // начальный символ 
    fi >> S; 
} 
string Grammar::AsString(){ 
    string res = ""; 
    charset::iterator i; 
    res += "Nonterminals ("; 
    res += IntToStr(N.size()).c_str(); 
    res += ") : "; 
    for (i = N.begin(); i != N.end(); i++){ 
        res += *i; 
        res += " "; 
    } 
    res += "\nTerminals ("; 
    res += IntToStr(T.size()).c_str(); 
    res += ") : "; 
    for (i = T.begin(); i != T.end(); i++){ 
        res += *i; 
        res += " "; 
    } 
    res += "\nRules ("; 
    res += IntToStr(P.size()).c_str(); 
    res += ")\n"; 
    for (rulemap::iterator j = P.begin(); j != P.end(); 
j++){ 
        res += "\t"; 
        res += j->first; 
        res += " -> " + j->second + "\n"; 
    } 
    res += "Starting symbol: "; 
    res += S; 
    res += "\n"; 
    return res; 
} 
void Grammar::OutGrammar(char *fname){ 
    ofstream fo(fname); 
    charset::iterator i; 
    fo << N.size() << "\n"; 
    for (i = N.begin(); i != N.end(); i++) 
        fo << *i; 
    fo << "\n" << T.size() << "\n"; 
    for (i = T.begin(); i != T.end(); i++) 
        fo << *i; 
    fo << "\n" << P.size() << "\n"; 
    for (rulemap::iterator j = P.begin(); j != P.end(); 
j++) 
        fo << j->first << " " << j->second << "\n"; 
    fo << "\n" << S; 
} 
void FAutomat::SetGrammar(Grammar *NG){ 
    G = NG; 
} 
void FAutomat::CreateAutomat(){ 
    rulemap::iterator i, j; 
    rule r; 
    char c, t; 
    int k; 
    // поиск незанятого символа 
    for(c = 'A'; G->N.count(c); c++); 
    // поиск правил вида  A -> a без A -> aB 
    for(i = G->P.begin(); i != G->P.end(); i++) 
        if (i->second.length() == 1 && G->T.count(i-
>second[0])){ 
            for(j = G->P.lower_bound(i->first), k = G-
>P.count(i->first); k; j++, k--) 
                if (j->second.length() == 2 && j-
>second[0] == i->second[0] && G->N.count(j-
>second[1])) 
                    break; 
            if (!k){ 
                // добавление правила вида A -> aC 
                r.first = i->first; 
                r.second = i->second + c; 
                G->P.insert(r); 
                G->N.insert(c); 
            } 
        } 
    // начальный символ 
    H = G->S; 
    // состояния 
    Q = G->N; 
Лист
18
                                                             res += S;
                                                             res += "\n";
ifstream fi(fname);                                          return res;
   N.clear();                                            }
   T.clear();
   P.clear();                                            void Grammar::OutGrammar(char *fname){
   // ввод нетерминалов                                    ofstream fo(fname);
   fi >> n;                                                charset::iterator i;
   for (i = 0; i < n; i++){                                fo << N.size() << "\n";
      fi >> c;                                             for (i = N.begin(); i != N.end(); i++)
      N.insert(c);                                            fo << *i;
   }                                                       fo << "\n" << T.size() << "\n";
   // ввод терминалов                                      for (i = T.begin(); i != T.end(); i++)
   fi >> n;                                                   fo << *i;
   for (i = 0; i < n; i++){                                fo << "\n" << P.size() << "\n";
      fi >> c;                                             for (rulemap::iterator j = P.begin(); j != P.end();
      T.insert(c);                                       j++)
   }                                                          fo << j->first << " " << j->second << "\n";
   // ввод правил                                          fo << "\n" << S;
   fi >> n;                                              }
   for (i = 0; i < n; i++){
      fi >> r.first >> r.second;                         void FAutomat::SetGrammar(Grammar *NG){
      P.insert(r);                                         G = NG;
   }                                                     }
   // начальный символ
   fi >> S;                                              void FAutomat::CreateAutomat(){
}                                                          rulemap::iterator i, j;
                                                           rule r;
string Grammar::AsString(){                                char c, t;
   string res = "";                                        int k;
   charset::iterator i;                                    // поиск незанятого символа
   res += "Nonterminals (";                                for(c = 'A'; G->N.count(c); c++);
   res += IntToStr(N.size()).c_str();                      // поиск правил вида A -> a без A -> aB
   res += ") : ";                                          for(i = G->P.begin(); i != G->P.end(); i++)
   for (i = N.begin(); i != N.end(); i++){                    if (i->second.length() == 1 && G->T.count(i-
      res += *i;                                         >second[0])){
      res += " ";                                                for(j = G->P.lower_bound(i->first), k = G-
   }                                                     >P.count(i->first); k; j++, k--)
   res += "\nTerminals (";                                          if (j->second.length() == 2 && j-
   res += IntToStr(T.size()).c_str();                    >second[0] == i->second[0] && G->N.count(j-
   res += ") : ";                                        >second[1]))
   for (i = T.begin(); i != T.end(); i++){                             break;
      res += *i;                                                 if (!k){
      res += " ";                                                   // добавление правила вида A -> aC
   }                                                                r.first = i->first;
   res += "\nRules (";                                              r.second = i->second + c;
   res += IntToStr(P.size()).c_str();                               G->P.insert(r);
   res += ")\n";                                                    G->N.insert(c);
   for (rulemap::iterator j = P.begin(); j != P.end();           }
j++){                                                         }
      res += "\t";                                         // начальный символ
      res += j->first;                                     H = G->S;
      res += " -> " + j->second + "\n";                    // состояния
   }                                                       Q = G->N;
  res += "Starting symbol: ";
                                                                                                           Лист
                                                                                                           18
                                                                                                                 55
