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
|