Чтобы выполнить проект, следует составить спецификацию языка и затем составить язык по этой спецификации. Спецификация включает в себя
- описание ключевой парадигмы языка (императивный, структурный, процедурный, объектно-ориентированный) и краткое описание особенностей (3-4 предложения)
- лексическая структура: алфавит, список ключевых слов, список токенов-разделителей, список операторов.
- синтаксические и семантические особенности: как выполнена поддержка разных типов данных
- грамматика языка в EBNF нотации, проверенная через Flex/Bison
Чтобы язык был уникальным и содержал интересные детали, следует выбрать из предложенных вариантов или придумать свой способ решения типовых проблем.
- Разделитель — точка с запятой:
x = 10; print x;
- Разделитель — перенос строки:
x = 10;\nprint x;
- Язык без разделителей, восстановление после ошибки в разборе инструкции происходит иным способом
- Вложенный блок инструкций обёрнут фигурными скобками:
if (x) { ... }
- Вложенный блок инструкций обёрнут словами BEGIN/END:
if (x) BEGIN ... END
- Вложенный блок инструкций имеет больший отступ, как в языке Python
- Вложенный блок инструкций начинается с переноса строки после
if
илиwhile
и продолжается до словаend
.
В данном случае следует выбрать несколько инструкций из предложенного набора:
if
с опциональнымelse
while
while
с опциональнымelse
(как в языке Python)do
/while
repeat
/until
for %item% in %array%
foreach %item% in %array%
for %item% : %array%
for I := 1 TO 2
for
в стиле языка C
- присваивание через
=
, сравнение через==
(стиль C++) - присваивание через
=
, сравнение с приведением типов через==
, сравнение с проверкой типов через===
(стиль Javascript) - присваивание через
:=
, сравнение через=
(стиль PASCAL) - присваивание с объявлением через
:=
, обычное присваивание через=
, сравнение через==
(стиль Golang)
- динамическая проверка типов, переменная может менять тип во время выполнения
- статическая проверка типов, тип указывается при объявлении справа (в стиле C):
int i = 10;
i = i + 2;
- статическая проверка типов, тип указывается при объявлении слева (в стиле ActionScript):
var i: Number = 20;
i = i + 1;
- статическая проверка типов, тип указывается при объявлении слева либо выводится автоматически (в стиле C++ и C#)
var x = 10; // автоматический вывод типа из инициализатора
int y = 12; // явное указание типа
- статическая проверка типов, тип указывается при объявлении справа либо выводится автоматически (в стиле Golang)
var x int // явное указание типа
y := 10 // вывод типа из инициализатора
- аргументы в круглых скобках после имени функции (стиль C++)
setPosition(x, y);
- аргументы в квадратных скобках вместе с именем функции, имя функции разбито на фрагменты (стиль Objective-C)
[object setX:x andY:y] // имя функции - 'setX:andY:'
- аргументы в круглых скобках вместе с именем функции (стиль LISP)
(setPosition x y)
- функция начинается с ключевого слова
def
(стиль Python) - функция начинается с ключевого слова
function
(стиль ActionScript) - функция отличается от остальны конструкций только синтаксически (стиль C++)