2012-09-14 30 views
1

我有一个简单的状态机(在下面输入)。我的主要问题是我试图对我的状态机的函数进行递归调用。我在输入函数时所做的是为我的树创建一个新节点,然后推送它。当我进行递归调用时,我一遍又一遍地创建一个新节点。这可以工作,但是当向父母添加孩子时,我有点困惑。有人可以帮助看看这个,并帮助我把我的树节点(我假设的父母)和附加一个孩子吗?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(错误)的列表数组的索引。你也可以假设这个函数在输入文件中至少被调用一次,并且已经开始解析。感谢您的帮助。在你的代码

回答

0

看,你有

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?