рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рдмреНрд░реЗрдирдлрдХ рдкрд░ рдРрдб-рдСрди рдХреЗ рд▓рд┐рдП рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдмреНрд░реЗрдирдлрдХ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдРрдб-рдЗрди рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝реЗрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рднрд╛рдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рдХреНрдпрд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
- рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдкреНрд░рдХреНрд░рд┐рдпрд╛) рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ред
- рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБред
рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ
рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЛрд╖реНрдардХреЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╡рд░реНрдгреЛрдВ рдХрд╛ рдХреЛрдИ рдЕрдиреБрдХреНрд░рдо рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдмреНрд░реИрдХреЗрдЯ рдЕрдиреБрдХреНрд░рдо "рдлреНрд░реЗрдорди" рдЯрд┐рдкреНрдкрдгреА рдкрд╛рда рд╕рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдФрд░ рдПрдХ рдФрд░ рдмрд╛рдд: рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ "рд╕реНрдХреНрд░реАрди рдЖрдЙрдЯ" рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЕрдВрдд рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЙрд╕ рдХреЛрдб рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдмрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
unsigned int skipComment( std::ifstream &file )
{
unsigned int skipped = 0;
unsigned int unclosedComments = 1;
while( file.good() && ( unclosedComments != 0 ) )
{
char tmp = (char) file.get();
if ( bf_cBeg == tmp )
unclosedComments++;
else if ( tmp == bf_cEnd )
unclosedComments--;
skipped++;
}
return skipped;
}
рдЬреИрд╕реЗ рд╣реА '(' рд╡рд░реНрдг рдХрд╛ рд╕рд╛рдордирд╛ рд╣реЛрддрд╛ рд╣реИ) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдХреЛ "рдирд┐рдЧрд▓" рджреЗрдЧрд╛ рдФрд░ рдирд┐рдЧрд▓реЗ рдЧрдП рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред
рдХрд╛рд░реНрдп / рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВред
рдпрд╣рд╛рдБ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛!
рд╣рдо рдорд╛рдВрдЧ рдХрд░реЗрдВрдЧреЗ:
- рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдирд╛рдо) рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдЧрд▓рд╛, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдИ рд╣реИред
- 2. рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ (рдорд╛рди) рд╢реВрдиреНрдп рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
- 3. рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рддреЛ рд╕рдорд╛рд░реЛрд╣ рд╢рд░реАрд░ рдХреА рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
{% <name>% <code>}
рдирд╛рдо рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЛрд╖реНрдардХ рдХреЗ рдмрд┐рдирд╛ рд╡рд░реНрдгреЛрдВ рдХрд╛ рдХреЛрдИ рднреА рдЕрдиреБрдХреНрд░рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
std::string parseName( std::ifstream &file, const char parsingAfter )
{
if ( file.bad() || ( bf_fNme != parsingAfter ) )
return std::string();
std::string res = std::string();
while ( file.good() )
{
char tmp = (char) file.get();
if ( tmp == bf_fNme )
return res;
res += tmp;
}
return res;
}
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ рдЬрдм рдЗрд╕реЗ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
struct proc
{
char code[ maxCodeSize ]; //
unsigned int realCodeSize; //
};
рдФрд░ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ std :: map <std :: string, proc> рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗ, рдПрдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдо рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдореЗрдВ рднрд░реЗрдВрдЧреЗред рдпрд╣ рд╕реАрдЦрдирд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрд╛рд░реНрд╕ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдХрдВрдЯреЗрдирд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рднрд░реЗрдВред рдпрд╣рд╛рдВ:
bool parseFunction( std::ifstream &file, const char parsingAfter )
{
if( ( bf_fBeg != parsingAfter ) || ( file.bad() ) )
return false;
if( bf_fNme != ( char ) file.get() )
return false;
std::string funcName = parseName( file, bf_fNme );
if( 0 == funcName.size() )
return false;
proc addProc;
addProc.realCodeSize = 0;
while( file.good() )
{
char tmp = (char) file.get();
if( bf_cBeg == tmp )
skipComment( file );
else if ( bf_cEnd == tmp )
; // Syntax error
else if ( bf_fEnd == tmp )
{
std::map<std::string, proc>::iterator it = procedures.find( funcName );
if( it == procedures.end() )
{
std::pair< std::string, proc > tmpP;
tmpP.first = funcName;
tmpP.second = addProc;
procedures.insert( tmpP );
std::cout << "Added proceudre: " << funcName << std::endl;
printCode( addProc.code, addProc.realCodeSize, funcName );
return true;
}
else
{
std::cerr << "Function with name " << funcName
<< " already exists. Ignoring all other definitions."
<< std::endl;
return false;
}
}
else
addProc.code[ addProc.realCodeSize++ ] = tmp;
}
return false;
}
рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕рдм рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдлрд╝рдВрдХреНрд╢рди, рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдФрд░ рдПрдХ рд▓реВрдк рдлрд╝рдВрдХреНрд╢рди рд╣реИред
рд╣рдорд╛рд░реА рднрд╛рд╖рд╛ рдореЗрдВ 2 рдФрд░ рд╡рд░реНрдг рдЬреЛрдбрд╝реЗрдВ:
- # - рд╡рд░реНрддрдорд╛рди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рд╡реГрджреНрдзрд┐, рдЬрдмрдХрд┐ рдпрджрд┐ рдХреЛрдИ рд╣реЛред
- ~ - рдЬрдмрдХрд┐ рд╡рд░реНрддрдорд╛рди рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХрдореАред
рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЕрдм, рдЬрдм рдХреЛрдб рдореЗрдВ '' @ 'рдХрд╛ рдЪрд┐рд╣реНрди рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдвреВрдВрдврддреЗ рд╣реИрдВ, рдФрд░ рдирд╛рдо рд╕реЗ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ, рдФрд░ рд▓реВрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред
рд╕реНрд░реЛрдд рдХреЛрдб