RU

Анализатор кода QSP

Nex Moderator 09.08.2011 13:23 29 comments 45499 views

Некоторое время назад я написал анализатор кода QSP-игр.
Изначально он был сделан “на скорую руку” при помощи регулярных выражений, и из-за этого был примитивным, поэтому я распространял его только лично, с подробной инструкцией по использованию и перечислением имеющихся недостатков.

Этим летом я переработал код, написав полноценный анализатор синтаксиса QSP без регулярных выражений.

Анализатор выполняет проверку на двух уровнях:
1. Проверка синтаксиса. Все ошибки, которые можно однозначно определить по соответствию синтаксическим правилам языка QSP.
Пример: незакрытые многострочные операторы, незакрытые скобки, неверное количество аргументов функции и т.д.
2. Предупреждения. Предположения об ошибках, основанные на анализе структуры игры - переменные, локации, предметы, действия.
Пример: локации, на которые нет перехода, использование неинициализированных переменных, попытка удалить предмет, который нигде не добавляется, и т.д.

Ссылка на проект, для тех, кому интересно: http://code.google.com/p/qsp-analyser/

Главная ценность проекта - исходный код, который полностью открыт. Его я буду обновлять регулярно, по мере работы над проектом.

Внимание: анализатор работает только с файлом текстового формата (TXT2GAM). Поэтому для проверки вам придётся экспортировать игру в кугене. Игра -> Экспорт -> Текстовый файл формата TXT2GAM.

Скачать

Замечания, предложения - приветствуются.

Edited at 25.04.2014 03:33 (11 years ago)

Aleks Versus,
1. Можно приравнять по смыслу элемент массива с явно заданным индексом к отдельной переменной. По сути это одно и то же.
2. Как раз это и есть “верный” способ указания номера строки. Показывается номер строки в текстовом файле. Т.к. в анализатор не встроена работа с бинарным форматом QSP, то приходится временно опираться на формат TXT2GAM. Интегрированный в QGen анализатор будет показывать номера строк относительно локации.

Доработок в ближайшем будущем не планируется, т.к. я занят монетизацией.

Aleks Versus,
я буду не против, если кто-нибудь прикрутит галочку “Считать номера строк от начала локации” в настройках. Исходный код открыт, если кому надо - дам доступ на запись в репозиторий.

классная штука. сильно сэкономила время. еще б только читала файлы без конвертации, что б сразу в .qsp :D ну а если серьезно, то большой респект за такую прогу!
кстати не понимаю зачем это делать.

Nex:

до тех пор пока она не будет-таки реализована в кугене

с проверкой орфографии прекрасно справляется ворд + мозг. да и хранить текст удобнее в ворде, особенно если захочешь перенести его допустим на аксму или твайн (что в общем то почти одно и то же). прописал код, поставил где надо “” и контрол+C контрол+V между скобок фигачишь. ладн. кончаю флудить

ошибка лишний end очень коварная как и недостающий / анализатор указывает просто на последний в блоке кода. Однако можно было бы облегчить жизнь
Пример :
if
else
if
end - лишний!
else - этот оператор не относится ни к одному if что явная ошибка структуры однако ни плеер ни анализатор на это не указывают
end
end - сюда указывает анализатор

и еще момент анализатор также считает локацию потерянной если оператор gt с именем локации находится внутри тега <a href=“exec:gt

lom,
Я использую такие конструкции, все работает…

интересно а обновка для анализатора будет?

Было-бы круто обновить анализатор до QSP 5.8, да, с учётом того, что сейчас есть расширение для VScode, это уже не так актуально, т.к. большинство проблем, и так подсвечиваются в процессе, тем не менее - расширение для VScode не имеет некоторых функций, которые имеет анализатор, и это куда надежней проверять цельный файл полностью, нежели отдельные .qsps куски.

И ещё, если будет возможность - неплохо-бы сделать CLI версию анализатора, без графической оболочки, чтоб была возможность интегрировать его в последовательность команд, т.е. компиляция цельного txt2gam из отдельных .qsps, сразу после прогоняем через анализатор, далее если нет ошибок - прогоняем через txt2gam и создаём .qsp файл.

Aleks Versus Moderator 21.08.2023 14:32 (2 years ago)

l0stetrnity,
ты можешь сделать это сам. ;)
Я себе добавил в планы поработать над анализатором, но я только-только начал изучать сишарп, поэтому никаких сроков указать не могу. Некс уже давно обозначил, что у него нет времени работать над анализатором или Quest Navigator’ом. Собственно, времени ни у кого нет, поэтому, если очень надо, лучше брать дело в свои руки.

Aleks Versus,
Да я подумывал над этим, потом вспомнил что вроде как он и так был. Решил проверить, но поскольку он не обновлён до 5.8 - он сейчас бесполезен, т.к. тот-же qSpider работает на 5.8, да и в целом, субъективно - 5.8 лучше, чем 5.7

По поводу C# - ну, его нужно изучать если планируешь апдйтить этот, существующий анализатор.
Если-же писать его с нуля, то можно писать его на чём угодно, Python для этого прекрасно подойдёт, да даже JS.
Да, объективно, C# шустрее чем Python или JS, тем не менее, если не прогонять 10мб+++ qsp файлы через анализатор, то разница в скорости вряд ли будет ощутимой.

В общем посмотрим, попробую поковырять эту тему, но ничего не обещаю.

Ok, забыл пароль от старого аккаунта, но не суть.
В общем, сделал для себя “headless” версию анализатора, т.е. фактически для CLI использования.
На коде 5.8+ не проверял, ничего не обновлял, просто перекомпилировал на .net 8, с некоторыми доработками, в частности: Теперь программа умеет работать как с одним txt2gam файлом, так и папкой с .qsps файлами.
Программу нужно запускать через консоль/терминал (пример на скриншоте).

Т.е.

./имяпрограммы ./путь/к/файлу/или/папке

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

В любом случае, вот скомпилированный .exe файл - MEGA

Либо, если нет доверия к левым .EXEшниками из интернета, или есть желание обновить до 5.8+ вот SRC MEGA
Для компиляции потребуется .NET 8 SDK, лучше ставить всё паком вместе с Visual Studio.

Lost_Eternity,
Спасибо за обновление! Может, лучше создать проект на GitHub, чтобы он точно не потерялся?

Byte,
Я ни на что не претендую т.к. это не мой код.

Более того, я сейчас занимаюсь основательной переработкой анализатора, чтоб помимо “анализа” он собирал “Граф” QSP файла, т.к. по сути, он и так обрабатывает QSP таким образом.
Т.е. на входе имеем txt2gam .txt файл, на выходе - .HTML граф, в котором записаны все локации, переменные на них, все GT и GS итд.
И чтоб всё это можно было легко искать/отслеживать.

Кое-какой прогресс есть, но иногда появляюются сложности.
*Надеюсь* - удасться сделать что-то адекватное.

Кстати, если я не ошибаюсь, то txt2gam - это твоя программа? Я для себя сделал штуку на её основе, которая вгружает txt2gam файл, кэширует и хэширует его, пребилдит .QSP файл, запускает TCP сервер, и после этого, мы можем посылать запросы TCP серверу на добавление/удаление/обновление/переиминование локаций и моментально воссоздавать .QSP (без полного ребилда).
Но, естественно, нам нужна штука, которая будет посылать эти запросы и принимать QSP файл, т.к. в этом исполнеиии txt2gam работает как сервер. (Например JS скрипт через NodeJS)
Т.е. это полезно для разработки вне qGen.
Но, признаюсь, поскольку мои познания в C - минимальны, код создавался и правился с помощью LLMов.

Тем не менее, если интересно, то вот сорсы - txt2gam_src.rar

Lost_Eternity,
Пока что не было в планах делать txt2gam-сервер, но спасибо за исходники!

Попозже выложу анализатор QSP кода (исходники с MEGA) на GitHub.

Byte,
Ну мне это было нужно, т.к. я использую VScode (с расширением) для QSP, и “сборка” .qsps файлов (фрагментированного txt2gam) - является(лось) слабым местом этого процесса.

Суть в том, что - во первых, при таком раскладе - тебе нужно собрать цельный txt2gam файл из кусков, потом из него скомпилировать .qsp файл, через txt2gam.
И хоть на современных машинах, сборка и компиляция даже проектов с 1000-2000 локаций занимает пару секунд (3-5 в среднем) - это всё ровно напрасная трата времени и ресурсов.

Поэтому я и решил переделать txt2gam Под свои нужды.
Т.е. мы его запускаем и вгружаем в него наш базовый .txt файл (в формате txt2gam, очевидно), и после этого, мы ему можем по TCP отправлять ТОЛЬКО изменённые локации, например с помощью любого watcher’а на NodeJS (Типа Chockidar, или своего, кастомного), который при “сохранении” локации - пакует её “название” и “контент” в b64, отправляет по TCP модифицированному txt2gam, и txt2gam обновляет/добавляет/удаляет/переименовывает прибилдженный .qsp файл, и в случае небходимости - моментально его нам возвращает.

В любом случае, мб пригодится.

Log in or Register to post comments.