本文整理汇总了C++中lem::iridium::Macro_Parser::backward方法的典型用法代码示例。如果您正苦于以下问题:C++ Macro_Parser::backward方法的具体用法?C++ Macro_Parser::backward怎么用?C++ Macro_Parser::backward使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类lem::iridium::Macro_Parser
的用法示例。
在下文中一共展示了Macro_Parser::backward方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: CompileDeclaration
void TrFunction::CompileDeclaration(
PM_Automat &pm,
lem::Iridium::Macro_Parser &txtfile,
TrFunctions &functions,
const TrProcedureDeclaration &procs,
const TrKnownVars *lambda_caller
)
{
const bool is_lambda = lambda_caller!=NULL;
lem::Iridium::BSourceState fun_beg = txtfile.tellp();
ret_type.LoadTxt( pm, txtfile, functions );
lem::Iridium::BSourceState ss = txtfile.tellp();
try
{
if( is_lambda )
{
// Формируем "невозможное" имя лямбда-функции, которое наверняка не будет
// пересекаться с пользовательскими и встроенными функциями.
static int lambda_number=0;
name = L" $lambda";
name += to_ustr(lambda_number++);
}
else
{
name = txtfile.read();
}
if( pm.GetDict().GetDebugLevel_ir()>=3 )
{
// Печатаем имя транслируемой статьи для контроля за процессом
// парсинга Словаря.
pm.GetDict().GetIO().mecho().printf( "function [%vfA%us%vn]->", name.c_str() );
}
if( !is_lambda && !CorrectName(name) )
{
lem::Iridium::Print_Error( ss, txtfile );
pm.GetIO().merr().printf( "Invalid function name [%us]\n", name.c_str() );
throw E_ParserError();
}
txtfile.read_it( B_OROUNDPAREN );
TrKnownVars call_vars( lambda_caller==NULL ? &functions.global_known_vars : lambda_caller );
// Список формальных аргументов
while( !txtfile.eof() )
{
if( txtfile.pick().GetToken()==B_CROUNDPAREN )
break;
if( arg_name.size()>0 )
txtfile.read_it(B_COMMA);
TrType at;
at.LoadTxt(pm,txtfile,functions);
const lem::Iridium::BethToken &an = txtfile.read();
if( arg_name.find(an)!=UNKNOWN )
{
lem::Iridium::Print_Error( an, txtfile );
pm.GetIO().merr().printf( "Function [%us] call argument [%us] is already declared\n", name.c_str(), an.string().c_str() );
throw E_ParserError();
}
arg_type.push_back(at);
arg_name.push_back(an.string());
call_vars.RegisterVar( at, an.string() );
}
txtfile.read_it( B_CROUNDPAREN );
if( txtfile.pick().GetToken()==B_SEMICOLON )
{
txtfile.read();
// Это форвардное объявление функции, без определения тела.
}
else
{
// Чтобы компилировать рекурсивные функции, мы сейчас добавим в список функций свое форвардное объявление.
if( !is_lambda && !functions.IsFunction(name) )
{
TrFunction *forward = MakeForwardDeclaration();
functions.AddForwardDeclaration(forward);
}
// В фигурных скобочках - тело функции. Оно компилируется как вызов специальной функции-группы {}
txtfile.read_it( B_OFIGPAREN );
txtfile.backward();
body = functions.CompileCall( pm, txtfile, procs, call_vars );
}
if( pm.GetDict().GetDebugLevel_ir()>=3 )
pm.GetIO().mecho().printf( "%vfAOK%vn\n" );
//.........这里部分代码省略.........