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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.04.2023, 22:35   #1
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
Счастье Построение простейшего дерева вывода

Ребят нужна помощь не могу понять как построить простейшее дерево вывода : исходя из моего варианта мне нужно идентификаторы и шестнадцатеричные числа, ещё данны множества крайних левых и крайних правых : символ U: S,F,E,D,C L(u): F, if a, if a , E,D D,c R(U): F, E ,D, T, E,D D,C C,a) a,) ребят очень прошу помогите голову уже неделю ломаю решить это надо помоги если не сложно на c++
ChestIotVaga вне форума Ответить с цитированием
Старый 15.04.2023, 19:32   #2
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() {
    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 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
построение дерева в C# s4egol Помощь студентам 1 25.12.2014 19:35
Построение Б-дерева MariaD Помощь студентам 2 25.10.2013 15:23
Построение дерева Vellosity Общие вопросы C/C++ 1 31.03.2012 18:25
запрос для вывода дерева. bondik SQL, базы данных 1 06.12.2010 07:50
Построение дерева TzX Компоненты Delphi 2 20.07.2010 15:20