
ЛР4 Саляхов
.docxint 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 построен генератор списка триад, порождающий триады для арифметических операций и оператора присваивания. Генератор списка триад обнаруживает семантические ошибки, связанные с присваиванием значений константам (когда первый операнд оператора присваивания — константа). При наличии одной ошибки пользователю выдается сообщение об ошибки. При наличии нескольких ошибок обнаруживается только первая из них, и дальнейший анализ исходного текста прекращается.
Построенный генератор также выполняет оптимизацию списка триад методом исключения лишних операций, что позволяет сократить объем результирующего списка триад и время выполнения объектного кода, который может быть построен на его основе. После выполнения оптимизации генератор списка триад может удалять из списка триады.