summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/macro_rules/eval.cpp72
-rw-r--r--src/main.cpp15
-rw-r--r--src/parse/lex.cpp4
-rw-r--r--src/parse/token.cpp21
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;
}