Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.04.2023, 16:49   #1
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
По умолчанию добавить в код дерево вывода с++

мне нужно добавить в мой код дерево разбора с выводом помогите срочно
Код:
#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;
}
ChestIotVaga вне форума Ответить с цитированием
Старый 18.04.2023, 12:36   #2
molokoedov89.
Новичок
Джуниор
 
Регистрация: 18.04.2023
Сообщений: 1
По умолчанию чтот и я не справился)

увы
molokoedov89. вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить класс грамматики, построить вывод и дерево вывода Skoew Помощь студентам 0 09.10.2018 17:11
Tree - добавить узлы в дерево (Ребята помогите исправить код) Nastya2018 Общие вопросы по Java, Java SE, Kotlin 14 23.08.2018 11:41
Добавить sidebar на страницу вывода статей по рубрикам Tenass WordPress и другие CMS 1 18.04.2017 18:09
C# Задание с деревьями 1)Построить двоичное дерево и вывести его на экран 2)построить двоичное дерево поиска ekzo Помощь студентам 0 20.01.2017 12:00
в worde построить дерево вывода.задача решена на prologe 5.2 Kalinak Помощь студентам 2 01.11.2013 18:21