Этот раздел книги описывает формальную грамматику языка программирования Swift. Грамматика, описанная здесь, предназначена скорее для того, чтобы помочь вам более подробно понять язык, а не просто прямолинейно реализовывать анализатор или компилятор.
Язык Swift относительно небольшой, поскольку многие распространенные типы, функции и операторы, появляющиеся практически везде в коде Swift, фактически определены в стандартной библиотеке Swift. Хотя эти типы, функции и операторы не являются частью языка Swift, они широко используются в обсуждениях и примерах кода в этой части книги.
Как читать Грамматику
Для описания формальной грамматики языка программирования Swift используются следующие условные обозначения:
- Стрелка (→) используется для обозначения грамматических производных и может быть прочитана как «может состоять из».
- Синтаксические категории обозначены курсивом и расположены по обеим сторонам правила грамматической производной.
- Слова и знаки препинания обозначаются полужирным текстом постоянной толщины и расположены только справа правила грамматической производной.
- Альтернативные грамматические производные разделяются вертикальными чертами (|). Когда альтернативные производные слишком длинные для того, чтобы их было легко читать, они разбиваются на несколько правил грамматической производной в новых строках.
- В некоторых случаях используется обычный шрифт текста для написания в правой части правила грамматической производной.
- Дополнительные синтаксические категории и литералы обозначаются нижним индексом, opt.
В качестве примера, грамматика блока геттера-сеттера будет выглядеть следующим образом:
Грамматика блока геттера-сеттера
getter-setter-block → {getter-clause setter-clauseopt} | {setter-clause getter-clause}
Это определение указывает на то, что блок геттера-сеттера может состоять из getter clause, за которым следует опциональный setter clause, заключенный в скобки, или setter clause, за которым следует getter clause в скобках. Приведенное выше правило эквивалентно следующим двум производным, где альтернативы явно прописаны:
Грамматика блока геттера-сеттера
getter-setter-block → {getter-clause setter-clauseopt}
getter-setter-block → {setter-clause getter-clause}