Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки 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», например). Но мы придём к практике употребления «магческих комбинаций» для набора на клавиатуре символов, на ней отсутствующих.

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

Последняя правка: 2015-01-23    06:26

ОценитеОценки посетителей
   █████████████████████████████ 9 (69.2%)
   ████ 1 (7.69%)
   ████ 1 (7.69%)
   ███████ 2 (15.3%)

Отзывы

     2016/08/05 21:44, rst256

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

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

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

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

Написать отзыв

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

Авторизация

Регистрация

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

Карта сайта


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Комментарии

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

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

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

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

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

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

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

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

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

Циклы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Компилятор

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

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

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

Прочее

Последние комментарии

2018/12/08 23:03 ••• Попов Михаил
✎ Программирование без программистов — это медицина без врачей

2018/12/07 08:57 ••• Автор сайта
✎ Почему обречён язык Форт

2018/12/07 08:36 ••• Автор сайта
✎ Нужны ли беззнаковые целые?

2018/12/03 13:51 ••• kt
✎ Экстракоды при синтезе программ

2018/11/30 17:56 ••• Freeman
✎ Изменение приоритетов операций

2018/11/30 17:20 ••• Автор сайта
✎ Почему языки с синтаксисом Си популярнее языков с синтаксисом Паскаля?

2018/11/26 14:23 ••• Автор сайта
✎ Так ли нужны операции «&&», «||» и «^^»?

2018/11/18 15:21 ••• Freeman
✎ Устарел ли текст как форма представления программы

2018/11/17 03:28 ••• Comdiv
✎ Изменение длины объекта в стеке во время исполнения

2018/11/16 12:53 ••• Автор сайта
✎ Помеченные комментарии

2018/11/11 14:01 ••• Александр Коновалов aka Маздайщик
✎ Нерабочий код

2018/11/11 13:39 ••• Александр Коновалов aka Маздайщик
✎ О русском языке в программировании