diff --git a/src/ndbl/core/Token.cpp b/src/ndbl/core/Token.cpp index b2a6d887b..0d5db05b9 100644 --- a/src/ndbl/core/Token.cpp +++ b/src/ndbl/core/Token.cpp @@ -203,18 +203,28 @@ void Token::word_replace(const char* new_word) void Token::prefix_push_front(const char* str) { - const size_t str_len = strlen(str); - m_buffer.switch_to_intern_buf_with_data(begin(), length()); + if (!m_buffer.intern()) + { + size_t size = length(); + char* data = begin(); + m_buffer.switch_to_intern_buf(size); + m_buffer.intern_buf->append( data, size ); + } m_buffer.intern_buf->insert(0, str); - m_prefix_len += str_len; + m_prefix_len += strlen(str); } void Token::suffix_push_back(const char* str) { - const size_t str_len = strlen(str); - m_buffer.switch_to_intern_buf_with_data(begin(), length()); + if (!m_buffer.intern()) + { + size_t size = length(); + char* data = begin(); + m_buffer.switch_to_intern_buf(size); + m_buffer.intern_buf->append( data, size ); + } m_buffer.intern_buf->append(str); - m_suffix_len += str_len; + m_suffix_len += strlen(str); } void Token::prefix_reset(size_t size ) @@ -297,12 +307,6 @@ void Token::BimodalBuffer::switch_to_intern_buf(size_t size) intern_buf->reserve(size); } -void Token::BimodalBuffer::switch_to_intern_buf_with_data(char* data, size_t size) -{ - switch_to_intern_buf(size); - intern_buf->append( data, size ); -} - void Token::BimodalBuffer::delete_intern_buf() { diff --git a/src/ndbl/core/Token.h b/src/ndbl/core/Token.h index 54fb40436..f4b406b6f 100644 --- a/src/ndbl/core/Token.h +++ b/src/ndbl/core/Token.h @@ -56,7 +56,7 @@ namespace ndbl ~BimodalBuffer(); void delete_intern_buf(); void switch_to_intern_buf(size_t size); - void switch_to_intern_buf_with_data(char *data, size_t len); + char* data() const { return intern() ? intern_buf->data() : extern_buf; } char* begin() const { return data() + offset; } bool intern() const { return _flags & BimodalBuffer::Flags_INTERN; } diff --git a/src/ndbl/core/language/Nodlang.cpp b/src/ndbl/core/language/Nodlang.cpp index 89cc755cc..27a899580 100644 --- a/src/ndbl/core/language/Nodlang.cpp +++ b/src/ndbl/core/language/Nodlang.cpp @@ -572,18 +572,19 @@ Optional Nodlang::parse_program() // Create an entry point and push its scope Node* entry_point = parser_state.graph()->create_entry_point(); + // Parse main code block + parser_state.push_scope( entry_point->inner_scope() ); + Optional block = parse_code_block( entry_point->inner_scope() ); + parser_state.pop_scope(); + + // To preserve any ignored characters stored in the global token // we put the prefix and suffix in resp. token_begin and end. Token& tok = parser_state.tokens().global_token(); std::string prefix = tok.prefix_to_string(); std::string suffix = tok.suffix_to_string(); - entry_point->inner_scope()->token_begin = {Token_t::ignore, prefix }; - entry_point->inner_scope()->token_end = {Token_t::ignore, suffix }; - - // Parse main code block - parser_state.push_scope( entry_point->inner_scope() ); - Optional block = parse_code_block( entry_point->inner_scope() ); - parser_state.pop_scope(); + entry_point->inner_scope()->token_begin.prefix_push_front( prefix.c_str() ); + entry_point->inner_scope()->token_end.suffix_push_back( suffix.c_str() ); if ( block ) { @@ -1732,8 +1733,8 @@ std::string &Nodlang::serialize_token(std::string& _out, const Token& _token) co std::string& Nodlang::serialize_graph(std::string &_out, const Graph* graph ) const { - if ( const Node* root = graph->root().get() ) - serialize_node(_out, root, SerializeFlag_RECURSE); + if ( const Scope* scope = graph->root()->inner_scope() ) + serialize_scope(_out, scope); else LOG_ERROR("Serializer", "a root child_node is expected to serialize the graph\n"); return _out;