что такое префикс и постфикс

Префиксы и постфиксы в PHP (и CSS)

что такое префикс и постфикс. Смотреть фото что такое префикс и постфикс. Смотреть картинку что такое префикс и постфикс. Картинка про что такое префикс и постфикс. Фото что такое префикс и постфикс

Ещё давно я взял практику использовать префиксы и постфиксы в PHP и в CSS. Особенно это актуально, когда что-то выходит за рамки локальной видимости и находится в глобальном пространстве, взять те же модели в Yii.

Префиксы и постфиксы несут основную задачу – сделать сущность максимально уникальной, причём настолько, чтобы её можно было без проблем найти любым текстовым редактором. На сегодняшний день IDE поддерживают отличную вещь – «Find Usages» (поиск использований), но это не всегда помогает, и об этом я напишу чуть ниже.

Именование в стиле Венгерской нотации мне не пришлось по душе. Такой подход мне не нравился ещё со времён C++ / Delphi – я считал его избыточном и не всегда понятным. Мне понравилась реализация БЭМ, но в полной мере я её тоже не использую. Я постарался вычленить и объединить наиболее понравившиеся мне методы, о них и расскажу.

Все CSS классы я начинаю с префикса «cl_», идентификаторы с префикса «id_». Если класс или идентификатор относится к блоку, добавляю после префикса «b_», если к модулю – «m_». Какие-либо внутренние состояния или мини-блоки я также указываю с префиксами.

Таким образом, у меня всегда уникальные и структурно понятные названия. Да и найти такие названия куда проще, если надо, например, провести рефакторинг и посмотреть, где это может отразиться.

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

PHP (Yii)

Как-то неправильно, что контроллеры, валидаторы и т.п. имеют дополнительные префиксы и постфиксы, а модели не имеют. Я решил, что ввиду «магии» Yii тяжело будет найти, где используется класс User, а простым поиском по тексту слово User будет встречаться везде, где только можно.

Использование таких наименований придаёт уникальности, и в случае чего я могу даже без IDE найти все использования того или иного класса. Также я всячески старюсь отойти от использования текстового представления классов и атрибутов, особенно считаю большим злом, когда ссылка на класс генерируется из объединения строк – это нельзя найти ни через «Find Usages», ни через поиск по тексту. Например:

Для именования relations в Yii я также использую специальный префикс – «R_» (сокращение от Relation). Таким образом, при взгляде сразу уже понятно, что это не атрибут модели, а именно связь с другой моделью. Хотя по концепции Yii это преподносится как одно и то же (атрибут модели), всё же я считаю, что это разные вещи. Помимо добавления префикса, я всегда добавляю также и название класса модели. Да, этот подход может и менее красив, зато сух и конкретен – при взгляде на код я сразу же понимаю, что от чего зависит, и откуда взялись данные.

Как можно заметить в коде выше (метод relations), я определяю классы для связанных моделей динамически, а не текстом. Но это возможно только для PHP > 5.5. Если же (а скорей всего так и есть) сервер не поддерживает такую версию PHP, можно расширить ActiveRecord и вместо CLASS использовать метод _CLASS_(). Потом после перехода на PHP > 5.5 можно будет без проблем заменить _CLASS_() на CLASS простым «Find And Replace».

«ЗА» или «ПРОТИВ»

В моём окружении есть сторонники как «ЗА», так и «ПРОТИВ» такого подхода к именованию.

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

Да, префиксы и постфиксы несколько замедляют написание кода, но код пишется один раз, а читается и рефакторится далеко не один. Как по мне, так значительно проще читать код, в котором можно сразу определить по префиксам и регистру, где атрибут модели, где метод, а где scope или relation. Префикс «R_» явно даёт понять, что это связь, а постфикс «Model», что это модель. Например, есть класс WebUser – это компонент (extends CWebUser), а есть класс User – и это уже модель.

Мне хочется услышать от аудитории Хабра именно конструктивного обсуждения такого подхода. Возможно, есть иные варианты решения проблем с неуникальными именами.

Источник

2.9. Переменные в параметрах

Содержание

1. Краткий обзор

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

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

Когда пользователь нажмёт эту кнопку, он запустит IrfanView, а переменную %p Double Commander заменит выбранным в активной панели файлом.

Вот что понимается под переменными, описанными на этой странице.

что такое префикс и постфикс. Смотреть фото что такое префикс и постфикс. Смотреть картинку что такое префикс и постфикс. Картинка про что такое префикс и постфикс. Фото что такое префикс и постфикс

2. Основные переменные

Это основные переменные, которые могут использоваться и которые связаны с текущим выбором.

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

В качестве примера для каждой переменной мы используем файл C:\Users\UserName\Desktop\comment.png.

Основные переменные
ПеременнаяЧто обозначает
Полное имя файла, путь+имя файла
Пример: %p = «C:\Users\UserName\Desktop\comment.png»
Только путь, без разделителя каталогов в конце
Пример: %d = «C:\Users\UserName\Desktop»

3. Основные суффиксы переменных

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

Для каждого примера предполагаем следующее:
В левой панели курсор стоит на файле «C:\LeftFolder\File.lft»
В правой панели — на «C:\RightFolder\File.rgh»
Активна правая панель.

Основные суффиксы
СуффиксЧто обозначает
Исходная или активная панель (независимо от того, левая или правая)
Пример: %ps = «C:\RightFolder\File.rgh»
Целевая или неактивная панель (независимо от того, левая или правая)
Пример: %pt = «C:\LeftFolder\File.lft»
Обе панели, сначала активная, затем пробел и далее неактивная
Пример: %pp = «C:\RightFolder\File.rgh» «C:\LeftFolder\File.lft»
Обе панели, сначала левая, затем пробел и далее правая
Пример: %pb = «C:\LeftFolder\File.lft» «C:\RightFolder\File.rgh»

4. Нумерованный суффикс

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

Для каждой строки таблицы предполагаем, что в активной панели открыт каталог «C:\temp\» и мы выделили двадцать шесть файлов с именем «FileA.txt», «FileB.txt» и т.д. до «FileZ.txt».

5. Указание префикса и постфикса для каждого файла

Иногда в передаваемых исполняемому файлу параметрах необходимо что-то добавить перед именами файлов.

В некоторых случаях нужно добавить что-то до и сразу после имён файлов.

Обратите внимание, что описанное далее будет применяться к каждому выделенному файлу.

Для каждой строки таблицы предполагаем, что в активной панели открыт каталог «C:\Windows\Fonts» и мы выделили три файла с именами «courrier.ttf», «fixedsys.ttf» и «terminal.ttf».

Нумерованный суффикс
СуффиксЧто обозначает
Префикс и постфикс
Префикс и постфиксЧто обозначает
Один набор фигурных скобок добавляет текст в фигурных скобках перед каждым выделенным файлом
Пример: %fs <+>= «+courrier.ttf» «+fixedsys.ttf» «+terminal.ttf»
Два набора фигурных скобок добавят текст в фигурных скобках соответственно до и после каждого выделенного файла
Пример: %fs<[> <]>= «[courrier.ttf]» «[fixedsys.ttf]» «[terminal.ttf]»

6. Путь панели

Ранее мы разбирали переменные, связанные с выделенными файлами и папками.

Но мы также можем использовать переменную %D для выбора каталога конкретной панели.

Для выбора панели к этой переменной мы можем добавить букву из упомянутых выше основных суффиксов.

Для каждого примера предполагаем следующее:
В левой панели открыт каталог «C:\Reference»
В правой панели — «E:\Work»
Активна правая панель.

Путь панели
ПеременнаяЧто обозначает
Каталог исходной или активной панели (независимо от того, левая или правая)
Пример: «E:\Work»
Каталог целевой или неактивной панели (независимо от того, левая или правая)
Пример: «C:\Reference»
Одна, без суффикса, вернёт имя последней папки в пути активной панели
Пример: «Work»
Имя последней папки в пути активной панели (независимо от того, левая или правая)
Пример: «Work»
Имя последней папки в пути неактивной панели (независимо от того, левая или правая)
Пример: «Reference»

7. Использование кавычек

Как вы видели ранее, DC возвращает результат, автоматически расставляя двойные кавычки.

Это было полезно, если в имени файла были пробелы и мы хотели передать его в качестве параметра, и чтобы все это работало.

Но по мере добавления новых переменных стало очевидно, что нам нужен способ получить результат без кавычек. Типичный пример: мы хотим в командной строке объединить исходное имя файла, но только имя файла без расширения, с новым расширением.

Вместо добавления новых переменных, которые возвращали бы то же самое, но без кавычек, мы можем использовать те же переменные, однако необходимо добавить в строке параметров %»0, чтобы заставить DC до конца строки не расставлять кавычки автоматически.

%»0 : начиная с этой позиции не брать имена файлов в кавычки %»1 : начиная с этой позиции автоматически брать имена в кавычки %» : восстановить значение по умолчанию (автоматически расставлять кавычки)

Таблица ниже показывает примеры использования для файла с именем «Client List.mdb»:

8. Разделитель каталогов в пути

Как вы видели ранее, DC возвращает путь без разделителя каталогов в конце.

Такое поведение также может быть изменено с помощью переменной.

%/0 : путь будет возвращён без разделителя каталогов в конце %/1 : путь будет возвращён с разделителем каталогов в конце %/ : восстановление значения по умолчанию (без разделителя каталогов в конце)

Следующая таблица показывает примеры использования для каталога «C:\Users\UserName\Desktop»:

Примеры использования кавычек
ВыражениеРезультат

9. Список файлов

Некоторые приложения в качестве параметра могут принимать текстовый файл со списком имён файлов.

DC предлагает нам переменные, которые создадут временный текстовый файл со списком выделенных файлов и папок.

Разделитель каталогов в пути
ВыражениеРезультат

10. Суффиксы для списка файлов

По умолчанию имена файлов в списке не берутся в кавычки, но если это необходимо, они могут быть добавлены.

Кроме того, есть возможность выбрать для списка файлов кодировку UTF-8 или UTF-16 LE.

Список файлов
ВыражениеОписание

11. Комбинирование суффиксов для списка файлов

Вы также можете добавить ещё один суффикс, чтобы указать панель для получения списка файлов.

Суффиксы для списка файлов
ВыражениеОписание
Комбинирование суффиксов для списка файлов
ВыражениеОписание
Полные имена выделенных в целевой (неактивной) панели файлов, заключённые в кавычки
Только имена выделенных в активной панели файлов, список в кодировке UTF-8
Имена файлов активной панели (по умолчанию) с относительным путём, в кавычках, список в кодировке UTF-16 LE

12. Запуск в терминале

В параметрах вы можете указать, что команду необходимо выполнить в терминале.

13. Взаимодействие

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

Запуск в терминале
ВыражениеОписание
Взаимодействие
ВыражениеОписание
Будет показано обычное окно сообщения с текстом между квадратными скобками
Будет показано окно запроса ввода параметра с его значением по умолчанию
Пример взаимодействия
ВыражениеОписание
Перед выполнением действия будет показано окно с сообщением «Убедитесь, что ThisFile.ext закрыт!».
Перед выполнением действия будет показано окно с текстом «Введите значение ШИРИНЫ для преобразования изображения», в поле ввода будет вставлено значение по умолчанию, 1024. Введённое пользователем значение будет подставлено в то место строки, где добавлено выражение «%[запрос;значение]».

14. Прочие переменные

В этом заключительном разделе перечислены переменные, которые ещё не были представлены.

Прочие переменные
ВыражениеОписание
С этой позиции и до конца строки вместо % указателем переменной будет символ #
Отмена предыдущего поведения: отсюда и до конца строки указателем переменной будет знак %
До выполнения будет показана вся командная строка, с развёрнутыми значениями переменных.

%% обычно используется, если вам необходимо использовать символ % как есть: это не позволит Double Commander попытаться прочитать этот и последующие символы как переменную.

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

Более того, вы можете что-то изменить в этом окне, непосредственно до запуска команды.

Это особенно полезно, если вы не уверены в параметрах, передаваемых приложению.

Иногда комбинация знака процента и буквы переменной может совпасть с системной переменной.

%# указывает DC, что с этого момента символ # эквивалентен символу процента, таким образом можно избежать пересечения с возможными системными переменными.

Это редко необходимо, но если потребуется, вы будете рады узнать, что способ обойти существует!

Далее, если потребуется, #% вернёт символу % обычное значение.

15. Сводная таблица со всеми переменными

В этом разделе нет ничего нового, однако для удобства все переменные сведены в одну таблицу.

Источник

Что такое постфикс в русском языке? Примеры

Постфикс — это зна­чи­мая мор­фе­ма, нахо­дя­ща­я­ся после всех дру­гих частей сло­ва. Различаем фор­мо­об­ра­зу­ю­щий и сло­во­об­ра­зо­ва­тель­ный пост­фикс, кото­рый вклю­ча­ет­ся в осно­ву слова.

Значимые части слова — морфемы

Чтобы узнать, что такое пост­фикс, вспом­ним, какие мор­фе­мы в сво­ем соста­ве име­ют сло­ва рус­ско­го языка:

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

Кроме этих часто встре­ча­ю­щих­ся мор­фем, в соста­ве неко­то­рых лек­сем име­ет­ся еще одна зна­чи­мая часть — постфикс.

Постфикс — это…

Лингвистический тер­мин «пост­фикс» явля­ет­ся латин­ским по сво­е­му про­ис­хож­де­нию и состо­ит из двух частей:

В мор­фе­ми­ке рус­ско­го язы­ка поль­зу­ют­ся этим тер­ми­ном, кото­рый име­ет сле­ду­ю­щее значение:

что такое префикс и постфикс. Смотреть фото что такое префикс и постфикс. Смотреть картинку что такое префикс и постфикс. Картинка про что такое префикс и постфикс. Фото что такое префикс и постфикс

А вот какое опре­де­ле­ние, что такое пост­фикс, мож­но про­честь в Википедии:

Как обозначается постфикс?

Все зна­чи­мые части сло­ва име­ют услов­ное гра­фи­че­ское обо­зна­че­ние. Постфикс обо­зна­ча­ет­ся в виде пря­мо­го угол­ка с про­длен­ной впра­во гори­зон­таль­ной линией.

что такое префикс и постфикс. Смотреть фото что такое префикс и постфикс. Смотреть картинку что такое префикс и постфикс. Картинка про что такое префикс и постфикс. Фото что такое префикс и постфикс

Постфиксальный способ словообразования

В соста­ве воз­врат­ных гла­го­лов отме­тим нали­чие пост­фик­са -ся, вари­ан­том кото­ро­го явля­ет­ся -сь. Возникает вопрос — пост­фикс -ся сло­во­об­ра­зо­ва­тель­ный или формообразующий?

Морфема -ся пишет­ся после соглас­ных, а -сь — после глас­ных, например:

Глагольный воз­врат­ный пост­фикс выпол­ня­ет фор­мо­об­ра­зу­ю­щую роль:

Как и фор­мо­об­ра­зу­ю­щие суф­фик­сы и окон­ча­ние, эта часть сло­ва не вклю­ча­ет­ся в про­из­во­дя­щую основу:

Постфикс -ся может участ­во­вать в обра­зо­ва­нии новых слов — непе­ре­ход­ных гла­го­лов:

Эта мор­фе­ма явля­ет­ся тогда сло­во­об­ра­зо­ва­тель­ной, когда она участ­ву­ет в обра­зо­ва­нии воз­врат­ных гла­го­лов, не име­ю­щих пары без неё, или сло­во в при­сут­ствии пост­фик­са при­об­ре­та­ет дру­гое лек­си­че­ское значение.

В таких слу­ча­ях, явля­ясь сло­во­об­ра­зо­ва­тель­ной мор­фе­мой, -ся вхо­дит в осно­ву лек­се­мы, кото­рая чаще все­го явля­ет­ся пре­ры­ви­стой, например:

В соот­вет­ствии с эти­ми кри­те­ри­я­ми не вхо­дит в гла­голь­ную осно­ву пост­фикс -те, обра­зу­ю­щий фор­му 2 лица мно­же­ствен­но­го чис­ла пове­ли­тель­но­го наклонения:

Понаблюдаем за про­цес­сом словообразования:

Словообразовательные пост­фик­сы место­име­ний и наре­чий вклю­ча­ем в осно­ву слов:

Постфикс -ка смяг­ча­ет при­каз­ной тон обра­ще­ния к дру­го­му лицу:

Принеси-ка мне чистый лист, руч­ку и чер­ни­ла (Майн Рид).

В мор­фем­ном соста­ве слов рус­ско­го язы­ка суще­ству­ют мини­маль­ные зна­чи­мые сло­во­об­ра­зо­ва­тель­ные и фор­мо­об­ра­зу­ю­щие части:

Формообразующие пост­фик­сы не вхо­дят в осно­ву слов.

Источник

Инфиксные, префиксные и постфиксные выражения¶

Когда вы записываете арифметическое выражение вроде B * C, то его форма предоставляет вам достаточно информации для корректной интерпретации. В данном случае мы знаем, что переменная B умножается на переменную C, поскольку оператор умножения * находится в выражении между ними. Такой тип записи называется инфиксной, поскольку оператор расположен между (in between) двух операндов, с которыми он работает.

Рассмотрим другой инфиксный пример: A + B * C. Операторы + и * по-прежнему располагаются между операндами, но тут уже есть проблема. С какими именно операндами они будут работать? + работает с A и B или * принимает B и C? Выражение выглядит неоднозначно.

Фактически, вы можете читать и писать выражения такого типа долгое время, и они не будут вызывать у вас вопросов. Причина в том, что вы кое-что знаете о + и *. Каждый оператор имеет свой приоритет. Операторы с высоким приоритетом используются прежде операторов с низким. Единственной вещью, которая может изменить порядок приоритетов, являются скобки. Для арифметических операций умножение и деление стоят выше сложения и вычитания. Если появляются два оператора одинакового приоритета, то используются порядок слева направо, или их ассоциативность.

Давайте интерпретируем вызвавшее затруднение выражение A + B * C, используя приоритет операторов. B и C перемножаются первыми, затем к результату добавляется A. (A + B) * C заставит выполнить сложение A и B перед умножением. В выражении A + B + C по очерёдности (через ассоциативность) первым будет вычисляться самый левый +.

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

Выражение A + B * C + D может быть переписано как ((A + (B * C)) + D) с целью показать, что умножение происходит в первую очередь, а затем следует крайнее левое сложение. A + B + C + D перепишется в (((A + B) + C) + D), поскольку операции сложения ассоциируются слева направо.

Существует ещё два очень важных формата выражений, которые на первый взгляд могут показаться вам неочевидными. Рассмотрим инфиксную запись A + B. Что произойдёт, если мы поместим оператор перед двумя операндами? Результирующее выражение будет + A B. Также мы можем переместить оператор в конец, получив A B +. Всё это выглядит несколько странным.

A + B * C в префиксной нотации можно переписать как + A * B C. Оператор умножения ставится непосредственно перед операндами B и C, указывая на приоритет * над +. Затем следует оператор сложения перед A и результатом умножения.

В постфиксной записи выражение выглядит как A B C * +. Порядок операций вновь сохраняется, поскольку * находится непосредственно после B и C, обозначая, что он имеет приоритет выше следующего +. Хотя операторы перемещаются и теперь находятся до или после соответствующих операндов, порядок последних по отношению друг к другу остаётся в точности таким, как был.

Таблица 2: Примеры инфиксной, префиксной и постфиксной записи

Инфиксная записьПрефиксная записьПостфиксная запись
A + B+ A BA B +
A + B * C+ A * B CA B C * +

А сейчас рассмотрим инфиксное выражение (A + B) * C. Напомним, что в этом случае запись требует наличия скобок для указания выполнить сложение перед умножением. Однако, когда A + B записывается в префиксной форме, то оператор сложения просто помещается перед операндами: + A B. Результат этой операции является первым операндом для умножения. Оператор умножения перемещается в начало всего выражения, давая нам * + A B C. Аналогично, в постфиксной записи A B + явно указывается, что первым происходит сложение. Умножение может быть выполнено для получившегося результата и оставшегося операнда C. Соответствующим постфиксным выражением будет A B + C *.

Рассмотрим эти три выражения ещё раз (см. таблицу 3). Происходит что-то очень важное. Куда ушли скобки? Почему они не нужны нам в префиксной и постфиксной записи? Ответ в том, что операторы больше не являются неоднозначными по отношению к своим операндам. Только инфиксная запись требует дополнительных символов. Порядок операций внутри префиксного и постфиксного выражений полностью определён позицией операторов и ничем иным. Во многом именно это делает инфиксную запись наименее желательной нотацией для использования.

Таблица 3: Выражение со скобками

Инфиксное выражениеПрефиксное выражениеПостфиксное выражение
(A + B) * C* + A B CA B + C *

Таблица 4 демонстрирует некоторые дополнительные примеры инфиксных выражений и эквивалентных им префиксных и постфиксных записей. Убедитесь, что вы понимаете, почему они эквивалентны с точки зрения порядка выполнения операций.

Таблица 4: Дополнительные примеры инфиксной, префиксной и постфиксной записи

Инфиксное выражениеПрефиксное выражениеПостфиксное выражение
A + B * C + D+ + A * B C DA B C * + D +
(A + B) * (C + D)* + A B + C DA B + C D + *
A * B + C * D+ * A B * C DA B * C D * +
A + B + C + D+ + + A B C DA B + C + D +

Преобразование инфиксного выражения в префиксное и постфиксное¶

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

Первой из рассматриваемых нами техник будет использование идеи полной расстановки скобок в выражении, рассмотренной нами ранее. Напомним, что A + B * C можно записать как (A + (B * C)), чтобы явно показать приоритет умножения перед сложением. Однако, при более близком рассмотрении вы увидите, что каждая пара скобок также отмечает начало и конец пары операндов с соответствующим оператором по середине.

Взгляните на правую скобку в подвыражении (B * C) выше. Если мы передвинем символ умножения с его позиции и удалим соответствующую левую скобку, получив B C *, то произойдёт конвертирование подвыражение в постфиксную нотацию. Если оператор сложения тоже передвинуть к соответствующей правой скобке и удалить связанную с ним левую скобку, то результатом станет полностью постфиксное выражение (см. рисунок 6).

что такое префикс и постфикс. Смотреть фото что такое префикс и постфикс. Смотреть картинку что такое префикс и постфикс. Картинка про что такое префикс и постфикс. Фото что такое префикс и постфикс

Рисунок 6: Перемещение операторов вправо для постфиксной записи

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

что такое префикс и постфикс. Смотреть фото что такое префикс и постфикс. Смотреть картинку что такое префикс и постфикс. Картинка про что такое префикс и постфикс. Фото что такое префикс и постфикс

Рисунок 7: Перемещение операторов влево для префиксной записи.

что такое префикс и постфикс. Смотреть фото что такое префикс и постфикс. Смотреть картинку что такое префикс и постфикс. Картинка про что такое префикс и постфикс. Фото что такое префикс и постфикс

Рисунок 8: Преобразование сложного выражения к префиксной и постфиксной записи.

Обобщённое преобразование из инфиксного в постфиксный вид¶

Нам необходимо разработать алгоритм преобразования любого инфиксного выражения в постфиксное. Для этого посмотрим ближе на сам процесс конвертирования.

Рассмотрим ещё раз выражение A + B * C. Как было показано выше, его постфиксным эквивалентом является A B C * +. Мы уже отмечали, что операнды A, B и C остаются на своих местах, а местоположение меняют только операторы. Ещё раз взглянем на операторы в инфиксном выражении. Первым при проходе слева направо нам попадётся +. Однако, в постфиксном выражении + находится в конце, так как следующий оператор, *, имеет приоритет над сложением. Порядок операторов в первоначальном выражении обратен результирующему постфиксному выражению.

В процессе обработки выражения операторы должны где-то храниться, пока не найден их соответствующий правый операнд. Также порядок этих сохраняемых операторов может быть обратным (из-за их приоритета), как в данном примере со сложением и умножением. Поскольку оператор сложения, появляющийся перед оператором умножения, имеет более низкий приоритет, то он должен появиться после использования последнего. Из-за такого обратного порядка имеет смысл рассмотреть использование стека для хранения операторов до тех пор, пока они не понадобятся.

Что насчёт (A + B) * C? Напомним его постфиксный эквивалент: A B + C *. Повторимся, что обрабатывая это инфиксное выражение слева направо, первым мы встретим +. В этом случае, когда мы увидим *, + уже будет помещён в результирующее выражение, поскольку имеет преимущество над * в силу использования скобок. Теперь можно приступить к рассмотрению работы алгоритма преобразования. Когда мы видим левую скобку, то сохраняем её как знак, что должен будет появиться другой оператор с высоким приоритетом. Он будет ожидать, пока не появится соответствующая правая скобка, чтобы отметить его местоположение (вспомните технику полной расстановки скобок). После появления правой скобки оператор выталкивается из стека.

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

Рисунок 9 демонстрирует алгоритм преобразования, работающий над выражением A * B + C * D. Заметьте, что первый оператор * удаляется до того, как мы встречаем оператор +. Также + остаётся в стеке, когда появляется второй *, поскольку умножение имеет приоритет перед сложением. В конце инфиксного выражения из стека дважды происходит выталкивание, удаляя оба оператора и помещая + как последний элемент в результирующее постфиксное выражение.

что такое префикс и постфикс. Смотреть фото что такое префикс и постфикс. Смотреть картинку что такое префикс и постфикс. Картинка про что такое префикс и постфикс. Фото что такое префикс и постфикс

Рисунок 9: Преобразование A * B + C * D в постфиксную запись

Чтобы закодировать алгоритм на Python, мы будем использовать словарь под именем prec для хранения значений приоритета операторов. Он связывает каждый оператор с целым числом, которые можно сравнивать с числами других операторов, как уровень приоритетности (для этого мы произвольно выбрали целые числа 3, 2 и 1). Левая скобка получит самое низкое значение. Таким образом, любой сравниваемый с ней оператор будет иметь приоритет выше и располагаться над ней. Строка 15 определяет, что операнды могут быть любыми символами в верхнем регистре или цифрами. Полная функция преобразования показана в ActiveCode 8.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *