Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Рекурсивный спуск


Автор: Dia28 15.11.2012, 16:07
Здравствуйте помогите пожалуйста разобраться в рекурсивном спуске, который вычисляет выражения, и как считывать по одному элементу из файла(

Код

#include "stdafx.h"
#include "stdlib.h"
 
bool E();
bool T();
bool F();
bool N();
{
    if(T())
    {
        while(NS == '+' || NS == '-')
        {
            if(!T())
            {
                return false;
            }
        }
        return true;
    }
    else
        return false;
}
 
bool T()
{
    if(F())
    {
        while(NS == '*' || NS == '/')
        {
            if(!F())
                return false;
        }
        return true;
    }
    else
        return false;
}
 
bool F()
{
    if(NS == '(')
    {
        if(E())
            if(NS == ')')
                return true;
            else
                return false;
        else
            return false;
    }
    else
        return N();
}
 
bool N()
{
    
}
int _tmain(int argc, _TCHAR* argv[])
{
    
    return 0;
}

Автор: xvr 15.11.2012, 19:00
Судя по содержимому функции main - он ничего не вычисляет.  smile Судя по именам остальных функций их писал большой любитель загадок. 
Вы бы для начала написали грамматику того, что вы собираетесь высичлять (и не в виде загадочной программы, а в виде BNF например)  smile 



Автор: Dia28 16.11.2012, 01:37
Цитата(xvr @ 15.11.2012,  19:00)
Судя по содержимому функции main - он ничего не вычисляет.  smile Судя по именам остальных функций их писал большой любитель загадок. 
Вы бы для начала написали грамматику того, что вы собираетесь высичлять (и не в виде загадочной программы, а в виде BNF например)  smile

Я не знаю как написать функцию чтения из файла посимвольно, и чтобы этот символ сохранялся в переменную NS

Грамматика :

E::=T|T+E|T-E
T::=F|T*F|T/F
F::=(E)|N;

N - число в файле

Автор: Remiznik 16.11.2012, 09:55
Не хочу быть занудой. Но попробуйте давать осмысленные имена функциям и переменным это не только помогает читателю, но и Вам поможет разобратся с логикой программы. 

Автор: xvr 16.11.2012, 11:56
Цитата(Dia28 @  16.11.2012,  01:37 Найти цитируемый пост)
Я не знаю как написать функцию чтения из файла посимвольно, и чтобы этот символ сохранялся в переменную NS

Гм. Это вообще то самые азы. Какие нафиг рекурсивные спуски, если вы не владете инструментом?  smile 

Пусть эта функция называется nxt(). Дестриптор открытого файла лежит в глобальной переменной file. Лексема читается в переменную NS, значение константы (для N) в переменной val
Код

FILE* file;
int val;

bool nxt()
{
 for(;;)
  {
   int c = fgetc(file);
   if (c==EOF) {NS=0; return false;}
   if (isspace(c)) continue;
   if (isdigit(c))
    {
     ungetc(c,file);
     fscanf(file,"%d",&val);
     NS='N';
     return true;
    }
   NS=c;
   return true;
 }
}
Ну и вызовы ее надо добавить после всех проверок NS в вашей исходной программе

Добавлено через 3 минуты и 9 секунд
Кстати, ваша грамматика не соотвествует вашей программе

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)