Можете ли вы проверить мой код и указать, в чем именно ошибка, или это моя ошибка?

Как разобрать пример кода из книги Страуструпа, где используется рекурсивный спуск и изменяются глобальные переменные? Я уже некоторое время пытаюсь разобраться в этом примере, так как общая концепция мне понятна, но мне сложно самому написать подобный код из-за проблем с рекурсией и изменением глобальных переменных.
  • 20 января 2024 г. 8:39
Ответы на вопрос 1
Конечно, я постараюсь помочь вам. 

Ошибки в коде могут быть различные: синтаксические, логические, семантические или ошибки времени выполнения. Чтобы понять, где именно у вас возникают трудности, вам нужно предоставить конкретные примеры кода или конкретные вопросы. Таким образом, я смогу дать вам целенаправленный совет.

Что касается примеров кода из книг Страуструпа, где используются рекурсивные спуски и глобальные переменные, обычно такие примеры представляют собой упрощенные парсеры или интерпретаторы. Принцип рекурсивного спуска заключается в том, что каждая функция соответствует определенному правилу грамматики и вызывает другие функции для проверки подправил. Глобальные переменные часто используются для хранения текущего состояния парсера, например, текущего токена или значения ввода, над которым выполняется работа.

Пример простого парсера с использованием рекурсивного спуска и глобальных переменных может выглядеть примерно так:

```cpp
#include <iostream>
#include <string>
#include <cctype>

using namespace std;

// Глобальная переменная, представляющая текущий символ ввода
char current_char;

// Функция, которая «читает» следующий символ
void get_next_char() {
    cin >> noskipws >> current_char;
}

// Предварительные объявления рекурсивных функций
void parse_expression();
void parse_number();

// Парсинг числа
void parse_number() {
    while (isdigit(current_char)) {
        cout << "Number: " << current_char << endl;
        get_next_char();
    }
}

// Парсинг выражения
void parse_expression() {
    if (isdigit(current_char)) {
        parse_number();
    } else if (current_char == '(') {
        get_next_char(); // Пропустить '('
        parse_expression(); // Парсить подвыражение
        if (current_char == ')') {
            get_next_char(); // Пропустить ')'
        } else {
            cerr << "Error: expected ')'" << endl;
        }
    }
    // Можно добавить другие правила для операторов, скобок и т.д.
}

int main() {
    get_next_char(); // Положить первый символ в current_char
    parse_expression(); // Начало разбора
    return 0;
}
```

Представленный пример использует рекурсию для парсинга выражений и чисел. Глобальная переменная `current_char` используется для хранения текущего символа, и вызывается функцией `get_next_char` для считывания следующего символа из входного потока.

Если у вас есть конкретный пример кода, который вам нужно проверить, предоставьте его, и я дам более точные рекомендации.
Похожие вопросы