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

https://github.com/dmitrii-artuhov/vk-kphp-project-2022

Test project for VK 2022 KPHP team internship
https://github.com/dmitrii-artuhov/vk-kphp-project-2022

Last synced: 7 months ago
JSON representation

Test project for VK 2022 KPHP team internship

Awesome Lists containing this project

README

          

# VK KPHP

Есть некоторый новый язык С+-, он состоит из переменных, констант, литералов (строковых и числовых), функции вывода "print" , функции ввода "input".

В языке используется неявная динамическая типизация: переменные могут хранить значения разных типов. Всего есть 3 основных типа:
- `Int` (8 байт)
- `String`
- `Float` (8 байт)

Также язык поддерживает арифметические операторы `+` и `-` и оператор присваивания `=`.

Все доступные типы могут стоять по обе стороны от арифметических действий. При этом правила конвертации следующие (порядок аргументов не важен):
- `String` + `Int/Float` → число преобразуется в строку.
- `String` - `Int/Float` → строка преобразуется в целое или дробное число, а если строка не является числовой (2) то будто бы она "0".
- `Float` (+, -) `Int` → целое число преобразуется в дробное.

В качестве входных данных — только один файл, в котором пишется весь код. Разделения на функции нет. Пример кода:
```js
var str = "Hello"; // переменная задаётся через var
str = str + "!"; // переменные можно изменять
print(str); // функция print принимает один параметр
```

```js
str = 21 + 2 + 18; // можно записать в ту же переменную число
print(str); // -> 42
```

```js
val worldString = "World"; // константа задёется через val
val answerNumber = 42;
```

```js
print(worldString + answerNumber); // -> World42
print(worldString - answerNumber); // -> -42

val pi = 3.14;
print(pi + answerNumber); // -> 45.14
```

```js
val numberString = "134";
print(numberString - answerNumber); // -> 92
print(numberString + answerNumber); // -> 13442
```

```js
val name = input("Name: "); // выводит "Name: " и ждёт ввода
print("Your name is " + name);
```

## Необходимо:
- Написать парсер любым удобным способом (генераторы или вручную)
- Написать проверку того, что константы не перезаписываются
- Написать проверку того, что используемые переменные существуют
- Сгенерировать код на С++ для полученного после парсинга AST
- Написать на С++ рантайм, который будет управлять всеми операциями ввода, вывода, сложения, умножения и т.д.
- Скомпилировать полученный С++ вместе с рантаймом в готовый бинарный файл

## Примечания:
- Пишем на языке C++.
- Обратите внимание, что вы не должны пытаться вывести типы для переменных и сделать всё статически типизированным: вам нужно написать некоторый тип Mixed, который умеет хранить числа/строки и умеет в операции с другим Mixed .
- Числовой строкой является строка, состоящая только из цифр и одной опциональной точки.

В итоге вы должны получить программу, которая на вход принимает файл с кодом, а на выходе даёт готовый бинарный файл.

В качестве ответа пришлие ссылку на git-репозиторий с выполненным заданием.