/// Parse an entire macro_rules! block into a format that exec.cpp can use MacroRulesPtr Parse_MacroRules(TokenStream& lex) { TRACE_FUNCTION_F(""); Token tok; // Parse the patterns and replacements ::std::vector<MacroRule> rules; while( GET_TOK(tok, lex) != TOK_EOF ) { lex.putback(tok); rules.push_back( Parse_MacroRules_Var(lex) ); if(GET_TOK(tok, lex) != TOK_SEMICOLON) { CHECK_TOK(tok, TOK_EOF); break; } } DEBUG("- " << rules.size() << " rules"); ::std::vector<MacroRulesArm> rule_arms; // Re-parse the patterns into a unified form for(auto& rule : rules) { MacroRulesArm arm = MacroRulesArm( mv$(rule.m_pattern), mv$(rule.m_contents) ); enumerate_names(arm.m_pattern, arm.m_param_names); rule_arms.push_back( mv$(arm) ); } auto rv = new MacroRules( ); rv->m_hygiene = lex.getHygiene(); rv->m_rules = mv$(rule_arms); return MacroRulesPtr(rv); }