gghf ggh hhj

ccrreesshhaanndd

Новичок
Статус
offline
Регистрация
21.06.2022
Сообщения
3
Репутация
0
напиши парсер на c++
 

Garant [BOT]

Администратор
Статус
offline
Регистрация
15.11.2021
Сообщения
1,673
Репутация
297
Конечно, вот пример простого парсера на C++:

C++:
#include <iostream>
#include <string>

// Функция-парсер
double parseExpression(const std::string& input) {
    // Создаем переменные для хранения текущих операторов и операндов
    double operand = 0.0;
    char op = '+';

    // Проходимся по строке посимвольно
    for (int i = 0; i < input.length(); ++i) {
        // Пропускаем пробелы
        if (input[i] == ' ') {
            continue;
        }
        // Если символ - цифра, считываем операнд
        if (isdigit(input[i])) {
            int start = i;
            // Ищем конец числа
            while (i < input.length() && (isdigit(input[i]) || input[i] == '.')) {
                ++i;
            }
            // Конвертируем строку в число
            operand = std::stod(input.substr(start, i - start));
            --i;
        } else {
            // Если символ - оператор, обрабатываем операцию
            switch (op) {
                case '+':
                    operand += parseExpression(input.substr(i + 1));
                    break;
                case '-':
                    operand -= parseExpression(input.substr(i + 1));
                    break;
                case '*':
                    operand *= parseExpression(input.substr(i + 1));
                    break;
                case '/':
                    operand /= parseExpression(input.substr(i + 1));
                    break;
            }
            // Сохраняем текущий оператор
            op = input[i];
        }
    }
    return operand;
}

int main() {
    // Пример использования парсера
    std::string input = "5 + 8 * 2 - 4 / 2";
    double result = parseExpression(input);
    
    std::cout << "Результат: " << result << std::endl;
    
    return 0;
}

Этот пример парсит и вычисляет простое выражение с операциями сложения, вычитания, умножения и деления. Однако, обратите внимание, что он не учитывает приоритет операций или скобки.
 

ccrreesshhaanndd

Новичок
Статус
offline
Регистрация
21.06.2022
Сообщения
3
Репутация
0
Конечно, вот пример простого парсера на C++:

C++:
#include <iostream>
#include <string>

// Функция-парсер
double parseExpression(const std::string& input) {
    // Создаем переменные для хранения текущих операторов и операндов
    double operand = 0.0;
    char op = '+';

    // Проходимся по строке посимвольно
    for (int i = 0; i < input.length(); ++i) {
        // Пропускаем пробелы
        if (input[i] == ' ') {
            continue;
        }
        // Если символ - цифра, считываем операнд
        if (isdigit(input[i])) {
            int start = i;
            // Ищем конец числа
            while (i < input.length() && (isdigit(input[i]) || input[i] == '.')) {
                ++i;
            }
            // Конвертируем строку в число
            operand = std::stod(input.substr(start, i - start));
            --i;
        } else {
            // Если символ - оператор, обрабатываем операцию
            switch (op) {
                case '+':
                    operand += parseExpression(input.substr(i + 1));
                    break;
                case '-':
                    operand -= parseExpression(input.substr(i + 1));
                    break;
                case '*':
                    operand *= parseExpression(input.substr(i + 1));
                    break;
                case '/':
                    operand /= parseExpression(input.substr(i + 1));
                    break;
            }
            // Сохраняем текущий оператор
            op = input[i];
        }
    }
    return operand;
}

int main() {
    // Пример использования парсера
    std::string input = "5 + 8 * 2 - 4 / 2";
    double result = parseExpression(input);
   
    std::cout << "Результат: " << result << std::endl;
   
    return 0;
}

Этот пример парсит и вычисляет простое выражение с операциями сложения, вычитания, умножения и деления. Однако, обратите внимание, что он не учитывает приоритет операций или скобки.
А можешь сделать парсер цифр с веб сайта?
 

Garant [BOT]

Администратор
Статус
offline
Регистрация
15.11.2021
Сообщения
1,673
Репутация
297
А можешь сделать парсер цифр с веб сайта?
Конечно! Для парсинга цифр с веб-сайта можно использовать библиотеку curl для загрузки HTML-страницы и regex для поиска цифр в полученном HTML-коде. Вот пример кода на C++:

C++:
#include <iostream>
#include <curl/curl.h>
#include <regex>

// Функция обратного вызова для записи полученных данных
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* output) {
    size_t totalSize = size * nmemb;
    output->append((char*)contents, totalSize);
    return totalSize;
}

// Функция для парсинга цифр с веб-сайта
void parseNumbersFromWebsite(const std::string& url) {
    CURL* curl = curl_easy_init();
    if (curl) {
        std::string htmlCode;

        // Устанавливаем URL для загрузки
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());

        // Устанавливаем функцию обратного вызова для записи данных
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &htmlCode);

        // Выполняем запрос
        CURLcode res = curl_easy_perform(curl);
        if (res == CURLE_OK) {
            // Парсим цифры с помощью регулярного выражения
            std::regex numberRegex(R"(\d+)");  // Ищем все непрерывные последовательности цифр
            std::smatch matches;
            std::string::const_iterator iterStart = htmlCode.cbegin();
            std::string::const_iterator iterEnd = htmlCode.cend();

            while (std::regex_search(iterStart, iterEnd, matches, numberRegex)) {
                for (const auto& match : matches) {
                    std::cout << match << std::endl;
                }
                iterStart = matches[0].second;
            }
        } else {
            std::cerr << "Ошибка загрузки страницы: " << curl_easy_strerror(res) << std::endl;
        }

        // Освобождаем ресурсы
        curl_easy_cleanup(curl);
    } else {
        std::cerr << "Ошибка инициализации CURL" << std::endl;
    }
}

int main() {
    std::string url = "https://example.com";  // Замените URL на тот, который вам нужен
    parseNumbersFromWebsite(url);
    return 0;
}

В этом примере используется библиотека curl для загрузки HTML-страницы по заданному URL-адресу. Затем мы используем регулярное выражение, чтобы найти все непрерывные последовательности цифр в HTML-коде и выводим их на экран.

Обратите внимание, что вам может потребоваться установить библиотеку libcurl и указать путь к заголовочным файлам и библиотеке при компиляции этого кода.