Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Разбор выражения, траблы


Автор: Sheff_as_Guest 1.8.2004, 15:29
Люди, я реализовал алгоритм Бауэра и Замельзона, и вроде всё бы хорошо, но только вот с унарным минусом он не справляется, т.е выражение типа:
-5/-(2+5)
Он не парсит. Я пробовал вносить свои изменения в алгоритм, и проблема вроде бы решалась, но возникали другие.
Не подскажете, что делать, может есть алгоритмы получше. А польская нотация нормально работает с унарными минусами ?

Автор: Kiorus 1.8.2004, 19:44
а что если сначала сложить 2 +5 , потом домножить на -1 и только потом поделить

Автор: Олег М 2.8.2004, 08:33
Я делал когда-то давно простенький парсер. По своему правда, что такое Бауэр и Замельзон к сожалению не знаю. Могу выслать исходники, если хочешь. Скажи только куда.
Цитата
а что если сначала сложить 2 +5 , потом домножить на -1 и только потом поделить

Ух ты!

Автор: Sheff_as_Guest 2.8.2004, 12:31
Олег М
Спасиба, я лучше сам, более того, у меня парсер не такой уж простой должен получиться, я планирую сделать парсинг выражений, в которых могут находиться переменные, массивы и вложенные функции для этого мне нужен какой-нибудь быстрый и чёткий алгоритм, Бауэра и Замельзона хороший, но вот унарные минусы не держит sad.gif
Я кстати до этого делал через двоичные деревья, всё пахало, но мне не нравился сам алгоритм, много памяти жрёт и т.д
Кстати, польская нотация тоже с унарными минусами не работает sad.gif(( Ну неужели нет на свете быстрого алгоритма парсинга, который бы всё предусматривал...

Автор: Олег М 2.8.2004, 12:43
А что это за Бауэр-Замельзон такой? Кинь ссылочку - для общего развития.
Я, кстати тоже через двоичные деревья делал - несбалансированные, и рекурсию. Мне нужно было, чтобы разобранные выражения выражения потом быстро выполнялись.
А в чём там ввобще проблема с унарными минусами? Обычные вроде операторы. А "--" и "++" ты делаешь?

Автор: Sheff_as_Guest 2.8.2004, 15:57
Олег М
В том-то и дело что если разбирать через двоичные деревья, то унарный минус не проблема, но если по другому то...
Вообще я пишу интерпретатор, и ++ и -- конечно будет smile.gif
Ссылка вот: http://program.rin.ru/razdel/html/940.html

Автор: Fantasist 2.8.2004, 20:27
Помниться когда-то давно написал программку которая считала такие простенькие выражения. Проблема со знаком минус вначале выражения тоже была - я ее решил просто. Добавлял к началу выражения "0+", или просто "0" с предпросмотром, не помню уже. Короче, выражение

-5/-(2+5)

Превращалось то ли в:

0-5/-(2+5)

то ли в

0+-5/-(2+5).

Ну в общем, парсилось после этого без проблем. smile.gif
Способ тупой, на на то время мне показался самым простым.

Автор: Sheff_as_Guest 3.8.2004, 10:08
Fantasist
Да, и я такое сделал и сначала всё было хорошо, но потом я стал экспериментировать и начались проблемы.
Видишь ли, у меня парсер такой что он работает не только с числами, но и со строками и с массивами и с функциями, вобщем проблемы возникают...
Цитата
на на то время мне показался самым простым

А что, на сегодняшний день у тебя есть что-то покруче ? Не поделишься ?

Автор: Guest 3.8.2004, 16:09
а yacc с lex позвать не проще ?

Автор: Blacksnow 3.8.2004, 18:35
Могу посоветовать одну замечательную книгу
Ахо, Сети, Ульман "Компиляторы".

Автор: Sheff_as_Guest 3.8.2004, 21:57
Blacksnow
Интересно, её можно в инете откопать...

Автор: Guest 4.8.2004, 08:27
на счет накопать в инете книжку: скажу что маловероятно.
я заказывал на амазоне правда на аглицком по деньгам 90 баксов.
правда книжка полезна тока в том случае если хочется заниматься
програмированием компиляторов. там больше теория. (правда без нее никуда :-))) )
но во всяком случае после ее прочтения масса вопросов отпадут сами собой.

а в общем случае хватит описание yacc и lex для написания простых однопроходных компиляторов.

А еще можно саму книжку купить в инет магазе. правда на заказ. потому как редкость :-))

Автор: Guest 4.8.2004, 08:29
А пожалуй добавлю книга полностью называется "Теория синтаксического анализа перевода и компиляции" 2 тома.

Автор: Sheff_as_Guest 4.8.2004, 12:10
Цитата
тока в том случае если хочется заниматься
програмированием компиляторов

Чем я и занимаюсь smile.gif

Кстати, тема закрыта, я уже нашёл решение: Я усовершенствовал алгоритм Бауэра и Замельзона, так что теперь мой парсер разбирает быстро и без труда выражения любой сложности smile.gif

Автор: Blacksnow 4.8.2004, 12:43
Цитата(Guest @ 4.8.2004, 08:29)
А пожалуй добавлю книга полностью называется "Теория синтаксического анализа перевода и компиляции" 2 тома.

Ахо, Ульман "Теория синтаксического анализа перевода и компиляции. Т1. Синтаксический анализ" 1978 (год русификации)
Ахо, Ульман "Теория синтаксического анализа перевода и компиляции. Т2. Компиляция" 1978
Я же говорил про новое издание
Ахо, Сети, Ульман "Компиляторы. Принципы, технологии, инструменты" 2003
В интернете её нет. Стоит 400 р.

Автор: Guest 2.5.2005, 18:45
smile

Автор: Void 2.5.2005, 19:00
Цитата(Sheff_as_Guest @ 3.8.2004, 23:57)
Интересно, её можно в инете откопать...

Можно. Вот:
http://club.shelek.com/download.php?id=278
И вот (Ахо, Ульман, Теория синтаксического анализа, перевода и компиляции, в 2-х тт.):
http://club.shelek.com/download.php?id=255
http://club.shelek.com/download.php?id=256

Лучше книг по этой теме не найти.

Автор: SectoR 25.2.2006, 02:19
Цитата(Sheff_as_Guest @ 1.8.2004, 15:29 Найти цитируемый пост)
Люди, я реализовал алгоритм Бауэра и Замельзона!


Sheff_as_Guest, очень хочется посмотреть твою реализацию...
Если не жалко залей сюда сорец?!

Цитата(Sheff_as_Guest @ 2.8.2004, 12:31 Найти цитируемый пост)
я планирую сделать парсинг выражений, в которых могут находиться переменные, массивы и вложенные функции для этого мне нужен какой-нибудь быстрый и чёткий алгоритм


Из известных мне могу посоветовать алгоритм Рутисхаузера!
Сейчас сам пытаюсь написать парсер с помощью этого алгоритма.
Добавлено @ 02:23
Void! Спасибо за ссылки!

Автор: DeadSoul 25.2.2006, 12:06
Когда писал подобное обнарузил следующее:
1. Разбор выражения нужно вести с конца. Причина:
2-2-2
2. Вначале нужно вытаскивать операции с наименьшим приоритетом. Причина:
2/2-2

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)