Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int run(int limit = 1000000) {
- int lim = 0;
- while (lim++ < limit) { //типа пока не превысим лимит, продолжаем проверять на совпадения подслов из слова с левыми частями правила
- bool f = false;
- for (int i = 1; i <= count; i++) { //по номеру правила
- vector<T> m = (*from.find(i)).second; //это левая часть правила
- int n = find(line, m); //сверяем ее с подсловами нашего слова
- if ((n != -1) && !f) { //если нашлось, и в этом шаге мы еще не нашли слово, то
- f = true; //помечаем, что мы нашли подходящее правило (кстати, тут очень неэффективно, но не хочется переделывать)
- vector<T> stroka; //это будет подсловом нашего слова, которое следует за тем куском слова, который соответсвует найденному правилу, вытащим его, чтобы можно было впендюрить слово-замену из правой части правила
- if (!m.empty()){ //КОНТРОЛЬНЫЙ ВОПРОС: если в правиле слева пустое слово, то добавлять в конец или в начало????
- for (int k = n + m.size(); k < line.size(); k++){ //но я добавляю в конец, потому что, я дура, кажется, что все же в начало..
- stroka.push_back(line[k]); //поэтому тут лучше переделать для пустого правила
- }
- line.erase(line.begin() + n, line.end()); //удаляем символы, которые будут заменены
- }
- for (int j = 0; j < (*to.find(i)).second.size(); j++){
- line.push_back(to[i][j]); //добавляем символы к оставшейся части слова из правой части правила
- }
- for (int i = 0; i < stroka.size(); i++){
- line.push_back(stroka[i]); //добавляем ту хуйню, которую мы вырезали для вставки
- }
- if (term[i]) { //и если правило было терминальным, то кикаемся с количеством проделанных операций
- return lim;
- }
- }
- }
- if (!f) { //если после прохода по всем правилам, ничего не подошло, то кикаемся с -1
- return - 1;
- }
- }
- return -1; //если привышен лимит
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement