fixed: program_mode was not set in cctor
fixed: container was not correctly parsed (in template mode) git-svn-id: svn://ttmath.org/publicrep/ezc/trunk@1139 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
parent
a6b767a223
commit
bf62d44346
|
@ -5,7 +5,7 @@
|
|||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007-2015, Tomasz Sowa
|
||||
* Copyright (c) 2007-2018, Tomasz Sowa
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -363,6 +363,7 @@ Generator<StreamType>::Generator() : empty_stream()
|
|||
can_find_in_cache = true;
|
||||
can_use_vars = true;
|
||||
expression_parser = nullptr;
|
||||
program_mode = false;
|
||||
}
|
||||
|
||||
|
||||
|
@ -396,6 +397,7 @@ Generator<StreamType> & Generator<StreamType>::operator=(const Generator<StreamT
|
|||
block_stack_size = n.block_stack_size;
|
||||
ezc_out_stack_size = n.ezc_out_stack_size;
|
||||
expression_parser = n.expression_parser;
|
||||
program_mode = n.program_mode;
|
||||
|
||||
// vars doesn't have to be copied
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007-2016, Tomasz Sowa
|
||||
* Copyright (c) 2007-2018, Tomasz Sowa
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -55,6 +55,7 @@ PatternParser::PatternParser()
|
|||
pblocks = 0;
|
||||
include_level_max = 100;
|
||||
delete_white_text_items = false;
|
||||
program_mode = false;
|
||||
}
|
||||
|
||||
|
||||
|
@ -241,9 +242,7 @@ void PatternParser::ParseString(const wchar_t * str, Pattern & pattern)
|
|||
include_level = 0;
|
||||
|
||||
pat->item_root.Clear();
|
||||
pat->item_root.type = Item::item_container;
|
||||
|
||||
CreateTree(pat->item_root);
|
||||
CreateTreeContainer(pat->item_root);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1061,8 +1060,7 @@ void PatternParser::CreateTreeReadIncludeSkipAllowFlag(Item & item)
|
|||
itext = file_text.c_str();
|
||||
|
||||
item.Clear();
|
||||
item.type = Item::item_container;
|
||||
CreateTree(item);
|
||||
CreateTreeContainer(item);
|
||||
|
||||
itext = itext_old;
|
||||
--include_level;
|
||||
|
@ -1076,11 +1074,9 @@ void PatternParser::CreateTreeReadIf(Item & item)
|
|||
pitem->Clear();
|
||||
|
||||
if( program_mode )
|
||||
pitem->type = Item::item_none;
|
||||
else
|
||||
pitem->type = Item::item_container;
|
||||
|
||||
CreateTree(*pitem);
|
||||
else
|
||||
CreateTreeContainer(*pitem);
|
||||
|
||||
if( program_mode )
|
||||
{
|
||||
|
@ -1100,7 +1096,7 @@ void PatternParser::CreateTreeReadIf(Item & item)
|
|||
pitem->DeleteLastItem();
|
||||
|
||||
pitem = item.AddItem();
|
||||
CreateTree(*pitem);
|
||||
CreateTreeContainer(*pitem);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1114,10 +1110,7 @@ void PatternParser::CreateTreeReadBlock(Item & item)
|
|||
{
|
||||
Item item_block;
|
||||
|
||||
item_block.Clear();
|
||||
item_block.type = Item::item_container;
|
||||
|
||||
CreateTree(item_block);
|
||||
CreateTreeContainer(item_block);
|
||||
|
||||
if( item_block.LastItemType() == Item::item_end )
|
||||
item_block.DeleteLastItem();
|
||||
|
@ -1132,14 +1125,11 @@ Item item_block;
|
|||
void PatternParser::CreateTreeReadFor(Item & item)
|
||||
{
|
||||
Item * pitem = item.AddItem();
|
||||
pitem->Clear();
|
||||
|
||||
if( program_mode )
|
||||
pitem->type = Item::item_none;
|
||||
else
|
||||
pitem->type = Item::item_container;
|
||||
|
||||
CreateTree(*pitem);
|
||||
else
|
||||
CreateTreeContainer(*pitem);
|
||||
|
||||
if( pitem->LastItemType() == Item::item_end )
|
||||
pitem->DeleteLastItem();
|
||||
|
@ -1147,52 +1137,58 @@ void PatternParser::CreateTreeReadFor(Item & item)
|
|||
|
||||
|
||||
|
||||
void PatternParser::CreateTree(Item & item)
|
||||
bool PatternParser::CreateTree(Item & item)
|
||||
{
|
||||
do
|
||||
{
|
||||
if( !CreateTreeReadItem(item) )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if( item.type == Item::item_block )
|
||||
CreateTreeReadBlock(item);
|
||||
}
|
||||
while( item.type == Item::item_comment || item.type == Item::item_block );
|
||||
|
||||
// such container can be read in program mode
|
||||
if( item.type == Item::item_container )
|
||||
CreateTreeContainer(item);
|
||||
|
||||
if( item.type == Item::item_if )
|
||||
CreateTreeReadIf(item);
|
||||
|
||||
// CHECK ME is it correct to check item_filter and item_ezc here and call CreateTreeReadFor?
|
||||
if( item.type == Item::item_for ||
|
||||
item.type == Item::item_filter ||
|
||||
item.type == Item::item_ezc )
|
||||
CreateTreeReadFor(item);
|
||||
|
||||
if( item.type == Item::item_include )
|
||||
CreateTreeReadInclude(item);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void PatternParser::CreateTreeContainer(Item & item)
|
||||
{
|
||||
bool item_read_correctly;
|
||||
Item * pitem;
|
||||
|
||||
if( item.type != Item::item_container )
|
||||
pitem = &item;
|
||||
else
|
||||
pitem = item.AddItem();
|
||||
item.type = Item::item_container;
|
||||
|
||||
do
|
||||
{
|
||||
if( !CreateTreeReadItem(*pitem) )
|
||||
{
|
||||
if( item.type == Item::item_container )
|
||||
pitem = item.AddItem();
|
||||
item_read_correctly = CreateTree(*pitem);
|
||||
}
|
||||
while( item_read_correctly && pitem->type != Item::item_end && pitem->type != Item::item_else);
|
||||
|
||||
if( !item_read_correctly )
|
||||
item.DeleteLastItem();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if( pitem->type == Item::item_block )
|
||||
CreateTreeReadBlock(*pitem);
|
||||
}
|
||||
while( pitem->type == Item::item_comment ||
|
||||
pitem->type == Item::item_block );
|
||||
|
||||
if( pitem->type == Item::item_end || pitem->type == Item::item_else )
|
||||
return;
|
||||
|
||||
if( pitem->type == Item::item_if )
|
||||
CreateTreeReadIf(*pitem);
|
||||
|
||||
if( pitem->type == Item::item_for ||
|
||||
pitem->type == Item::item_filter ||
|
||||
pitem->type == Item::item_ezc )
|
||||
CreateTreeReadFor(*pitem);
|
||||
|
||||
if( pitem->type == Item::item_include )
|
||||
CreateTreeReadInclude(*pitem);
|
||||
}
|
||||
while( item.type == Item::item_container );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2007-2016, Tomasz Sowa
|
||||
* Copyright (c) 2007-2018, Tomasz Sowa
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
|
@ -188,7 +188,8 @@ private:
|
|||
void CreateTreeReadIf(Item & item);
|
||||
void CreateTreeReadBlock(Item & item);
|
||||
void CreateTreeReadFor(Item & item);
|
||||
void CreateTree(Item & item);
|
||||
bool CreateTree(Item & item);
|
||||
void CreateTreeContainer(Item & item);
|
||||
void CreateTreeReadInclude(Item & item);
|
||||
void CreateTreeReadIncludeSkipAllowFlag(Item & item);
|
||||
|
||||
|
|
Loading…
Reference in New Issue