From e74ceca550c06f8a0c267459fbb2e365b3ddd708 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Thu, 14 Jul 2016 08:50:10 +0800 Subject: Macro Rules - Running fully once more, may still be incorrect --- src/macro_rules/eval.cpp | 72 ++++++++++++++++++++++++++++++++---------------- src/main.cpp | 15 +++++----- src/parse/lex.cpp | 4 +-- src/parse/token.cpp | 21 ++++++++++++++ 4 files changed, 79 insertions(+), 33 deletions(-) (limited to 'src') diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp index 81898fa9..1dda2be3 100644 --- a/src/macro_rules/eval.cpp +++ b/src/macro_rules/eval.cpp @@ -80,38 +80,54 @@ public: m_mappings.resize( name_index + 1 ); } auto* layer = &m_mappings[name_index].top_layer; - for(const auto iter : iterations) + if( iterations.size() > 0 ) { - if( layer->is_Vals() ) { - assert( layer->as_Vals().size() == 0 ); - *layer = CaptureLayer::make_Nested({}); - } - auto& e = layer->as_Nested(); - if( e.size() < iter ) { - // ERROR - DEBUG("Iteratoun count jumped from " << e.size() << " to " << iter); - assert(!"Iteration count jump"); - } - else if(e.size() == iter) { - e.push_back( CaptureLayer::make_Vals({}) ); - } - else { + for(unsigned int i = 0; i < iterations.size()-1; i ++ ) + { + auto iter = iterations[i]; + + if( layer->is_Vals() ) { + assert( layer->as_Vals().size() == 0 ); + *layer = CaptureLayer::make_Nested({}); + } + auto& e = layer->as_Nested(); + while( e.size() < iter ) { + DEBUG("- Skipped iteration " << e.size()); + e.push_back( CaptureLayer::make_Nested({}) ); + } + + if(e.size() == iter) { + e.push_back( CaptureLayer::make_Vals({}) ); + } + else { + if( e.size() > iter ) { + DEBUG("ERROR: Iterations ran backwards?"); + } + } layer = &e[iter]; } + assert(layer->as_Vals().size() == iterations.back()); + layer->as_Vals().push_back( mv$(data) ); + } + else { + assert(layer->as_Vals().size() == 0); + layer->as_Vals().push_back( mv$(data) ); } - layer->as_Vals().push_back( mv$(data) ); } InterpolatedFragment* get(const ::std::vector& iterations, unsigned int name_idx) { + DEBUG("(iterations=[" << iterations << "], name_idx=" << name_idx << ")"); auto& e = m_mappings.at(name_idx); + //DEBUG("- e = " << e); auto* layer = &e.top_layer; - if( iterations.size() == 0 ) { - TU_IFLET(CaptureLayer, (*layer), Vals, e, + // - If the top layer is a 1-sized set of values, unconditionally return + TU_IFLET(CaptureLayer, (*layer), Vals, e, + if( e.size() == 1 ) { return &e[0]; - ) - } + } + ) for(const auto iter : iterations) { @@ -129,6 +145,10 @@ public: } unsigned int count_in(const ::std::vector& iterations, unsigned int name_idx) { + DEBUG("(iterations=[" << iterations << "], name_idx=" << name_idx << ")"); + if( name_idx >= m_mappings.size() ) { + return 0; + } auto& e = m_mappings.at(name_idx); auto* layer = &e.top_layer; for(const auto iter : iterations) @@ -255,7 +275,6 @@ bool Macro_HandlePattern(TTStream& lex, const MacroPatEnt& pat, ::std::vector #include // std::count -const bool DEBUG_PRINT_TOKENS = false; -//const bool DEBUG_PRINT_TOKENS = true; +//const bool DEBUG_PRINT_TOKENS = false; +const bool DEBUG_PRINT_TOKENS = true; Lexer::Lexer(const ::std::string& filename): m_path(filename.c_str()), diff --git a/src/parse/token.cpp b/src/parse/token.cpp index 5b580fe3..6380992e 100644 --- a/src/parse/token.cpp +++ b/src/parse/token.cpp @@ -445,6 +445,27 @@ SERIALISE_TYPE(Token::, "Token", { if( tok.m_data.is_Integer() ) os << ":" << tok.intval(); break; + case TOK_INTERPOLATED_TYPE: + os << ":" << *reinterpret_cast(tok.m_data.as_Fragment()); + break; + case TOK_INTERPOLATED_PATTERN: + os << ":" << *reinterpret_cast(tok.m_data.as_Fragment()); + break; + case TOK_INTERPOLATED_PATH: + os << ":" << *reinterpret_cast(tok.m_data.as_Fragment()); + break; + case TOK_INTERPOLATED_EXPR: + os << ":" << *reinterpret_cast(tok.m_data.as_Fragment()); + break; + case TOK_INTERPOLATED_STMT: + os << ":" << *reinterpret_cast(tok.m_data.as_Fragment()); + break; + case TOK_INTERPOLATED_BLOCK: + os << ":" << *reinterpret_cast(tok.m_data.as_Fragment()); + break; + case TOK_INTERPOLATED_META: + os << ":" << *reinterpret_cast(tok.m_data.as_Fragment()); + break; default: break; } -- cgit v1.2.3