C++ Рекурсивное построение дерева с указателями и конечным автоматом

У меня есть простой конечный автомат (введен ниже). Моя главная проблема заключается в том, что я пытаюсь сделать рекурсивный вызов функции, которая является моим конечным автоматом. После ввода функции я создаю новый узел для своего дерева и затем проталкиваю его. Когда я делаю рекурсивный вызов, я снова и снова создаю новый узел. Это может сработать, но когда я добавляю детей к родителю, я немного растерялся. Может ли кто-нибудь помочь разобраться в этом и помочь мне взять мой узел дерева (родитель, которого я предполагаю) и привязать к нему ребенка?

TreeNodeClass* ProcessTree(TokenT token, vector <list <stateAssoc> >& vecTree, int depth)
  {
    int state = 1; //Assume this is a new record.
    bool noState = false;
    bool update = true;
    int dex = 0;
    string root, value, data, tag;
    TreeNodeClass* treeNode;

    treeNode = new TreeNodeClass; //Assume a new node per state machine visit.

    //Need 11 to break out of loop as well. 
    while(state != 10)
    {
      switch(state)
      {
    case 1: dex = 1;
        break;

    case 2: dex = 6; 
        root = yylval;
        break;

    case 3: dex = 7; 
        break;

    case 4: dex = 3;
        value = yylval;
        treeNode->CreateAttrib(root, value);
        break;

    case 5: dex = 2;
        break;

    case 6: dex = 4;
            data = yylval; 
        break;

    case 7: //Really Don't do anything. Set the tag creation at 8...
            dex = 8; 
        tag = yylval;
        if(data != "" and data != "authors")
          treeNode->CreateTag(data, tag);
        break;

    case 8: {
          //New TreeNode already grabbed. 
          //TreeNodeClass* childNode = new TreeNodeClass;
          childNode = ProcessTree(token, vecTree, depth+1);
          childNode->SetHeight(depth);
          treeNode->AddChildren(childNode);
        }
        token = TokenT(yylex()); //Get a new token to process.
        dex = 5;
        break;

    case 9: dex = 9;
        update = false;
        if(yylval != treeNode->ReturnTag())
        {
          state = 11; 
        }
        break;

    case 10: update = false;
        treeNode->SetHeight(1);
        break;

    default: cout << "Error " << endl;
        cout << state << endl;
        cin.get();
        break;

      }

      if(!noState)
    state = FindMatch(vecTree[dex], token);

      if(update)
    token = TokenT(yylex());
      else
    update = true;
    }
    return treeNode;

  }

Вы можете предположить, что dex - это просто указатель на массив списков, который будет возвращать правильное состояние или 11 (ошибка). Также вы можете предположить, что эта функция по крайней мере однажды была вызвана для входного файла и начала синтаксический анализ. Спасибо за помощь.

1 ответ

Глядя на свой код, у вас есть

int state = 1;
//Code

while(state != 10) {
    switch(state) {
        case:1 dex = 1; break;   //Only case you run
        //more cases
        case 8: { //never enter here
          //New TreeNode already grabbed. 
          //TreeNodeClass* childNode = new TreeNodeClass;
          childNode = ProcessTree(token, vecTree, depth+1);
          childNode->SetHeight(depth);
          treeNode->AddChildren(childNode); //should work if assuming function is correct
        }
        //stuff
        break;
        default: break;//blah
    }
}
//blah

return treeNode;

Я не вижу другой причины, кроме факта state всегда равно 1, что ваш код в случае 8 потерпит неудачу. Это предполагает treeNodeClass::AddChildren(TreeNodeClass*) был правильно реализован. Без этого кода могу предположить, что это не ваша проблема. Есть ли какой-то метод, в котором state не будет 1 в коммутаторе?

Другие вопросы по тегам