2013-02-13 3 views
7

나는 부스트 웨이브에 대해 머리를 쓰려고 노력하고 있으며, 지금까지는별로 운이 없다.부스트 웨이브 사용하기

사이트에서 샘플 코드를 사용해 보았습니다. 그것은 다음과 같습니다 :

#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <string> 
#include <vector> 

/////////////////////////////////////////////////////////////////////////////// 
// Include Wave itself 
#include <boost/wave.hpp> 

/////////////////////////////////////////////////////////////////////////////// 
// Include the lexer stuff 
#include <boost/wave/cpplexer/cpp_lex_token.hpp> // token class 
#include <boost/wave/cpplexer/cpp_lex_iterator.hpp> // lexer class 

int main() { 
    // The following preprocesses a given input file. 
    // Open the file and read it into a string variable 
    std::ifstream instream("lex_infile"); 
    std::string input(
     std::istreambuf_iterator<char>(instream.rdbuf()), 
     std::istreambuf_iterator<char>()); 

    // The template boost::wave::cpplexer::lex_token<> is the 
    // token type to be used by the Wave library. 
    // This token type is one of the central types throughout 
    // the library, because it is a template parameter to some 
    // of the public classes and templates and it is returned 
    // from the iterators. 
    // The template boost::wave::cpplexer::lex_iterator<> is 
    // the lexer iterator to use as the token source for the 
    // preprocessing engine. In this case this is parametrized 
    // with the token type. 
    typedef boost::wave::cpplexer::lex_iterator< 
      boost::wave::cpplexer::lex_token<> > 
     lex_iterator_type; 
    typedef boost::wave::context< 
      std::string::iterator, lex_iterator_type> 
     context_type; 

    context_type ctx(input.begin(), input.end(), "lex_infile"); 

    // At this point you may want to set the parameters of the 
    // preprocessing as include paths and/or predefined macros. 
     //ctx.add_include_path("..."); 
     //ctx.add_macro_definition(...); 

    // Get the preprocessor iterators and use them to generate 
    // the token sequence. 
    context_type::iterator_type first = ctx.begin(); 
    context_type::iterator_type last = ctx.end(); 

    std::cout << "HERE" << std::endl; 

    // The input stream is preprocessed for you during iteration 
    // over [first, last) 
     while (first != last) { 
      std::cout << (*first).get_value() << std::endl; 
      ++first; 
     } 
} 

그것은 확인을 컴파일하지만 나는 그것으로 파일을 먹일 때, 나는 다음과 같은 오류 얻을 :

terminate called after throwing an instance of 'boost::exception_detail::clone_impl >'
what(): boost::wave::preprocess_exception
Aborted

내가 '전처리'에 노력하고있어 코드가 인을 나는 심지어는 어떻게 할 것 .... 나는 내가이 위치를 포함 정의 할 필요가 상상

#include <oglre> 
#include <light> 
#include <material> 

in vec3 in_Position; 
in vec2 in_Texture; 
in vec3 in_Normal; 

out vec2 textureCoord; 
out vec4 pass_Color; 




void main() { 
    gl_Position = pvmMatrix * vec4(in_Position, 1.0); 

    textureCoord = in_Texture; 


    vec3 normalDirection = normalize(normalMatrix * in_Normal); 
    vec3 lightDirection = normalize(vec3(lightSources[0].direction)); 

    vec3 diffuseReflection = vec3(lightSources[0].diffuse) * vec3(mymaterial.diffuse) * max(0.0, dot(normalDirection, lightDirection)); 

    /* 
    float bug = 0.0; 
    bvec3 result = equal(diffuseReflection, vec3(0.0, 0.0, 0.0)); 
    if(result[0]) bug = 1.0; 

    diffuseReflection.x += bug; 
    */ 

    pass_Color = vec4(diffuseReflection, 1.0); 
} 

: 파일은 다음과 같은 내용 lex_infile을라고?

죄송합니다. 간단한 자료라면 죄송합니다.

답변

7

알아 냈어.

public wave::context_policies::default_preprocessing_hooks 클래스를 확장 한 다음 found_unknown_directive 메서드를 재정의해야합니다.

일단 완료되면 새로운 사전 처리 후크 클래스를 typedef boost::wave::context에 템플릿 매개 변수로 전달해야했습니다.

그것은 다음과 같습니다

typedef boost::wave::context< 
       std::string::iterator, 
       lex_iterator_type, 
       load_file_to_string, 
       custom_directives_hooks 
      > context_type; 

와 다른 사람이이 문제를 가지고하는 데 도움이

class custom_directives_hooks 
: public wave::context_policies::default_preprocessing_hooks 
{ 
public: 

    template <typename ContextT, typename ContainerT> 
    bool 
    found_unknown_directive(ContextT const& ctx, ContainerT const& line, 
     ContainerT& pending) 
    { 
     typedef typename ContainerT::const_iterator iterator_type; 
     iterator_type it = line.begin(); 
     wave::token_id id = wave::util::impl::skip_whitespace(it, line.end()); 

     if (id != wave::T_IDENTIFIER) 
      return false;  // nothing we could do 

     if (it->get_value() == "version" || it->get_value() == "extension") { 
      // Handle #version and #extension directives 
      std::copy(line.begin(), line.end(), std::back_inserter(pending)); 
      return true; 
     } 

     if (it->get_value() == "type") { 
      // Handle type directive 
      return true; 
     } 

     // Unknown directive 
     return false; 
    } 
}; 

희망을.

관련 문제