Преобразовать массив слов в дерево - PullRequest
0 голосов
/ 19 октября 2019

Я пишу свой собственный анализатор, лексер, интерпретатор. И мне нужно создать дерево кодовых блоков, например, у меня есть текстовый файл:

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). Дочерние объекты тоже слишком кодовые блоки

...