Как стать автором
Обновить

Комментарии 16

Ну почему по первым же строкам становится видно, что это статья студента?

Отослать в википедию для чтения о алгербраических нотациях, где указана лишь польская нотация, которая, вообще не использована в статье. Ну и если уже расписывать, то лучше было бы упомянуть, что постфиксная нотация - это не просто польская нотация, а обратная польская нотация(ОПН). Для примеров, почему-то, в инфиксной нотации использовались пробелы, в то время как "22+=4" вызывает смятение, пока не дойдет, что 2 числа просто слепили вместе. С каких пор вначале статьи на хабре рекомендуют читать самоучитель по С# перед прочтением статьи?

Информация про постфиксную, инфиксную и префиксную нотации была приведена для справки, не было целью расписывать данные моменты, а лишь показать наглядную реализацию алгоритмов.

Префиксная и постфиксная нотации - являются польскими записями, постфиксная нотация также называется обратной польской записью, поэтому они взаимозаменяемые.

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

Ссылка на самоучитель была привидена для людей, плохо знакомых с C#.

2\;\;\;2+=22

\; -толстый пробел; \: средний; \, тонкий; \! - "отрицательный" пробел

Спасибо, поправил.

Остаётся вопрос, а зачем вообще нужна строка с обратной записью? Почему вместо этого сразу не создать второй стек и не вычислить выражение?

Для наглядности работы алгоритмов.

На этом принципе работали советские программируемые микрокалькуляторы, Б3-34, МК-61, МК-52. Там чтобы сложить 2 + 2 надо было набрать 2, стрелочку вверх, 2 а после +. Сначала крайне неудобно, потом привыкаешь. После с "техникой молодежи" на Луну сажаешь космические корабли :)

Инфиксная, префиксная и постфиксная нотация соответствуют трем способам обхода вершин дерева выражения: Left-Node-Right (центрированный обход), Node-Left-Right (прямой обход), Left-Right-Node (обратный обход). Пришлось когда-то написать парсер выражений, преобразовывавший их в форму, удобную для (многократного) вычисления значений и других манипуляций (вроде аналитического дифференцирования). Только я использовал рекурсию, программа получается несколько проще, но могут возникнуть проблемы с динамическим распределением памяти
Для наглядности работы алгоритмов
Не только. Обратная польская запись позволяет записать выражение без скобок. Есть (был?) такой язык — Forth, в нем обратная польская запись была главным способом задания выражений
Есть (был?) такой язык — Forth, в нем обратная польская запись была главным способом задания выражений

Не совсем обратная т.к. в понимании Форт всё есть слова и цикл их трансляции во внутренности Форт системы достаточно примитивен по классике его построения.

Хаб Хабра по Forth языку

The Top 999 Forth Open Source Projects on Github, но их, конечно, больше и не только размещены в рамках Github.

По версии IEEE Spectrum Top Programming Languages Форт входит в топ 50-ти языков.

P.S. Действующий рускоязычный форум по Форт языку 😋

...и вот вам половина интерпретатора вашего выдуманного языка. На самом деле, будучи школьником, я очень вдохновлялся подобными статьями. У меня даже была книжка про создание собственного компилятора С в ассемблер выдуманной машины, и я стоически пытался собрать примеры из неё в единый компилятор (правда, наш перевод был с миллионом опечаток, от того не компилировался, а отладить тогда подобную простыню было выше моих тогдашних силёнок).

А интерпретатор я таки сделал, но потом. Не поверите, на visual foxpro. Да, не лучшее средство для подобных экспериментов, но мне надо было реализовать существующий алгоритм функционального тестирования некоего прибора с подробной визуализацией, интерпретатор использовался как скриптовый язык - для программирования поведения "вот этой кнопочки" и её воздействия на весь прибор. Потом и в диплом пошло :)

Это все было лет 20 назад, да ещё и студент, так что не ругайтесь пожалста за микроскоп и гвозди.

Когда-то писал такую же штуку на lex и yacc (нынче bison), там парсинг, приоритеты и дерево операций строится тривиально, потом просто обходишь дерево как хочешь и вуаля

А интерпретатор я таки сделал, но потом. Не поверите, на visual foxpro
На FoxPro (даже и не Visual, а на более древних версиях) все сильно упрощалось наличием макроподстановок (&), позволявших выполнять компиляцию прямо во время выполнения программы. Особенно просто это работает для числовых выражений, написав
X = 0.345
Y = "SIN(X)"
?&Y
можно вывести на экран значение SIN(0.345), причем это работает, даже если строка для выражения будет прочитана из файла, будучи неизвестной во время компиляции программы. Конечно, здесь будут сложности с обработкой ошибок, поскольку при наличии синтаксической ошибки в выражении такой способ не сможет показать, в какой позиции выражения она возникла.

Оператор ~ в Execute лишний.

locals.Push(Execute("-", 0, last));

Спасибо за подсказку, не заметил. Поправил.

Спасибо за ссылку, добавлю.

Мне было лениво делать ещё и токенизацию, раз всё и без неё прекрасно работает :)

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории