рд╣рдорд╛рд░реА рдЧреВрдврд╝ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдирд╛ (рднрд╛рдЧ 2)

рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рдмреНрд░реЗрдирдлрдХ рдкрд░ рдРрдб-рдСрди рдХреЗ рд▓рд┐рдП рдПрдХ рджреБрднрд╛рд╖рд┐рдпрд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдмреНрд░реЗрдирдлрдХ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдерд╛, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдРрдб-рдЗрди рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝реЗрдВред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕ рднрд╛рдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рднрд╛рдЧ рдореЗрдВ рдХреНрдпрд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
  1. рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдкреНрд░рдХреНрд░рд┐рдпрд╛) рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ред
  2. рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБред


рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдпрд╣ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдХреЛрд╖реНрдардХреЛрдВ рдореЗрдВ рд╕рдВрд▓рдЧреНрди рд╡рд░реНрдгреЛрдВ рдХрд╛ рдХреЛрдИ рдЕрдиреБрдХреНрд░рдо рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдмреНрд░реИрдХреЗрдЯ рдЕрдиреБрдХреНрд░рдо "рдлреНрд░реЗрдорди" рдЯрд┐рдкреНрдкрдгреА рдкрд╛рда рд╕рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдФрд░ рдПрдХ рдФрд░ рдмрд╛рдд: рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ "рд╕реНрдХреНрд░реАрди рдЖрдЙрдЯ" рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЕрдВрдд рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЙрд╕ рдХреЛрдб рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдмрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

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


рдЬреИрд╕реЗ рд╣реА '(' рд╡рд░реНрдг рдХрд╛ рд╕рд╛рдордирд╛ рд╣реЛрддрд╛ рд╣реИ) рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдХреЛ "рдирд┐рдЧрд▓" рджреЗрдЧрд╛ рдФрд░ рдирд┐рдЧрд▓реЗ рдЧрдП рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред

рдХрд╛рд░реНрдп / рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВред

рдпрд╣рд╛рдБ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛!
рд╣рдо рдорд╛рдВрдЧ рдХрд░реЗрдВрдЧреЗ:

рддреЛ рд╕рдорд╛рд░реЛрд╣ рд╢рд░реАрд░ рдХреА рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:
{% <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 рдФрд░ рд╡рд░реНрдг рдЬреЛрдбрд╝реЗрдВ:



рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЕрдм, рдЬрдм рдХреЛрдб рдореЗрдВ '' @ 'рдХрд╛ рдЪрд┐рд╣реНрди рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рдвреВрдВрдврддреЗ рд╣реИрдВ, рдФрд░ рдирд╛рдо рд╕реЗ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдПрдБ, рдФрд░ рд▓реВрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред

рд╕реНрд░реЛрдд рдХреЛрдб

Source: https://habr.com/ru/post/In120279/


All Articles