Пример #1
0
char *OpenDDLParser::parseStructureBody( char *in, char *end, bool &error ) {
    if( !isNumeric( *in ) && !isCharacter( *in ) ) {
        ++in;
    }

    in = lookForNextToken( in, end );
    Value::ValueType type( Value::ddl_none );
    size_t arrayLen( 0 );
    in = OpenDDLParser::parsePrimitiveDataType( in, end, type, arrayLen );
    if( Value::ddl_none != type ) {
        // parse a primitive data type
        in = lookForNextToken( in, end );
        if( *in == Grammar::OpenBracketToken[ 0 ] ) {
            Reference *refs( ddl_nullptr );
            DataArrayList *dtArrayList( ddl_nullptr );
            Value *values( ddl_nullptr );
            if( 1 == arrayLen ) {
                size_t numRefs( 0 ), numValues( 0 );
                in = parseDataList( in, end, type, &values, numValues, &refs, numRefs );
                setNodeValues( top(), values );
                setNodeReferences( top(), refs );
            } else if( arrayLen > 1 ) {
                in = parseDataArrayList( in, end, type, &dtArrayList );
                setNodeDataArrayList( top(), dtArrayList );
            } else {
                std::cerr << "0 for array is invalid." << std::endl;
                error = true;
            }
        }

        in = lookForNextToken( in, end );
        if( *in != '}' ) {
            logInvalidTokenError( in, std::string( Grammar::CloseBracketToken ), m_logCallback );
            return ddl_nullptr;
        } else {
            //in++;
        }
    } else {
        // parse a complex data type
        in = parseNextNode( in, end );
    }

    return in;
}
Пример #2
0
void    astar(TreeNode &root)
{
    t_astar var;

    var.children = NULL;
    var.success = false;
    var.success2 = false;
    normalized2(*root.getState());
    TreeNode end(all.finalsnail);
    end.StateToStr();

    setNodeValues(end);
    end.setParent(NULL);
    root.StateToStr();
    var.pq_end.push(&end);
    var.opened_end.insert({end.getStringedState(), &end});
    while (!var.success2)
    {
        var.e = var.pq_end.top();
        var.e->StateToStr();
        if (var.e->getDepth() > 11 || var.e->getStringedState() == root.getStringedState()) {
            var.success2 = true;
        }
        else {
            var.pq_end.pop();
            var.e->setChildren(var.e->up(), 0);
            var.e->setChildren(var.e->down(), 1);
            var.e->setChildren(var.e->right(), 2);
            var.e->setChildren(var.e->left(), 3);
            var.closed_end.insert({var.e->getStringedState(), var.e});

            var.children = (TreeNode **) var.e->getChildren();
            if (var.children[0] != NULL) {
                astar3(var, 0);
            }
            if (var.children[1] != NULL) {
                astar3(var, 1);
            }
            if (var.children[2] != NULL){
                astar3(var, 2);
            }
            if (var.children[3] != NULL) {
                astar3(var, 3);
            }
        }
    }
    setNodeValues(root);
    var.pq.push(&root);
    var.opened.insert({root.getStringedState(), (&root)});
    while (!var.success && !var.pq.empty())
    {
        var.e = var.pq.top();

        var.e->StateToStr();
        if (var.e->getStringedState() == end.getStringedState()) {
            var.e->printree();
            std::cout<<"complexity_time / "<<all.complexity_time<<std::endl;
            std::cout<<"complexity_size / "<<var.closed.size() + var.closed_end.size()<<std::endl;
            std::cout<<all.nb_moves<<"nb_moves"<<std::endl;
            var.success = true;
            continue;
        }
        else {
            var.pq.pop();
            var.closed.insert({var.e->getStringedState(), var.e});
            var.e->setChildren(var.e->up(), 0);
            var.e->setChildren(var.e->down(), 1);
            var.e->setChildren(var.e->right(), 2);
            var.e->setChildren(var.e->left(), 3);

            var.children = (TreeNode **) var.e->getChildren();
            if (var.children[0] != NULL) {
                if (astar2(var, 0))
                    continue ;
            }
            if (var.children[1] != NULL) {
                if (astar2(var, 1))
                    continue ;
            }
            if (var.children[2] != NULL){
                if (astar2(var, 2))
                    continue ;
            }
            if (var.children[3] != NULL) {
                if (astar2(var, 3))
                    continue ;
            }
        }
    }
    if (var.pq.empty() && !var.success)
        std::cout<<"Solution not found!"<<std::endl;
}