Mathos

Mathos

О разборе и создании языков программирования. Я в ВК: https://vk.com/kot_miyao В Telegram: https://t.me/kot_miyao Иногда бывает и всякая всячина.
На Пикабу
9383 рейтинг 33 подписчика 24 подписки 99 постов 15 в горячем
Награды:
Сборщик Пыли
6

Обратная польская нотация, получение и вычисление

Предыдущая статья: Включения действий при разборе и итог пройденных тем в vk.com

Статья для повторения: От перепутья к перепутью, часть вторая: Разбор языка арифметики

Для тех кто спешит увидеть код вот (С#) или псевдокод вот, кому нужна ясность в них читаем далее.

В привычной нами записи выражения, знак операции (далее оператор) записываются между значениями (далее операндами):
а + б
Такая форма называется инфиксной (калька - вкрепной).
Так же используется префиксная (докрепная) запись, когда операторы пишутся до операндов:
+ а б
и постфиксная (закрепная) запись, когда операторы пишутся за операндами:
а б +

Ниже показаны ещё примеры:

Обратная польская нотация, получение и вычисление Опрос, Программирование, Разбор, Парсер, Переводчик, IT, Урок, Длиннопост

Префиксная и постфиксная запись также именуются прямая и обратная польская нотация (далее ОПН), в честь её изобретателя польского логика Яна Лукасевича. Отличительная их черта, то что в них не используются скобки для обособления вычисления.

Получение ОПН из инфиксной записи

Используем рекурсивный спуск по рассмотренной нами грамматике, где в качестве чисел целые без знака:

Грамматика с унарным минусом и плюсом:
Г: В -> ДС
С -> ε | +ДС | -ДС
Д -> РП | -Д | +Д
П -> ε | *РП | /РП
Р -> ч | (В)

Звенья цепочки ОПН опишем набором трёх типов:
1. Операнд - целые числа.
2. Одноместный оператор - однооп, это унарный минус и плюс.
3. Двуместный оператор - двуоп, это минус, плюс, умножить, делить.

Ниже представлено полное описание звена ОПН:

Обратная польская нотация, получение и вычисление Опрос, Программирование, Разбор, Парсер, Переводчик, IT, Урок, Длиннопост

Соберём звенья в список, который будет представлять нашу ОПН. Для этого отметим 3 действия на отделах рисунка порядка:
Д1 - Создать хрон. Переменная хранящая звено до момента добавления в список.
Д2 - Запомнить. Помещаем встреченное звено в хрон.
Д3 - Добавить. Записываем в список ОПН.

Ниже показаны отделы и процедуры со встроенными действиями в разбор:

Так мы добавляем в первую очередь операнды, затем операторы в порядке их приоритетов. Всмотритесь в процедуру «Дополнениее». В качестве хрона используется стог (англ. stack), так как запоминаются несколько знаков сразу, их следует вспомнить в обратном порядке.

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

Грамматика обратной польской нотации:
Г:В -> ч | П`П
П`-> чПО
П -> ВОП | ε

где:

В - ВЫРАЖЕНИЕ
О - ОПЕРАТОР
П - ПРАВОЕ_ПОДВЫРАЖЕНИЕ
П`- ПОДВЫРАЖЕНИЕ
ч - ЧИСЛО

Остановитесь на минутку, осмыслите.

Вычисление ОПН

Ниже изображена схема устройства вычисления ОПН - Стог-машина (Stack machine), а на следующем её описание. Для примера использована ОПН:

1 2 3 * + 4 -

Которая получена из инфиксной записи:

1 + 2 * 3 - 4

Стог-машина состоит из:

  1. Стога - в котором хранятся промежуточные значения.

  2. Набора двухместных и одноместных операций.

  3. Движка - который читает ОПН, управляет стогом и обращается к набору операций.

ОПН обладает свойством: действия применяются последовательно при её чтении, на чём и основана работа стог-машины:

  1. Если звено операнд, то кладём число в стог.

  2. Если звено однооп, снимаем верхнее число обрабатываем, итог кладём в стог.

  3. Если звено двуоп, снимаем два верхних числа и применяем операцию. Причём первое значение операции - второе верхнее, а второе - первое верхнее. Итог кладём в стог.

  4. По окончанию чтения ОПН, итог вычисления оказывается на дне стога, одним.

В заключении

Не стоит думать, что рассмотренный способ единственный для получения ОПН. Есть так же алгоритм Дейкстры перевода выражения в ОПН, но я не знаю стоит ли его разобрать или сразу перейти к обсуждению включения действий в «Провидца», ранее нами рассматриваемого.

Поэтому решение будет зависить от вас:

Какую тему разобрать следующей?
Всего голосов:
Обратная польская нотация, получение и вычисление Опрос, Программирование, Разбор, Парсер, Переводчик, IT, Урок, Длиннопост

Ну на это всё, быть добру, хорошего настроения. Подписывайся. =)
Точно! Для любознательных и внимательных читателей, ещё одна не позиционная система счисления.

Показать полностью 8 1

В одном старом-старом лесу...

В оδηом старом-старом лесу, гδе δеревья шэпталісь с ветром, а ручеькі sвеηелі, как стекляηηѵе колокольчікі, жѵл δобрѵь δеδушка Егор. Бороδа у ηего бѵла сеδая, как sімηіь сηег, а глаsа светілісь теплом, буδто δва малеηькіх солηѵшка.

Жѵл δеδушка в уютηом δоміке с реsηѵмі ставηямі, а вокруг рослі самѵе раsηѵе ςветѵ — веδь оη очеηь любіл саδ. Nо большэ всего ηа свете δеδушка Егор любіл помогать δругім. То белке шѵшку пріηесєт, то єжѵку яблоко, то птіςам крошэк ηасѵплет.

Оδηажδѵ раηηім утром к ηему прілетела сіηічка Sіηька і оставіла ηа крѵльςэ малеηькое семечко.

— «Это ηе простое семечко, δеδушка, а волшэбηое!» — прошебетала оηа і улетела.

Δеδушка Егор посаδіл семечко в самѵь красівѵь горшок, поліл роδηіковоь воδоь і стал жδать. Прошла ηеδеля, δругая — а росток всє ηе появлялся.

— «Можэт, sабѵло, как расті?» — поδумал δеδушка і ηачял расскаsѵвать семечку скаsкі. О смелѵх путешэствеηηіках, о δобрѵх велікаηах, о sвєsδах, что смеются по ηочям.

І вот оδηажδѵ утром… Тук-тук! — іs sемлі покаsался sелєηѵь росток. Оη тяηулся к солηςу, а лісточкі у ηего бѵлі ηеобѵчηѵе — в серебрістѵх уsорах, буδто іηеь.

Росло δеревςэ ηе по δηям, а по чясам. Скоро оηо стало вѵшэ δеδушкіηого δома, а ηа его ветвях sасветілісь… волшэбηѵе фоηарікі! Кажδѵь фоηарік бѵл похож ηа малеηькое солηѵшко, і в его свете всє вокруг преображалось: увяδшѵе ςветѵ расправлялі лепесткі, грустηѵе sвері ηачіηалі улѵбаться, δажэ старѵь пеηь воsле δома sаςвєл ромашкамі!

Оδηажδѵ к δеδушке прішла вηучка Машэηька і спросіла:

— Δеδуля, а почему твоє δерево такое δоброе?

Δеδушка Егор улѵбηулся:

— Потому что оηо вѵросло ηе только іs семечка, ηо і іs δобрѵх слов. Всє, во что вложэηо тепло, стаηовітся волшэбηѵм.

С тех пор в іх δоме всегδа горелі волшэбηѵе фоηарікі, а δеδушка Егор так і остался храηітелем δобротѵ в своєм скаsочηом лесу.

Показать полностью

Ещё одна сказка про ежа

А Б В Г Д Е Ё Ж S І К Л М Н О П Р С Т У Ф Х Ц Ч Ш Ь Э Ю Я

а б в г д е ё ж s і к л м н о п р с т у ф х ц ч ш ь э ю я

Жьіл-бьіл в лесу добрьіь ёж по iменi Ёжьік. Он бьіл маленькiь, но шьірокiь душоь. Каждьіь день Ёжьік ходiл по лесу, помогал sверям i ульібался солньішку.

Однаждьі вечером, когда солнце ужэ садiлось, Ёжьік увiдел на тропiнке что-то блестяшее. Он подошол блiжэ i увiдел маленькую sвёsдочку. Она лежала на sемле i тiхо плакала.

"Что случiлось, sвёsдочка?" — спросiл Ёжьік.

"Я упала с неба i не sнаю, как вернуться обратно," — ответiла sвёsдочка. Ёжьік подумал i скаsал: "Не грустi, я тебе помогу!"

Он вsял sвёsдочку на спiну i понёс её к самоь вьісокоь горе в лесу. Там, на вершьіне, Ёжьік поднял sвёsдочку к небу i скаsал: "Летi, sвёsдочка, домоь!"

Sвёsдочка sасветiлась ярче i вsлетела в небо. Она ульібнулась Ёжьіку i скаsала: "Спасiбо тебе, добрьіь ёж! Тьі сделал меня счястлiвоь!"

С тех пор sвёsдочка каждую ночь светiла над лесом, чтобьі Ёжьік i его друsья нiкогда не боялiсь темнотьі. А Ёжьік продолжал делать добрьіе дела, потому что sнал: дажэ маленькiь ёж можэт сделать мiр лучшэ.

UPD:

Вдохновлён данной лекцией:
Видео для остроконечников:

Видео для тупоконечников:

У автора лекции скорее всего противоположный взгляд на моё видение.

Показать полностью 2
713

Что я понял за 6 лет работы сварщиком

  1. Зайцев ловит в основном слесарь, ты в маске, поэтому говори: ГЛАЗА!!! Береги напарника.

  2. Ты зайцев ловишь, когда работает рядом другой сварщик, отвернись, отгородись, заставь отгородиться. Когда поймаешь, поймёшь как больно спать ночью. Поэтому береги своего напарника: ГЛАЗА!!!

  3. Не хочешь "красный галстук" (ожоги), укутайся как-будто тебе очень холодно, даже если в цеху +40.

  4. Никогда не работай с УШМ (болгаркой) без кожуха и без защитных очков.

  5. Очки не всегда выручают от окалины летящей от УШМ, работай аккуратно. И вообще верни инструмент слесарю.

  6. Не верь показателям слабого инвертора, когда переноска для 220В длинною больше 30-40 метров.

  7. Меняй респираторы, как минимум два раза за смену. Курить менее вредно, чем дышать испарениями.

  8. Береги себя. Не сиди на холодном, подстели, что-то под коленки, займи удобное положение. Не работаю сварщиком уже 5 лет, коленки перестали болеть только где-то через год.

  9. Когда кто-то тебе мешает в чём-то ты почему-то кричишь: ГЛАЗА!!!

Вопрос из ленты «Эксперты»

Словарь "несуществующих" слов

пон - понятно
сча - сейчас
драсте - здавствуйте
спс - спасибо
тоес - то есть
лан - ладно
тож - тоже

Каких слов ещё нету?

UPD:

ихний - точно принадлежащий им, но не они.
евоный - точно принадлежащий ему, но не он. Частичный синоним слова его. Если мы хотим сохранить морфологию, то следует писать егоный.
ейный - точно принадлежащий ей, но не она. Частичный синоним слова её. Букву ё пожалуйста не теряйте. Нет слова ее в понимании принадлежности, но есть слово ее в как восклицание восторга.
ложить - перенести из положения стоя в положение лёжа. (Так ли это?)

Отличная работа, все прочитано!