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
- Host: GitHub
- URL: https://github.com/andcool-systems/html8
- Owner: Andcool-Systems
- Created: 2025-03-14T16:25:27.000Z (2 months ago)
- Default Branch: master
- Last Pushed: 2025-03-21T17:01:25.000Z (2 months ago)
- Last Synced: 2025-03-21T17:30:46.520Z (2 months ago)
- Topics: c, compiler, esoteric
- Language: Rust
- Homepage:
- Size: 45.9 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
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
```