Rekursion im AST Tree



  • Hallo,

    hab glaube ich ein ganz triviales Problem, stehe jetzt aber schon seit Stunden auf dem Schlauch. Ich habe einen ast tree (mit der BOOST-Bibliothek) erzeugt, und iteriere da jetzt in einer Rekursion durch. Ich speichere jeden Node mit seiner Nummer, seinem Namen (z. B. AND oder OR) und der Nummer des aufrufenden Nodes in einer Liste ab. Klappt alles, bis auf die Nummer des aufrufenden Nodes, da steht konsequent die falsche drin, weil ich bei der Rekursion mit den Geltungsbereichen der Variablen wohl irgendwie den Überblick verliere. Das ist die Funktion

    void convert_to_parsetree(BOOST_SPIRIT_NAMESPACE::tree_match<iterator_t>::const_tree_iterator parse_node, int callingNode) {
        //int remNum;
        std::string node_value(parse_node->value.begin(), parse_node->value.end());
        //First Element: Node-Counter, Second Element, Name of Node, Third Element: Parent Node Number
        myList.push_back(NodeDescription(counter++, node_value, callingNode));
        int remNum = callingNode;
    
        if (parse_node->children.size() > 0) {
    
            if (parse_node->children.size() > 1) {
                //std::string value(parse_node->children[0].value.begin(), parse_node->children[0].value.end());
                //std::string value2(parse_node->children[1].value.begin(), parse_node->children[1].value.end());
    
                BOOST_SPIRIT_NAMESPACE::tree_match<iterator_t>::const_tree_iterator children_it = parse_node->children.begin();
                for (int i = 0; i < parse_node->children.size(); ++i) {
                    convert_to_parsetree(children_it, remNum+1);
                    children_it++;
                }
            } else {
                convert_to_parsetree(parse_node->children.begin(), remNum+1);
            }
        }
    }
    

    Letztliches Ziel ist das Erzeugen einer dot-File, damit ich mit graphviz den Ast-Tree visualisieren kann, das einzige wo ich hänge, ist die Nummer des aufrufenden Nodes richtig zu setzen. Ich hoffe ich habe mich verständlich ausgedrückt.

    PS: Der counter ist aktuell global deklariert.

    Freundliche Grüße



  • Nur dass wir das jetzt richtig verstehen: Ist das da jetzt Dein aktueller Code, oder wie ist das PS gemeint?



  • Ich hab es jetzt lösen können, bzw. das Internet hat es lösen können:

    void convert_to_parsetree (MyTreeIterator parse_node, int parent_number) {
       int node_number = counter++;
       std::string node_name(parse_node->value.begin(), parse_node->value.end());
       myList.push_back(NodeDescription(node_number, node_name, parent_number));
       for (MyTreeIterator children_it = parse_node->children.begin();
            children_it != parse_node->children.end();
            ++children_it) {
          convert_to_parsetree(children_it, node_number);
       }
    }
    

Anmelden zum Antworten