From bf62d443460d52754210bf9dad27a50f09fa24d2 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Thu, 1 Nov 2018 21:52:33 +0000 Subject: [PATCH] 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 --- src/generator.h | 4 +- src/patternparser.cpp | 108 ++++++++++++++++++++---------------------- src/patternparser.h | 5 +- 3 files changed, 58 insertions(+), 59 deletions(-) diff --git a/src/generator.h b/src/generator.h index cb80fe4..0e82b64 100644 --- a/src/generator.h +++ b/src/generator.h @@ -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::Generator() : empty_stream() can_find_in_cache = true; can_use_vars = true; expression_parser = nullptr; + program_mode = false; } @@ -396,6 +397,7 @@ Generator & Generator::operator=(const Generatoritem_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; + CreateTree(*pitem); else - pitem->type = Item::item_container; - - CreateTree(*pitem); + CreateTreeContainer(*pitem); if( program_mode ) { @@ -1100,7 +1096,7 @@ void PatternParser::CreateTreeReadIf(Item & item) pitem->DeleteLastItem(); pitem = item.AddItem(); - CreateTree(*pitem); + CreateTreeContainer(*pitem); } } @@ -1112,12 +1108,9 @@ void PatternParser::CreateTreeReadIf(Item & item) void PatternParser::CreateTreeReadBlock(Item & item) { -Item item_block; + 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; + CreateTree(*pitem); else - pitem->type = Item::item_container; - - CreateTree(*pitem); + 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 { - Item * pitem; - - if( item.type != Item::item_container ) - pitem = &item; - else - pitem = item.AddItem(); - - do + if( !CreateTreeReadItem(item) ) { - if( !CreateTreeReadItem(*pitem) ) - { - if( item.type == Item::item_container ) - item.DeleteLastItem(); - - return; - } - - if( pitem->type == Item::item_block ) - CreateTreeReadBlock(*pitem); + return false; } - 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); + if( item.type == Item::item_block ) + CreateTreeReadBlock(item); } - while( item.type == Item::item_container ); + 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; + + item.type = Item::item_container; + + do + { + 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(); +} + diff --git a/src/patternparser.h b/src/patternparser.h index 89a446d..4c475b9 100644 --- a/src/patternparser.h +++ b/src/patternparser.h @@ -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);