написание калькулятора с функциями

программирование обучение алгоритм парсинг

Я хочу написать калькулятор на Delphi с использованием функций. Но функций не вида sin,cos и т.п., таких примеров в сети и так полно, а функций, похожих на те что есть в Excel: сумм(аргумент,аргумент...,аргумент). Загвоздка в том что функции могут быть вложенными и число аргументов в них неизвестно. Каким образом лучше их парсить? Есть ли какие-либо стандартные алгоритмы на этот повод, типа обратной польской записи, но с неизвестным числом операндов?
p.s. я НЕ прошу готовый код (хотя и не против)

Примечание:
ах да, калькулятор основан только на функциях, т.е. привычные "+", "-" ОТСУТСТВУЮТ и заменяются соответственно функциями

Примечание:
vprisivko: а можно на примере? ну допустим произведение(сумма(2;3;4);5)
5*(2+3+4)
2 3 4 ) сумма 5 ) произведение

но у меня почему то возникает ощущение, что могут возникнуть таким образом ошибки
(3+2+4)*(5+(4*3))
произвед(сумм(3;2;4);сумм(5;произвед(4;3)))
3 2 4 ) сумм 4 3 ) произвед 5 ) сумм ) произвед

Примечание:
кажется я нашёл то что мне нужно - Алгоритм Рутисхаузера (http://algolist.ru/syntax/parsear.php). Он очень простой а главное он позволит не париться с числом операндов. Всем спасибо, сотку пока поберегу вдруг еще что интересного напишут...

Примечание:
На самом деле то, что я делаю, не является калькулятором как таковым. Но алгоритмы будут почти одинаковые. Я описал таким образом вопрос чтобы вам было проще и понятнее.
насчёт скобок я ступил, я думал вы имели в виду добавить скобки как обозначение конца списка операндов.
В приведенных вами решениях как раз таки идёт использование стандартных инфиксных операций, от которых мне и нужно избавиться. Однако вы натолкнули меня на нужное направление, в котором я уже продвинулся до стадии "надо бы код писать да влом на ночь, пойду посплю =) ", за что вам большое спасибо. Угощайтесь заслуженными баллами ;)
Ответы:
есть простые алгоритмы анализа и интерпретации формул. и генераторы парсеров для ситаксиса. поищи в сети. в какойто книжке по с++ я видел полный текст (то что на с++ это ничего, разберешся)
Насколько я помню, в Delphi есть необходимые элементы для работы с функциями переменного числа аргументов.
Для алгоритма естественно использовать RPN (обратную польскую запись) --- тут ничего сложного не возникнет, закрывающая скобка и будет означать конец перечисления операндов.
Во-первых, алгоритм RPN подразумевает отсутствие скобок в выходной строке:
когда мы преобразуем исходную последовательность символов и доходим до закрывающейся скобки, мы выталкиваем все элементы из стека в выходную строку вплоть до первой встретившейся нам открывающей скобки, а сами скобки не пишем в строчку, они "сокращают" друг друга.
Во-вторых, нужно понять, а нужно ли Вам преобразовывать обычные для человека инфиксные операции + - / * в "функциональные" --- на мой взгляд, совсем необязательно, да и требует времени и памяти порядка длины исходной строки, спрашивается, зачем?
Поэтому для Ваших примеров будет так:


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

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

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.