|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
29.09.2015, 19:43 | #1 |
Пользователь
Регистрация: 27.03.2015
Сообщений: 15
|
Парсер выражений методом рекурсивного спуска
Здравствуйте, уважаемые форумчане! Подскажите, пожалуйста: как реализовать парсер арифметических выражений методом рекурсивного спуска? Заранее спасибо!
|
29.09.2015, 20:10 | #2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Я так полагаю, что требуется вызывать функцию считывания элементов выражения. Если встречается скобочка эта функция вызывается рекурсивно до первой (для нее без внутренних рекурсий) скобочки.
А я зык то хоть какой?
I'm learning to live...
|
29.09.2015, 20:19 | #3 |
Пользователь
Регистрация: 27.03.2015
Сообщений: 15
|
Stilet, язык С++, но я не прошу, чтоб за меня написали готовый парсер. Просто хочу, чтоб понимающие люди объяснили суть этого метода.
|
29.09.2015, 20:44 | #4 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Ну с коленки могу набросать идею:
Код:
I'm learning to live...
|
29.09.2015, 21:29 | #5 |
Старожил
Регистрация: 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 появился в результате деления на нуль. Осторожно! Альтернативная логика |
29.09.2015, 21:31 | #6 |
Пользователь
Регистрация: 27.03.2015
Сообщений: 15
|
Спасибо! Сейчас буду разбираться.
|
29.09.2015, 21:35 | #7 |
Старожил
Регистрация: 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. |
04.10.2015, 17:10 | #8 |
Пользователь
Регистрация: 27.03.2015
Сообщений: 15
|
Ребята, помогите еще, пожалуйста! Как мне распарсить, например, такое выражение: 5-3+1..5+7, где 1...5 - ряд чисел от 1 до 5. Надо, чтоб программа как-то распознала этот ряд и вывела на экран 5-3+ряд(1,5)+7. Как такое реализовать?
Последний раз редактировалось hidforce; 04.10.2015 в 17:49. |
04.10.2015, 18:25 | #9 |
Лис
Старожил
Регистрация: 18.09.2015
Сообщений: 2,409
|
А сами как думаете? Тут же просто цикл с условием.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал . |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Синтаксический анализатор (метод рекурсивного спуска) | 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 |