Лексика

Исходный текст есть последовательность лексем: идентификаторов, ключевых слов, знаков операций и знаков препинания, литералов и модификаторов. Каждая лексема состоит из последовательности 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")