An open API service indexing awesome lists of open source software.

https://github.com/andcool-systems/html8

Open source HTML8 language compiler
https://github.com/andcool-systems/html8

c compiler esoteric

Last synced: 2 months ago
JSON representation

Open source HTML8 language compiler

Awesome Lists containing this project

README

        

# HTML8
HTML8 — это высокоуровневый компилируемый язык программирования, имеющий синтаксис, подобный HTML.

## Описание синтаксиса языка

Программа имеет общую структуру вида:
```xml

```

Блок `html` должен обязательно содержать блок `main`, который является точкой входа. Также дополнительно может быть объявлен блок `head`, в котором подключаются отдельные модули, объявляются константы и так далее.

## Области видимости
Все переменные и функции, которые были созданы в корне блока `main` будут доступны всем дочерним блокам. Переменные, объявленные внутри дочерних блоков не будут доступны из родительских, но также будут доступны для дочерних. Для определения пустого блока можно использовать конструкцию `

`. После завершения блока, все объекты, которые были созданы внутри уничтожаются и более не будут доступны по имени.

## Резервирование имен
Язык резервирует за собой несколько ключевых слов. Эти слова не могут быть использованы в именах переменных или функций. Такие слова как `html, head, main, div` и далее будут расцениваться компилятором **исключительно как ключевые слова**. Все попытки создать переменную или функцию с таким именем будут приводить к ошибке компиляции.

## Переменные
Так как язык статически типизируемый, тип переменной должен быть известен на моменте компиляции. Синтаксис объявления переменной:
```xml
12
```

В этом примере создается переменная my_var со значением 12. Использование других переменных как значение для инициализации так же разрешается. Разрешается также создавать переменные, в качестве имени которых указана другая **константная** переменная. В этом случае имя переменной указывается в фигурных скобках:
```xml
"my_cool_var"
12
```

Использование неконстантных переменных в качестве имени запрещается, в ином случае будет вызвана ошибка компиляции.

### Изменение переменных
После создания *неконстантной* переменной её значение можно изменить на другое с таким же типом. При этом синтаксис имеет вид:
```xml
16
```

В этом случае в качестве имени тега используется название переменной, с которым она была создана. (Важно отметить, что приоритет в парсинге отдается зарезервированным ключевым словам, а потом только именам объектов).

### Математические операции внутри блоков
Внутри блоков разрешены математические операции, например:
```xml
2 * 2
```

В результате в переменную попадет результат выполнения математической операции. (Предполагается, что на моменте компиляции константные значения будут упрощены и оптимизированы)

## Функции
Объявление функций почти не отличается от объявления переменной:
```xml


```

Используемое при создании функции ключевое слова показывает, какой тип возвращает функция. Ключевое слово `return` принимает один аргумент `val`, который будет возвращен из функции. Если возвращаемым типом является `void`, то функцию `return` можно не вызывать.
Аргумент `arg1` имеет тип `int` и может быть использован по своему имени внутри блока функции.

Как вы уже заметили, создание переменной и функции мало чем отличаются. Это связано с тем, что язык реализует переменные через функции с предвычисленным значением. Изначально все функции являются переменными до тех пор, пока в их теле не появится хоть одно служебное слово. Например:

```xml

1 + 2


```

### Вызов функций
Вызов функции производится через одиночный тег `` при этом порядок передачи аргументов не важен. Результат выполнения функции будет передан в блок выше. Результат может быть принят, а может быть подавлен. Пример:
```jsx




1
2






```