Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Клуб программистов > Свободное общение
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2009, 19:27   #11
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Ну будет у нас такое выражение:
1 + sqr_sum(4*2,6-3)+5
В записи этой польской, если я не ошибаюсь, будет так:
1 4 2 * 6 3 - 2 sqr_sum + 5 +
Читаем это сначала и считаем:
1 4 2 * // Умножаем 4 на 2
1 8 6 3 * // Находим разность 6 и 3
1 8 3 2 sqr_sum // Считаем функцию, она пусть 2 вернёт, ибо тут оно не важно
1 2 + // складываем
3 5 + // снова складываем
8
Вроде бы всё правильно.
pu4koff вне форума Ответить с цитированием
Старый 30.09.2009, 19:33   #12
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Цитата:
Сообщение от pu4koff Посмотреть сообщение
Ну будет у нас такое выражение:
1 + sqr_sum(4*2,6-3)+5
В записи этой польской, если я не ошибаюсь, будет так:
1 4 2 * 6 3 - 2 sqr_sum + 5 +
Читаем это сначала и считаем:
1 4 2 * // Умножаем 4 на 2
1 8 6 3 * // Находим разность 6 и 3
1 8 3 2 sqr_sum // Считаем функцию, она пусть 2 вернёт, ибо тут оно не важно
1 2 + // складываем
3 5 + // снова складываем
8
Вроде бы всё правильно.
Да, но
Цитата:
//Я говорю именно о компиляции, а не интерпретации.
Иными словами ему не желательно пихать sqr_sum в стек. Вообще никогда.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 02.10.2009, 10:16   #13
Izhic
Форумчанин
 
Аватар для Izhic
 
Регистрация: 08.10.2008
Сообщений: 668
По умолчанию

Цитата:
//Я говорю именно о компиляции, а не интерпретации.
На данный момент все проще Создание приложения|компилятора на потом.
Вот что получилось:
ссылка

надо бы ещё не верные выражения браковать, однако пока проверять буду, что уже есть.

//В принципе там одна ошибка сразу видна
//пробел после скобки.
//Просто хотел показать к какому виду пока пришёл.
Don't worry be happy

Последний раз редактировалось Izhic; 02.10.2009 в 10:27.
Izhic вне форума Ответить с цитированием
Старый 02.10.2009, 17:45   #14
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Круто . А если я ошибся и указал для функции больше параметров чем требуется?
все же мы при работе уже с выражением считаем его правильным. кол-во параметров мы проверяем при генерации выражения ОПН.
так что когда уже построено выражение ОПН мы не обязаны проверять его на правильность.

Цитата:
А если она перегружена и воспринимает и 3 и 2 и 4 параметра?
А какая разница? При объявлении функций мы же не оставляем одинаковые имена. Один из вариантов - просто их нумеровать. на примере делфи:
Код:
function Abc(a:integer):integer; overload;
function Abc(a:integer;b:real):integer; overload;
будет Abc1, Abc2.
в выражении
x=1+Abc(1+7*2,2.3);
получаем x 1 2.3 1 7 2 * + Abc2 + =
решаем:
  1. x в стек (как переменную)
  2. 1 в стек (как число)
  3. 2.3 в стек
  4. 1 в стек
  5. 7 в стек
  6. 2 в стек
  7. умножаем 2 и 7: убираем их из стека и кладем 14
  8. складываем 14 и 1, убираем их из стека кладем 15
  9. Вызываем Abc2. Она вынимает последние 2 элемента из стека: 15 и 2.3, убираем их из стека и кладем результат (как число)
  10. складываем результат функции Abc2 и 1, убираем их из стека и кладем ответ (как число)
  11. действие "=", вынимаем из стека 2 последних значения: 1) число, 2) переменная X. присваеваем иксу значение.
а она уже примет нужное кол-во параметров.

Цитата:
А если она виртуальная?
и че? тут, как и в предыдущем случае проблема не с параметрами а с вызовом нужной функции.

Цитата:
И заключаются они в том, чтобы определить где собственно выражение, а где параметры функции?
опять же, какая разница?! при вызове функция сама заберет нужное кол-во.

Цитата:
Пример:
х+sin(x+y)*2
Ну позапихаешь ты цифры в стек и чего далее? Когда должен быть вызван синус? Одно дело математические операции - их число заранее известно и совсем другое дело функции, которые помимо огромного ряда существующих может понапихать еще большую кучу и сам программист.
И ладно бы если бы у него был бы чистый интерпретатор, но ему нужна промежуточная компиляция (а возможно и полная) и здесь вообще полный задний проход (а возможно и сразу два).
а тут в чем проблема? и, между прочим, какая разница какое количество функций? я этого не понимаю, хоть пять, хоть двадцать пять.
а синус вызван будет тогда когда и потребуется:
х+sin(x+y)*2 = x x y + sin 2 * +(RPN)
Роман Радер вне форума Ответить с цитированием
Старый 02.10.2009, 18:03   #15
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Ты пробовал когда-нибудь написать парсер ? С учетом вызовов функций и переменных?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 02.10.2009, 18:18   #16
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Цитата:
Сообщение от Utkin Посмотреть сообщение
Ты пробовал когда-нибудь написать парсер ? С учетом вызовов функций и переменных?
и не только парсер, но и полностью интерпретатор. я все это говорю на личном опыте.
http://programmersforum.ru/showthread.php?t=34927
Роман Радер вне форума Ответить с цитированием
Старый 02.10.2009, 18:44   #17
Izhic
Форумчанин
 
Аватар для Izhic
 
Регистрация: 08.10.2008
Сообщений: 668
По умолчанию

Цитата:
Роман Радер будет Abc1, Abc2.
Ааааа.. точно! В итоге то это ведь две разные функции с двумя разными адресами, верно? т.е. при преобразовании

Abc(x,x) это вообще не Abc а чтото типа указателя [35475453]
Abc(x) это также указатель сов-но на другую функцию[1233].

Нам же лично это просто для наглядности человеческой.

А если машине делать, то там всё будет различные указатели и ни каких тебе аля-алиасовых проблем.

Роман Райдер спасибо. Натолкнули на мысль про указатели
А то из-за одинаковых имен Нотация не укладывалась в голове.

Вопрос думаю можно считать закрытым.
Don't worry be happy

Последний раз редактировалось Izhic; 02.10.2009 в 18:49.
Izhic вне форума Ответить с цитированием
Старый 02.10.2009, 23:43   #18
Роман Радер
Форумчанин
 
Аватар для Роман Радер
 
Регистрация: 16.12.2006
Сообщений: 859
По умолчанию

Цитата:
Ааааа.. точно! В итоге то это ведь две разные функции с двумя разными адресами, верно? т.е. при преобразовании

Abc(x,x) это вообще не Abc а чтото типа указателя [35475453]
Abc(x) это также указатель сов-но на другую функцию[1233].
Именно. Способ их отличия уже зависит от архитектуры самого интерпретатора, у меня они отличались номерами. т.е. при преобразовании в псевдокод каждая функция нумеровалась (как стандартная, так и та что объявлена програмистом).
и вызывались уже не по именам а по номерам.
у вас некими адресами.
а у какого-то васи пупкина будут отличатся хешом md5 отсортированых в алфавитном порядке)
это я к тому что важно понять суть, а реализация, хоть я и не преуменьшаю важность этой части, это уже дело техники

Последний раз редактировалось Роман Радер; 02.10.2009 в 23:47.
Роман Радер вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратная польская нотация Sexy Fox Помощь студентам 9 22.09.2011 14:57
Польская запись azl-8 Помощь студентам 0 06.05.2009 20:19
Обратная польская запись Катуха Помощь студентам 6 27.12.2008 10:23
Обратная польская запись Роман Радер Общие вопросы Delphi 0 09.12.2008 18:18
Обратная польская нотация Sexy Fox Помощь студентам 2 22.06.2007 13:27