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

ЛР4 Саляхов

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

int elseTriadIndex = elseUniqueQueue.front();

elseUniqueQueue.pop();

int actionTriadIndex = actionUniqueQueue.front();

actionUniqueQueue.pop();

Triad newTriad("else", "^" + to_string(elseTriadIndex), "^" + to_string(actionTriadIndex));

if (find(uniqueTriads.begin(), uniqueTriads.end(), newTriad) == uniqueTriads.end()) {

uniqueTriads.push_back(newTriad);

elseUniqueQueue.push(++lastTriadIndex);

}

}

elseUniqueQueue.push(++lastTriadIndex);

}

i++;

}

}

void printTriads() {

cout << "Триады:" << endl;

for (size_t i = 0; i < triads.size(); i++) {

cout << i << ": " << triads[i].operation << " (" << triads[i].operand1 << ", " << triads[i].operand2 << ")" << endl;

}

}

void printUniqueTriads() {

cout << "Триады без повторений:" << endl;

for (size_t i = 0; i < uniqueTriads.size(); i++) {

cout << i << ": " << uniqueTriads[i].operation << " (" << uniqueTriads[i].operand1 << ", " << uniqueTriads[i].operand2 << ")" << endl;

}

}

int main() {

setlocale(LC_ALL, "Russian");

ifstream file("D:/input4.txt");

if (!file) {

cerr << "Не удалось открыть файл." << endl;

return 1;

}

string line, text;

while (getline(file, line)) {

text += line + '\n';

}

file.close();

vector<Lexeme> lexemes = lexicalAnalysis(text);

cout << "Лексема\t\tТип лексемы\t\tЦепочка" << endl;

cout << "--------------------------------------------------------" << endl;

for (const auto& lex : lexemes) {

cout << lex.value << "\t\t" << lex.type << "\t\t" << lex.chain << endl;

}

if (!hasUnknownLexeme)

{

cout << "\nРезультаты синтаксического анализа:" << endl;

syntaxAnalysis(lexemes);

generateTriads(lexemes);

cout << endl;

printTriads();

generateUniqueTriads(triads);

cout << endl;

printUniqueTriads();

}

else

{

cout << "\nВ файле найдены ошибки, невозможно запустить синтаксический анализ" << endl;

}

return 0;

}

Результат работы программы:

Цепочка if A > B then P := X else if A > B then P := X else if A = B then H := V;

Вывод:

В результате лабораторной работы № 4 построен генератор списка триад, порождающий триады для арифметических операций и оператора присваивания. Генератор списка триад обнаруживает семантические ошибки, связанные с присваиванием значений константам (когда первый операнд оператора присваивания — константа). При наличии одной ошибки пользователю выдается сообщение об ошибки. При наличии нескольких ошибок обнаруживается только первая из них, и дальнейший анализ исходного текста прекращается.

Построенный генератор также выполняет оптимизацию списка триад методом исключения лишних операций, что позволяет сократить объем результирующего списка триад и время выполнения объектного кода, который может быть построен на его основе. После выполнения оптимизации генератор списка триад может удалять из списка триады.

Соседние файлы в предмете Системное программное обеспечение