Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1.  
  2. int run(int limit = 1000000) {
  3. int lim = 0;
  4. while (lim++ < limit) { //типа пока не превысим лимит, продолжаем проверять на совпадения подслов из слова с левыми частями правила
  5. bool f = false;
  6. for (int i = 1; i <= count; i++) { //по номеру правила
  7. vector<T> m = (*from.find(i)).second; //это левая часть правила
  8. int n = find(line, m); //сверяем ее с подсловами нашего слова
  9. if ((n != -1) && !f) { //если нашлось, и в этом шаге мы еще не нашли слово, то
  10. f = true; //помечаем, что мы нашли подходящее правило (кстати, тут очень неэффективно, но не хочется переделывать)
  11. vector<T> stroka; //это будет подсловом нашего слова, которое следует за тем куском слова, который соответсвует найденному правилу, вытащим его, чтобы можно было впендюрить слово-замену из правой части правила
  12. if (!m.empty()){ //КОНТРОЛЬНЫЙ ВОПРОС: если в правиле слева пустое слово, то добавлять в конец или в начало????
  13. for (int k = n + m.size(); k < line.size(); k++){ //но я добавляю в конец, потому что, я дура, кажется, что все же в начало..
  14. stroka.push_back(line[k]); //поэтому тут лучше переделать для пустого правила
  15. }
  16. line.erase(line.begin() + n, line.end()); //удаляем символы, которые будут заменены
  17. }
  18. for (int j = 0; j < (*to.find(i)).second.size(); j++){
  19. line.push_back(to[i][j]); //добавляем символы к оставшейся части слова из правой части правила
  20. }
  21. for (int i = 0; i < stroka.size(); i++){
  22. line.push_back(stroka[i]); //добавляем ту хуйню, которую мы вырезали для вставки
  23. }
  24. if (term[i]) { //и если правило было терминальным, то кикаемся с количеством проделанных операций
  25. return lim;
  26. }
  27. }
  28. }
  29. if (!f) { //если после прохода по всем правилам, ничего не подошло, то кикаемся с -1
  30. return - 1;
  31. }
  32.  
  33. }
  34. return -1; //если привышен лимит
  35. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement