Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки Cтатьи на компьютерные темы Компьютерный юмор Новости и прочее

Разделители

Разделители не являются существенной частью языка программирования. Некоторые из них просто опускают при описании грамматики. При грамматическом разборе они помогают выделить как отдельные лексемы, так и целые выражения. Разберём такой пример на C:

int i = func(a,b);
i += 10;
        В этом примере пробельный символ, используемый в качестве разделителя, важен только в «int i». Без него запись «inti» приобретает иной смысл. В остальных случаях пробельный символ помогает не компилятору, а программисту, читающему текст. Следует оговориться, что понятие «пробельный символ» включает в себя пробел, последовательность пробелов, символ табуляции и перевод строки. В остальных случаях разделитель не обязателен, грамматика языка C позволяет обойтись без него. Почему?

        Потому что в алголоподобных языках, как правило, лексемы одинакового вида редко соседствуют. Идентификаторы перемежаются символами операций, скобками, запятыми для разделения аргументов, а так же разделителями выражений (чаще всего это «;»). А вот в языке Forth разделители (в основном это пробел) обязательны. Даже в простейших арифметических выражениях операнды и операции должны быть разделены:
2 3 +		(правильная запись с разделителями)
2 3+		(неправлильно: «3+» трактуется как монолитное Форт-слово)
        Это особенность Форта: слово может содержать в себе любые символы. Расплачиваться за это приходится обязательным разделителем между соседними словами Форта. В языке J — похожая ситуация. Однако повторять синтаксис этих языков вряд ли стоит. Полная свобода в одном приведёт к ограничениям в другом.

        В некоторых языках идентификаторы могут содержать внутри себя пробелы. Если это пробелы с кодом 32, то это создаёт некоторые проблемы для компилятора. Как отличить пробел внутри идентфикатора от пробела-разделителя? Как тракторвать «int i» — как два идентификатора, разделённых пробелом, или как один? Как решить эту проблему?

        Самое разумное, наверно, не считать одиночный пробел разделителем. Если два пробела и более — полноправный разделитель. Многие могли бы возразить, что существует ещё пробел с кодом 160. Вот его можно было бы считать буквой и, как следствие, её можно было бы употреблять без ограничений. А вот пробел с кодом 32 можно было бы оставить в покое, пусть это будет разделителем. Но как тогда в программе визуально отличать один пробел от другого? Подводить курсор к вызывающему вопросы пробелу и смотреть на его код? Или каким-то образом графически помечать пробел с кодом 160, чтобы он визуально отличался? Да и стоит ли использовать в языке символ, которого нет на клавиатуре? Конечно, его можно набирать комбинацией клавиш («Ctrl»+«Space», например). Но мы придём к практике употребления «магческих комбинаций» для набора на клавиатуре символов, на ней отсутствующих.

        В алголоподобных языках в качестве разделителя выражений чаще всего выступает символ «;». В некоторых языках «;» заменена на «перевод строки». Это правильный решение. «Перевод строки» трудно не заметить в программе, ведь после него следующее выражение размещается на новой строке. Это стимулирует придерживаться правила «отдельное выражение — на отдельной строке», что ведёт к ясности кода. Более подробно — в следующей статье «Строки программы»

Опубликовано: 2012.09.25, последняя правка: 2015.01.23    03:26

ОценитеОценки посетителей
   ████████████████████ 15 (46.8%)
   ██████████ 7 (21.8%)
   ████ 3 (9.37%)
   ██████████ 7 (21.8%)

Отзывы

✅  2016/08/05 21:44, rst256          #0 

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

Самое разумное, наверно, не считать одиночный пробел разделителем. Если два пробела и более — полноправный разделитель.

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

Например, в языке си было бы достаточно изменить только одно правило определения нового символа (не типа!):
<выражение типа> <новый идентификатор>
на такое в стиле Паскаль:
<выражение типа> `:` <новый идентификатор>
И если не учитывать работу препроцессора, грамматика языка си будет теперь будет поддерживать идентификаторы с пробелами. И можно даже игнорировать множественные пробелы внутри имен, (распознавать "ид а" и "ид а" как один и тот же идентификатор)

Добавить свой отзыв

Написать автору можно на электронную почту
mail(аt)compiler.su

Авторизация

Регистрация

Выслать пароль

Карта сайта


Содержание

Каким должен быть язык программирования?

Анализ и критика

●  Устарел ли текст как форма представления программы

●  Русский язык и программирование

●  Многоязыковое программирование

Синтаксис языков программирования

Синтаксический сахар

●  Некоторые «вкусности» Алгол-68

●  «Двухмерный» синтаксис Python

●  Почему языки с синтаксисом Си популярнее языков с синтаксисом Паскаля?

●  Должна ли программа быть удобочитаемой?

●  Стиль языка программирования

●  Тексто-графическое представление программы

●●  Разделители

●●  Строки программы

●●  Слева направо или справа налево?

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

●●  Длинные комментарии

●●  Короткие комментарии

●●  Комментарии автоматической генерации документации

●●  Нерабочий код

●●  Помеченные комментарии

●  Нужны ли беззнаковые целые?

●  Шестнадцатиричные и двоичные константы

●  Условные операторы

●  Переключатель

●  Циклы

●●  Продолжение цикла и выход из него

●  Некошерный «goto»

●  Изменение приоритетов операций

●  Операции присвоения и проверки на равенство. Возможно ли одинаковое обозначение?

●  Так ли нужны операции «&&», «||» и «^^»?

●  Постфиксные инкремент и декремент

●  Почему в PHP для конкатенации строк используется «.»?

●  Указатели и ссылки в C++

●●  О неправомерном доступе к памяти через указатели

●  Обработка ошибок

●  Функциональное программирование

●●  Нечистые действия в чистых функциях

●●  О чистоте и нечистоте функций и языков

●●  Макросы — это чистые функции, исполняемые во время компиляции

●●  Хаскелл, детище британских учёных

●●  Измеряем замедление при вызове функций высших порядков

●●  C vs Haskell: сравнение скорости на простом примере

●●  Уникальность имён функций: за и против

●●  Каррирование: для чего и как

●●  О тестах, доказывающих отсутствие ошибок

●  Надёжные программы из ненадёжных компонентов

●●  О многократном резервировании функций

●  Оценка надёжности функции с несколькими реализациями

●  Использование памяти

●  Почему динамическое распределение памяти — это плохо

●  Как обеспечить возврат функциями объектов переменной длины?

●●  Типы переменного размера (dynamically sized types, DST) в языке Rust

●●  Массивы переменной длины в C/C++

●●  Размещение объектов в стеке, традиционный подход

●●  Размещение объектов переменной длины с использованием множества стеков

●●  Размещение объектов переменной длины с использованием двух стеков

●●  Реализация двухстековой модели размещения данных

●●  Двухстековая модель: тесты на скорость

●●  Изменение длины объекта в стеке во время исполнения

●●  Размещение объектов переменной длины с использованием одного стека

●  Можно ли забыть о «куче», если объекты переменной длины хранить в стеке

●  Безопасность и размещение объектов переменной длины в стеке

●  Массивы, структуры, типы, классы переменной длины

●  О хранении данных в стеке, вместо заключения

●  Реализация параметрического полиморфизма

Описание языка

Компилятор

Отечественные разработки

Cтатьи на компьютерные темы

Компьютерный юмор

Новости и прочее




Последние отзывы

2024/11/21 11:02 ••• Автор сайта
Продолжение цикла и выход из него

2024/11/12 20:24 ••• Вежливый Лис
Правила языка: строки, комментарии

2024/11/12 13:10 ••• Вежливый Лис
Новости и прочее

2024/11/12 00:32 ••• Автор сайта
Оценка надёжности функции с несколькими реализациями

2024/11/06 02:50 ••• Иван
Энтузиасты-разработчики компиляторов и их проекты

2024/11/05 23:51 ••• Борис К.
Изменение приоритетов операций

2024/11/05 23:38 ••• Борис К.
Шестнадцатиричные и двоичные константы

2024/11/04 12:50 ••• Неслучайный читатель
Русский язык и программирование

2024/11/01 12:11 ••• ИванАс
Русской операционной системой должна стать ReactOS

2024/10/27 14:01 ••• Автор сайта
О русском ассемблере

2024/09/29 23:40 ••• Автор сайта
Десятка худших фич C#

2024/09/29 13:10 ••• Автор сайта
ЕС ЭВМ — это измена, трусость и обман?

2024/09/22 21:08 ••• Вежливый Лис
Бесплатный софт в мышеловке