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

Синтаксический справочник

< Лекция 9 || Лекция 10: 123456 || Лекция 11 >
Аннотация: В этой лекции вы получите общее представление о синтаксисе в Haskell. Мы разберем с вами основные конструкции языка. Этот небольшой справочник поможет вам в дальнейшем написании программ. В данном синтаксическом справочнике основной уклон идет на используемые соглашения об обозначениях и лексическом синтаксисе, а также рассматривается правильное размещение текста и комментарий в программе

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

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

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

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

Nonterm \to alt1 | alt2 | ... | altn

Перевод:

нетерминал \to альтернатива1 | альтернатива2 | ... | альтернативаn

В синтаксисе, который следует далее, есть некоторые семейства нетерминалов, индексированные уровнями приоритета (записанными как верхний индекс). Аналогично, нетерминалы op (оператор), varop (оператор-переменной) и conop (оператор-конструктора) могут иметь двойной индекс: букву l, r или n соответственно для левоассоциативности, правоассоциативности или отсутствия ассоциативности и уровень приоритета. Переменная уровня приоритета i изменяется в пределах от 0 до 9, переменная ассоциативности a изменяется в диапазоне {l, r, n}. Например,

aexp \to ( expi+1 qop(a,i) )

на самом деле обозначает 30 правил вывода с 10 подстановками для i и 3 для a.

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

9.2 Лексический синтаксис

program \to {lexeme | whitespace }
lexeme \to qvarid | qconid | qvarsym | qconsym
| literal | special | reservedop | reservedid
literal \to integer | float | char | string
special \to ( | ) | , | ; | [ | ] | &apos;| { | }
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 ! | # | $ | % | & | * | + | . | / | < | = | > | ? | @
| \ | ^ | | | - | \sim
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 ( | ) | , | ; | [ | ] | &apos;| { | }
пробельная-строка \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 ! | # | $ | % | & | * | + | . | / | < | = | > | ? | @
| \ | ^ | | | - | \sim
символ-Unicode \to любой символ или знак пунктуации Unicode
цифра \to цифра-ASCII | цифра-Unicode
цифра-ASCII \to 0 | 1 | ... | 9
цифра-Unicode \to любая десятичная цифра Unicode
восьмиричная-цифра \to 0 | 1 | ... | 7
шестнадцатиричная-цифра \to цифра | A | ... | F | a | ... | f
< Лекция 9 || Лекция 10: 123456 || Лекция 11 >
Николай Щербаков
Николай Щербаков
Россия, Москва
Олег Корсак
Олег Корсак
Латвия, Рига