diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/macro_rules/eval.cpp | 72 | ||||
-rw-r--r-- | src/main.cpp | 15 | ||||
-rw-r--r-- | src/parse/lex.cpp | 4 | ||||
-rw-r--r-- | src/parse/token.cpp | 21 |
4 files changed, 79 insertions, 33 deletions
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<unsigned int>& 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<unsigned int>& 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<un DEBUG("break"); break; } - iterations.back() += 1; for( unsigned int i = 0; i < pat.subpats.size(); i ++ ) { if( !Macro_HandlePattern(lex, pat.subpats[i], iterations, bound_tts) ) { @@ -264,6 +283,7 @@ bool Macro_HandlePattern(TTStream& lex, const MacroPatEnt& pat, ::std::vector<un } } match_count += 1; + iterations.back() += 1; DEBUG("succ"); if( pat.tok.type() != TOK_NULL ) { @@ -466,6 +486,7 @@ Token MacroExpander::realGetToken() } else { + DEBUG("Insert replacement #" << e << " = " << *frag); if( frag->m_type == InterpolatedFragment::TT ) { m_ttstream.reset( new TTStream( frag->as_tt() ) ); @@ -486,9 +507,12 @@ Token MacroExpander::realGetToken() if( this_repeats > num_repeats ) num_repeats = this_repeats; } - m_offsets.push_back( {0, 0, num_repeats} ); - m_iterations.push_back( 0 ); - m_cur_ents = getCurLayer(); + if( num_repeats > 0 ) + { + m_offsets.push_back( {0, 0, num_repeats} ); + m_iterations.push_back( 0 ); + m_cur_ents = getCurLayer(); + } ) ) // Fall through for loop diff --git a/src/main.cpp b/src/main.cpp index 38b060fb..24b99705 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,8 +25,8 @@ int g_debug_indent_level = 0; bool debug_enabled()
{
- return true;
- //return g_cur_phase != "Parse";
+ //return true;
+ return g_cur_phase != "Parse";
//return g_cur_phase != "Parse" && g_cur_phase != "Expand";
//return g_cur_phase != "Parse" && g_cur_phase != "Expand" && g_cur_phase != "Resolve";
}
@@ -198,11 +198,12 @@ int main(int argc, char *argv[]) // Convert structures to C structures / tagged enums
//Convert_Render(flat_crate, stdout);
}
- catch(const CompileError::Base& e)
- {
- ::std::cerr << "Parser Error: " << e.what() << ::std::endl;
- return 2;
- }
+ catch(unsigned int) {}
+ //catch(const CompileError::Base& e)
+ //{
+ // ::std::cerr << "Parser Error: " << e.what() << ::std::endl;
+ // return 2;
+ //}
//catch(const ::std::exception& e)
//{
// ::std::cerr << "Misc Error: " << e.what() << ::std::endl;
diff --git a/src/parse/lex.cpp b/src/parse/lex.cpp index 2b84d0e4..6097839d 100644 --- a/src/parse/lex.cpp +++ b/src/parse/lex.cpp @@ -20,8 +20,8 @@ #include <typeinfo> #include <algorithm> // 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<TypeRef*>(tok.m_data.as_Fragment()); + break; + case TOK_INTERPOLATED_PATTERN: + os << ":" << *reinterpret_cast<AST::Pattern*>(tok.m_data.as_Fragment()); + break; + case TOK_INTERPOLATED_PATH: + os << ":" << *reinterpret_cast<AST::Path*>(tok.m_data.as_Fragment()); + break; + case TOK_INTERPOLATED_EXPR: + os << ":" << *reinterpret_cast<AST::ExprNode*>(tok.m_data.as_Fragment()); + break; + case TOK_INTERPOLATED_STMT: + os << ":" << *reinterpret_cast<AST::ExprNode*>(tok.m_data.as_Fragment()); + break; + case TOK_INTERPOLATED_BLOCK: + os << ":" << *reinterpret_cast<AST::ExprNode*>(tok.m_data.as_Fragment()); + break; + case TOK_INTERPOLATED_META: + os << ":" << *reinterpret_cast<AST::MetaItem*>(tok.m_data.as_Fragment()); + break; default: break; } |