9.1 Соглашения об обозначениях
Эти соглашения об обозначениях используются для представления синтаксиса:
| [pattern] |
необязательный |
| {pattern} |
ноль или более повторений |
| (pattern) |
группировка |
| pat1 | pat2 |
выбор |
| pat<pat> |
разность --- элементы, порождаемые с помощью pat, за исключением элементов, порождаемых с помощью pat'
|
| fibonacci |
терминальный синтаксис в машинописном шрифте |
Повсюду используется BNF -подобный синтаксис, чьи правила вывода имеют вид:
| Nonterm |
 |
alt1 | alt2 | ... | altn |
Перевод:
|
нетерминал
|
 |
альтернатива1 | альтернатива2 | ... | альтернативаn
|
В синтаксисе, который следует далее, есть некоторые семейства нетерминалов, индексированные уровнями приоритета (записанными как верхний индекс). Аналогично, нетерминалы op (оператор), varop (оператор-переменной) и conop (оператор-конструктора) могут иметь двойной индекс: букву l, r или n соответственно для левоассоциативности, правоассоциативности или отсутствия ассоциативности и уровень приоритета. Переменная уровня приоритета i изменяется в пределах от 0 до 9, переменная ассоциативности a изменяется в диапазоне {l, r, n}. Например,
| aexp |
 |
( expi+1 qop(a,i) ) |
на самом деле обозначает 30 правил вывода с 10 подстановками для i и 3 для a.
И в лексическом, и в контекстно-свободном синтаксисе есть некоторые неоднозначности, которые разрешаются посредством создания грамматических фраз наибольшей из возможных длины, действуя слева направо (в восходящем синтаксическом анализе при конфликте сдвиг - свертка выполняется сдвиг). В лексическом синтаксисе это правило "максимального потребления". В контекстно-свободном синтаксисе это означает, что условные выражения, let -выражения и лямбда-абстракции продолжаются вправо насколько возможно.
9.2 Лексический синтаксис
| program |
 |
{lexeme | whitespace } |
| lexeme |
 |
qvarid | qconid | qvarsym | qconsym |
|
| |
literal | special | reservedop | reservedid |
| literal |
 |
integer | float | char | string |
| special |
 |
( | ) | , | ; | [ | ] | '| { | } |
| whitespace |
 |
whitestuff {whitestuff} |
| whitestuff |
 |
whitechar | comment | ncomment |
| whitechar |
 |
newline | vertab | space | tab | uniWhite |
| newline |
 |
return linefeed | return | linefeed | formfeed |
| return |
 |
возврат каретки |
| linefeed |
 |
перевод строки |
| vertab |
 |
вертикальная табуляция |
| formfeed |
 |
перевод страницы |
| space |
 |
пробел |
| tab |
 |
горизонтальная табуляция |
| uniWhite |
 |
любой пробельный символ Unicode
|
| comment |
 |
dashes [ any<symbol> {any}] newline |
| dashes |
 |
-- {-} |
| opencom |
 |
{- |
| closecom |
 |
-} |
| ncomment |
 |
opencom ANYseq {ncomment ANYseq}closecom |
| ANYseq |
 |
{ANY}<{ANY}( opencom | closecom ) {ANY}> |
| ANY |
 |
graphic | whitechar |
| any |
 |
graphic | space | tab |
| graphic |
 |
small | large | symbol | digit | special | : | " | ' |
| small |
 |
ascSmall | uniSmall | _ |
| ascSmall |
 |
a | b | ... | z |
| uniSmall |
 |
любая буква Unicode нижнего регистра |
| large |
 |
ascLarge | uniLarge |
| ascLarge |
 |
A | B | ... | Z |
| uniLarge |
 |
любая буква Unicode верхнего регистра или заглавная |
| symbol |
 |
ascSymbol | uniSymbol<special | _ | : | &" | '> |
| ascSymbol |
 |
