Ecosyste.ms: Awesome

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

Awesome Lists | Featured Topics | Projects

https://github.com/inyutin-maxim/vkscriptparser


https://github.com/inyutin-maxim/vkscriptparser

Last synced: 12 days ago
JSON representation

Awesome Lists containing this project

README

        

# Лексер, парсер, компилятор скриптового языка VKScript

**VKScript** - язык, похожий на **JavaSсript** или **ActionScript** (предполагается совместимость с **ECMAScript**). Алгоритм должен завершаться командой **return %выражение%**. Операторы должны быть разделены точкой с запятой.

> Внутри **code** может содержаться не более 25 обращений к методам API.

Пример значения параметра code

>


> // присваивает переменной a результат поиска по фотографиям с данными параметрами
> var a = API.photos.search({"q":"Nature","count":3});
>
> // присваивает переменной b список владельцев найденных фотографий
> var b = [email protected]_id;
>
> // присваивает переменной с данные о страницах владельцев из списка b
> var c = API.users.get({"user_ids":b});
>
> // возвращает список фамилий из данных о владельцах
> return [email protected]_name;
>
> // пример цикла
> var a = 1;
> var b = 10;
> while (b != 0) {
> b = b - 1;
> a = a + 1;
> };
> return a;
>

То же самое можно более коротко записать так:

>

return API.users.get({"user_ids": API.photos.search({"q":"Beatles", "count":3})[email protected]_id})@.last_name; 

Поддерживаются:

* арифметические операции
* логические операции
* создание массивов и списков ([X,Y])
* **parseInt** и **parseDouble**
* конкатенация (+)
* конструкция **if**
* фильтр массива по параметру (@.)
* вызовы методов **API**, параметр **length**
* циклы, используя оператор **while**
* методы Javascript: **slice**, **push**, **pop**, **shift**, **unshift**, **splice**, **substr**, **split**
* оператор **delete**
* присваивания элементам маcсива, например: row.user.action = "test";
* поиск в массиве или строке — **indexOf**, например: "123".indexOf(2) = 1, [1, 2, 3].indexOf(3) = 2. Возвращает -1, если элемент не найден.

В данный момент не поддерживается создание функций.

Обращение к элементам массива с результатом какого-либо метода всего должно основываться на структуре JSON, а не XML. Например, правильным обращением является

API.photos.search({"q":"Nature","count":3})[email protected]_id;, а не

API.photos.search({"q":"Nature","count":3})[email protected]@.owner_id;

Метод **execute** также может использоваться и для получения результатов нескольких не связанных между собой запросов.

Пример значений параметра code

> return [API.users.isAppUser(), API.friends.get(), API.status.get()];

> return {"user": API.users.isAppUser(), "friends": API.friends.get(), "status": API.status.get()};

В методе **execute** поддерживаются логические операции **<** (меньше), **>** (больше), **<=** (меньше или равно), **>=** (больше или равно), **==** (равно) и **!=** (не равно). В данный момент поддерживаются сравнения двух строк, двух чисел и строки и числа (в этом случае строка приводится к числу).

Результат логического выражения может быть использован в управляющей конструкции **if** ... [**else** ...]:

Пример значения параметра code

>

var posts = API.wall.get({"count": 1});

> if (posts.count<0) {
> return {"post": null, "copy_owner": null};
> } else {
> var post = posts.items[0];
> var copy_owner=null;
> if (post.copy_history[0]){
> if (post.copy_history[0].owner_id > 0) {
> copy_owner = API.users.get({"user_id": post.copy_history[0].owner_id})[0];
> } else
> if (post.copy_history[0].owner_id < 0) {
> copy_owner = API.groups.getById({"group_ids": -post.copy_history[0].owner_id})[0];
> }
> return {"post": post, "copy_owner": copy_owner};
> } else {
> return {"post": post, "copy_owner": null};
> }
> }