мне нужно добавить в мой код дерево разбора с выводом помогите срочно
Код:
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <stack>
using namespace std;
// Структура для представления лексемы
struct Lexeme {
string token;
string lexeme;
};
// Функция для выполнения лексического анализа
vector<Lexeme> lexicalAnalysis(string input) {
// Здесь можно внести правила лексического анализа на основе таблицы терминальных символов
vector<Lexeme> lexemes;
// Разделение входного текста на лексемы
// Пример реализации для данной грамматики:
size_t pos = 0;
while (pos < input.length()) {
Lexeme lexeme;
if (input[pos] == ';') {
lexeme.token = "S";
lexeme.lexeme = ";";
pos++;
}
else if (input[pos] == 'i' && input[pos + 1] == 'f') {
lexeme.token = "F";
lexeme.lexeme = "if";
pos += 2;
}
else if (input[pos] == 'a') {
lexeme.token = "C";
lexeme.lexeme = "a";
pos++;
}
else if (input[pos] == 't' && input[pos + 1] == 'h' && input[pos + 2] == 'e' && input[pos + 3] == 'n') {
lexeme.token = "T";
lexeme.lexeme = "then";
pos += 4;
}
else if (input[pos] == 'e' && input[pos + 1] == 'l' && input[pos + 2] == 's' && input[pos + 3] == 'e') {
lexeme.token = "E";
lexeme.lexeme = "else";
pos += 4;
}
else if (input[pos] == ':' && input[pos + 1] == '=') {
lexeme.token = "T";
lexeme.lexeme = ":=";
pos += 2;
}
else if (input[pos] == '|' || input[pos] == 'x' || input[pos] == 'o' || input[pos] == 'r') {
lexeme.token = "E";
lexeme.lexeme = string(1, input[pos]);
pos++;
}
else if (input[pos] == 'a' && input[pos + 1] == 'n' && input[pos + 2] == 'd') {
lexeme.token = "D";
lexeme.lexeme = "and";
pos += 3;
}
else if (input[pos] == '(' || input[pos] == ',') {
lexeme.token = "C";
lexeme.lexeme = string(1, input[pos]);
pos++;
}
else {
// Обработка ошибок, если встретился неизвестный символ
cout << "Ошибка: неизвестный символ " << input[pos] << endl;
exit(1);
}
lexemes.push_back(lexeme);
}
return lexemes;
}
// Функция для выполнения синтаксического разбора
void syntaxAnalysis(vector<Lexeme> lexemes) {
// Здесь можно внести правила синтаксического разбора на основе грамматики
// и строить дерево разбора
// Пример реализации для данной грамматики:
stack<string> stack;
stack.push("S"); // Загружаем начальный символ грамматики
cout << "Начало синтаксического разбора..." << endl;
while (!stack.empty()) {
string top = stack.top();
stack.pop();
if (top == lexemes[0].token) {
// Если верхушка стека совпадает с текущей лексемой, считаем их сопоставленными
cout << "Сопоставлено: " << top << " = " << lexemes[0].lexeme << endl;
lexemes.erase(lexemes.begin()); // Удаляем сопоставленную лексему
}
else {
// Иначе, обрабатываем ошибку
cout << "Ошибка: неожиданный символ " << lexemes[0].lexeme << ", ожидается " << top << endl;
exit(1);
}
}
cout << "Синтаксический разбор завершен успешно." << endl;
}
int main() {
setlocale(LC_ALL, "rus");
string input;
cout << "Введите текст для лексического анализа: ";
getline(cin, input);
// Выполняем лексический анализ
vector<Lexeme> lexemes = lexicalAnalysis(input);
// Выводим результат лексического анализа
cout << "Результат лексического анализа:" << endl;
for (const Lexeme& lexeme : lexemes) {
cout << "Токен: " << lexeme.token << ", Лексема: " << lexeme.lexeme << endl;
}
// Выполняем синтаксический разбор
syntaxAnalysis(lexemes);
return 0;
}