adic3x

cJass - дополнение к языку JASS

Published

Что это?

cJass - это еще одно расширение языка JASS, которое полностью совместимо с популярным vJass. Цель его создания - дать программистам еще больше возможностей по созданию простого и качественного кода. Основными направлениями являются:
  1. Макросредства и стандартная библиотека - избавляют от рутины, позволяя сконцентрироваться на основном коде.
  2. Упрощение синтаксиса - мы не хотим снова начинать спор, какой синтаксис лучше (блоки через begin & end или {}), и более того, мы не навязываем свою точку зрения - все конструкции cJass имеют JASS-style аналоги, тем не менее мы предоставляем выбор.
  3. Оптимизация карты - основная концепция cJass - это то, что все языковые конструкции не должны сказываться на качестве генерируемого кода. Также мы работаем над встроенным оптимизатором.

Как это использовать?

Просто скачайте дистрибутив (пароль для архива: cjass), распакуйте и запустите инсталлятор. У вас уже должен быть установлен Jass New Gen Pack.
Ознакомиться с возможностями можно, прочитав руководство пользователя cJass (off-line версия этого файла также имеется в директории программы).

Что-то не работает!

В настоящий момент мы активно дополняем язык всевозможными конструкциями, поэтому полноценная проверка синтаксиса пока отсутствует. Но мы всегда внимательно изучаем
bug-репорты, которые можно оставить в этой теме.

У меня есть идея: а не плохо бы...

Мы всегда рады выслушать Ваши идеи и предложения по внесению каких либо новых возможностей в язык, расширению стандартной библиотеки и т.д. Иногда мы даже действительно делаем то, что Вы нам предлагаете ;) Наша секция обратной связи ждет Вас!
» И напоследок немного истории.
А история программы начинается на ресурсе wc3c.net, когда Vexorian, выслушав предложение от ADOLF'a сделать инструкции инкремента и декремента создает ветку с обсуждением синтаксиса... и благополучно забывает об этом. Тогда ADOLF подумал: "А неплохо было бы сделать свой парсер и включить в него всяких вкусностей". Изначально программа весила меньше заветных 9000 байт, распространялась по сети ICQ/Jabber и ее использовали несколько человек.
Однажды один из ее пользователей - Van Damm (впоследствии стал соавтором) сказал "это очень удобно!" (это было сказано про то, что можно вызывать функции без ключевого слова call) - и тогда мы решили, что если это удобно, почему бы не выложить программу на публичное обозрение. Благодаря zibade у нас появился сайт, где сразу стал отписываться Dark Dragon, который помог выявить львиную долю багов и внес множество интересных предложений.
С тех пор прошло много времени, мы сделали много новых версий, вес программы вырос в 3 раза (сейчас 26 Кбайт). На данный момент у нас есть планы, касающиеся многих конструкций, оптимизатора, и всего прочего.


Views: 87 287



Doc #601 - 9 лет назад 0
Голосов: +0 / -0
Faion, хм, а что не так?
Faion #602 - 9 лет назад 0
Голосов: +0 / -0
bb:Ну я думал сразу в jass2 конвертируется.
Doc #603 - 9 лет назад 0
Голосов: +0 / -0
Нет офк, а зачем?)
Faion #604 - 9 лет назад 0
Голосов: +0 / -0
bb:Ну к примеру что бы не быть зависимым от vjass=)
Doc #605 - 9 лет назад 0
Голосов: +0 / -0
Лишняя работа же, кому нужен еще один вжасс парсер?
Faion #606 - 9 лет назад 0
Голосов: +0 / -0
[quote=Doc]Лишняя работа же, кому нужен еще один вжасс парсер?[/quote]
Я прост еще тот перфекционист. Была б моя работа, я бы 100% прикрутил бы свой парсер, и еще большинство фич vjass на свой лад=)
Elf_Stratigo #607 - 9 лет назад 0
Голосов: +0 / -0
Faion:
Была б моя работа
там опен сорс
Faion #608 - 9 лет назад 0
Голосов: +0 / -0
[b]ADOLF[/b], увеличь максимальное кол-во дефайнов, а то мне над 20к+
Faion #609 - 9 лет назад 0
Голосов: +0 / -0
Такая проблема с cjass:
есть некий #define QuestHead = if (GetData==QuestData) then
но после компиляции я получаю:
if(GetData==(1))then
Если рассмотреть процесс компиляции, то:
На стадии в parsed_war3map все норм, заменяется правильно , а вот уже в optimized_war3map косяк.
Что касается новой сборки, то выдает ошибку в самом начале на #include "cj_types.j" ,а именно когда начинает парсить сам дефайн в либе.
Картина такая там:
[code]
define
{
int integer
bool boolean
void nothing
float real
while (cond) whilenot not(cond), <- тут ошибка
break=exitwhen true
[/code]
На данный момент у меня нет идей кроме как избавится от данного дефайна.
решил проблему рейнеймом нескольких дефайнов.
Doc #610 - 9 лет назад 0
Голосов: +0 / -0
в новой сборке while (cond) задефайнено в exe.
if(GetData==(1))then
обычно такое случается, если у тебя есть функция с именем
QuestData
Faion #611 - 9 лет назад 0
Голосов: +0 / -0
[quote=Doc]if(GetData==(1))then
обычно такое случается, если у тебя есть функция с именем
QuestData[/quote]
Прав. А вообще было бы не дурно, если бы компилятор писал о конфликте имен. У меня вот все в сплошных дефайнах, фиг найдешь конфликт если возникнет.
2 комментария удалено
Msey #614 - 9 лет назад 0
Голосов: +0 / -0
Последняя версия парсера. Выдает ошибку на модуль библиотеки (либа не кривая, установка тоже в поряде прошла.. до этого все отлично работало).
Как решить проблему? как модуль заменить в таком случае?
module ABCstart
endmodule
Faion #615 - 9 лет назад 0
Голосов: +0 / -0
[b]ADOLF[/b], по силам ли тебе сделать такие фичи:
  • подсветку пользовательских функций
  • прикрутить что бы фича, которая выводит список предполагаемых функций при вводе пары букв из функции, выводила не только кастомные, но и пользовательские
  • по нажатию горячей клавиши переход к месту объявления функции
Я конечно понимаю, что вопрос не совсем по адрессу, т.к. cjass выполняет несколько другие задачи, но мне кажется у тебя достаточно скила и понимания устройства WE.
adic3x #616 - 9 лет назад 0
Голосов: +1 / -1
Нет, не в силах. Слишком много всего переделывать придется.
Clamp #617 - 9 лет назад 0
Голосов: +0 / -0
Faion, адик ещё год тому назад сказал, что не будет пилить распознавание пользовательских функций
Faion #618 - 9 лет назад 0
Голосов: +0 / -0
[quote=Clamp]Faion, адик ещё год тому назад сказал[/quote]
Не видел
[quote=ADOLF]Нет, не в силах. Слишком много всего переделывать придется.[/quote]
Блин, обломно.
Hellfim #619 - 9 лет назад 0
Голосов: +0 / -0
Faion, оно есть. Помести их в папку с тешем. Это немного неудобно, потому что каждую функцию нужно будет копировать вручную, но они будут подсвечиваться и "всплывать", так что можешь заняться этим.
Faion #620 - 9 лет назад 0
Голосов: +0 / -0
ADOLF, дайошь foreach =) и еще динамическую типизацию=)
Типа
var g = new Group();
ну ты понял=)
Doc #621 - 9 лет назад 0
Голосов: +0 / -0
for(unit u; UnitsInRange(x, y, r)){
}
чем не foreach?
Faion #622 - 9 лет назад 0
Голосов: +0 / -0
Действительно forech, не вкурсе был что можно так юзать конструкцию for. thx
ScorpioT1000 #623 - 9 лет назад 0
Голосов: +0 / -0
Faion, просто она в последнем cJass, который на гуглкоде лежит
Кстати, может, обновишь эксперементальную сборку ? Добавить вжасс и сижасс новый туда.
alpha #624 - 9 лет назад 0
Голосов: +0 / -0
ScorpioT1000:
Кстати, может, обновишь эксперементальную сборку ? Добавить вжасс и сижасс новый туда.
В новом сижасс есть пара багов, по-моему
я отписывал о них ранее
Если обновлять, то оставляя прежнюю сборку, просто рядом ссыль на сборку с более свежим сдж и тешем
ScorpioT1000 #625 - 9 лет назад 0
Голосов: +0 / -0
Не трогайте теш, там форк от Vann Damm для cJass синтаксиса
Klop #626 - 9 лет назад 0
Голосов: +0 / -0
если поставить макрос с названием умножить(*) и начать сохранение повисает Адик)))
Klop добавил:
или прочие символы типа @
adic3x #627 - 9 лет назад 0
Голосов: +0 / -0
Там много можно найти способов его повесить.
Hanabishi #628 - 9 лет назад 0
Голосов: +0 / -0
ADOLF, а возможно сделать синтаксис для структур
class A{
}
adic3x #629 - 9 лет назад 0
Голосов: +0 / -0
Это делать не нужно, просто послушайте меня.
Hanabishi #630 - 9 лет назад 0
Голосов: +0 / -0
ADOLF, okay
ScorpioT1000 #631 - 9 лет назад 0
Голосов: +0 / -0
всмысле? там так и есть, тока #define class struct
Doc #632 - 9 лет назад 0
Голосов: +0 / -0
Я так делал, просто подсветки не было.
Faion #633 - 8 лет назад 0
Голосов: +0 / -0
Как на счет убрать лимиты на кол-во скопов(???).
adic3x #634 - 8 лет назад (изм. ) 0
Голосов: +0 / -0
Был лимит на количество дефайнов, но его я вроде убрал в тех бетах, что на гуглокоде. Можно мне попробовать скинуть карту в личку, на которой падает - скажу, что пофиксить.
Darklight #635 - 8 лет назад 0
Голосов: +0 / -0
А сочетается ли AdicHelepr (cJass) c обновлённым JassHelper 2012-03-10 (vJass)?
adic3x #636 - 8 лет назад (изм. ) 0
Голосов: +0 / -0
Совмещается с помощью //! nocjass и //! endnocjass в перед и после нововведений.
Это сообщение удалено
Faion #638 - 8 лет назад (изм. ) 0
Голосов: +0 / -0
ADOLF, fix this plz:)
Faion #639 - 8 лет назад (изм. ) 0
Голосов: +0 / -0
Предлагаю новую конструкцию для препроцессора:
#define <callback onInit({0}){{{1}}}, arg1, arg2 >= 
{
  callback onInit(arg1)
  {
    arg2
  }
}

//{{{1}}} это не ошибка, это экранирование `{` и `}`

#define <{0}.Destroy(), arg1> = Destroy(arg1);
adic3x #640 - 8 лет назад 0
Голосов: +0 / -0
Я ничего не понял. В любом случае - удачи!
Faion #641 - 8 лет назад 0
Голосов: +0 / -0
ADOLF, ок понимаю, подскажи мне хотя бы, как произвести препроцессинг кода, до обработки cJass'ом. А именно интересует как скормить cjass'у преобразованный war3map.wct. Все остальное не проблема запилить, в т.ч. любые синтаксические cjass конструкции, главное реализовать то что я указал выше.
adic3x #642 - 8 лет назад (изм. ) 2
Голосов: +2 / -0
Там же у меня была фишка с плагинами? Надо рыть тему и фидбек на сжасс.хгм.ру, где я это описывал.
Вот:
Plugins are analog of external tools in jasshelper, but:
run it before processing code (when I started writing adiсhelper I could not do it with external tools, and I had to edit Lua)
when writing a preprocessor you no need to open the map, extract script, repack it, look it your tags, etc.
You can pass more than one command line in external
You can write a plugin in any language, which compiles to the *.dll (C, Delphi, basic, asm, etc.)
writing a specific plugin may be necessary in rare cases, so much not to think about)
...
When plugins is necessary:
create your own zinc with syntax sugar
write own specific preprocessors
create database of terrain (read war3map.w3e) or placed doodads
...
#custom test (command line)
code there
#endcustom
It load %adic_helper_dir%\plugins\test.dll and call _stdcall cjplugresult ParseCode (*cjpluginfo arg)
It run before cJass parser, so you may use cJass syntax, or add (temporary) ! lua ... ! endlua - then cJass parser ingone your code.
cjplugresult - is windows exit code analog:
0x00000000 - succesfull!
0x00000001 ... 0xfffffffe - error, plug display information about error to user
0xffffffff - error, cJass display [21] Critical error: unknown error in plugin
Struct cjpluginfo is:
	_dCstCodeStart		dd	;; addr of input code
	_dCstCodeSize		dd	;; size in bytes of input code
	_dCstCodeDest		dd	;; addr of dest
	_dCstCodeFinalSize	dd	;; parsed code size
	_dCstArguments		dd	;; null term string, arguments to plugin
cjass himself will take care of memory allocation, all you need to - write your code to the specified address (_dCstCodeDest) and set it size (_dCstCodeFinalSize)
There is demo plugin with source, which add string s="Hello from plugin!" to code. Create plugins directory, place it there and try parse code from this post...
Не факт, что это не отвалилось в каком либо билде ;)
Проверил, работает. Я таки крут
#custom test ()

#endcustom
Faion #643 - 8 лет назад 0
Голосов: +0 / -0
Хм, thx, как раз со следующей недели ухожу в отпуск, попробую запилить :)
Doc #644 - 8 лет назад 0
Голосов: +0 / -0
Faion, лучше уж тогда свой препроц пиши, алгоритм все равно тот же, просто не придется юзать custom, это тут не к месту, по запуску препроца из луа могу подсказать, хотя там все предельно просто, я сам писал поддержку кириллицы на жаве.
В общем, как адик и написал, нужно достать из карты код, пропарсить и засунуть обратно.
adic3x #645 - 8 лет назад 0
Голосов: +0 / -0
#custom делает в целом тоже самое.
Faion #646 - 8 лет назад 0
Голосов: +0 / -0
Doc, а я и так буду писать свой препроц, если осилить ту конструкцию, которую я привел в пример выше, то можно будет написать весьма разнообразные конструкции. Я особо не задумывался, но вроде бы там над будет пилить генератор регулярных выражений по шаблону по дефайну.
Doc #647 - 8 лет назад 0
Голосов: +0 / -0
ADOLF, лишний синтаксис просто. Только я не понял, плагинописателю же все равно придется самому доставать код из мпку или чо?
adic3x #648 - 8 лет назад 0
Голосов: +0 / -0
же все равно придется самому доставать код из мпку или чо?
Нет, он просто пишет длл с процедурой, которая принимает аддр структуры, в которой уже занесен код между секциями #custom и #endcustom, и которая должна написать куда либо код, и заполнить с структуре его аддр и размер. Копание мпку не предполагается, по крайней мере для кода.
Doc #649 - 8 лет назад 0
Голосов: +0 / -0
ADOLF, а, ну тогда норм.
Faion #650 - 8 лет назад 0
Голосов: +0 / -0
TimerStart(CreateTimer(), 0.1, false, lambda void(){
            loop
            {  
                intArray[0][indexer++] = indexer;
            }
        });
сжасс мешает вжассу обработать двумерный массив. Вынос данной конструкции из лямбда функции решает вопрос.
Ошибки нету, я ступил.