Опубликован: 19.09.2008 | Уровень: специалист | Доступ: платный
Лекция 3:

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

< Лекция 2 || Лекция 3: 123 || Лекция 4 >
Аннотация: В этой лекции мы опишем лексическую структуру нижнего уровня языка Haskell. Большинство деталей может быть пропущено при первом прочтении этого описания

2.1. Соглашения об обозначениях

Эти соглашения об обозначениях используются для представления синтаксиса:

[pattern] необязательный
{pattern} ноль или более повторений
(pattern) группировка
pat1 <I> | pat2 разность - элементы, порождаемые с помощью pat, за исключением элементов, порождаемых с помощью pat'
fibonacci терминальный синтаксис в машинописном шрифте

Поскольку синтаксис в этом разделе описывает лексический синтаксис, все пробельные символы выражены явно; нет никаких неявных пробелов между смежными символами. Повсюду используется BNF-подобный синтаксис, чьи правила вывода имеют вид:

nonterm \to alt1 | alt2 | ... | altn
Перевод: нетерминал \to альтернатива1 | альтернатива2 | ... | альтернативаn

Необходимо внимательно отнестись к отличию синтаксиса металогических символов, например, | и [...], от конкретного синтаксиса терминалов (данных в машинописном шрифте),например, | и [...], хотя обычно это ясно из контекста.

Haskell использует кодировку символов Unicode [11].

Тем не менее, исходные программы в настоящее время написаны в основном в кодировке символов ASCII, используемой в более ранних версиях Haskell.

Этот синтаксис зависит от свойств символов Unicode, определяемых консорциумом Unicode. Ожидается, что компиляторы Haskell будут использовать новые версии Unicode, когда они станут доступными.

2.2 Лексическая структура программы

program \to {lexeme | whitespace }
lexeme \to qvarid | qconid | qvarsym | qconsym
| literal | special | reservedop | reservedid
literal \to integer | float | char | string
special \to (|)|,|;|[|]|'|{|}
whitespace \to whitestuff {whitestuff}
whitestuff \to whitechar | comment | ncomment
whitechar \to newline | vertab | space | tab | uniWhite
newline \to return linefeed | return | linefeed | formfeed
return \to возврат каретки
linefeed \to перевод строки
vertab \to вертикальная табуляция
formfeed \to перевод страницы
space \to пробел
tab \to горизонтальная табуляция
uniWhite \to любой пробельный символ Unicode
comment \to dashes [any<symbol> {any}] newline
dashes \to - {-}
opencom \to {-
closecom \to -}
ncomment \to opencom ANYseq {ncomment ANYseq}closecom
ANYseq \to {ANY}<{ANY}( opencom | closecom ) {ANY}>
ANY \to graphic | whitechar
any \to graphic | space | tab
graphic \to small | large | symbol | digit | special | : | " | '
small \to ascSmall | uniSmall | _
ascSmall \to a | b | ... | z
uniSmall \to любая буква Unicode нижнего регистра
large \to ascLarge | uniLarge
ascLarge \to A | B | ... | Z
uniLarge \to любая буква Unicode верхнего регистра или заглавная
symbol \to ascSymbol | uniSymbol<special | _ | : | " | '>
ascSymbol \to ! | # | $ | % | & | * | + | . | / | < | = | > | ? | @
| \ | ^ | | | - | ~
uniSymbol \to любой символ или знак пунктуации Unicode
digit \to ascDigit | uniDigit
ascDigit \to 0 | 1 | ... | 9
uniDigit \to любая десятичная цифра Unicode
octit \to 0 | 1 | ... | 7
hexit \to digit | A | ... | F | a | ... | f

Перевод:

программа \to {лексема | пробельная-строка }
лексема \to квалифицированный-идентификатор-переменной
| квалифицированный-идентификатор-конструктора
| квалифицированный-символ-переменной
| квалифицированный-символ-конструктора
| литерал
| специальная-лексема
| зарезервированный-оператор
| зарезервированный-идентификатор
литерал \to целый-литерал
| литерал-с-плавающей-точкой
| символьный-литерал
| строковый-литерал
специальная-лексема \to ( | ) | , | ; | [ | ] |'| { | }
пробельная-строка \to пробельный-элемент {пробельный-элемент}
пробельный-элемент \to пробельный-символ
| комментарий
| вложенный-комментарий
пробельный-символ \to новая-строка
| вертикальная-табуляция
| пробел
| горизонтальная-табуляция
| пробельный-символ-Unicode
новая-строка \to возврат-каретки перевод-строки
| возврат-каретки
| перевод-строки
| перевод-страницы
комментарий \to тире [ любой-символ<символ> {любой-символ}] новая-строка
тире \to - {-}
начало-комментария \to {-
конец-комментария \to -}
вложенный-комментарий \to начало-комментария ЛЮБАЯ-последовательность {вложенный-комментарий ЛЮБАЯ-последовательность}конец-комментария
ЛЮБАЯ-последовательность \to {ЛЮБОЙ-символ}<{ЛЮБОЙ-символ}( начало-комментария | конец-комментария ) {ЛЮБОЙ-символ}>
ЛЮБОЙ-символ \to графический-символ | пробельный-символ
любой-символ \to графический-символ
| пробел
| горизонтальная-табуляция
графический-символ \to маленькая-буква
| большая-буква
| символ
| цифра
| специальная-лексема
| : | " | '
маленькая-буква \to маленькая-буква-ASCII
| маленькая-буква-Unicode
| _
маленькая-буква-ASCII \to a | b | ... | z
большая-буква \to большая-буква-ASCII | большая-буква-Unicode
большая-буква-ASCII \to A | B | ... | Z
символ \to символ-ASCII
| символ-Unicode<специальная-лексема | _ | : | " | '>
символ-ASCII \to ! | # | $ | % | & | * | + | . | / | < | = | > | ? | @
| \ | ^ | | | - | ~
символ-Unicode \to любой символ или знак пунктуации Unicode
цифра \to цифра-ASCII | цифра-Unicode
цифра-ASCII \to 0 | 1 | ... | 9
цифра-Unicode \to любая десятичная цифра Unicode
восьмиричная-цифра \to 0 | 1 | ... | 7
шестнадцатиричная-цифра \to цифра | A | ... | F | a | ... | f

Лексический анализ должен использовать правило "максимального потребления": в каждой точке считывается наиболее длинная из возможных лексем, которая удовлетворяет правилу вывода lexeme (лексемы).

Таким образом, несмотря на то, что case является зарезервированным словом, cases таковым не является. Аналогично, несмотря на то, что = зарезервировано, == и \sim =- нет.

Любой вид whitespace (пробельной-строки) также является правильным разделителем для лексем.

Символы, которые не входят в категорию ANY (ЛЮБОЙ-символ), недопустимы в программах на Haskell и должны приводить к лексической ошибке.

< Лекция 2 || Лекция 3: 123 || Лекция 4 >
KroshkaRu KroshkaRu
KroshkaRu KroshkaRu
Россия, Петерубрг, СПБ-ГПУ, 1998
Петр Бондареко
Петр Бондареко
Россия