Разделители
Разделители не являются существенной частью языка программирования.
Некоторые из них просто опускают при описании грамматики.
При грамматическом разборе они помогают выделить как отдельные лексемы, так и целые выражения.
Разберём такой пример на 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
Отзывы
✅ 2016/08/05 21:44, rst256 #0
В некоторых языках идентификаторы могут содержать внутри себя пробелы. Если это пробелы с кодом 32, то это создаёт некоторые проблемы для компилятора. Самое разумное, наверно, не считать одиночный пробел разделителем. Если два пробела и более — полноправный разделитель. Этот метод оправдан только тогда. когда в синтаксисе языка ОЧЕНЬ много правил, в которых допустима последовательность из двух и более идентификаторов подряд и используются идентификаторы, начинающихся с ключевых слов, отделенных от остальной части пробелом.
Например, в языке си было бы достаточно изменить только одно правило определения нового символа (не типа!): <выражение типа> <новый идентификатор> на такое в стиле Паскаль:<выражение типа> `:` <новый идентификатор> И если не учитывать работу препроцессора, грамматика языка си будет теперь будет поддерживать идентификаторы с пробелами. И можно даже игнорировать множественные пробелы внутри имен, (распознавать "ид а" и "ид а" как один и тот же идентификатор) Добавить свой отзыв
Написать автору можно на электронную почту mail(аt)compiler.su
|