1 #ifndef XYZ_ATTRIBUTE_LIST_MAP
2 #define XYZ_ATTRIBUTE_LIST_MAP
4 #define DEBUG_WAVE_ROSE_CONNECTION 1
5 #define DEBUG_USE_ROSE_BOOST_WAVE_SUPPORT 1
14 #include <boost/wave.hpp>
19 #include <boost/wave/cpplexer/cpp_lex_token.hpp>
20 #include <boost/wave/cpplexer/cpp_lex_iterator.hpp>
29 NodeQuerySynthesizedAttributeType
70 template <
typename TokenT>
bool found_include_directive(TokenT directive, std::string relname, std::string absname );
80 template <
typename TokenT,
typename ContainerT>
82 found_directive(TokenT
const& directive, ContainerT
const& expression,
bool expression_value)
86 using namespace boost::wave;
87 token_id wave_typeid = token_id(directive);
137 std::cout <<
"Token to include directive: " << directive.get_value() << std::endl;
148 ROSE_ASSERT(
false==
true);
155 std::cout <<
"THE FOUND DIRECTIVE IS: " << directive.get_value().c_str() << std::endl;
156 std::cout <<
"THE FOUND DEF IS: " << boost::wave::util::impl::as_string(expression) << std::endl;
159 std::string filename(directive.get_position().get_file().c_str());
162 copy (expression.begin(), expression.end(),
163 inserter(tokListCont, tokListCont.end()));
175 template <
typename TokenT,
typename ContainerT>
177 update_token(TokenT
const& token, ContainerT
const& stream,
bool expression_value)
180 std::string filename(token.get_position().get_file().c_str());
185 for(std::vector<PreprocessingInfo*>::reverse_iterator i = infos.rbegin(); i != infos.rend(); ++i)
188 if ((*(*i)->get_token_stream())[0] == token && (*(*i)->get_token_stream())[0].get_position() == token.get_position())
191 for (
typename ContainerT::const_iterator item = stream.begin(); item != stream.end(); ++item)
193 (*i)->push_back_token_stream(*item);
198 ROSE_ASSERT(!
"Token to update not found!");
209 template <
typename TokenT>
215 using namespace boost::wave;
216 token_id wave_typeid = token_id(directive);
268 std::cout <<
"Token to include directive: " << directive.get_value() << std::endl;
271 case boost::wave::T_PP_HHEADER_NEXT:
273 std::cout <<
"Token to include next directive: " << directive.get_value() << std::endl;
291 std::cout <<
"Error: Unknown preprocessor declaration found : " << directive.get_value().c_str() << std::endl;
292 std::cout << boost::wave::get_token_name(wave_typeid) <<
" " << directive.get_position().get_file().c_str() <<
" " << directive.get_position().get_line()
293 <<
" " << directive.get_position().get_column() << std::endl;
306 currentTokSeq2.push_back(directive);
307 std::string filename(directive.get_position().get_file().c_str());
327 template<
typename TokenT,
typename ParametersT,
typename DefinitionT>
329 ParametersT& parameters, DefinitionT &definition,
bool is_predefined){
340 copy (definition.begin(), definition.end(),
344 return preprocMacroDef;
352 template<
typename TokenT,
typename ParametersT,
typename DefinitionT>
354 ParametersT& parameters, DefinitionT &definition,
bool is_predefined){
357 if(macro_name.get_position().get_file().size()!=0){
358 if(macro_name.get_position().get_file()!=
"<built-in>")
361 std::cout <<
"SKIPPED BECAUSE FILE IS NULL: " << macro_name.get_value().c_str() << std::endl;
374 ROSE_ASSERT(preprocMacroDef != NULL);
377 ROSE_ASSERT(file_info != NULL);
383 ROSE_ASSERT(filename !=
"");
388 std::cout <<
"DONE adding to map" << std::endl;
391 std::cout <<
"Before mapKey" << std::endl;
393 std::pair<std::string,int> mapKey(filename,macro_name.get_position().get_line());
395 std::cout <<
"After mapKey" << std::endl;
397 std::cout <<
"ASXXX Defining macro: " << macro_name.get_value().c_str() << std::endl;
398 std::cout <<
"at " << filename <<
" l" << mapKey.second << std::endl;
408 defMap[mapKey]=preprocMacroDef;
417 template<
typename TokenT,
typename ContainerT>
419 ContainerT
const &definition, TokenT
const ¯ocall, std::vector<ContainerT>
const &arguments){
444 std::cout <<
"DEFINITION: " << boost::wave::util::impl::as_string(definition);
446 std::cout <<
"\n MACRO CALL: " << macrocall.get_value() << std::endl;
457 std::pair<std::string,int> mapKey;
459 if(macrodef.get_position().get_file()!=
"<built-in>"){
460 mapKey.first = string(macrodef.get_position().get_file().c_str());
461 mapKey.second = macrodef.get_position().get_line();
467 bool is_function_like =
true;
468 bool is_predefined =
false;
473 std::cout <<
"Did not find: " << macrodef.get_value().c_str() <<
" " << boost::wave::util::impl::as_string(definition) << std::endl;
474 std::cout <<
"in " << mapKey.first <<
" l " << mapKey.second << std::endl;
479 typedef typename std::vector<ContainerT>::const_iterator vec_call_iterator_t;
483 vec_call_iterator_t it = arguments.begin();
484 vec_call_iterator_t it_end = arguments.end();
490 std::cout <<
"ARGUMENTS:\n";
492 while (it != it_end ){
494 std::cout << boost::wave::util::impl::as_string(*it);
496 std::list<token_type> tk;
498 copy (it->begin(), it->end(),
499 inserter(tk, tk.end()));
512 typename testType::iterator it2 =
test.begin();
513 typename testType::iterator it_end2 =
test.end();
515 while (it2 != it_end2 ){
516 std::cout<< boost::wave::util::impl::as_string(*it2);
536 template<
typename TokenT,
typename ContainerT>
557 std::cout <<
"DEFINITION: " << boost::wave::util::impl::as_string(definition);
564 std::pair<std::string,int> mapKey;
566 if( (macro.get_position().get_file().size() != 0 ) && (macro.get_position().get_file()!=
"<built-in>")
567 && (macro.get_position().get_file()!=
"<command line>") ){
568 mapKey.first = string(macro.get_position().get_file().c_str());
569 mapKey.second = macro.get_position().get_line();
572 std::cout <<
"Did not find: " << macro.get_value().c_str() <<
" " <<
573 macrocall.get_value().c_str() <<
" " << boost::wave::util::impl::as_string(definition) << std::endl;
574 std::cout <<
"in " << mapKey.first <<
" l " << mapKey.second << std::endl;
583 bool is_function_like =
false;
584 bool is_predefined =
false;
592 std::cout <<
"\n MACRO CALL: " << macrocall.get_value() << std::endl;
608 template <
typename ContainerT>
625 template <
typename ContainerT>
633 std::cout <<
"Rescanned macro: " << boost::wave::util::impl::as_string(result) << std::endl;
638 copy (result.begin(), result.end(),
658 template<
typename TokenIterator,
typename DirectiveType>
659 struct findDirective:
public std::binary_function<TokenIterator,DirectiveType,bool>
661 bool operator()(TokenIterator node, DirectiveType directive)
const{
662 bool returnValue =
false;
664 using namespace boost::wave;
666 token_id wave_typeid = token_id(node);
668 if(wave_typeid == directive)
682 template<
typename TokenIterator,
typename DirectiveType>
685 bool operator()(TokenIterator node, std::list<DirectiveType> directiveList)
const{
686 bool returnValue =
false;
688 using namespace boost::wave;
690 token_id wave_typeid = token_id(node);
693 if( T_PP_ELIF == wave_typeid)
694 std::cout <<
"Found an #elif\n";
697 if(
std::find(directiveList.begin(),directiveList.end(), wave_typeid) != directiveList.end())
705 template <
typename TokenT>
721 if(last_skipped ==
false)
724 std::cout <<
"Pushed Skipped Token: " << token.get_value().c_str() << std::endl;
733 std::cout <<
"Pushed Skipped Token: " << token.get_value().c_str() << std::endl;
734 std::cout <<
"Popping Skipped Tokens: " << boost::wave::util::impl::as_string(*skippedTokenStream).c_str() << std::endl;
746 std::cout <<
"SKIPPED TOKEN: " << token.get_value().c_str() << std::endl;
762 template <
typename ContextT,
typename TokenT>
766 using namespace boost::wave;
769 token_id
id = token_id(token);
770 bool skip =
id == T_PP_ELSE ||
id == T_PP_ELIF ||
id == T_PP_ENDIF;
771 using namespace boost::wave;
774 switch(token_id(token))
776 case T_PP_DEFINE: std::cout <<
"Skip White: #define\n";
break;
777 case T_PP_IF: std::cout <<
"Skip White: #if\n";
break;
778 case T_PP_IFDEF: std::cout <<
"Skip White: #ifdef\n";
break;
779 case T_PP_IFNDEF: std::cout <<
"Skip White: #ifndef\n";
break;
780 case T_PP_ELSE: std::cout <<
"Skip White: #else\n";
break;
781 case T_PP_ELIF: std::cout <<
"Skip White: #elif\n";
break;
782 case T_PP_ENDIF: std::cout <<
"Skip White: #endif\n";
break;
783 case T_PP_ERROR: std::cout <<
"Skip White: #error\n";
break;
784 case T_PP_LINE: std::cout <<
"Skip White: #line\n";
break;
785 case T_PP_PRAGMA: std::cout <<
"Skip White: #pragma\n";
break;
786 case T_PP_UNDEF: std::cout <<
"Skip White: #undef\n";
break;
787 case T_PP_WARNING: std::cout <<
"Skip White: #warning\n";
break;
788 case T_PP_INCLUDE: std::cout <<
"Skip White: #include \"...\"\n";
break;
789 case T_PP_QHEADER: std::cout <<
"Skip White: #include <...>\n";
break;
790 case T_PP_HHEADER: std::cout <<
"Skip White: #include ...\n";
break;
791 default: std::cout <<
"Skip White: <something else (" << token.get_value() <<
")>\n";
break;
804 std::cout <<
"Whitespace makes us pop skipped tokens: " << boost::wave::util::impl::as_string(*skippedTokenStream).c_str() << std::endl;
809 std::cout <<
"Token stream is null?" << std::endl;
813 std::cout <<
"MAX_SKIP_WHITESPACE: " << token.get_value().c_str() << std::endl;
828 template<
typename IteratorT>
832 template <
typename StringT,
typename IteratorT>
837 for (; it != end; ++it)
839 result += (*it).get_value();
846 template <
typename TokenT>
849 boost::wave::token_id wave_typeid = boost::wave::token_id(directive);
853 case boost::wave::T_PP_INCLUDE:
855 case boost::wave::T_EOI:
859 if( directive.get_position().get_file().size() == 0 )
break;
867 std::string filename(directive.get_position().get_file().c_str());