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

задание по рекурсии - C++

Восстановить пароль Регистрация
 
maxlennon
1 / 1 / 0
Регистрация: 21.12.2008
Сообщений: 8
16.02.2010, 16:40     задание по рекурсии #1
Помогите девушке.

Задание: Построить синтаксический анализатор для понятия "скобки".

скобки::=А | скобка скобки
скобка::=( B скобки)

-----------------------------------------------------------------------
Вот так. Надо использовать рекурсию, а я даже задание понять не могу =( Помогите мне =(
Надо писать на С.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.02.2010, 16:40     задание по рекурсии
Посмотрите здесь:

использование рекурсии C++
Задание на массив и задание на матрицу. C++
C++ Задание... о золотой горе с использованием рекурсии
Вопрос по рекурсии C++
рекурсии... C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Qwerty_coder
29 / 29 / 2
Регистрация: 14.12.2009
Сообщений: 79
16.02.2010, 19:21     задание по рекурсии #2
Тут гляньте, много хороших примеров:

http://www.ict.edu.ru/ft/005128//ch6.pdf
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
16.02.2010, 19:41     задание по рекурсии #3
Цитата Сообщение от maxlennon Посмотреть сообщение
я даже задание понять не могу
http://ru.wikipedia.org/wiki/Форма_Бэкуса_—_Наура
maxlennon
1 / 1 / 0
Регистрация: 21.12.2008
Сообщений: 8
17.02.2010, 20:00  [ТС]     задание по рекурсии #4
спасибо. я щас попытаюсь написать текст. поможете мне потом его доработать?

Добавлено через 21 час 4 минуты
Путём долгих мучений я вникла в задание.

Задание: Построить синтаксический анализатор для понятия "скобки".

скобки::=А | скобка скобки
скобка::=( B скобки)


То есть возможны корректные варианты:
A
(BA)
(BA)A
и всевозможное чередование этих трёх выражений.

некорректные выражения таковы:
  1. Пусто
  2. присутствуют лишнме символы - Z!345c и тд
  3. Спереди строки не могут стоять - B и закрывающая скобка ')'
  4. Когда конструкция незакончена - ( или (B
  5. Потеря части - (B)

получился такой текст: помогите его отредактировать и дополнить. Так чтобы программа анализировала символы из файла и выводила результат в другой файл. результат - это правильные последовательности + ошибки.
Да, ещё я попыталась сделать чтобы программа будущая игнорировала пробелы и переходы на новую строку.

очень надеюсь на вашу помощь с текстом программы.


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
 #include <iostream.h>
 #include <stdio.h>
 #include conio.h>
 
 void Error(int N)
 
 { switch (N)                                          //переключатель ошибок (надо как то реализовать вывод ошибок в файл)
    {
    case 1;
    cout<<"nycTo"<<endl;
    case 2;
    cout<<"HedonycTumblU cumBoJl"<<endl;
    case 3;
    cout<<"CnepeDu He mogeT 6blTb: ),B"<<endl;
    case 4;
    cout<<"HeT Круглой скобки"<<endl;
    case 5;
    cout<<"nocJle kpyrJlou cko6ku Het B"<<endl;
    case 6;
    cout<<"notep9 4actu - (B)"<<endl;           //также ещё другие подобные некорректные ситуации
 
     }
  }
 
 Fsteam F;                      //Входной файл из которого всё читается
 int Round ()                       //фунцкция анализа скобок
 
 {
  char S; F>>S; int D=0; int k
    if(F eof())
       {
        Error(z);
        cout<<"BHytPu ()";
        }
     else 
      {
    if(S=='(') D=1;
    else
    if(S=='B') D=1;
    else
    if(S=='A') D=1;
    else
    if(S==')') D=1;                 //не знаю как это записать. надо как то поместить сюда Error
    
     
     }
    return D;
  } 
 
 int Bracket()                      //функция запуска
 {
  char S; F>>S; int D=0
  switch (S)
    {
      case 'A': case '(' ; D=Round(); break;
      case '(' ; D=Round(); break;
       }
    default; Error()
   }
 
  void main()
  {
    F open();
    char S; F.sets(skipws)              //пропуск пробелов и переходов  
    F>>S;
    if(F.eof( ) ) Error()
    else
    {
      F.seekg(ios::beg);
      D=Bracket();
      if(D) cout<<"A";
     
        }
   }
Добавлено через 1 час 55 минут
неужели некто мне не хочет помочь
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
18.02.2010, 05:45     задание по рекурсии #5
Код
скобки::=А | скобка скобки
скобка::=( B скобки)
Цитата Сообщение от maxlennon
То есть возможны корректные варианты:
A
(BA)
(BA)A
и всевозможное чередование этих трёх выражений.
AB(B(AAB(B(A))))
вроде тоже подходит
символы друг за другом идут же

Добавлено через 7 минут
если не друг за другом, а просто одна запись в файле
(BA)(BA)
(B(BA))(B(BA))(BA)
запись, конечно, бесконечная может быть
тогда как её читать

Добавлено через 2 минуты
(B(BA))(B(BA))(BA) - это неправильная
(B(BA)A)(B(BA)A)(BA) - это правильная
maxlennon
1 / 1 / 0
Регистрация: 21.12.2008
Сообщений: 8
24.02.2010, 19:54  [ТС]     задание по рекурсии #6
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <fstream.h>
 
ifstream f;         //исходный файл
ofstream out,calls; //выходной файл с результатом и файл вызовов функции
 
const int empty = 0;
const int after_a = 1;
const int after_b = 2;
const int after_in_br = 3;
const int after_out_br = 4;
const int nothing = 5;
 
 
void Hello(int w){                  //вывод в файл надписи запуска функции
    for(int i=0; i<w; i++)
        calls<<' ';
    calls<<"Analyze запущена"<<endl;
}
 
void Goodbye(int w){                //вывод в файл надписи завершения функции
    for(int i=0; i<w; i++)
        calls<<' ';
    calls<<"Analyze завершена"<<endl;
}
 
void Error(int N, int num) {        //функция вывода ошибок
    switch (N){
        case 1: out<<"Error! Source file is empty. "<<endl; break;
        case 2: out<<"Error! Unexpected symbol. At pos "<<num<<endl;break;
        case 3: out<<"Error! Unexpected symbol A. At pos "<<num<<endl;  break;
        case 4: out<<"Error! Unexpected symbol ). At pos "<<num<<endl;  break;
        case 5: out<<"Error! Unexpected symbol B. At pos "<<num<<endl;  break;
        case 6: out<<"Error! Unexpected symbol (. At pos "<<num<<endl;  break;
        case 7: out<<"Error! The symbol A is passed. At pos "<<num<<endl;   break;
        case 8: out<<"Error! The symbol B is passed. At pos "<<num<<endl;   break;
        case 9: out<<"Error! The bracket is passed. At pos "<<num<<endl;    break;
        default: out<<"Error! At pos "<<num<<endl; break;
    }
}
 
int getNext(char& ch, int & num){   //прочтение следующего значащего символа
    static int n=0; //номер символа для диагностических сообщений
    do  {
        f>>ch; 
        num = ++n;
    } while (((ch==' ') || (ch=='\n')) && (!f.eof())) ; //пропускаем пробелы и перевод строки
    if (f.eof()) return 0;  //если обнаружен конец файла, сообщим о неудаче чтения
    return 1;
}
 
 
/*
    главная рекурсивная функция, выявляющая ошибки и пробегающая всю входную цепочку
    параметры:  w - смещение в файле вызовов функции.
                st - информация о том, что было перед этим символом прочитанно
                br - счетчик скобок
*/
void Analyze(int w, int st, int br){
    Hello(w);           //функция запустилась, информация об этом добавлятся в файл
    char c;
    int i;
    if (!getNext(c,i)){ //читаем следующий символ
        if (br>0) Error(9,i);
        if ((st != nothing) || br) Error(10,i);         
        else out<<"Правильная запись скобки"<<endl;
        Goodbye(w); 
        return;
    }
    out<<c<<endl;       //выведем его в файл
    switch(st){
        case empty:     //начинаться правильная последовательность может с..
            if (c=='('){
                br++;   //изменим счетчик скобок
                Analyze(w+2,after_in_br,br);
            }
            else if (c=='A'){   //первый символ и он же должен быть последний
                Analyze(w+2,nothing,br);
            }
            else {      //увы, ошибки
                Error(7,i);
                Error(9,i);
                if (c==')') Error(4,i);
                else if (c=='B') Error(5,i);
                else Error(2,i);
            }
            break;
        case after_a: //после символа А могут идти ..
            if ( br>0 && (c==')')){ //только закрывающие скобки, если они должны присутствовать
                br--;
                Analyze(w+2,after_out_br,br);
            }
            else {      //увы, ошибки
                if (br>0) Error(9,i);
                if (c=='A') Error(3,i);
                else if (c=='B') Error(5,i);
                else if (c=='(') Error(6,i);
                else Error(10,i);
            }
            break;
        case after_b:   //после символа Б могут идти .. 
            if (c=='('){
                br++;
                Analyze(w+2,after_in_br,br);
            }
            else if (c=='A'){
                Analyze(w+2,after_a,br);
            }
            else {      //увы, ошибки
                if (c=='B') Error(3,i);
                else if (c==')') Error(4,i);
                else Error(2,i);
            }
            break;
        case after_in_br: //после открывающей скобки может идти ..
            if (c=='B'){    //только Б
                Analyze(w+2,after_b,br);
            }
            else{       //увы, ошибки
                Error(8,i);
                if (c=='A') Error(3,i);
                else if (c=='(') Error(6,i);
                else if (c==')') Error(4,i);
                else Error(2,i);
            }
            break;
        case after_out_br:  //после закрывающей скобки могут идти ..
            if(c==')'){     //еще одна закрвающая, например (Б(БА))А
                br--;
                Analyze(w+2,after_out_br,br);
            }
            else if ((br==0)&&(c=='(')){ //новая открывающая, если все старые скобки закрыты (БА)(БА)А
                br++;
                Analyze(w+2,after_in_br,br);
            }
            else if((c=='A') && !br){   //завершающий символ А, при условии, что все скобки на местах
                Analyze(w+2,nothing,br);
            }
            else {          //увы, ошибки
                if ((c=='A') && br) {
                    Error(9,i); 
                    Error(3,i); 
                }
                else if ((c=='(') && !br){
                    Error(9,i); 
                    Error(6,i); 
                }
                else Error(10,i); 
            }
            break;
        case nothing:       //если больше ничего не должно быть в файле, но есть..
            if (c=='A') Error(3,i); 
            else if (c=='B') Error(5,i); 
            else if (c=='(') Error(6,i); 
            else if (c==')') Error(4,i);            
            break;
    }
    Goodbye(w);         //функция завершается  и выводит сообщение в файл
}
 
int main(){ 
    f.open("Input.txt",fstream::in|fstream::nocreate ); //исходный файл
    if (!f.is_open()) {
        cout<<"Source file is not exist or busy.. Try again later.."<<endl;
        return 1;
    }
    out.open("Output.txt",fstream::out|fstream::trunc );    //файл выходной
    calls.open("Analyze.txt",fstream::out|fstream::trunc ); //файл вызово функции
    Analyze(0,empty,0); //запуск анализатора
    return 0;
}

вот текст. он написан на си. кто может помочь подправить его на си++, только что компилировалось в борланде 3.1
maxlennon
1 / 1 / 0
Регистрация: 21.12.2008
Сообщений: 8
04.03.2010, 20:56  [ТС]     задание по рекурсии #7
никто не хочет помочь мне =((
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.03.2010, 21:03     задание по рекурсии
Еще ссылки по теме:

C++ Рекурсии.
C++ Возврат рекурсии
C++ Ошибка в рекурсии

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.03.2010, 21:03     задание по рекурсии #8
maxlennon, это и есть C++, в чем проблема?
Yandex
Объявления
04.03.2010, 21:03     задание по рекурсии
Ответ Создать тему
Опции темы

Текущее время: 00:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru