Я пишу свой собственный анализатор, лексер, интерпретатор. И мне нужно создать дерево кодовых блоков, например, у меня есть текстовый файл:
word0
{
word0_0
{
word0_0_0
{
}
}
}
word1
{
word1_0
{
}
word1_1
{
}
}
Я читаю этот файл и преобразовываю в массив токенов. (слова), массив будет выглядеть так:
word0
, {
, word0_0
, {
, word0_0_0
, {
, }
, }
, }
, word1
, {
, word1_0
, {
, }
, word1_1
, {
, }
, }
И мне нужно создать дерево(не дерево текстовых файлов) из этого массива, например:
word0--|
|
word0_0--|
|
word0_0_0
word1---|
|
|-------|
word1_0 word1_1
Но я не понимаю, как это сделать. Я пытался, и мне было разрешено только создать дерево без дочерних элементов:
word0
word1
Что я сделал, чтобы сделать дерево без дочерних элементов (только кодовые блоки word0, word1)
List<ICodeBlock> blocks = new List<ICodeBlock>(); //list of codeblocks in file
//codeblock is class that contains information,like index of codeblock start
//or index of codeblock end, and also array of codeblocks(childs inside
codeblock)
//notendedcodeblock is same class as codeblock,but not stores a index of codeblock end
int tokenIndex = 0; //index of current token(word) that i will read in loop
int blockIndex = 0; //index of current codeblock
foreach(Token codeWord in code) //loop to read every token(word) in array(code is Token[] array)
{
if(codeWord.Name==token_name_CODEBLOCK_START) //if token text is "{"
{
//create notendedcodeblock(first arg is childs of codeblock(other codeblocks) and second arg is index where codeblock starts
blocks[blockIndex] = new NotEndedCodeBlock(null,tokenIndex);
}
if(codeWord.Name==token_name_CODEBLOCK_END) //if token text is "}"
{
//convert a notendedcodeblock to codeblock(first arg is notendedcodeblock class and second is index of where end of codeblock
blocks[blockIndex] = new CodeBlock(((NotEndedCodeBlock)blocks[blockIndex]),tokenIndex);
blockIndex++;
}
tokenIndex++;
}
также, если это будет полезно, есть код классов кодовых блоков:
public interface ICodeBlock
{
List<ICodeBlock> Childs { get; set; }
int Start { get; set; }
}
public class CodeBlock : ICodeBlock
{
public List<ICodeBlock> Childs { get; set; }
public int Start { get; set; }
public int End { get; set; }
public CodeBlock(List<ICodeBlock> childs,int start,int end)
{
Childs = childs;
Start = start;
End = end;
}
public CodeBlock(NotEndedCodeBlock cb,int end)
{
Childs = cb.Childs;
Start = cb.Start;
End = end;
}
}
public class NotEndedCodeBlock : ICodeBlock
{
public List<ICodeBlock> Childs { get; set; }
public int Start { get; set; }
public NotEndedCodeBlock(List<ICodeBlock> childs, int start)
{
Childs = childs;
Start = start;
}
}
Я ожидаю получить список или массив классов кодовых блоков с дочерними элементами (CodeBlock.Childs). Дочерние объекты тоже слишком кодовые блоки