Разделы сайта находятся в разработке.
Материалы могут быть неполными или содержать ошибки. Содержимое сайта будет синхронизировано с реализацией при выходе следующей версии, тогда как текущая (0.6.0) предназначена для прототипирования синтаксиса и создания песочницы.
Концепция
Фундаментальные понятия
Синтаксис TrustLang имеет несколько общих для всего языка правил:
- Язык построен на грамматических правилах, а не на ключевых словах. Лексер и парсер
получаются однопроходными, простыми и быстрыми, а привычная запись с ключевыми словами
(
@if,@while,@func, …) реализуется поверх базового синтаксиса через макросы. - Термины исходного текста сначала распознаются лексером и обрабатываются макропроцессором, и только затем попадают в парсер. Это позволяет с помощью макросов модифицировать даже базовые синтаксические конструкции.
- Инструкции (операторы) разделяются точкой с запятой
;. - Блоки кода записываются в фигурных скобках
{ ... }. - Любая конструкция (в том числе блок кода) является выражением и возвращает значение, поэтому её можно вкладывать в другие выражения.
Синтаксис TrustLang можно условно разделить на несколько слоёв, каждый из которых отвечает за свою область:
- Алгоритмический слой — минимально необходимая основа, описывающая сам алгоритм: литералы, именованные объекты, операторы и управляющие конструкции (Операторы). Этот слой оптимизирован для машинного разбора и не содержит «синтаксического сахара».
- Оформительский слой — не влияющие на алгоритм средства оформления и упрощения записи: макросы, вспомогательные проверки.
- Атрибуты — отдельный слой записи свойств элементов, которые не меняют алгоритм, но влияют на детали его реализации (оптимизации, интеграция с C/C++).
- Верификация — слой контрактов, который не пересекается с остальными и не влияет ни на алгоритм, ни на его реализацию, а служит для доказательства корректности алгоритма.
Блоки кода
Последовательность идущих подряд инструкций группируется в блок кода { ... }, который
выполняется как единое целое и завершается точкой с запятой ;. Блок кода возвращает значение
своей последней инструкции; тип этого значения можно ограничить явно: { ... }:Type.
Блоки кода используются для ограничения области видимости переменных (см. Иерархия кода) и могут быть именованными — тогда они выступают локальными метками передачи потока управления (см. Возврат, прерывания и ошибки). Тело функции тоже является блоком кода в пространстве имён её определения. Перехват и прерывание потока внутри блока описаны в разделе Обработка ошибок.
Блок кода с нативным синтаксисом {% ... %} содержит исходный текст на языке реализации
(C++), который подставляется в выходной текст напрямую (см. Нативные типы).