Исходный текст фламберга - это текстовый файл в utf-8 с расширением ~ или flam.
Комментарии
Комментарии начинаются с символа ";" и следуют до конца строки.
Пример:a = 42 ; от символа ';' до конца строки - всё это - комментарий
Поскольку в Фламберге операторы не заканчиваются на точку с запятой и не бывает нескольких операторов в одной строке, я счел возможным вернуть символу ";" древнеассемблерный смысл.
Многострочные комментарии вводятся как строковые литералы. Часто в виде параметров для функций, отвечающих за генерацию документации.
Разбиение на строки
Разбиение на строки имеет значение.
Выражение с инфиксными операторами (expression) не может записываться в несколько строк (т.к. его тупо неудобно читать). Используйте многострочный вызов функций.Пример
; ok d = b * b - 4 *a *c
; not ok d = b * b - 4 * a *c
; ok d = sub b * b 4 * a * c
Пустые строки (состоящие из отступов и комментариев) игнорируются.
Строки разделяются символами 0x0a 0x0d (\n\r) в любых комбинациях
Отступы
Отступы задают стркуруту программы (прямо как в Питоне).
Для отступов можно пользоваться как пробелами так и табами, но табы и пробелы не должны присутствовать в отступе одной строки или в отступах смежных строк.Пример:
; ok for∙list:∙x →echo∙x→ ;∙отступ сделан табуляцией, →echo∙-x→ ;∙далее в строке смешаны табы и пробелы< ; ok - отступ сделан пробелами for∙list:∙x ∙∙∙echo∙x ∙∙∙echo→-x ; not ok for∙list:∙x ∙∙∙∙∙echo∙x ; пробелы и табы в смежных строках →∙echo -x ; и в отступе одной строки
Многострочные конструкции (statements)
Общий вид многострочного выражения (стейтмента)
стартовоеВыражение выражение2 выражение3 выражениеN →стейтмент1 →стейтмент2 →стейтментXПример:
echo "Hello " →"my name is" →nameСуществует несколько особых стейтментов различающихся стартовым выражением
- .. - вызов результата предыдущего выражения
- : - определение функции
- # - определение диспетчера
- ' - строгий текстовый литерал
- " - текстовый литерал с искейпами
- + - импорт модуля
Все прочие стейтменты обозначают вызов функции, и все выражения и стейтменты, идущие за стартовым выражением, задают параметры этого вызова. В приведенном выше примере вызывается функция echo с тремя параметрами.
Лексика выражений
Отдельные выражения отделяются друг от друга пробелами или табами. Выражения состоят из идентификаторов, литеральных констант и символов операций.
Идентификаторы- начинаются с латинской буквы или символов '$', '_', '@'.
- могут содержать все выше перечисленное плюс цифры 0-9.
- последовательности цифр и десятичной точки (числовые)
- строк в кавычках и апострофах (стороковые)
- точки и идентификатора (атомы)
- точки без идентификатора за ней (константа void типа void)
- ключевых слов true / false (boolean)
- префиксные (-a)
- инфиксные (a+b)
- суффиксные (a-- или а())
- обрамляющие ([a b c])
- a-b ; вычитание b из a
- a - b ; то же вычитание
- a -b ; два подряд идущих выражения "a" и "минус b"
Строковые литералы
Их бывает четыре вида:
Строгий однострочный литерал
Задается тестом в апострофах. Он может содержать в себе любой текст, кроме апострофа и управляющих символов с кодами меньше пробела.
echo 'Это пример однострочной текстовой константы'Весь текст воспринимается как есть, никакого искейпинга не делается.
Строгий многострочный литерал
Задается одиночным апострофом, за которым следует конец строки и далее с отступом любое количество текста с любыми символами.
echo ' →Это пример →многострочной текстовой константыТекстовая константа продолжается, пока сохраняется отступ. В ней могут присутствовать любые символы, включая апостроф, табуляцию и переходы на новую строку. Символы перехода на новую строку считаются частью текстовой константы. Начальная табуляция, задающая отступ строки не включается в константу, но все дополнительные отступы включаются. Примеры:
echo ' →Пример →текстаЭквивалентен следующей строке на С++; "Пример\nтекста". Пример:
echo ' →<ul> →→<li> →→→"Test" →→</li> →</ul>
Эквивалентен следующей строке на С++; "<ul>\n\t<li>\n\t\t\"Test\"\n\t</li>\n</ul>".
Однострочный литерал с интерполяцией.
Строка в кавычках, которая может содержать выражения в фигурных скобках.
Напримерecho "Hello {name}! How are you{chooseOne "today" 'tonight'}?".В сущности это не строковая константа, а вызов функции concatenate с передачей в нее всех кусочков.
echo →concatenate →→'Hello ' →→name →→'! How are you' →→chooseOne 'today' 'tonight' →→'?'Но есть нюанс: если все кусочки - константы, склейка произойдет во время компиляции, и результат будет константной строкой. В стандарной библиотеке существуют функция char(N) возвращающая символ с кодом N и константы CR, TAB, QUOT - поэтому искейпинг любых символов в строке делается этим же механизмом: echo "Hello!{CR}{TAB}Long time{char 48+1}".
Но, конечно, основное предназначение этого синтаксиса - форматный вывод.
Многострочный литерал с интерполяцией:
Объединяет возможности многострочных текстовых констант и вставку произвольных фрагментов во время компиляции и произвольных выражений во время исполнения.
echo " <div style="{record.headerStyle}"> Многострочный блок c escape-последовательностями </div> <p> {record.mainText} </p>Собственно, наличие многострочного синтаксиса делает практически не нужными константы CR TAB QUOT. Единственным символом нуждающемся в искейпинге в этом синтаксисе является открывающая фигурная скобка. Она искейпится пустым выражением {}. Пример
echo " /* Old good C */ char *{functionName}(void) {} return "{escapeCString value}"; }
Такой искейпинг работает и в однострочном варианте.
Поддержка национальных символов в идентификаторах.
По умолчанию она выключена. Но есть возможность переконфигурировать компилятор и заставить его понимать любые подмножества национальных символов. Это может быть полезно для DSL.
No comments:
Post a Comment