Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2015, 19:43   #1
hidforce
Пользователь
 
Регистрация: 27.03.2015
Сообщений: 15
По умолчанию Парсер выражений методом рекурсивного спуска

Здравствуйте, уважаемые форумчане! Подскажите, пожалуйста: как реализовать парсер арифметических выражений методом рекурсивного спуска? Заранее спасибо!
hidforce вне форума Ответить с цитированием
Старый 29.09.2015, 20:10   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я так полагаю, что требуется вызывать функцию считывания элементов выражения. Если встречается скобочка эта функция вызывается рекурсивно до первой (для нее без внутренних рекурсий) скобочки.
А я зык то хоть какой?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.09.2015, 20:19   #3
hidforce
Пользователь
 
Регистрация: 27.03.2015
Сообщений: 15
По умолчанию

Stilet, язык С++, но я не прошу, чтоб за меня написали готовый парсер. Просто хочу, чтоб понимающие люди объяснили суть этого метода.
hidforce вне форума Ответить с цитированием
Старый 29.09.2015, 20:44   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну с коленки могу набросать идею:
Код:
string scaner(string s,int b){
 int i=b;
 for(;i<s.length();i++){
   if(s[i]=='(') cout<<endl<<scaner(s,i); else
   if(s[i]==')') break;
 }
 return s.substr(i,i-b);
}
...
string exp='(5*(8+7))';
cout<<endl<<scaner(exp,0);
Т.е.: Проходим рекурсивно по выражению, если встречается открывающая скобочка, и выходим с выводом в консоль - если встретилась ее закрывающая.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.09.2015, 21:29   #5
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Вкратце - каждая операция рассматривается как а операция b, причем сначала рассматриваются операции низшего приоритета.
Допустим есть выражение
3+5*(8-9*8)

1) перед нами а + b
а=3
b=5*(8-9*8)
С а все ясно, просто получим число и пес с ним.
2) b - перед нами операция a*b
a=5
b=(8-9*8)
С а все ясно, просто получим число и пес с ним.
3) b - перед нами операция a-b
a=8
b=9*8
С а все ясно, просто получим число и пес с ним.
4) b - перед нами операция a*b
a=9
b=8
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 29.09.2015, 21:31   #6
hidforce
Пользователь
 
Регистрация: 27.03.2015
Сообщений: 15
По умолчанию

Спасибо! Сейчас буду разбираться.
hidforce вне форума Ответить с цитированием
Старый 29.09.2015, 21:35   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Для ускорения надо
1) Функция поиска операций в порядке от низкого приоритета к высшему (при этом скобки считаются целым операндом и поиск операций внутри скобок не производится).
2) Уметь разбирать выражение на три части a операция b
3) Уметь извлекать выражение из скобок

Вкратце этого достаточно. Унарные операции можно преобразовывать в бинарные
Например: -5 = 0 - 5, а значит перед нами выражение a - b и понеслась.

Важный момент приоритет операций:
5 + 6/9
a + b (но не a/b!) - всегда сначала рассматриваются операции с наименьшим приоритетом.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 29.09.2015 в 21:38.
Utkin вне форума Ответить с цитированием
Старый 04.10.2015, 17:10   #8
hidforce
Пользователь
 
Регистрация: 27.03.2015
Сообщений: 15
По умолчанию

Ребята, помогите еще, пожалуйста! Как мне распарсить, например, такое выражение: 5-3+1..5+7, где 1...5 - ряд чисел от 1 до 5. Надо, чтоб программа как-то распознала этот ряд и вывела на экран 5-3+ряд(1,5)+7. Как такое реализовать?

Последний раз редактировалось hidforce; 04.10.2015 в 17:49.
hidforce вне форума Ответить с цитированием
Старый 04.10.2015, 18:25   #9
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

А сами как думаете? Тут же просто цикл с условием.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синтаксический анализатор (метод рекурсивного спуска) hidforce Помощь студентам 1 28.05.2015 05:52
Парсер логических выражений Hemul Общие вопросы C/C++ 1 18.10.2011 21:45
парсер арифметических выражений. gufon Общие вопросы Delphi 2 16.05.2011 16:51
Парсер математических выражений RIO Общие вопросы по Java, Java SE, Kotlin 2 06.04.2011 01:05
Парсер математических выражений Granus Общие вопросы Delphi 3 24.06.2009 15:19