Опубликован: 19.09.2008 | Доступ: свободный | Студентов: 658 / 70 | Оценка: 4.50 / 5.00 | Длительность: 21:25:00
Лекция 3:

Лексическая структура Haskell 98

< Лекция 2 || Лекция 3: 123 || Лекция 4 >

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

Комментарии являются правильными пробельными символами.

Обычный комментарий начинается с последовательности двух или более следующих друг за другом символов тире (например, - ) и простирается до следующего символа новой строки. Последовательность тире не должна являться частью правильной лексемы. Например, "- \to " или "|-" не являются началом комментария, потому что оба они являются правильными лексемами; но "-foo" начинает комментарий.

Вложенный комментарий начинается с "{-" и заканчивается "-}". Нет никаких правильных лексем, которые начинаются с "{-" ; следовательно, например, "{-" начинает вложенный комментарий несмотря на замыкающие символы тире.

Сам комментарий не подвергается лексическому анализу. Вместо этого, первое,не имеющее соответствующей пары вхождение строки "-}" заканчивает вложенный комментарий. Вложенные комментарии могут быть вложенными на любую глубину: любое вхождение строки "{-" в пределах вложенного комментария начинает новый вложенный комментарий, заканчивающийся "-}". В пределах вложенного комментария каждый "{-" сопоставляется с соответствующим вхождением "-}".

В обычном комментарии последовательности символов "{-" и "-}" не имеют никакого специального значения, и во вложенном комментарии последовательность символов тире не имеет никакого специального значения.

Вложенные комментарии также используются для указаний компилятору, объясненных в лекции "Указания компилятору (псевдокомментарии)" .

Если некоторый код закомментирован с использованием вложенного комментария, то любое вхождение {- или -} в пределах строки или в пределах комментария до конца строки в этом коде будет влиять на вложенные комментарии.

2.4 Идентификаторы и операторы

varid \to (small {small | large | digit | ' })<reservedid>
conid \to large {small | large | digit | ' }
reservedid \to case | class | data | default | deriving | do | else
| if | import | in | infix | infixl | infixr | instance
| let | module | newtype | of | then | type | where | _

Перевод:

идентификатор-переменной \to (маленькая-буква {маленькая-буква | большая-буква | цифра | ' })<зарезервированный-идентификатор>
идентификатор-конструктора \to большая-буква {маленькая-буква | большая-буква | цифра | ' }
зарезервированный-идентификатор \to case | class | data | default | deriving | do | else
| if | import | in | infix | infixl | infixr | instance
| let | module | newtype | of | then | type | where | _

Идентификатор состоит из буквы, за которой следует ноль или более букв, цифр, символов подчеркивания и одинарных кавычек. Идентификаторы лексически делятся на два пространства имен (раздел "Введение" ): те, которые начинаются со строчной буквы (идентификаторы переменных), и те, которые начинаются с заглавной буквы (идентификаторы конструкторов). Идентификаторы зависят от регистра букв: name, naMe и Name - это три различных идентификатора (первые два являются идентификаторами переменных, последний - идентификатором конструктора).

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

varsym \to ( symbol {symbol | :})<reservedop | dashes>
consym \to (: {symbol | :})<reservedop>
reservedop \to .. | : | :: | = | \ | | | \gets | \to | @ | \sim | \Rightarrow

Перевод:

символ-переменной \to ( символ {символ | :})<зарезервированный-оператор | тире<
символ-конструктора \to (: {символ | :})< зарезервированный-оператор>
зарезервированный-оператор \to .. | : | :: | = | \ | | | \gets | \to | @ | \sim | \Rightarrow

Символы операторов образуются из одного или более символов, в соответствии с приведенным выше определением, и лексически делятся на два пространства имен (раздел "Введение" ):

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

Заметьте, что само по себе двоеточие ":" зарезервировано исключительно для использования в качестве конструктора списков в Haskell; это делает их интерпретацию единообразной с другими частями синтаксиса списка, как например "[]" и "[a,b]".

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

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

В оставшейся части описания будут использоваться шесть различных видов имен:

varid (переменные)
conid (конструкторы)
tyvar \to varid (переменные типов)
tycon \to conid (конструкторы типов)
tycls \to conid (классы типов)
modid \to conid (модули)

Перевод:

идентификатор-переменной (переменные)
идентификатор-конструктора (конструкторы)
переменная-типа \to идентификатор-переменной (переменные типов)
конструктор-типа \to идентификатор-конструктора (конструкторы типов)
класс-типа \to идентификатор-конструктора (классы типов)
идентификатор-модуля \to идентификатор-конструктора (модули)

Переменные и переменные типов представляются идентификаторами, начинающимися с маленьких букв, а остальные четыре - идентификаторами, начинающимися с больших букв; также, переменные и конструкторы имеют инфиксные формы, остальные четыре - нет. Пространства имен также рассматриваются в разделе "Введение" .

В определенных обстоятельствах имя может быть снабжено необязательным квалификатором, т.е. быть квалифицировано, посредством присоединения к нему слева идентификатора модуля. Это относится к именам переменных, конструкторов, конструкторов типов и классов типов, но не относится к переменным типов или именам модулей. Квалифицированные имена подробно рассматриваются в лекции "Модули" .

qvarid \to [modid .] varid
qconid \to [modid .] conid
qtycon \to [modid .] tycon
qtycls \to [modid .] tycls
qvarsym \to [modid .] varsym
qconsym \to [modid .] consym

Перевод:

квалифицированный-идентификатор-переменной \to [идентификатор-модуля .] идентификатор-переменной
квалифицированный-идентификатор-конструктора \to [идентификатор-модуля .] идентификатор-конструктора
квалифицированный-конструктор-типа \to [идентификатор-модуля .] конструктор-типа
квалифицированный-класс-типа \to [идентификатор-модуля .] класс-типа
квалифицированный-символ-переменной \to [идентификатор-модуля .] символ-переменной
квалифицированный-символ-конструктора \to [идентификатор-модуля .] символ-конструктора

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

Это интерпретируется как
f.g f . g (три токена)
F.g F.g (квалифицированное 'g')
f.. f .. (два токена)
F.. F.. (квалифицированный '.')
F. F.(два токена)

Квалификатор не изменяет синтаксическую интерпретацию имени; например, Prelude.+ - это инфиксный оператор той же ассоциативности и того же приоритета, что и определение + в Prelude (раздел "Объявления и связывания имен" ).

< Лекция 2 || Лекция 3: 123 || Лекция 4 >