2011-01-23 2 views
0

그래서 ... 어떤 스크립트를 작성하기위한 표준 라이브러리가 있습니까/xmls 독자는 스크립트를 어떤 롤을 통해 객체에 맵핑합니까?부스트 C++로 스크립트 인터프리터를 생성하는 방법

+0

내 주요 요점 - 다른 순서로 시작한 수업이 많아서 다른 결과가 나옵니다. 원하는 순서대로 tham을 시작하게하려면 뭔가가 필요합니다. 응용 프로그램이 컴파일 된 후. – Rella

+0

내가 원하는 것을 모르겠지만 어쩌면 이것이 무엇을 찾고 있는지 알 수 있습니다. http://www.boost.org/doc/libs/1_45_0/doc/html/property_tree.html – MatiasFG

+1

질문이 조금 혼란스러워 보입니다. 나는 네가 여기서 원하는 것을 전혀 확신하지 못한다. 좀 더 구체적인 예를 들어 주시겠습니까? 그런데 질문 아래에있는 '수정'링크를 클릭하면 자세한 내용을 추가 할 수 있습니다. 코멘트가 너무 많으면 코멘트가 숨겨집니다. – bdonlan

답변

1

클래스를 특정 순서로 시작하려면 스크립트 언어가 과도하게 사용되는 것으로 생각합니다. 당신이 필요로하는 것은 지형 학적 정렬입니다.

당신은

향상이 필요한 무엇 topographical sort 있습니다. 부스트 라이브러리가 당신에게 조금이라면 C++로 옮겨 가야하는 매우 읽기 쉬운 C# 구현을 읽을 수도 있습니다. 그건 here입니다.

는 기본적으로

을 무엇을, 당신은 당신의 클래스로 정렬 알고리즘을 제공하고 당신은 자신의 의존성을 (정렬 알고리즘은 정점 가장자리로 이러한 전망)를 추가합니다. 완료되면 알고리즘을 적용합니다. 당신이 나가는 것은 어떤 물건이 무엇에 의존하는지입니다.

로드 할 필요가있는 서브 시스템이있을 때이 정확한 방법을 사용했습니다. 일부는 다른 시스템에 의존하고 일부는로드하지 않았습니다. 서브 시스템의 양은 임의이며, 프로그램의 플러그인 특성으로 인해 컴파일 타임에는 알려지지 않았습니다.

필자는 각 서브 시스템에 고유 한 식별자 (부수적으로 boost::uuid을 사용)를 할당했으며, 각 서브 시스템은이 서브 시스템에 의존하는 다른 서브 시스템의 식별자를 나열했습니다. 이것은 분류기에 공급되었고 초기화 순서가 백 엔드에서 나왔습니다.

당신을 도울 수 있도록 몇 가지 코드가 있습니다 (참고 :이 시점에서 나는 부스트 라이브러리가 존재한다는 것을 몰랐습니다. 이것은 위에 제공된 링크의 C# 코드를 기반으로 한 내 구현입니다)

 // class TopologicalSorter 
     template<typename TYPE> class TopologicalSorter 
     { 
     private: 

      std::vector<TYPE>    m_Vertices; 
      std::vector<std::vector<TYPE> > m_Matrix; 
      std::vector<TYPE>    m_Sorted; 
      TYPE       m_nNumVerts; 
      TYPE       m_nSize; 

      // private helpers 
      int noSuccessors() 
      { 
       bool isEdge; 
       for(TYPE row(0); row < m_nNumVerts; row++) 
       { 
        isEdge = false; 
        for(TYPE col(0); col < m_nNumVerts; col++) 
        { 
         if(m_Matrix[row][col] > 0) // edge to another? 
         { 
          isEdge = true; 
          break; 
         }; 
        }; 

        if(!isEdge) 
         return(row); 
       }; 

       return(-1); // nope! 
      }; // eo noSuccessors 

      void deleteVertex(TYPE _vertex) 
      { 
       if(_vertex != m_nNumVerts - 1) 
       { 
        for(TYPE j(_vertex); j < m_nNumVerts - 1; j++) 
         m_Vertices[j] = m_Vertices[j + 1]; 

        for(TYPE row(_vertex); row < m_nNumVerts - 1; row++) 
         moveRowUp(row, m_nNumVerts); 

        for(TYPE col(_vertex); col < m_nNumVerts - 1; col++) 
         moveColLeft(col, m_nNumVerts - 1); 
       }; 

       --m_nNumVerts; 
      }; // eo deleteVertex 

      void moveRowUp(TYPE _row, TYPE _length) 
      { 
       for(TYPE col(0); col < _length; col++) 
        m_Matrix[_row][col] = m_Matrix[_row + 1][col]; 
      }; // eo moveRowUp 

      void moveColLeft(TYPE _col, TYPE _length) 
      { 
       for(TYPE row(0); row < _length; row++) 
        m_Matrix[row][ _col] = m_Matrix[row][_col + 1]; 
      }; // eo moveColLeft 

     public: 
      TopologicalSorter(TYPE _size) : m_nNumVerts(0) 
              , m_Vertices(_size) 
              , m_Matrix(_size) 
              , m_Sorted(_size) 
              , m_nSize(_size) 
      { 
       assert(_size > 0); 
       for(TYPE i(0); i < m_nSize; ++i) 
       { 
        for(TYPE j(0); j < m_nSize; ++j) 
         m_Matrix[i].push_back(0); 
       }; 
      }; // eo ctor 


      ~TopologicalSorter(){}; 


      // public methods 


      TYPE addVertex(TYPE _vertex) 
      { 
       m_Vertices[m_nNumVerts++] = _vertex; 
       return(m_nNumVerts - 1); 
      }; // eo addVertex 

      void addEdge(TYPE _start, TYPE _end) 
      { 
       m_Matrix[_start][_end] = 1; 
      }; // eo addEdge 

      std::vector<TYPE> sort() 
      { 
       int currVertex; 
       while(m_nNumVerts) 
       { 
        currVertex = noSuccessors(); 
        coreAssert(currVertex != -1, "Graph has cycles"); 

        m_Sorted[m_nNumVerts - 1] = m_Vertices[currVertex]; 
        deleteVertex(currVertex); 
       }; // eo while(m_nNumVerts) 

       return(std::move(m_Sorted)); 
      }; // eo sort 

     }; // eo class TopologicalSorter 

지금이이 도움과 해제에 필요한 스크립트를 피하기

// create a topological sorter: 
    utility::TopologicalSorter<ManagerVector_sz> sorter(m_Managers.size()); 
    std::map<Uuid, ManagerVector_sz> indexes; 

    // add vertices and edges 
    for(ManagerVector_sz i(0); i < m_Managers.size(); ++i) 
     indexes.insert(std::pair<Uuid, ManagerVector_sz>(m_Managers[i]->getUuid(), sorter.addVertex(i))); 

    for(ManagerVector_sz i(0); i < m_Managers.size(); ++i) 
    { 
     if(m_Managers[i]->getDependencies().size()) 
     { 
      for(ManagerVector_sz j(0); j < m_Managers[i]->getDependencies().size(); ++j) 
       sorter.addEdge(i, indexes[m_Managers[i]->getDependencies()[j]]); 
     }; 
    }; 

    // get the order in which we should initialise 
    m_SortedIndexes = sorter.sort(); 

    // and initialise 
    ManagerVector* mv(&m_Managers); 
    std::for_each(m_SortedIndexes.rbegin(), 
        m_SortedIndexes.rend(), 
        [&mv](int i){mv->at(i)->initialise();}); 

희망 (UUID 그냥 boost::uuids::uuid에 대한 typedef이다)이이로드 및 서브 시스템을 초기화에 사용 된 방법입니다!

2

Boost Spirit 라이브러리를 사용하면 상당히 쉽게 구성 형식을 정의 할 수 있습니다.

관련 문제