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

Технологии синтаксического анализа и интерпретации команд - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
kest_wolf
0 / 0 / 0
Регистрация: 08.02.2011
Сообщений: 33
01.03.2011, 13:40     Технологии синтаксического анализа и интерпретации команд #1
Составить программу, которая проверяет корректность арифметических выражений, в которых могуть быть скобки трех типов "()", "[]", "{}" и действия "+-*/".

очень нужно срочно. курсач горит у бедного студента

 Комментарий модератора 
Не дублируйте темы - это нарушает правила форума.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.03.2011, 13:40     Технологии синтаксического анализа и интерпретации команд
Посмотрите здесь:

Выбор инструмента/технологии C++
C++ GUI, технологии
технологии программирования C++
прога для интерпретации #define C++
Программа анализа текста C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dxdy
 Аватар для dxdy
97 / 97 / 5
Регистрация: 14.06.2010
Сообщений: 283
01.03.2011, 14:11     Технологии синтаксического анализа и интерпретации команд #2
и в чем же проблема?
kest_wolf
0 / 0 / 0
Регистрация: 08.02.2011
Сообщений: 33
01.03.2011, 14:13  [ТС]     Технологии синтаксического анализа и интерпретации команд #3
какой?

Добавлено через 58 секунд
не знаю язык си... совсем не получаеться в нем разобраться и выучиь! а прога надо тоьок на языке СИ!
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.03.2011, 15:13     Технологии синтаксического анализа и интерпретации команд #4
А какой знаете? Можете написать хоть на чём-то или хотя-бы предложить алгоритм (для этого нужен только русский язык, или в нём тоже совсем не получается разобраться и выучить)?
kest_wolf
0 / 0 / 0
Регистрация: 08.02.2011
Сообщений: 33
01.03.2011, 15:17  [ТС]     Технологии синтаксического анализа и интерпретации команд #5
ну а смысл от того что я напишу прогу на джава? тебе то что от неё?
мне на сишке надо! и только си. хотя можно и С++
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.03.2011, 15:23     Технологии синтаксического анализа и интерпретации команд #6
kest_wolf, пишите. И выкладывайте.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
01.03.2011, 15:34     Технологии синтаксического анализа и интерпретации команд #7
Цитата Сообщение от kest_wolf Посмотреть сообщение
ну а смысл от того что я напишу прогу на джава?
Смысл в том, чтобы хотябы алгоритм самому составить. Логика работы программы в общем случае не должна зависеть от языка программирования, скорее даже наоборот. А логика в этом задании не то, чтобы сложная, но требует некоторой кропотливости (проверка открывающих/закрывающих скобок, наличие посторонних символов, etc...) Сделайте хоть на JavaScript, главное, чтобы работало, а на С переделать особой сложности не составит. Даже при условии, что Вы не знаете С, вероятность того, что Вам помогут переделать программу, написанную на другом языке, гораздо выше, чем вероятность, что кто-то будет долго и нудно за Вас парсер строки на С писать.


Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
(для этого нужен только русский язык, или в нём тоже совсем не получается разобраться и выучить)?
Цитата Сообщение от dxdy Посмотреть сообщение
и в чем же проблема?
Цитата Сообщение от kest_wolf Посмотреть сообщение
какой?

kest_wolf
0 / 0 / 0
Регистрация: 08.02.2011
Сообщений: 33
01.03.2011, 16:17  [ТС]     Технологии синтаксического анализа и интерпретации команд #8
у меня курсач на завтра. сегодня отчет хоть бы успеть сделать!
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.03.2011, 16:31     Технологии синтаксического анализа и интерпретации команд #9
kest_wolf, всё с вами понятно. Сегодня за вас надо написать курсовой проект, завтра диплом. Потом и работать за вас?
kest_wolf
0 / 0 / 0
Регистрация: 08.02.2011
Сообщений: 33
01.03.2011, 16:35  [ТС]     Технологии синтаксического анализа и интерпретации команд #10
диплом я сам делаю. и отчет сам делаю! но прога нужна!
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.03.2011, 16:40     Технологии синтаксического анализа и интерпретации команд #11
Цитата Сообщение от kest_wolf Посмотреть сообщение
отчет сам делаю
[сарказм]Похвально![/сарказм]
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
01.03.2011, 16:40     Технологии синтаксического анализа и интерпретации команд #12
Цитата Сообщение от kest_wolf Посмотреть сообщение
но прога нужна!
Давайте разберемся: Вы хотите что бы зав Вас написали всю програму ? Если да - вам сюда, иначе - Ваши наброски, идеи по созданию програмы.
silent_1991
01.03.2011, 16:44
  #13