! | # | $ | % | & | * | + | . | / | < | = | > | ? | @ |
|
| |
\ | ^ | | | - |
|
| uniSymbol |
 |
любой символ или знак пунктуации Unicode
|
| digit |
 |
ascDigit | uniDigit |
| ascDigit |
 |
0 | 1 | ... | 9 |
| uniDigit |
 |
любая десятичная цифра Unicode
|
| octit |
 |
0 | 1 | ... | 7 |
| hexit |
 |
digit | A | ... | F | a | ... | f |
Перевод:
| программа |
 |
{лексема | пробельная-строка } |
|
лексема
|
 |
квалифицированный-идентификатор-переменной |
|
| |
квалифицированный-идентификатор-конструктора |
|
| |
квалифицированный-символ-переменной |
|
| |
квалифицированный-символ-конструктора |
|
| |
литерал |
|
| |
специальная-лексема
|
|
| |
зарезервированный-оператор |
|
| |
зарезервированный-идентификатор |
| литерал |
 |
целый-литерал |
|
| |
литерал-с-плавающей-точкой |
|
| |
символьный-литерал |
|
| |
строковый-литерал |
| специальная-лексема
|
 |
( | ) | , | ; | [ | ] | '| { | } |
| пробельная-строка |
 |
пробельный-элемент {пробельный-элемент} |
| пробельный-элемент |
 |
пробельный-символ |
|
| |
комментарий |
|
| |
вложенный-комментарий |
| пробельный-символ |
 |
новая-строка |
|
| |
вертикальная-табуляция |
|
| |
пробел |
|
| |
горизонтальная-табуляция |
|
| |
пробельный-символ-Unicode |
| новая-строка |
 |
возврат-каретки перевод-строки |
|
| |
возврат-каретки |
|
| |
перевод-строки |
|
| |
перевод-страницы |
| комментарий |
 |
тире [ любой-символ<символ> {любой-символ}] новая-строка |
| тире |
 |
-- {-} |
| начало-комментария |
 |
{- |
| конец-комментария |
 |
-} |
| вложенный-комментарий |
 |
начало-комментария ЛЮБАЯ-последовательность {вложенный-комментарий ЛЮБАЯ-последовательность}конец-комментария |
| ЛЮБАЯ-последовательность |
 |
{ЛЮБОЙ-символ}<{ЛЮБОЙ-символ}( начало-комментария | конец-комментария ) {ЛЮБОЙ-символ}>
|
| ЛЮБОЙ-символ |
 |
графический-символ | пробельный-символ |
| любой-символ |
 |
графический-символ |
|
| |
пробел |
|
| |
горизонтальная-табуляция |
| графический-символ |
 |
маленькая-буква |
|
| |
большая-буква |
|
| |
символ |
|
| |
цифра |
|
| |
специальная-лексема
|
|
| |
: | " | ' |
| маленькая-буква |
 |
маленькая-буква-ASCII |
|
| |
маленькая-буква-Unicode |
|
| |
- |
| маленькая-буква-ASCII |
 |
a | b | ... | z |
| большая-буква |
 |
большая-буква-ASCII | большая-буква-Unicode |
| большая-буква-ASCII |
 |
A | B | ... | Z |
| символ |
 |
символ-ASCII |
|
| |
символ-Unicode<специальная-лексема | _ | : | " | '>
|
| символ-ASCII |
 |
! | # | $ | % | & | * | + | . | / | < | = | > | ? | @ |
|
| |
\ | ^ | | | - |
|
| символ-Unicode |
 |
любой символ или знак пунктуации Unicode
|
| цифра |
 |
цифра-ASCII | цифра-Unicode |
| цифра-ASCII |
 |
0 | 1 | ... | 9 |
| цифра-Unicode |
 |
любая десятичная цифра Unicode
|
| восьмиричная-цифра |
 |
0 | 1 | ... | 7 |
| шестнадцатиричная-цифра |
 |
цифра | A | ... | F | a | ... | f
|