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


Автор: anachoreta 21.9.2009, 15:09
Прошу прощения за это название темы, даже не представляю как это назвать, если у модеров будет желание переделайте пожалуйста.

Задача следующая,объясню на примере:

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

Вопрос: 

Каким образом можно реализовать следующее, введённый текст обрабатывается кодом, т.е. определяет где скобка начинается, где заканчивается, приоритетность операций и т.д.
хотелось бы услышать как этот процесс называется и по возможности пару толковых ссылок. Не хочется изобретать колесо снова.

Спасибо, за понимание.

P.S. Приведённый пример не является реальным, он дожен показать смысл. Больше интересен сам механизм работы алгоритма.

Автор: jonie 21.9.2009, 15:56
польская натация - как самый простой алгоритм.

вот http://dklab.ru/chicken/nablas/10.html тоже ниче так идея... 

Автор: zim22 21.9.2009, 16:13
это задачка на умение пользоваться структурой "стек"
выражение вида
5*(((9+8)*(4*6))+7)
преобразовывается сначала к виду
5 9 8 + 4 6 * * 7 + *
а потом уже обрабатывается алгоритмом

очень подробно и доходчиво объясняется в книге Роберта Седжвика Фундаментальные алгоритмы на С++. Части 1-4. (стр.142)

Автор: anachoreta 22.9.2009, 01:00
Лукашевичу респект, его алгоритм прост и эффективен, но как всегда без г... не обходится, алгоритм работает если уже расставлен приоритет операций, я имею ввиду скобки, но это не большая проблема. Книга, кстати толковая, мне понравилась, чуть позже изучу её более внимательно.

Я пытаюсь разобраться в ней, например возможно ли с помощью неё решить следующую задачу:

Код

8 + sqrt (( 7 + ( 5 * 4 )) / 13 )
8 sqrt (( 7 + ( 5 * 4 )) / 13 ) +


и что дальше  smile, следующим должен идти кв. корень, но я его не могу использовать, так как он не знак действия, ни переменная, на ум приходит только одно, для подобных целей использовать дополнительный модуль обработки выражения под корнем, а затем продолжать решать задачу. Верно ли я понимаю?

Автор: smoke_man 22.9.2009, 08:05
посмотри http://rsdn.ru/article/files/Classes/tparser.xml - может поможет.

Автор: xvr 22.9.2009, 11:16
Это все называется синтаксический анализ (или просто парсер)
Классика жанра - книга Ахо & Ульман: Компиляторы. принципы, технологии и инструментарий (она же Dragon book)
Собственно самих технологий парсеров существует вагон и маленькая тележка, вот некоторые:
Рекурсивный спуск (recursive descending parser)
Операторное предшествование
Конечные автоматы с стековой памятью (LALR & LR парсеры)

Существуют готовые программы, для генерации парсеров:
yacc/bison (LALR парсеры)
ANTLR (Рекурсивный спуск)

Есть готовые библиотеки, например boost::spirit

Автор: anachoreta 22.9.2009, 12:47
smoke_man  - за ссылку спасибо.

Книга прикольная, скачал второе издание и начал читать. О ней слышал в книге Страуструпа. Завтра в книжный поеду посмотрю в налиичае. Давно хотел понять принцип работы компиляторов, да вот тока руки не доходили.

Спасибо, всем. Достаточно инфы получил для размышления.

Автор: aikidzin 22.9.2009, 17:31
Цитата(anachoreta @ 22.9.2009,  12:47)
Давно хотел понять принцип работы компиляторов

Советовал бы почитать Т.Прата и М. Зелковица "Языки программирования. Разработка и реализация". очень хорошая книга. Кроме истории языков программирования рассматриваются основы построения компиляторов и трансляторов. 

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