Lymisy Ответов: 3

Может кто-нибудь объяснить рекурсивный анализатор спуска с использованием основных для синтаксиса c


Мне трудно понять эту формулу. Может ли кто-нибудь объяснить, используя main в качестве синтаксиса.

главный()
{
}

Как мне разбить это на рекурсивную формулу для синтаксического анализа?

Является ли формула просто формулой, на которой основан некоторый код? Или он также включен с каким-то кодом в таблицу символов или что-то в этом роде.

Я пытаюсь разобрать свою собственную основную функцию в источнике.
Если это не тот подход, то какой подход я использую, чтобы заставить c понимать мои языки main, чтобы я мог использовать rr для операторов? Это не домашнее задание

Что я уже пробовал:

Попробовал почитать кое-что на rr. Я не понимаю, как именно rr получает свою структуру или определяется так, как он делает, чтобы создать язык. И если вы используете rr для операторов и выражений, как вы анализируете функцию.

Dave Kreskowiak

Рекурсивная функция - это просто функция, которая вызывает себя многократно, пока не будет выполнено условие спасения.

Основная функция никогда не используется для этого.

Richard Deeming

Вы говорите о ... рекурсивный анализатор спуска [^]?

То есть попытка проанализировать синтаксис C++, а не написать рекурсивную функцию C++.

Lymisy

Да парсер рублей с синтаксисом

Richard Deeming

Если вы ищете что-то для использования в реальном коде, возможно, этот проект может помочь:
foonathan/cppast: библиотека для синтаксического анализа и работы с C++ AST[^]

Если это учебное упражнение, то оно довольно амбициозно. Грамматика языка Си++ [^] довольно большой. Наверное, проще было бы начать с чего-нибудь попроще.

Lymisy

Спасибо @ Richard Deeming я искал это уже некоторое время, и вы указали мне правильное направление.

3 Ответов

Рейтинг:
2

Patrice T

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

Цитата:
Как мне разбить это на рекурсивную формулу?

Короткий ответ: вы этого не делаете, потому что функция пуста.
Чтобы разбить функцию на рекурсивный код, вам нужна функция с рекурсивным определением, например факториал или Фибоначчи.
Рекурсия - Википедия[^]
[Обновление]
Цитата:
Может ли кто-нибудь объяснить рекурсивный спуск с помощью основного C

В этом предложении отсутствует слово синтаксический анализатор вопросы.
Когда вы просите о помощи, только одноклассник может знать, о чем вы говорите без подробностей, потому что он уже знает их. Но мы не знаем подробностей.
Для нас ваш заголовок запутанно говорит о том, что вы хотите сделать рекурсивную функцию main, когда вместо этого вы должны разобрать main с помощью рекурсивного парсера спуска.


k5054

Цитата:функция main никогда не может быть использована рекурсивно, потому что main-это специальная функция, это точка входа вашей программы.

Это не совсем так. main() это такая же функция, как и любая другая, и фактически вызывается из crt0, кода запуска c во время выполнения (по крайней мере, в unix-подобной среде). Следующий код будет скомпилирован и запущен:

#include <stdio.h>

int main(int argc, char **argv)
{
    if(argc == 1) {
        return 1;
    }
    else {
        return 1 + main(argc-1, argv+1);
    }
}

Как бы то ни было, звоню main() рекурсивно - это то, что потребует очень особого набора обстоятельств, поэтому не делайте этого, если вы не хотите этого делать. правда, правда, правда нужно и понимать последствия этого поступка.

Patrice T

Даже если "не совсем верно", это, по крайней мере, плохая привычка.

k5054

Оказывается, что рекурсия продолжается main() это явно запрещено в C++. Это еще одна ситуация, когда допустимая программа на языке Си не является допустимой программой на языке Си++.

Lymisy

Извините @Patrice T я не знал, что это имеет значение до сегодняшнего обеда. У меня не было четкого определения того, что я искал. Почему все думают, что я студент? Я не. Просто хочу построить простой компилятор. Я прошу прощения за ошибку.

Patrice T

Нет проблем, я просто хотел подчеркнуть трудность помочь вам, когда вы ничего не говорите.
- Почему все думают, что я студент?"
Для нас это не означает, что вы находитесь в школе, мы не знаем вашего происхождения.
Для нас вы студент хотя бы потому, что изучаете предмет.

Рейтинг:
2

OriginalGriff

То main функция обычно не рекурсивна: это не невозможно сделать, но это усложняет дело, когда вы пытаетесь (хотя бы потому, что это первая функция, вызываемая в вашем приложении, поэтому практически невозможно настроить данные, которые она будет обрабатывать до первого вызова).

Обычно ты делаешь что-то вроде этого:

int main()
   {
   /* Set up the data */
   ...
   /* Call recursive function */
   int i = func(parameterValue);
   ...
   return 0;
   }
int func(int x)
   {
   ...
   func(modifiedValueOfX);
   ...
   }
Подумайте об этом таким образом, а затем перечитайте свой домашний вопрос.


Рейтинг:
1

KarstenK

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

Лучшими примерами рекурсивных функций являются Фибоначчи или факторный функция.

Мне нравится это Алгоритм "разделяй и властвуй" за свою силу. Вот что делает программирование забавным. ;-)