Не по теме:

asics, понимаете, человек знает яву, но так вышло, что он из принципа не хочет писать на ней, а хочет, чтобы мы немного растрясли мозги (а то ведь только и можем что сидеть на форумах и ехидничать) и написали программу с нуля. Ну что тут поделать?

asics
01.03.2011, 16:49
  #14

Не по теме:

Цитата Сообщение от silent_1991 Посмотреть сообщение
Ну что тут поделать?
Предлагаю забить на это

silent_1991
01.03.2011, 16:53
  #15

Не по теме:

asics, мудро!

easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
01.03.2011, 16:55     Технологии синтаксического анализа и интерпретации команд #16
Цитата Сообщение от asics Посмотреть сообщение
Предлагаю забить на это
Ну во всяком случае давайте флудить перестанем. Найдутся альтруисты - повезло студенту. Не найдутся - не повезло...

kest_wolf, тему пока не закрываю, но всё-таки настоятельно рекомендую хотябы попытаться что-то сделать.
kest_wolf
0 / 0 / 0
Регистрация: 08.02.2011
Сообщений: 33
01.03.2011, 17:21  [ТС]     Технологии синтаксического анализа и интерпретации команд #17
неужели нет таких кто знает как делать эту програму?? блин. люди! помогите!
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9372 / 5422 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
01.03.2011, 17:56     Технологии синтаксического анализа и интерпретации команд #18
Цитата Сообщение от kest_wolf Посмотреть сообщение
неужели нет таких кто знает как делать эту програму?
Из троих последних в этой теме отписавшихся нет ниодного, кто не знает, как её делать. Вы просто разницу между "помочь" и "сделать за кого-то" не улавливаете.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2011, 11:41     Технологии синтаксического анализа и интерпретации команд
Еще ссылки по теме:

C++ Методы анализа данных
Облачные технологии на С++ C++
Технологии OpenMP C++

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,662
02.03.2011, 11:41     Технологии синтаксического анализа и интерпретации команд #19
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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
/////////////////////////////////////////////////////////////////////////////////////////
//Составить программу, которая проверяет корректность арифметических выражений, 
//в которых могуть быть скобки трех типов "()", "[]", "{}" и действия "+-*/".
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cctype>
#include <iostream>
#include <sstream>
#include <stack>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string       T_expr;
typedef std::stack<char>  T_brackets_stack;
typedef int               T_num;
/////////////////////////////////////////////////////////////////////////////////////////
enum
{
    OPEN_ROUND_BRACKET      = '(',    
    CLOSING_ROUND_BRACKET   = ')',    
 
    OPEN_SQUARE_BRACKET     = '[',    
    CLOSING_SQUARE_BRACKET  = ']',    
 
