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
|