【问题标题】:Using boost wave使用升压波
【发布时间】:2013-02-13 16:20:18
【问题描述】:

我正在努力解决助推波,但到目前为止,我的运气并不好。

我尝试了网站上的示例代码。如下:

#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;
        }
}

编译正常,但是当我向其中输入文件时,出现以下错误:

在抛出 'boost::exception_detail::clone_impl >'的实例后调用终止
what(): boost::wave::preprocess_exception
中止

我试图“预处理”的代码位于一个名为 lex_infile 的文件中,其内容如下:

#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);
}

我想我需要定义包含位置....我该怎么做呢?

对不起,如果这是简单的东西,我只是有点迷茫。

【问题讨论】:

    标签: c++ boost c-preprocessor


    【解决方案1】:

    想通了。

    我需要扩展类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;
        }
    };
    

    希望能帮助其他遇到此问题的人。

    【讨论】:

      猜你喜欢
      • 2018-10-02
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 2013-08-07
      • 1970-01-01
      • 2019-11-25
      • 1970-01-01
      相关资源
      最近更新 更多