Friday, February 10, 2017

Flamberg: лексика

Исходный текст фламберга - это текстовый файл в 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