Сейчас 04:43:08 Пятница, 19 апреля, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: PUVer, SirNikolas, Ty3uK  
Форум о Warcraft 3 » Раздел для картостроителей » Раздел картостроителя » JASP (Just Another Script Preprocessor)
JASP
Ty3uKДата: Понедельник, 02 Апреля 2012, 12:26:42 | Сообщение # 1
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
- небольшой препроцессор для языка Jass2, который запускается перед парсером vJass (JassHelper). Полную информацию о возможностях вы можете прочитать в мануале, все ссылки внизу.

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

lawsonДата: Понедельник, 07 Мая 2012, 00:33:00 | Сообщение # 176
Группа: Проверенные
Сообщений: 3482
Награды: 0
Репутация: 974
Блокировки:
Quote (SirNikolas)
++i + ++i?

Хмм ни разу такого не видел, но по идеи - сначала должны выполниться инкременты, а только потом складывать возвращенное значение.


Nic nie wiem bo mam chuj.
редактирую посты! ВСЕ!


Сообщение отредактировал lawson - Понедельник, 07 Мая 2012, 00:34:19
 

SirNikolasДата: Понедельник, 07 Мая 2012, 09:16:23 | Сообщение # 177
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
http://lurkmore.to/++i_+_++i

 

Ty3uKДата: Суббота, 02 Июня 2012, 15:50:14 | Сообщение # 178
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Я не модератор и темы закрывать не умею

Добавлено (02 Июнь 2012, 15:50:14)
---------------------------------------------
Возможно, кого-то это заинтересует, а кого-то заставит плясать
Итак, я научил жасп взаимодействовать с cJass, т.е. их взаимное использование с этого момента возможно и даже нужно :)
Комментим, господа


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Суббота, 02 Июня 2012, 16:40:16 | Сообщение # 179
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
yahoo
Ну что еще сказать)


 

Ty3uKДата: Воскресенье, 03 Июня 2012, 18:34:37 | Сообщение # 180
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
SirNikolas, сам тихо радуюсь :)

Добавлено (03 Июнь 2012, 18:34:37)
---------------------------------------------
бтв, я переписываю жасп на с#
все готовимся к катострофе trollface


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

DreiiДата: Воскресенье, 03 Июня 2012, 19:01:17 | Сообщение # 181
10 уровень
Группа: Проверенные
Сообщений: 4991
Награды: 0
Репутация: 603
Блокировки:
Иди учи матан!

 

Ty3uKДата: Воскресенье, 03 Июня 2012, 19:10:34 | Сообщение # 182
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
какой матан, ты же в 11 классе : trollface:

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

Like_a_NoobДата: Понедельник, 04 Июня 2012, 11:29:47 | Сообщение # 183
7 уровень
Группа: Проверенные
Сообщений: 253
Награды: 0
Репутация: 414
Блокировки:
Quote (Ty3uK)
бтв, я переписываю жасп на с#
все готовимся к катострофе trollface

хочу это увидеть idiot
 

Ty3uKДата: Понедельник, 04 Июня 2012, 12:10:56 | Сообщение # 184
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Code
using System;
using System.IO;
using System.Windows.Forms;
using System.Collections.Generic;
using SFMpq;

class JASP
{

     private static int MPQ;
     private static string[] war3map;
     private static List<string> script = new List<string>();

     //==========================================================================================//
     //
     //                    **Main API**
     //
     //==========================================================================================//

     private static void SplitComments()
     {
         for (int i = 0; i < war3map.Length; i++)
         {
             if (war3map[i].IndexOf("//") != -1)
             {
                 int index = war3map[i].IndexOf("//");
                 war3map[i] = war3map[i].Substring(0, index);
                  
             }
         }
     }

     private static void ReplaceSpaces()
     {
         for (int i = 0; i < war3map.Length; i++)
         {
             while (war3map[i].IndexOf("  ") != -1)
             {
                 war3map[i] = war3map[i].Replace("  ", " ");
             }
             war3map[i] = war3map[i].Trim();
             if (war3map[i].Length > 0) script.Add(war3map[i]);
         }
     }

     private static int FindBraces(int start)
     {
         int OB = 0, CB = 0, end = 0;
         for (int i = start; i < war3map.Length; i++)
         {
             if (war3map[i].IndexOf("{") != -1) OB++;
             if (war3map[i].IndexOf("}") != -1)
             {
                 CB++;
                 if (CB == OB) { end = i; break; };

             }
         }
         return end;
     }

     private static void ParseFunctions()
     {
         int start = 0, end = 0;
         string temp = "";
         do
         {
             if (war3map[start].IndexOf("{") != -1 && war3map[start].IndexOf("library") == -1 &&
                 war3map[start].IndexOf("scope") == -1 && war3map[start].IndexOf("struct") == -1 &&
                 war3map[start].IndexOf("define") == -1 && war3map[start].IndexOf("enum") == -1)
             {
                 end = FindBraces(start);
                 for (int i = start; i < end; i++) { temp += war3map[i] + "\n"; }
                 start = end;
             }
             start++;
         } while (start < war3map.Length);
     }

     private static void ExtractScript(string aName)
     {
         MPQ = SF.MpqOpenArchiveForUpdate(aName, SF.MOAU_OPEN_EXISTING + SF.MOAU_MAINTAIN_LISTFILE, 0);
         SF.MpqExtractFileTo(MPQ, "war3map.j", "war3map.j");
         war3map = File.ReadAllLines(@"war3map.j");
     }

     private void AddScript()
     {
         SF.MpqAddFileToArchiveEx(MPQ, "war3map.j", "war3map.j", SF.MAFA_REPLACE_EXISTING + SF.MAFA_COMPRESS, SF.MAFA_COMPRESS_DEFLATE, SF.Z_BEST_COMPRESSION);
         SF.MpqCompactArchive(MPQ);
         SF.MpqCloseUpdatedArchive(MPQ, 0);
     }

     //==========================================================================================//
     //
     //                    End **Main API**
     //
     //==========================================================================================//

     static void Main()
     {
         if (File.Exists(SF.DLL))
         {
             ExtractScript("ololo.w3x");
             SplitComments();
             ReplaceSpaces();
             //ParseFunctions();
             //File.WriteAllLines("123.txt", war3map);
         }
         else
         {
             MessageBox.Show("File \"SFMpq.dll\" isn't exists.\nSorry :(", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
         }
     }

}

Пока так.
Бтв, юзаю собсьвенный апишник для SFmpq.dll (перенес из апишника для плюсов)


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Понедельник, 04 Июня 2012, 12:31:21 | Сообщение # 185
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Вон ты какой хитрый. А я думал, работаешь с посимвольным вводом.

 

Ty3uKДата: Понедельник, 04 Июня 2012, 15:25:41 | Сообщение # 186
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
ник, на дворе 2012 год (:

Добавлено (04 Июнь 2012, 15:25:41)
---------------------------------------------
до этого жасп вообще на регулярках одних был
сейчас стараюсь без них
ибо парсинг цжасса не получалось на них сделать (:


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Понедельник, 04 Июня 2012, 15:26:10 | Сообщение # 187
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Судя по private static void ParseFunctions(), он будет некорректно обрабатывать однострочные define'ы.

 

Ty3uKДата: Понедельник, 04 Июня 2012, 15:34:39 | Сообщение # 188
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
он и не должен их обрабатывать. согласен, алгоритм так себе, но все же лучше, чем без цжасса (;

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

DragoNДата: Понедельник, 04 Июня 2012, 17:37:00 | Сообщение # 189
Инквизитор
Группа: Стримеры
Сообщений: 4348
Награды: 7
Репутация: 2776
Блокировки:
Quote (Dreii)
Иди учи матан!

матан не матчасть, если что
апишник видел ещё не в готовом вариант, молодец)


El Psy Congroo
 

Ty3uKДата: Среда, 20 Июня 2012, 10:25:30 | Сообщение # 190
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
спасибо :3

Добавлено (20 Июнь 2012, 10:25:30)
---------------------------------------------
Вот так сейчас выглядит жасп на шарпе
Может вырезать комменты, строки, равы, цикл и разбивать единые строки


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Среда, 20 Июня 2012, 13:09:08 | Сообщение # 191
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (Ty3uK)
Code
while (war3map[i].IndexOf("  ") != -1)
{
    war3map[i] = war3map[i].Replace("  ", " ");
}
war3map[i] = war3map[i].Trim();
Однозначно нехорошо.
Code
bool space = true;
string s = "";
for (short j = 0; j < war3map[i].Length; j++) {
    if (war3map[i][j] == ' ' || war3map[i][j] == '\t') {
        if (space)
            continue;
        space = true;
    } else if (space)
        space = false;
    s += war3map[i][j];
}
if (s[s.Length - 1] == ' ' || s[s.Length - 1] == '\t')
    s.RemoveAt(s.Length - 1);
war3map[i] = s;


Добавлено (20 Июнь 2012, 13:09:08)
---------------------------------------------
Quote (Ty3uK)
Code
private static void ReplaceFlush()
{
    for (int i = 0; i < war3map.Length; i++)
    {
        if (war3map[i].IndexOf("flush ") != -1 && war3map[i].IndexOf("locals") == -1)
        {
            war3map[i] = war3map[i].Replace("flush", "set");
            war3map[i] += " = null";
        }
    }
}
Следующий код не будет пропарсен:
Code
local unit mylocalsample = CreateUnit(...)
//...
flush mylocalsample


 

Ty3uKДата: Среда, 20 Июня 2012, 13:12:09 | Сообщение # 192
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Quote (SirNikolas)
Однозначно нехорошо.
почему? на делфи такой же алгоритм, работает достачно хорошо
Quote (SirNikolas)
Слудующий код не будет пропарсен:
да, там надо бы пошаманить с посимвольным чтением (:


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Среда, 20 Июня 2012, 13:18:06 | Сообщение # 193
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Во-первых, потому что тут не отслеживается табуляция. На это ты наверняка ответишь foreach (string s in war3map) { s.Replace('\t', ' '); }. Ладно, хотя это даст еще один пробег по всему многотысячностроковому коду. Во-вторых, при нахождении двух пробелов подряд они заменяются одним пробелом, и поиск начинается заново. Зачем? В-третьих, при каждом вхождении строка перезаписывается. В-четвертых, умножаем все потери в скорости от предыдущих пунктов на количество строк в файле.

 

Ty3uKДата: Среда, 20 Июня 2012, 13:19:53 | Сообщение # 194
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
SirNikolas, ник, какая табуляция? в жнгп табы заменяются 4 пробелами, потому что в TESH поставили такую галку
Но ты меня убедил, спасибо за исправленный вариант :)


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

SirNikolasДата: Среда, 20 Июня 2012, 13:34:44 | Сообщение # 195
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Quote (Ty3uK)
в жнгп табы заменяются 4 пробелами, потому что в TESH поставили такую галку
Правда? Не знал. Но ведь ты пишешь компилятор не под один редактор, верно? Может, я из Npp в JNGP код копирую?

Добавлено (20 Июнь 2012, 13:34:44)
---------------------------------------------
Quote (Ty3uK)
Code
private static string[] SplitEmptyLines(string[] input)
{
    int lines = 0, current = 0;
    for (int i = 0; i < input.Length; i++)
    {
        if (input[i].Trim().Length > 0) lines++;
    }
    string[] output = new string[lines];
    for (int i = 0; i < input.Length; i++)
    {
        if (input[i].Trim().Length > 0)
        {
            output[current] = input[i];
            current++;
        }
    }
    return output;
}
Я бы написал вот так:
Code
static string[ ] SplitEmptyLines(string[ ] input) {
    short lines = 0;
    short[ ] numbers = new short[input.Length];
    for (short i = 0; i < input.Length; i++)
        if (input[i].Trim().Length > 0)
            numbers[lines++] = i;
    if (lines == 0)
        return null;
    string[ ] output = new string[lines];
    for (short i = 0; i < lines; i++)
        output[i] = input[numbers[i]];
    return output;
}


 

Ty3uKДата: Среда, 20 Июня 2012, 13:50:09 | Сообщение # 196
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
спасибо :3

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

Brut@lusДата: Понедельник, 25 Июня 2012, 22:35:41 | Сообщение # 197
Группа: Заблокированные
Сообщений: 2496
Награды: 1
Репутация: 924
Блокировки:
Ty3uK, а этот агрегат возможно поставить на простой WE? Потому что jngp совсем не пашет :<

 

Ty3uKДата: Вторник, 03 Июля 2012, 11:19:25 | Сообщение # 198
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Brut@lus, нет, нельзя

Так как на подходе новая бета, я решил привести в порядок страничку на гуглокоде и написал о нововведениях в этой новой бетке. Всех, кто заинтересован - прошу сюда


╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

FaionДата: Вторник, 03 Июля 2012, 11:44:20 | Сообщение # 199
10 уровень
Группа: Проверенные
Сообщений: 1894
Награды: 0
Репутация: 430
Блокировки:
/o\ ну раз речь зашла о говнокоде и правильном подходе, то:

Code
string ResultingString = Regex.Replace(StringToCap, @"\w+", new MatchEvaluator(CapitalizeString));


+ StringBuilder

И вообще байтофаги детектед. Это вам не жасс. В дотнете есть автоматическая оптимизация кода. Алгоритмы лучше юзайте человеческие, от этого пользы будет в разы больше.


О нас думают плохо лишь те, кто хуже нас, а те кто лучше нас... Им просто не до нас.
My Project: Nindogatari
MAL
 

Ty3uKДата: Вторник, 03 Июля 2012, 11:45:15 | Сообщение # 200
Группа: Ветераны
Сообщений: 6125
Награды: 2
Репутация: 1617
Блокировки:
Faion, ты это к чему?

╭∩╮(︶︿︶)╭∩╮
"Ульта Тайда мне в жопу!" © k0fe1n
Статьи: MUI-1|MUI-2|Шрифт
Полезности: JASP|JNGP|Уголок библиотек
 

Форум о Warcraft 3 » Раздел для картостроителей » Раздел картостроителя » JASP (Just Another Script Preprocessor)
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz