|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
Дерево разбора12.03.2011, 02:03. Показов 32739. Ответов 34
Вообщем суть - нужно уметь распарсить любую логическую формулу и затем сделать с ней нечто по заданию (курсовик). Спросили у препода как лучше, он сказал, что лучше через дерево...
Ну с деревом вопросов нет... Но вот как распарсить и расставить приоритет у формул - вопрос. Допустим есть некая формула (x&y&z)|t Получается дерево должно выглядеть как. корень - | лево - (x&y&z) право - t Ну и так, далее. Я правильно уловил суть? Вопрос, как расставить так приоритеты, но мне не нужен код, просто некое небольшое объяснение и мысли по этому поводу. Заранее спасибо)
1
|
|
| 12.03.2011, 02:03 | |
|
Ответы с готовыми решениями:
34
Бинарное дерево. Удалить из дерева часть вершин так, чтобы оставшееся дерево стало пирамидой Дано дерево. Распечатать дерево по уровням Ошибка в функции разбора уравнения |
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||||
| 12.03.2011, 02:19 | ||||||
Сообщение было отмечено как решение
Решение
ForEveR, ты с грамматиками знаком, или это не связано с курсом построения трансляторов?
в основе всех подобных задач, как и задач заложенных в компиляторы всех языков программирования лежит построение синтаксического дерева, получение дерева - конечная цель, по нему уже можно считать выражения, генерировать машинный код, выполнять байт код итп к языку программирования строят грамматики - которые определяют все возможные программы на соответствующем языке (для выражения это все возможные выражения) методы разбора грамматики позволяют из листинга (цепочки языка) получить дерево ну вообщем это если ты вдруг решишь знакомиться с суровой правдой построения трансляторов ну теперь про дерево
правда грамматика неоднозначная, те для одного выражения можно построить несколько равносильных деревьев
3
|
||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 12.03.2011, 02:23 [ТС] | |
|
alex_x_x, Не связано совершенно. Курсовая за второй курс. Задачи вообщем-то по предмету мат. логика...
Посмотрев видео о разборе выражения - походу должно быть как-то так? (x&y&z)|t П.С. художник из меня плохой.
0
|
|
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 12.03.2011, 02:27 | |
|
ага, варианты разные могут быть
я тут вспомнил этож задачи на бинарные деревья но алгоритмов к ним я не помню хотя вроде просто - находишь корень, левый правый лист, потом для каждого из них рекурсивно повторяешь так проводишь рекурсивный спуск а потом по дереву уже обсчитываешь, не очень сложно) пс построение компиляторов все равно рулит)
1
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 12.03.2011, 02:32 [ТС] | |
|
alex_x_x, Тогда попробую распросить по сути...
Получается, у нас должна быть некоторая структура Token (при этом у каждого токена есть некий приоритет), мы должны найти операцию, которая будет выполнена позже всего - закинуть ее в корень дерева, дальше уже разбираться с остальным выражением, верно? Пока вопрос лишь один, как определить некий приоритет у операции (насколько я помню у | и & в логике одинаковый приоритет), но т.к. для начала я буду тренироваться на калькуляторе для обычных чисел - вопрос существенен. + как найти некую операцию, которая будет выполняться последней ну и т.д.? Про приор : я так понимаю, у меня должно быть некое перечисление приоритет, у каждого токена - поле, при конструкции токена - установка приоритета, да?
0
|
|
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|||||||||||||||||||||
| 12.03.2011, 02:47 | |||||||||||||||||||||
|
все так, насчет приоритетов такие соображения
ну можно прикинуть пускай дано (10+1)*(5+6*(3+1))+4*(3+1) есть операции 1) + - операции сложения, мы их в корень в первую очередь ставим 2) * / операции умножения, ставим если в выражении больше нет операций сложения 3) )( пока не достигнут баланс левых и правых скобок 1) ищем +, соблюдая баланс скобок
плюсов не находим, поэтому берем первое умножение с учетом баланса скобок
скобки выкидываем берем первый плюс
если при разборе будет чтото не так значит выражение невалидное
2
|
|||||||||||||||||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 12.03.2011, 02:58 [ТС] | |
|
alex_x_x, Красиво. Буду разбираться спасибо.
В итоге при работе с входной строкой получаем алгоритм потипу. Ищем первый плюс вне скобок (если плюса/минуса нет ищем умножение/деление) - если ничего нет - выход, выражение явно неверно. Нашли - помещаем плюс в дерево, запускаем рекурсию для левой части строки (от знака) ну или не рекурсию, а просто записываем левую и правую части строки в новую строку ищем в левой части, ищем в правой части, по пути убирая скобки и проверяя на все время на корректность. Верно? Да, кстати, стоит-ли сначала проверить на валидность расстановки скобок, путем простого прохода по строке выражения, добавляя '(' в стек и удаляя из стека при встрече ')', если размер стека после прохода - ноль - скобки расставлены верно или нет резона и выяснить это лучше при непосредственном обходе?
0
|
|
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
||||
| 12.03.2011, 03:02 | ||||
|
1
|
||||
|
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
|
|
| 12.03.2011, 03:08 | |
|
ForEveR, если тебе только для вычисления выражений, то польская обратная запись проще и быстрее
1
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 12.03.2011, 03:11 [ТС] | |
|
HIMen, В том-то и проблема, что не для вычисления. Иначе я бы просто формальную грамматику реализовал, как для калькулятора...
Задания в курсовом вроде : найти кнф, найти днф и т.п.
0
|
|
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|||||||||||
| 12.03.2011, 04:37 | |||||||||||
2
|
|||||||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
| 12.03.2011, 07:01 [ТС] | ||||||
|
Всю ночь сидел быдлокодил... Вот, что получилось. Парсит строки на ура, по всем правилам по идее. Осталось разобраться с запилом в дерево...
3
|
||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 12.03.2011, 07:05 [ТС] | |
|
Скрин
1
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 12.03.2011, 13:26 | |
|
Возможно, вот это дело тоже поможет, давно хочу написать что-нибудь такое, да руки не доходят...
Добавлено через 3 минуты Ну или вообще вот это, там можно на ссылочки потыкать, почитать про разные варианты.
1
|
|
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
| 12.03.2011, 13:37 | |
|
silent_1991, это уже полноценный разбор грамматики
0
|
|
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 12.03.2011, 13:39 | |
|
alex_x_x, да, но что мешает сделать его для выражения?
0
|
|
|
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
|
||||||
| 12.03.2011, 13:47 | ||||||
|
Вообще, обратная польская может здесь сработать, так как по сути она обозначает инверсный порядок обхода дерева, когда первым посещаются сыновья узла слева направо, и только потом уже родительский узел, так что запись вида " a b c * +" в принципе в дерево перевести не сложно, набираем операнды в стек, ну и при встрече оператора генерируем узел и цепляем к дереву.
А так я лично, если требуется разобрать что-нибудь маленькое, обычно обхожусь LL-анализом или алгоритмом Эрли (нерационально конечно малость, но зато писать легко), хоть и приходится целую грамматику определять ради этого. Добавлено через 7 минут И еще если есть больше желания получить работающий код, чем даже просто интерес к парсингу, чтобы всё от руки набивать, то я бы рекомендовал попробовать генераторы парсеров. К bison'у и flex'у у меня конечно отношение не очень, но вот boost::spirit рекомендовать могу, там грамматику забить не сложно, да и генерация дерева делается по сути очень просто, только позаботиться о рекурсивной обертке для дерева типа
2
|
||||||
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|||
| 12.03.2011, 13:52 | |||
|
тут же тривиальный подход Добавлено через 2 минуты вообщем не вижу смысла в учебной программе использовать черноящиковые алгоритмы разбора
1
|
|||
|
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
|
|
| 12.03.2011, 13:53 | |
|
Ну, это же было только предложение глянуть пару ссылочек, а не подстрекательство немедленно писать анализатор и больше никого не слушать
1
|
|
|
623 / 467 / 57
Регистрация: 28.01.2011
Сообщений: 605
|
|
| 12.03.2011, 13:59 | |
|
alex_x_x, в данном случае я просто предложил, что можно сделать.
Да, он не быстрый, писать много надо, да и вообще люди либо любят его, либо ненавидят, известный момент Я лично за польскую запись, а boost просто пришелся к слову, как вариант.
1
|
|
| 12.03.2011, 13:59 | |
|
Помогаю со студенческими работами здесь
20
Получить переменные из строки путём её разбора Программа разбора и вычисления значения арифметического выражения Tools для создания диаграм и разбора кода Исходное бинарное дерево превратить в бинарное дерево поиска, при этом сохранив его структуру Напишите программу, которая бы читала дерево в формате (а) и затем печатала бы это дерево в формате (б). Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию.
2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
|
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
|
|
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO
Апнулись до NET10.
Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта
так и в интерактивном режиме. из сложностей - чисто функциональный подход.
Решил. . .
|
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2.
Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники".
В. . .
|
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии.
. . .
|
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2.
При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
|