    OPEN_BRACE              = '{',    
    CLOSING_BRACE           = '}'
};
/////////////////////////////////////////////////////////////////////////////////////////
bool  parse_num(T_expr&  e)
{
    std::istringstream  e_stream(e);
    T_num               num = 0;
    if(!(e_stream >> num)) return  false;
    e.clear();
    e_stream >> e;
    return  true;
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  is_open_bracket(char  c)
{ 
    return    c == OPEN_ROUND_BRACKET
           || c == OPEN_SQUARE_BRACKET
           || c == OPEN_BRACE;
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  is_closing_bracket(char  c)
{ 
    return    c == CLOSING_ROUND_BRACKET
           || c == CLOSING_SQUARE_BRACKET
           || c == CLOSING_BRACE;
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  open_bracket_is_correct
    (
        char               open_bracket_symb, 
        T_brackets_stack&  brackets_stack
    )
{    
    switch(open_bracket_symb)
    {
    case OPEN_ROUND_BRACKET:
        if(   brackets_stack.empty()
           || brackets_stack.top() == OPEN_SQUARE_BRACKET
           || brackets_stack.top() == OPEN_BRACE)
        {
            brackets_stack.push(open_bracket_symb);            
            return  true;        
        }
        return  false;
               
    case OPEN_SQUARE_BRACKET:
        if(   brackets_stack.empty()           
           || brackets_stack.top() == OPEN_BRACE)
        {
            brackets_stack.push(open_bracket_symb);            
            return  true;        
        }
        return  false;
 
    case OPEN_BRACE: 
        if( brackets_stack.empty() )
        {
            brackets_stack.push(open_bracket_symb);            
            return  true;        
        }
        return  false;
 
    default:
        return  false;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  closing_bracket_is_correct
    (
        char               closing_bracket_symb, 
        T_brackets_stack&  brackets_stack
    )
{    
    switch(closing_bracket_symb)
    {
    case CLOSING_ROUND_BRACKET:
        if( brackets_stack.top() == OPEN_ROUND_BRACKET )
        {
            brackets_stack.pop();            
            return  true;        
        }
        return  false;
               
    case CLOSING_SQUARE_BRACKET:
        if( brackets_stack.top() == OPEN_SQUARE_BRACKET )
        {
            brackets_stack.pop();            
            return  true;        
        }
        return  false;
 
    case CLOSING_BRACE: 
        if( brackets_stack.top() == OPEN_BRACE )
        {
            brackets_stack.pop();            
            return  true;        
        }
        return  false;
 
    default:
        return  false;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  parse_open_brackets_arr_or_nothing
    (
        T_expr&            e, 
        T_brackets_stack&  brackets_stack
    )
{
    while(   !e.empty()
          && is_open_bracket(e[0]))
    {
        if(!open_bracket_is_correct(e[0], brackets_stack)) return  false;
        e.erase(0, 1);
    }
    return  true;
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  parse_closing_brackets_arr_or_nothing
    (
        T_expr&            e, 
        T_brackets_stack&  brackets_stack
    )
{    
    while(   !e.empty()
          && is_closing_bracket(e[0]))
    {
        if(!closing_bracket_is_correct(e[0], brackets_stack)) return  false;
        e.erase(0, 1);
    }
    return  true;
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  parse_num_with_brackets_arr
    (
        T_expr&            e, 
        T_brackets_stack&  brackets_stack
    )
{
    return    parse_open_brackets_arr_or_nothing     (e, brackets_stack)
           && parse_num(e)
           && parse_closing_brackets_arr_or_nothing  (e, brackets_stack);
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  parse_op(T_expr&  e)
{
    if(e.empty())  return  false;    
    switch(e[0])
    {
    case '+':
    case '-':
    case '*':
    case '/':
        e.erase(0, 1);
        return  true; 
 
    default:
        return  false;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  expr_is_correct(const T_expr&  expr)
{
    T_expr  e;    
    std::remove_copy_if(expr.begin(), expr.end(), 
                        std::back_inserter(e), isspace);
 
    T_brackets_stack  brackets_stack;
    if(!parse_num_with_brackets_arr(e, brackets_stack))  return  false;
    while(!e.empty())
    {
        if(   !parse_op                     (e)
           || !parse_num_with_brackets_arr  (e, brackets_stack))  return  false;        
    }
 
    return  brackets_stack.empty();
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите арифметическое выражение, содержащее целые числа,"
              << std::endl
              << "скобки трех типов \"()\", \"[]\", \"{}\" и действия \"+-*/\":"
              << std::endl;
 
    T_expr  expr;
    getline(std::cin, expr);
    std::cout << "Выражение "
              << (expr_is_correct(expr) ? "" : "НЕ ")
              << "корректно."
              << std::endl;
}
Yandex
Объявления
02.03.2011, 11:41     Технологии синтаксического анализа и интерпретации команд
Ответ Создать тему
Опции темы

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