Поиск:

Ответ в темуСоздание новой темы Создание опроса
> анализ выражения, на скобки 
:(
    Опции темы
Hidrag
Дата 6.3.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

Репутация: нет
Всего: 25



Задача такая нужно проанализировать выражение и удалить в нем лишние скобки, например:
c=(a+b)+d
должно получиться:
с=a+b+d
то есть нужно убрать скобки которые не влияют на результат.
Выражение всегда правильное, то есть не будет такого что есть открывающая скобка и нет закрывающей.
Из операций есть только + и *

Язык программирования, не важен, главное алгоритм анализа. Я, конечно, буду сам пытаться написать парсер, но почему то кажется что задача обычная и наверняка есть и кто нибудь знает простое решение.

С виду кажется вообще просто, но вдруг выражение будет:
с=(a*b+c)*d здесь уже скобки должны остаться...


--------------------
user posted image
PM WWW ICQ   Вверх
maxim1000
Дата 6.3.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



в принципе, можно просто пробовать убрать каждую пару скобок и сравнивать выражения на эквивалентность (в данном случае - на порядок выполнения операций)

правда, создаётся ощущение, что это окольный путь...


--------------------
qqq
PM WWW   Вверх
Hidrag
Дата 6.3.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

Репутация: нет
Всего: 25



не так все просто оказывается....  smile 


--------------------
user posted image
PM WWW ICQ   Вверх
Akina
Дата 6.3.2008, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(maxim1000 @  6.3.2008,  19:28 Найти цитируемый пост)
в принципе, можно просто пробовать убрать каждую пару скобок и сравнивать выражения на эквивалентность (в данном случае - на порядок выполнения операций)

На порядок выполнения - нельзя. Он может измениться. А вот деревья, построенные в обратно-польской нотации, окажутся эквивалентными.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxdiver
Дата 6.3.2008, 23:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Нужно построить дерево разбора этого выражения, но так, чтобы в нём остались скобки (как особый элемент с одним дочерним элементом).
Лишними окажутся скобки, дочерние элементу '+', дочерние '-' (но здесь уже в вычитаемом надо поменять знаки), а также скобки, дочерние скобкам.
Вроде так все лишние скобки уберутся.

Ещё есть идея построить обычное дерево разбора, а потом по нему построить выражение. В результате лишних скобок тоже не должно получаться.
PM MAIL WWW ICQ   Вверх
Akina
Дата 7.3.2008, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(maxdiver @  7.3.2008,  00:45 Найти цитируемый пост)
Ещё есть идея построить обычное дерево разбора, а потом по нему построить выражение. В результате лишних скобок тоже не должно получаться. 

Но это действие может изменить выражение. A+(B+C) превратится в B+C+A. Без скобок, но не то...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Serkys
Дата 7.3.2008, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1061
Регистрация: 19.4.2004

Репутация: нет
Всего: 22



Цитата(Akina @  7.3.2008,  09:29 Найти цитируемый пост)
A+(B+C) превратится в B+C+A. Без скобок, но не то...

А вот Hidrag надо уточнить условие, допустимы ли такие вещи.
PM MAIL   Вверх
Akina
Дата 7.3.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 20
Всего: 454



Цитата(Serkys @  7.3.2008,  10:41 Найти цитируемый пост)
допустимы ли такие вещи. 

Поскольку надо не получить конечное выражение, а только найти лишние скобки, с выражением можно делать что угодно - это очевидно. Просто после прямого-обратного преобразований выражение может измениться так, что понять, какие же скобки оказались лишними, тоже станет задачей нетривиальной...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxim1000
Дата 7.3.2008, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(maxdiver @  6.3.2008,  23:45 Найти цитируемый пост)
Лишними окажутся скобки, дочерние элементу '+', дочерние '-' (но здесь уже в вычитаемом надо поменять знаки), а также скобки, дочерние скобкам.

если я правильно понял, то, думаю, скобки в данном случае не будут убраны:
a*(b*c)


--------------------
qqq
PM WWW   Вверх
HistoryEarth
Дата 7.3.2008, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



Вылядит это так, что достаточно искать и убирать конструкции типа ")+" и "+(". Предварительно считая вложенность и пр.
PM MAIL   Вверх
Hidrag
Дата 7.3.2008, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 877
Регистрация: 9.4.2005
Где: JDK

Репутация: нет
Всего: 25



Serkys, Допустимы!
Выражения сами по себе не очень сложные, поэтому от перестановки членов выражения ничего не меняется. А что за прямое-обратное преобразование?




--------------------
user posted image
PM WWW ICQ   Вверх
Serkys
Дата 7.3.2008, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1061
Регистрация: 19.4.2004

Репутация: нет
Всего: 22



Цитата(Hidrag @  7.3.2008,  11:46 Найти цитируемый пост)
 А что за прямое-обратное преобразование?

Имеется в виду построение дерева выражения и последующее составление нового выражения на основе этого дерева.
PM MAIL   Вверх
maxdiver
Дата 7.3.2008, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Цитата(maxim1000 @ 7.3.2008,  11:07)
Цитата(maxdiver @  6.3.2008,  23:45 Найти цитируемый пост)
Лишними окажутся скобки, дочерние элементу '+', дочерние '-' (но здесь уже в вычитаемом надо поменять знаки), а также скобки, дочерние скобкам.

если я правильно понял, то, думаю, скобки в данном случае не будут убраны:
a*(b*c)

Да, точно, как раз сейчас хотел об этом написать smile
Если у скобки дочерним элементом является константа или переменная, то она, разумеется, тоже лишняя.

Вот теперь вроде всё smile
PM MAIL WWW ICQ   Вверх
Void
Дата 7.3.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 3
Всего: 173



Я недавно описывал алгоритм восстановления выражения по дереву с минимально необходимым числом скобок. Когда-то писал на OCaml для простенького интерпретатора.
Цитата(Void @  5.1.2008,  20:30 Найти цитируемый пост)
Оговоримся, что под приоритетом выражения понимаем приоритет оператора, образующего корень дерева этого выражения. Считаем, что константы и применения функций обладают наивысшим приоритетом.

Для унарных операций всё просто: скобки вокруг операнда ставятся только если приоритет операнда выше приоритета оператора.

Для бинарных алгоритм чуть сложнее:
Пусть P — приоритет оператора, Pl и Pr — приоритет левого и правого операндов соответственно.
ЕСЛИ ((оператор левоассоциативный ИЛИ коммутативный) И Pl >= P) ИЛИ Pl > P ТОГДА вывести левый операнд без скобок, иначе в скобках.
ЕСЛИ ((оператор коммутативный ИЛИ не левоассоциативный) И Pr >= P) ИЛИ Pr > P ТОГДА вывести правый операнд без скобок, иначе в скобках.

В случае, если деление выводится графически, достаточно добавить условие, что скобки вокруг операнда деления не ставятся никогда.

P.S. На всякий случай: левоассоциативны все арифметические операторы, кроме возведения в степень.



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1539 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.