Лексика
Исходный текст есть последовательность лексем: идентификаторов, ключевых слов, знаков операций и знаков препинания, литералов и модификаторов. Каждая лексема состоит из последовательности Unicode символов (Unicode code point) в кодировке UTF-8.
Пробелы (U+0020), символы табуляции (U+0009) и символы завершения строки (U+000D, U+000A) разделяют лексемы, и, игнорируются, кроме следующих случаев:
- Символы завершения строк могут использоваться как разделители синтаксических конструкций.
- Пробелы являются значащими символами в идентификаторах, состоящих из нескольких слов.
- Пробелы являются значащими в строковых и символьных литералах.
Несколько разделителей трактуются, как один.
Исходный текст может содержать комментарии.
Комментарии
Есть две формы комментариев:
- Строчный комментарий начинаeтся с последовательности символов `// и заканчиваeтся в конце строки.
- Блочный комментарий начинается с последовательности символов
/*и заканчивается последовательностью символов*/. Блочные комментарии могут быть вложенные.
Комментарий
: '//' (любой символ, кроме завершения строки)*
| '/*' (любой символ)* '*/'
Разделители синтаксических конструкций
Некоторые синтаксические правила используют нетерминал Разделитель для разделения двух подряд идущих синтаксических конструкций, например:
Список-операторов: Оператор (Разделитель Оператор)*
В качестве разделителя может использоваться символ ; или символ завершения строки.
Разделитель: ';' | символ-завершения-строки
Пример:
а := 1; б := 2
в := 1
В строке 1 операторы разделены символом ;, а оператор в строке 2 отделен от операторов строки 1 символом завершения строки.
Ошибка компиляции - нет разделителя:
а := 1 б := 2
Идентификаторы
Идентификатор – это последовательность Слов, разделенных пробелами или символами дефис - с опционально завершающим знаком препинания:
Каждое слово состоит из Букв и Цифр, и начинается с Буквы. Буквой считается любой Unicode символ, имеющий признак Letter, и, дополнительно, символы № и _.
Идентификатор: Слово ((' ' | '-') Слово)* Знак-препинания?
Слово: Буква (Буква | Цифра)*
Буква: Unicode-letter | '_' | '№'
Цифра: '0' .. '9'
Знак-препинания: '?' | '!'
Примеры идентификаторов:
буква
буква-или-цифра
№-символа
Цифра?
Пора паниковать!
Ключевые слова
Следующие ключевые слова зарезервированы и не могут быть использованы, как идентификаторы:
| авария | если | конст | позже | среди |
| вернуть | иначе | мб | пока | тип |
| вход | импорт | модуль | прервать | типа |
| выбор | класс | надо | протокол | фн |
| другое | когда | осторожно | пусть | цикл |
Знаки операций и знаки препинания
Следующие последовательности символов обозначают знаки операций и знаки препинания:
+ - * / %
= # < <= > >=
& | ~
:& :| :\ :~ << >>
:= ++ --
( ) [ ] { }
(: . ^ , : ;
Литералы
Литерал
: Целочисленный-литерал
| Вещественный-литерал
| Строковый-литерал
| Символьный-литерал
| Многострочный-литерал
Целочисленные литералы
Целочисленный-литерал:
Десятичный-литерал | Шестнадцатеричный-литерал
Десятичный-литерал: Цифра+
Шестнадцатеричный-литерал: '0x' Цифра16+
Цифра16: '0'..'9' | 'a'..'f' | 'A'..'F'
Тип десятичного литерала: Цел64, тип шестнадцатеричного литерала: Слово64.
Вещественные литералы
В текущей реализации есть только одна форма записи вещественных литералов, без экспоненты.
Вещественный-литерал: Цифра+ '.' Цифра*
Тип вещественного литерала: Вещ64.
Строковые литералы
Строковый литерал – это последовательность символов, заключенные в двойные кавычки. Строковый литерал может содержать символы, закодированные с помощью escape-последовательности, которая начинается с символа \. Строковый литерал должен целиком находиться на одной строке текста.
Строковый-литерал
: '"'
(~('"' | '\\' | '\n' | '\r' | '\t') | Escape)*
'"'
Escape
: '\\'
( 'u' Цифра16 Цифра16 Цифра16 Цифра16
| 'n' | 'r' | 't'
| '"'
| "'"
)
Тип строкового литерала: Строка.
Многострочные литералы
Многострочный литерал – это последовательность символов, заключенные в обратные кавычки: Привет. Последовательность может содержать любой символ, кроме обратной кавычки.
Многострочный-литерал
: '`' (~('`' )* '`'
В многострочном литерале escape-последовательности не обрабатываются. В частности, обратная косая черта не имеет выделенного значения и строка может содержать символ конца строка (\n). Последовательность \r\n заменяется на \n, а одиночный символ \r игнорируется (не попадают в литерал).
`это длинный
многострочный литерал,
содержащий символы конца строки`
Тип многострочного литерала: Строка.
Символьные литералы
Символьный литерал задает значение для Unicode code point. Он записывается как один или несколько символов, заключенных в одинарные кавычки. Символьный литерал может быть закодирован с помощью escape-последовательности, которая начинается с символа \.
Символьный-литерал
: "'"
~("'" | '\\' | '\n' | '\r' | '\t') | escape_value)
"'"
Тип символьного литерала: Символ.
Модификаторы
Модификаторы использутся в исходном тексте, чтобы внести изменение в в семантику и/или синтаксис конструкции языка, см., например, Внешние функции.
Модификатор: '@' Буква+ Cписок-атрибутов?
Cписок-атрибутов: '(' (Атрибут (',' Атрибут)*)? ')'
Атрибут: Строковый-литерал ': 'Строковый-литерал
@внеш("имя":"print_string")