Лексическая структура Haskell 98
2.3 Комментарии
Комментарии являются правильными пробельными символами.
Обычный комментарий начинается с последовательности двух или более следующих друг за другом символов тире (например, - ) и простирается до следующего символа новой строки. Последовательность тире не должна являться частью правильной лексемы. Например, "- " или "|-" не являются началом комментария, потому что оба они являются правильными лексемами; но "-foo" начинает комментарий.
Вложенный комментарий начинается с "{-" и заканчивается "-}". Нет никаких правильных лексем, которые начинаются с "{-" ; следовательно, например, "{-" начинает вложенный комментарий несмотря на замыкающие символы тире.
Сам комментарий не подвергается лексическому анализу. Вместо этого, первое,не имеющее соответствующей пары вхождение строки "-}" заканчивает вложенный комментарий. Вложенные комментарии могут быть вложенными на любую глубину: любое вхождение строки "{-" в пределах вложенного комментария начинает новый вложенный комментарий, заканчивающийся "-}". В пределах вложенного комментария каждый "{-" сопоставляется с соответствующим вхождением "-}".
В обычном комментарии последовательности символов "{-" и "-}" не имеют никакого специального значения, и во вложенном комментарии последовательность символов тире не имеет никакого специального значения.
Вложенные комментарии также используются для указаний компилятору, объясненных в лекции "Указания компилятору (псевдокомментарии)" .
Если некоторый код закомментирован с использованием вложенного комментария, то любое вхождение {- или -} в пределах строки или в пределах комментария до конца строки в этом коде будет влиять на вложенные комментарии.
2.4 Идентификаторы и операторы
Перевод:
Идентификатор состоит из буквы, за которой следует ноль или более букв, цифр, символов подчеркивания и одинарных кавычек. Идентификаторы лексически делятся на два пространства имен (раздел "Введение" ): те, которые начинаются со строчной буквы (идентификаторы переменных), и те, которые начинаются с заглавной буквы (идентификаторы конструкторов). Идентификаторы зависят от регистра букв: name, naMe и Name - это три различных идентификатора (первые два являются идентификаторами переменных, последний - идентификатором конструктора).
Символ подчеркивания "_" рассматривается как строчная буква, и может появляться везде, где может появляться строчная буква. Тем не менее, "_" сам по себе является зарезервированным идентификатором, который используется для обозначения группы любых символов в образцах. Компиляторы, которые выводят предупреждения о неиспользованных идентификаторах, подавляют вывод таких предупреждений для идентификаторов, начинающихся с символа подчеркивания. Это позволяет программистам использовать "_foo" для параметра, который, как они ожидают, не будет использоваться.
varsym | ![]() |
( symbol {symbol | :})<reservedop | dashes> |
consym | ![]() |
(: {symbol | :})<reservedop> |
reservedop | ![]() |
.. | : | :: | = | \ | | | ![]() ![]() ![]() ![]() |
Перевод:
символ-переменной | ![]() |
( символ {символ | :})<зарезервированный-оператор | тире< |
символ-конструктора | ![]() |
(: {символ | :})< зарезервированный-оператор> |
зарезервированный-оператор | ![]() |
.. | : | :: | = | \ | | | ![]() ![]() ![]() ![]() |
Символы операторов образуются из одного или более символов, в соответствии с приведенным выше определением, и лексически делятся на два пространства имен (раздел "Введение" ):
- Символ оператора, начинающийся с двоеточия, обозначает конструктор.
- Символ оператора, начинающийся с любого другого символа, обозначает обычный идентификатор.
Заметьте, что само по себе двоеточие ":" зарезервировано исключительно для использования в качестве конструктора списков в Haskell; это делает их интерпретацию единообразной с другими частями синтаксиса списка, как например "[]" и "[a,b]".
За исключением специального синтаксиса для префиксного отрицания, все остальные операторы являются инфиксными, хотя каждый инфиксный оператор можно использовать в сечении для выполнения частичного применения операторов (см. раздел "Выражения" ).
Все стандартные инфиксные операторы являются просто предопределенными символами и могут использоваться в связывании имен.
В оставшейся части описания будут использоваться шесть различных видов имен:
varid | (переменные) | ||
conid | (конструкторы) | ||
tyvar | ![]() |
varid | (переменные типов) |
tycon | ![]() |
conid | (конструкторы типов) |
tycls | ![]() |
conid | (классы типов) |
modid | ![]() |
conid | (модули) |
Перевод:
Переменные и переменные типов представляются идентификаторами, начинающимися с маленьких букв, а остальные четыре - идентификаторами, начинающимися с больших букв; также, переменные и конструкторы имеют инфиксные формы, остальные четыре - нет. Пространства имен также рассматриваются в разделе "Введение" .
В определенных обстоятельствах имя может быть снабжено необязательным квалификатором, т.е. быть квалифицировано, посредством присоединения к нему слева идентификатора модуля. Это относится к именам переменных, конструкторов, конструкторов типов и классов типов, но не относится к переменным типов или именам модулей. Квалифицированные имена подробно рассматриваются в лекции "Модули" .
qvarid | ![]() |
[modid .] varid |
qconid | ![]() |
[modid .] conid |
qtycon | ![]() |
[modid .] tycon |
qtycls | ![]() |
[modid .] tycls |
qvarsym | ![]() |
[modid .] varsym |
qconsym | ![]() |
[modid .] consym |
Перевод:
квалифицированный-идентификатор-переменной | ![]() |
[идентификатор-модуля .] идентификатор-переменной |
квалифицированный-идентификатор-конструктора | ![]() |
[идентификатор-модуля .] идентификатор-конструктора |
квалифицированный-конструктор-типа | ![]() |
[идентификатор-модуля .] конструктор-типа |
квалифицированный-класс-типа | ![]() |
[идентификатор-модуля .] класс-типа |
квалифицированный-символ-переменной | ![]() |
[идентификатор-модуля .] символ-переменной |
квалифицированный-символ-конструктора | ![]() |
[идентификатор-модуля .] символ-конструктора |
Так как квалифицированное имя является лексемой, пробелы недопустимы между квалификатором и именем. Примеры лексического анализа приведены ниже.
Это | интерпретируется как |
---|---|
f.g | f . g (три токена) |
F.g | F.g (квалифицированное 'g') |
f.. | f .. (два токена) |
F.. | F.. (квалифицированный '.') |
F. | F.(два токена) |
Квалификатор не изменяет синтаксическую интерпретацию имени; например, Prelude.+ - это инфиксный оператор той же ассоциативности и того же приоритета, что и определение + в Prelude (раздел "Объявления и связывания имен" ).