Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/inyutin-maxim/vkscriptparser
https://github.com/inyutin-maxim/vkscriptparser
Last synced: 12 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/inyutin-maxim/vkscriptparser
- Owner: inyutin-maxim
- Created: 2020-04-19T20:43:20.000Z (over 4 years ago)
- Default Branch: develop
- Last Pushed: 2020-05-06T11:50:34.000Z (over 4 years ago)
- Last Synced: 2024-11-07T20:13:39.421Z (about 2 months ago)
- Language: C#
- Size: 138 KB
- Stars: 0
- Watchers: 4
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.MD
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};
> }
> }