Рекурсия. Синтаксический анализатор - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Проверить правильность расстановки скобок в строке S. Текст в строке S определяется следующим образом: <текст>::=<элемент>|<элемент><текст> <элемент>::=a|b|c|(<текст>)|[<текст>]|{<текст>} Если текст составлен правильно, то вывести True, иначе вывести False

Решение задачи: «Рекурсия. Синтаксический анализатор»

textual
Листинг программы
#include <stdio.h>
 
/*
Проверить правильность расстановки скобок в строке S. Текст в строке S определяется следующим образом:
<текст>::=<элемент>|<элемент><текст>
<элемент>::=a|b|c|(<текст>)|[<текст>]|{<текст>}
Если текст составлен правильно, то вывести True, иначе вывести False
*/
 
class Scaner {
private:
    int i;
    const char* buf;
public:
    Scaner(const char* text) {
        this->i = 0;
        this->buf = text;
    }
    char get() {
        //printf("get %c\n", buf[i]);
        return buf[i];
    }
    char next() {
        //printf("next %c\n", buf[i]);
        return buf[i++];
    }
};
 
 
bool A_text(Scaner* s);
 
 
bool A_El(Scaner* s) {
    //puts("el");
    switch(s->next()) {
        case 'a':
        case 'b':
        case 'c':
            return true;
        case '(':
            A_text(s);
            if (s->next() != ')' ) return false;
            return true;
        case '[':
            A_text(s);
            if (s->next() != ']' ) return false;
            return true;
        case '{':
            A_text(s);
            if (s->next() != '}' ) return false;
            return true;
        default: return false;
    }
}
 
 
bool A_text(Scaner* s) {
    //puts("text");
    do {
        switch(s->get()) {
            case 'a':
            case 'b':
            case 'c':
            case '(':
            case '[':
            case '{':
                if (!A_El(s)) return false;
                break;
            default: return false;
        }
    } while(s->get() != '\0');
    return true;
}
 
 
int main() {
    Scaner* s = new Scaner("abcacbacbabcb[a]cb");
    printf(A_text(s)? "True" : "False");
    return 0;
}

Объяснение кода листинга программы

  1. Создание класса Scaner для синтаксического анализатора
  2. Определение функции A_text для проверки корректности расстановки скобок в строке
  3. Определение функции A_El для обработки элементов в строке
  4. Использование оператора switch для определения типа текущего элемента в строке
  5. Рекурсивный вызов функции A_El для обработки вложенных скобок
  6. Проверка правильности закрытия скобок в строке
  7. Использование оператора do-while для обработки последовательности элементов в строке
  8. Проверка каждого элемента строки на соответствие синтаксису
  9. Вывод результата работы программы на экран
  10. Создание экземпляра класса Scaner для заданной строки в функции main
  11. Вызов функции A_text для проверки корректности расстановки скобок в созданном экземпляре класса Scaner
  12. Вывод результата проверки на экран
  13. Вызов функции A_text в функции main возвращает значение True, если строка содержит корректно расставленные скобки, иначе возвращает значение False
  14. Вложенные вызовы функций A_El и A_text в функции A_text обеспечивают рекурсивный анализ строки
  15. Использование оператора new для выделения памяти под экземпляр класса Scaner
  16. Использование оператора delete для освобождения памяти после использования экземпляра класса Scaner
  17. Использование оператора printf для вывода результата работы программы на экран
  18. Значение True выводится на экран, если строка содержит корректно расставленные скобки, иначе выводится значение False
  19. Возврат значения 0 из функции main указывает на успешное завершение программы
  20. Значение 0, возвращаемое из функции main, не является результатом работы программы, а используется для корректного выхода из программы.

Оцени полезность:

14   голосов , оценка 4.143 из 5
Похожие ответы