Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб. 5 ПиАПС

.docx
Скачиваний:
0
Добавлен:
29.05.2025
Размер:
105.85 Кб
Скачать

Л а б о р а т о р н а я р а б о т а № 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;

}

Соседние файлы в предмете Проектирование и архитектура программных систем