
Лаб. 5 ПиАПС
.docxЛ а б о р а т о р н а я р а б о т а № 5
«Реализация одного из паттернов поведения»
Цель работы: Применение паттерна проектирования Interpreter (интерпетатор)
#include <iostream>
#include <regex>
#include <string>
#include <vector>
using namespace std;
// Интерфейс для интерпретатора
class Expression {
public:
virtual string interpret(string& context) = 0;
virtual ~Expression() = default;
};
// Удаление пробелов
class RemovingSpacesExpression : public Expression {
public:
string interpret(string& context) override {
string result = context;
// 1. Удаление пробелов в начале и в конце строки
result = regex_replace(result, regex("^[ ]+|[ ]+$"), "");
// 2. Замена двух и более пробелов в любом месте строки на один
result = regex_replace(result, regex("[ ]{2,}"), " ");
// 3. Удаление пробела после открывающей скобки "("
result = regex_replace(result, regex("\\([ ]+"), "(");
// 4. Удаление пробела перед закрывающей скобкой ")"
result = regex_replace(result, regex("[ ]+\\)"), ")");
// 5. Удаление пробела перед запятой ","
result = regex_replace(result, regex("[ ]+,"), ",");
// 6. Удаление пробела перед точкой "."
result = regex_replace(result, regex("[ ]+\\."), ".");
return result;
}
};
// Замена дефисов на длинное тире
class HyphenToDashExpression : public Expression {
public:
string interpret(string& context) override {
return regex_replace(context, regex("-"), "—");
}
};
// Замена “ и ” на « и »
class ReplacingQuotationMarksExpression : public Expression {
public:
string interpret(string& context) override {
string result = context;
result = regex_replace(result, regex("“"), "«");
result = regex_replace(result, regex("”"), "»");
return result;
}
};
// Удаление табуляций
class FixTabsExpression : public Expression {
public:
string interpret(string& context) override {
string result = context;
// Заменяет одиночные табуляции в тексте на один пробел
result = regex_replace(result, regex("\t"), " ");
return result;
}
};
// Удаление повторяющихся знаков переноса строки
class FixNewlinesExpression : public Expression {
public:
string interpret(string& context) override {
string result = context;
result = regex_replace(result, regex("\n{2,}"), "\n");
return result;
}
};
// Контекст для обработки строки через интерпретаторы
class Context {
private:
vector<Expression*> expressions;
public:
void addExpression(Expression* expr) {
expressions.push_back(expr);
}
string processing(string& input) {
string result = input;
for (Expression* expr : expressions) {
result = expr->interpret(result);
}
return result;
}
~Context() {
for (Expression* expr : expressions) delete expr;
}
};
int main() {
//Alt + 0150 = – дефис
//Alt + 0151 = — тире
setlocale(LC_ALL, "rus");
string inputText = "\t\t ( Hello ,\t – — “World” )\n .\t \n ";
// Создание обработчик текста
Context context;
context.addExpression(new RemovingSpacesExpression());
context.addExpression(new HyphenToDashExpression());
context.addExpression(new ReplacingQuotationMarksExpression());
context.addExpression(new FixTabsExpression());
context.addExpression(new FixNewlinesExpression());
// Запуск обработки
string result = context.processing(inputText);
cout << "Исходный текст: [" << inputText << "]" << endl;
cout << "Обработанный текст: [" << result << "]" << endl;
return 0;
}