bool ansi_c_languaget::parse( const std::string &path, message_handlert &message_handler) { // store the path parse_path=path; // preprocessing std::ostringstream o_preprocessed; if(preprocess(path, o_preprocessed, message_handler)) return true; std::istringstream i_preprocessed(o_preprocessed.str()); // parsing std::string code; internal_additions(code); std::istringstream codestr(code); ansi_c_parser.clear(); ansi_c_parser.filename="<built-in>"; ansi_c_parser.in=&codestr; ansi_c_parser.set_message_handler(&message_handler); ansi_c_parser.grammar=ansi_c_parsert::LANGUAGE; if(config.ansi_c.os==configt::ansi_ct::OS_WIN32) ansi_c_parser.mode=ansi_c_parsert::MSC; else ansi_c_parser.mode=ansi_c_parsert::GCC; ansi_c_scanner_init(); bool result=ansi_c_parser.parse(); if(!result) { ansi_c_parser.line_no=0; ansi_c_parser.filename=path; ansi_c_parser.in=&i_preprocessed; ansi_c_scanner_init(); result=ansi_c_parser.parse(); } // save result parse_tree.swap(ansi_c_parser.parse_tree); // save some memory ansi_c_parser.clear(); return result; }
bool ansi_c_languaget::parse( std::istream &instream, const std::string &path) { // store the path parse_path=path; // preprocessing std::ostringstream o_preprocessed; if(preprocess(instream, path, o_preprocessed)) return true; std::istringstream i_preprocessed(o_preprocessed.str()); // parsing std::string code; ansi_c_internal_additions(code); std::istringstream codestr(code); ansi_c_parser.clear(); ansi_c_parser.set_file(ID_built_in); ansi_c_parser.in=&codestr; ansi_c_parser.set_message_handler(get_message_handler()); ansi_c_parser.for_has_scope=config.ansi_c.for_has_scope; ansi_c_parser.cpp98=false; // it's not C++ ansi_c_parser.cpp11=false; // it's not C++ ansi_c_parser.mode=config.ansi_c.mode; ansi_c_scanner_init(); bool result=ansi_c_parser.parse(); if(!result) { ansi_c_parser.set_line_no(0); ansi_c_parser.set_file(path); ansi_c_parser.in=&i_preprocessed; ansi_c_scanner_init(); result=ansi_c_parser.parse(); } // save result parse_tree.swap(ansi_c_parser.parse_tree); // save some memory ansi_c_parser.clear(); return result; }
int main(int argc, const char *argv[]) { if(argc!=2) return 1; std::ifstream in(argv[1]); config.ansi_c.set_ILP32(); ansi_c_scanner_init(); ansi_c_parser.clear(); ansi_c_parser.mode=ansi_c_parsert::GCC; ansi_c_parser.cpp98=true; ansi_c_parser.cpp11=false; ansi_c_parser.in=∈ cpp_parser.in=∈ cpp_tokent tk; while(cpp_parser.token_buffer.get_token(tk)) std::cout << tk.text << '\n'; return 0; }
bool ansi_c_languaget::parse( std::istream &instream, const std::string &path) { // store the path parse_path=path; // preprocessing std::ostringstream o_preprocessed; if(preprocess(instream, path, o_preprocessed)) return true; std::istringstream i_preprocessed(o_preprocessed.str()); // parsing std::string code; ansi_c_internal_additions(code); std::istringstream codestr(code); ansi_c_parser.clear(); ansi_c_parser.set_file(ID_built_in); ansi_c_parser.in=&codestr; ansi_c_parser.set_message_handler(get_message_handler()); ansi_c_parser.for_has_scope=config.ansi_c.for_has_scope; ansi_c_parser.cpp98=false; // it's not C++ ansi_c_parser.cpp11=false; // it's not C++ switch(config.ansi_c.mode) { case configt::ansi_ct::flavourt::MODE_CODEWARRIOR_C_CPP: ansi_c_parser.mode=ansi_c_parsert::CW; break; case configt::ansi_ct::flavourt::MODE_VISUAL_STUDIO_C_CPP: ansi_c_parser.mode=ansi_c_parsert::MSC; break; case configt::ansi_ct::flavourt::MODE_ANSI_C_CPP: ansi_c_parser.mode=ansi_c_parsert::ANSI; break; case configt::ansi_ct::flavourt::MODE_GCC_C: case configt::ansi_ct::flavourt::MODE_GCC_CPP: ansi_c_parser.mode=ansi_c_parsert::GCC; break; case configt::ansi_ct::flavourt::MODE_ARM_C_CPP: ansi_c_parser.mode=ansi_c_parsert::ARM; break; default: assert(false); } ansi_c_scanner_init(); bool result=ansi_c_parser.parse(); if(!result) { ansi_c_parser.set_line_no(0); ansi_c_parser.set_file(path); ansi_c_parser.in=&i_preprocessed; ansi_c_scanner_init(); result=ansi_c_parser.parse(); } // save result parse_tree.swap(ansi_c_parser.parse_tree); // save some memory ansi_c_parser.clear(); return result; }