Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.49 KB | None | 0 0
  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7.  
  8. template<class T>
  9. class M{
  10. public:
  11.     T endline;
  12.     int ruleslimit;
  13.     int count;
  14.     map < int, vector<T> > from;
  15.     map < int, vector<T> > to;
  16.     map < int, bool> term;
  17.     vector<T> line;
  18.  
  19.     M(T e, int rl = 100) {
  20.         endline = e;
  21.         ruleslimit = rl;
  22.         count = 0;
  23.     }
  24.  
  25.         // endline - символ конца строки,
  26.  
  27.         // ruleslimit - максимальное количество правил для автомата
  28.  
  29.         // начальное состояние алгорифма - пустая строка
  30.  
  31.     bool add_rule(const T* search, const T* replace, bool isterm) {
  32.         ruleslimit--;
  33.         if (ruleslimit < 0) {
  34.             return false;
  35.         }
  36.         vector<T> s, r;
  37.         for (int i = 0; search[i+1] != endline; i++){
  38.             s.push_back(search[i]);
  39.         }
  40.         for (int i = 0; replace[i + 1] != endline; i++){
  41.             r.push_back(replace[i]);
  42.         }
  43.         count++;
  44.         from[count] = s;
  45.         to[count] = r;
  46.         term[count] = isterm;
  47.     }
  48.  
  49.         // возвращает, удалось ли добавить правило, false если лимит исчерпан
  50.  
  51.         // search - строка, которую ищут
  52.  
  53.         // replace - строка, на которую заменяют
  54.  
  55.         // isterm - является ли правило терминальным, true если является
  56.  
  57.     bool add_rule(bool isterm, ...) {
  58.         ruleslimit--;
  59.         if (ruleslimit < 0) {
  60.             return false;
  61.         }
  62.         bool *p = &isterm;
  63.         //p++;
  64.         T* pp = (T*)p;
  65.         pp++;
  66.         vector<T> s, r;
  67.         for (; *pp != endline; pp++) {
  68.             s.push_back(*pp);
  69.         }
  70.         pp++;
  71.         for (; *pp != endline; pp++) {
  72.             r.push_back(*pp);
  73.         }
  74.         count++;
  75.         from[count] = s;
  76.         to[count] = r;
  77.         term[count] = isterm;
  78.         return true;
  79.     }
  80.  
  81.         // isterm - является ли правило терминальным, true если является
  82.  
  83.         // … через запятую записаны элементы строк, сначала search потом replace обе
  84.  
  85.         // заканчиваются символами конца строки
  86.  
  87.     void set_state(const T* state) {
  88.         for (T* p = (T*)state; *p != endline; p++){
  89.             line.push_back(*p);
  90.         }
  91.     }
  92.         // устанавливает текущую строку
  93.  
  94.     void set_state(T firstchar, ...) {
  95.         T *p = &firstchar;
  96.         for (; *(p + 1) != endline; p++){
  97.             line.push_back(*p);
  98.         }
  99.     }
  100.  
  101.         // устанавливает текущую строку
  102.  
  103.     const T* get_state() const {
  104.         T* word = new T[line.size()];
  105.         for (int i = 0; i < line.size(); i++){
  106.             word[i] = line[i];
  107.         }
  108.         return word;
  109.     }
  110.  
  111.         // возвращает состояние алгорифма
  112.  
  113.     int run(int limit = 1000000) {
  114.         int lim = 0;
  115.         while (lim++ < limit) {
  116.             bool f = false;
  117.             for (int i = 1; i <= count; i++) {
  118.                 vector<T> m = (*from.find(i)).second;
  119.                 int n = find(line, (*from.find(i)).second);
  120.                 if ((n != -1) && !f) {
  121.                     f = true;
  122.                     for (int j = n; j < (*to.find(i)).second.size() + n; j++){
  123.                         line[j] = to[i][j - n];
  124.                     }
  125.                     if (term[i]) {
  126.                         return lim;
  127.                     }
  128.                 }
  129.             }
  130.             if (!f) {
  131.                 return -1;
  132.             }
  133.  
  134.         }
  135.         return -1;
  136.     }
  137.  
  138.         // запускает автомат, автомат должен сделать не более limit шагов
  139.  
  140.         // если на каком-то шаге не удалось применить какое-то правило, то автомат останавливается
  141.  
  142.         // функция должна возвращять номер шага, на котором остановится автомат
  143.  
  144.         // если автомат не остановился за limit шагов, то вернуть -1 (т.е. если было сделано limit замен, и
  145.  
  146.         //последнее из применённых limit правил было терминальным – возвращаем limit, иначе - 1).
  147.    
  148.     int find(vector<T> mass, vector<T> podmass) {
  149.         int n = 0;
  150.         bool t = false;
  151.         for (int i = 0; i < mass.size(); i++) {
  152.             if (mass[i] == podmass[0]) {
  153.                 t = true;
  154.                 n = i;
  155.             }
  156.             if (t && podmass.size() <= mass.size() - n + 1) {
  157.                 for (int j = 0; j < podmass.size(); j++) {
  158.                     t = mass[n + j] == podmass[j];
  159.                 }
  160.             }
  161.             if (t) {
  162.                 return n;
  163.             }
  164.         }
  165.         return -1;
  166.     }
  167. };
  168.  
  169. int main() {
  170.     M<int> m(0, 9);
  171.     m.add_rule(false, 3, 0, 4, 0);
  172.     int *p = new int[3];
  173.     p[0] = 2;
  174.     p[1] = 3;
  175.     p[2] = 0;
  176.     m.set_state(p);
  177.     m.run();
  178.     for (int i = 0; i < m.line.size(); i++) {
  179.         cout << m.line[i];
  180.     }
  181.     cout << " ";
  182.     return 0;
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement