Форум программистов, компьютерный форум CyberForum.ru

Пример работы функции get_toke() - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Лексический и синтаксический анализаторы http://www.cyberforum.ru/cpp-beginners/thread622911.html
здравствуйте.нужна помощь, по flex\bison, чтение драгон бука и поиска и google уже не хватает ,так что прошу помощи тут у Вас. лексер scaner.l D L H E ?{D}+ FS (f|F|l|L) IS (u|U|l|L)* %{
C++ Реализовать в виде модуля набор подпрограмм Реализовать в виде модуля набор подпрограмм для работы с многочленами от одной переменной (1й степени t, 2й степени n). 1) сложение 2) вычитание 3) умножение 4) деление с остатком 5) операции отношения (равно, не равно) 6) возведение в натуральную степень k 7) вычисление производной от многочлена 8) вычисление значения в точке х0. http://www.cyberforum.ru/cpp-beginners/thread622905.html
C++ Адаптация ПО под 64-битную систему
имею необходимость адаптировать прогу на С++ под 64 битную систему ( на 32 работает, но не на 64=() Подскажите плиз какие-нить источники, где можно почитать про адаптацию программ на С++ под 64 битку
Из арабских чисел в римские C++
Функция для перевода из арабских чисел в римские. Как можно заменить устаревший sprintf? string _func_arab_to_roman(int arab){ string arab_str; string res; char arr; int d; sprintf(arr, "%d", arab); arab_str = arr;
C++ програмный код http://www.cyberforum.ru/cpp-beginners/thread622846.html
Помогите плиз разобраться.Написали прогу, немогу понять как она работает.Конкретно нужны красные участки, если можно поподробнее) 1) Add/Dell: //add/dell.h //интерфейс модуля add/del #ifndef add/dell_h #define add/dell_h #endif //add/dell.cpp //реализация модуля «add/del» int readmsg(char*s){
C++ Получить количество символов во веденной строке Решил попробовать со строками поработать, сразу же возникло несколько вопросов: 1) В C++ тип string не встроен? Нужно подключать библиотеку? 2) В чем различие char от string? 3) Как использовать функции: * strlen - получить кол-во символов в строке. Попытался получить кол-во символов в веденной строке, возникли проблемы: 1. Нельзя получить кол-во... подробнее

Показать сообщение отдельно
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
13.07.2012, 00:15     Пример работы функции get_toke()
Цитата Сообщение от arfaa Посмотреть сообщение
в какой-то момент данному куску надо будет возвратить какое-то значение иначе программа будет зациклена.
Если вы на той главе о которой я думаю, то там сначала вызывается ф-ция expression(), она вызывает ф-цию term() и еще получает лексему с помощью get_token() для подальшой обработки. Ф-ция term() в свою очередь вызывает ф-цию primary() + получает лексему для обработки. Ф-ция primary() в свою очередь вызывает й-цию expression(). Если ничего не вызовет прерывания, то етот цикл будет продолжаться.
Читайте далее, там более подробно должно быть описано. Я сам по началу запутался.

Добавлено через 52 минуты
Вот немного прокоментировал
программу
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
double primary()
{
    Token t = ts.get(); //считывает лексему
    switch (t.kind) {   //проверяет тип лексемы
    case '(':    // если  лексема "(", то вызывется снова expression()
        {    
            double d = expression();
            t = ts.get();
            if (t.kind != ')') error("')' expected)");
            return d;
        }
    case '8':            // если лексема цыфра, то primary() возвращает цыфру
        return t.value;  
    default:
        error("primary expected");  
    }
}
 
//------------------------------------------------------------------------------
 
// deal with *, /, and %
double term()
{
    double left = primary(); // принимает то что возвращает primary()
    Token t = ts.get();        // получает следующую лексему
 
    while(true) {
        switch (t.kind) {
        case '*': 
            left *= primary();
            t = ts.get();
        case '/':
            {    
                double d = primary();
                if (d == 0) error("divide by zero");
                left /= d; 
                t = ts.get();
                break;
            }
        default: //если лексема не * и не /, то возвращает число
            ts.putback(t);     // 
            return left;
        }
    }
}
 
//------------------------------------------------------------------------------
 
// deal with + and -
double expression()
{
    double left = term();      // принимает то что возвращает Term()
    Token t = ts.get();        // ну и далее по аналогии
 
    while(true) {    
        switch(t.kind) {
        case '+':
            left += term();    
            t = ts.get();
            break;
        case '-':
            left += term();   
            t = ts.get();
            break;
        default: 
            ts.putback(t);     
            return left;      
        }
    }
}
 
int main()
{
     while (cin) {
     Token t = ts.get();
     double val;
     if (t.kind == 'q') break; // 'q' for quit
     if (t.kind == ';')        // ';' for "print now"
           cout << "=" << val << '\n';
     else
          ts.putback(t);
     val = expression();  //если все будет хорошо - вернет число
}
}
 
Текущее время: 00:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru