Редактировать обновление! Я думаю, что нашел способ сделать это. Я создал способ сделать это, используя следующие 2 метода: во-первых, этот метод, который ищет и возвращает вложенную строку для использования в циклах / циклах и в случае статов:
public static string UntilNestedEnd(List<Tuple<string, string>> t, ref int i)
{
string inner = "";
int nested = 0;
while (true)
{
if (i < t.Count-1)
{
i++;
if (t[i].Item2 == ")")
{
nested--;
if (nested > 0)
{
inner += t[i].Item2;
}
}
else if (t[i].Item2 == "(")
{
if (nested > 0)
{
inner += t[i].Item2;
}
nested++;
}
else
{
inner += t[i].Item2;
}
if (nested == 0)
{
break;
}
}
}
return inner;
}
Вот код, который может выполнить Команды, все, что мне нужно сделать, это сказать, сколько шагов нужно пропустить, прежде чем извлекать строку, и это привело к тому, что вложенные операторы, похоже, работают, на данный момент у меня есть только 2 команды 'print' и 'l oop ':
public static void RunCode(string input)
{
var g = GetTokens(input);
for (int i = 0; i < g.Count; i++)
{
if (g[i].Item2 == "print")
{
Console.WriteLine(UntilNestedEnd(g, ref i));
}
else if (g[i].Item2 == "loop")
{
int cnt = int.Parse(g[i+2].Item2);
i +=2;
string nested = UntilNestedEnd(g,ref i);
for (int x = 0; x < cnt; x++)
{
RunCode(nested);
}
}
}
}
Вот код, который его запускает:
static void Main(string[] args)
{
RunCode("loop:2(loop:2(loop:2(print(hello))))");
Console.ReadLine();
}