/// <summary>
/// Препретатор и постпретатор функция
/// </summary>
/// <param name="game">Массив строк всего скрипта</param>
/// <param name="main">Сам скрипт</param>
public static void Compilation(string[] game, ref string main, string namefunc = null)
{
//funct.Clear();
for (int i = 0; i < game.Length; i++)
{
game = main.Split('\n');
if (game[i].Split(';')[0] == "function")
{
//создание или "взятие" функции
Function fn;
if(namefunc != null)
{
fn = funct[namefunc]; //получем функцию из списка по её имени
}
else if (!funct.ContainsKey(game[i].Split(';')[1]))
{
fn = new Function();
fn.start = i + 1;
string name = game[i].Split(';')[1];
fn.name = name;
funct.Add(name, fn);
}
else
{
fn = funct[game[i].Split(';')[1]];
}
//Подсчёт строк функции
int o = 1;
for (; !game[i + o].TrimEnd('\n', '\r', '\t').EndsWith("}"); o++) ;
var rrrhhh = ""; //временная переменная с итоговым кодом скрипта
var telo = "";//тело функции
for (int p = 0; p < ((i + o)); p++)
{
rrrhhh += game[p] + "\n"; //заполнение до конца функции
}
//Console.WriteLine(rrrhhh);
for (int q = i; q < i+o; q++)
{
telo += game[q] + "\n"; //заполнение тела
}
telo = telo.Split('\n')[telo.Split('\n').Length - 2];//обрезка } (там 2 должно быть, потому что индекс с 0, а количество с 1)
//Console.WriteLine(telo);
int lenghtgoto = 0;
if (!telo.Contains("goto;")){
rrrhhh = rrrhhh.Insert(rrrhhh.Length, String.Format("goto;{0}", fn.point) + "\n}");//если "гото" нет, то добавляем
lenghtgoto = (String.Format("goto;{0}", fn.point) + "\n}").Length; //вычисляем длинну вставки
}
else//иначе изменяем
{
rrrhhh = rrrhhh.Substring(0, rrrhhh.Length - 3);//обрезаем перенос строки и }
int y = rrrhhh.Length - 1;//получаем длинну в виде индекса
int t = 0;//создает временную переменную
for (; rrrhhh[y] == ';'; y--, t++) ;//считаем от конца и до ; (это символ передачи аргументов)
//t++;
rrrhhh = rrrhhh.Substring(0, rrrhhh.Length - t);//обрезаем по него
rrrhhh += ";" + fn.point.ToString() + "\n}";//добавляем новый "гото"
//Console.WriteLine(rrrhhh);
}
rrrhhh = rrrhhh.Insert(rrrhhh.Length, main.Substring(rrrhhh.Length - (lenghtgoto))); //Добавляем всё что после функции
//Console.WriteLine(rrrhhh);
main = rrrhhh; //изменяем основной скрипт
}
}
}