From 5c757590c7561f6d85b3f9011aa0695c4111b379 Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Wed, 30 Mar 2005 21:58:44 +0000 Subject: 1. fixed a bug just introduced, preventing the last skeleton-generated file from being written. 2. introduced pragma directive and pragma main=class 3. minor changes of no importance --- diff --git a/include/sitecing/sitecing_enflesher.h b/include/sitecing/sitecing_enflesher.h index 8bc43a0..db15bc3 100644 --- a/include/sitecing/sitecing_enflesher.h +++ b/include/sitecing/sitecing_enflesher.h @@ -72,8 +72,17 @@ class sitecing_enflesher : public sitecing_enflesherFlexLexer { * destination filename, if needed, and open new file. * @see outs * @see outs_filename + * @see outs_close */ void outs_open(const string& nfile); + /** + * Close previously opened output stream, and rename to the 'correct' + * destination filename, if needed. + * @see outs_open + * @see outs + * @see outs_filename + */ + void outs_close(); }; #endif /* __SITECING_SITECING_ENFLESHER_H */ diff --git a/include/sitecing/sitecing_parser.h b/include/sitecing/sitecing_parser.h index 22d716f..a8474f3 100644 --- a/include/sitecing/sitecing_parser.h +++ b/include/sitecing/sitecing_parser.h @@ -291,6 +291,14 @@ class sitecing_parser : public sitecing_parserFlexLexer { * The reference to the component factory object. */ component_factory& factory; + /** + * Pragma map type. + */ + typedef map pragmas_t; + /** + * Pragma's found in the component. + */ + pragmas_t pragmas; /** * @param f the component factory. diff --git a/lib/component_factory.cc b/lib/component_factory.cc index b8f5a16..1253111 100644 --- a/lib/component_factory.cc +++ b/lib/component_factory.cc @@ -319,7 +319,7 @@ namespace sitecing { make(cn); ifstream ifs(cn.c_str()); if(!ifs.good()) - throw konforka::exception(CODEPOINT,"filed to access component .ancestors"); + throw konforka::exception(CODEPOINT,string("failed to access component '")+component+"' .ancestors"); rv.clear(); while(!ifs.eof()) { string a; diff --git a/lib/sitecing_enflesher.ll b/lib/sitecing_enflesher.ll index 46489c7..bb667be 100644 --- a/lib/sitecing_enflesher.ll +++ b/lib/sitecing_enflesher.ll @@ -179,6 +179,7 @@ void sitecing_enflesher::enflesh() { throw preprocessor_error(CODEPOINT,"failed to open skeleton file"); switch_streams(&ifs,NULL); yylex(); + outs_close(); } void sitecing_enflesher::anchor() { @@ -188,7 +189,7 @@ void sitecing_enflesher::anchor() { anchor_time = false; } -void sitecing_enflesher::outs_open(const string& nfile) { +void sitecing_enflesher::outs_close() { if(!outs_filename.empty()) { outs.flush(); outs.close(); @@ -244,6 +245,11 @@ void sitecing_enflesher::outs_open(const string& nfile) { throw preprocessor_error(CODEPOINT,"failed to rename() generated output"); } } + outs_filename.erase(); +} + +void sitecing_enflesher::outs_open(const string& nfile) { + outs_close(); outs_filename = nfile; outs.open((nfile+".new").c_str(),ios::trunc); if(!outs.good()) diff --git a/lib/sitecing_parser.ll b/lib/sitecing_parser.ll index 6cb78f3..8ba8673 100644 --- a/lib/sitecing_parser.ll +++ b/lib/sitecing_parser.ll @@ -23,6 +23,7 @@ using namespace sitecing; %x DERIVELINE DERIVECOMPONENT %x CONSTRUCTOR DESTRUCTOR CODEMETHODLINE CODEMETHODARGS %x CODEMETHODBLOCK INLINE METHODLINE METHODARGS METHODBLOCK CODEBLOCK OUTPUTBLOCK +%x PRAGMALINE %option 8bit c++ verbose noyywrap yyclass="sitecing_parser" prefix="sitecing_parser" stack yylineno WHITESPACE [ \t] @@ -94,6 +95,10 @@ NOIDCHAR [^A-Za-z0-9_] anchor(); BEGIN(METHODLINE); } + ^\%\%pragma{WHITESPACE}+ { + modi.push_front(modus_operandi(modus_operandi::flag_devour_comments)); + BEGIN(PRAGMALINE); + } <> { assert(modi.size()==1); M().modify(modus_operandi::modus_preop); @@ -110,6 +115,36 @@ NOIDCHAR [^A-Za-z0-9_] } } +{ + {WHITESPACE}+ { + modus_operandi& m = M(); + if(!m.output.empty()) { + string::size_type eq = m.output.find('='); + if(eq==string::npos) { + pragmas[m.output]=m.output; + }else{ + pragmas[m.output.substr(0,eq)] = m.output.substr(eq+1); + } + m.output.erase(); + } + } + \n { + modus_operandi& m = M(); + if(!m.output.empty()) { + string::size_type eq = m.output.find('='); + if(eq==string::npos) { + pragmas[m.output]=m.output; + }else{ + pragmas[m.output.substr(0,eq)] = m.output.substr(eq+1); + } + m.output.erase(); + } + modi.pop_front(); + BEGIN(INITIAL); + anchor(); + } +} + { {WHITESPACE}+ { modus_operandi& m = modi.front(); @@ -406,7 +441,7 @@ NOIDCHAR [^A-Za-z0-9_] modi.pop_front(); BEGIN(INITIAL); } -{ +{ "/*" { yy_push_state(SLASHSTAR_COMMENT); if(!M().devour_comments()) { @@ -546,7 +581,17 @@ void sitecing_parser::preprocess(const string& in) { switch_streams(&ifs,NULL); if(yylex()) throw preprocessor_error(CODEPOINT,"unknown error"); - member_functions.push_back(member_function("void","main","(int _magic,va_list _args)",M().output)); + pragmas_t::const_iterator mp = pragmas.find("main"); + if(mp==pragmas.end()) { + member_functions.push_back(member_function("void","main","(int _magic,va_list _args)",M().output)); + }else{ + member_functions.push_back( + member_function( + "void","main","(int _magic,va_list _args)", + mp->second+"::main(_magic,_args);" + ) + ); + } if(have_initializers && !have_constructor) member_functions.push_back(member_function("","","","")); sitecing_enflesher enflesher(*this); -- cgit v0.9.0.2