summaryrefslogtreecommitdiff
path: root/src/macro_rules
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2019-05-05 20:12:58 +0800
committerJohn Hodge <tpg@ucc.asn.au>2019-05-05 20:12:58 +0800
commit7a5cd835703fdfac0634b975392f915e0230c2a7 (patch)
treececda0ef233d853e9058649b49d373a8f0a5f299 /src/macro_rules
parent6cc802dfbd44a6f1f76cc5ae76227f1f54cf9f75 (diff)
downloadmrust-7a5cd835703fdfac0634b975392f915e0230c2a7.tar.gz
parse/expand/resolve - `macro` macros use their own module as the resolve root
Diffstat (limited to 'src/macro_rules')
-rw-r--r--src/macro_rules/eval.cpp1
-rw-r--r--src/macro_rules/macro_rules.hpp4
-rw-r--r--src/macro_rules/parse.cpp20
3 files changed, 17 insertions, 8 deletions
diff --git a/src/macro_rules/eval.cpp b/src/macro_rules/eval.cpp
index 9caff7b8..c40eb810 100644
--- a/src/macro_rules/eval.cpp
+++ b/src/macro_rules/eval.cpp
@@ -502,6 +502,7 @@ InterpolatedFragment Macro_HandlePatternCap(TokenStream& lex, MacroPatEnt::Type
::std::unique_ptr<TokenStream> Macro_InvokeRules(const char *name, const MacroRules& rules, const Span& sp, TokenTree input, AST::Module& mod)
{
TRACE_FUNCTION_F("'" << name << "', " << input);
+ DEBUG("rules.m_hygiene = " << rules.m_hygiene);
ParameterMappings bound_tts;
unsigned int rule_index = Macro_InvokeRules_MatchPattern(sp, rules, mv$(input), mod, bound_tts);
diff --git a/src/macro_rules/macro_rules.hpp b/src/macro_rules/macro_rules.hpp
index 02b302d8..9e408fd5 100644
--- a/src/macro_rules/macro_rules.hpp
+++ b/src/macro_rules/macro_rules.hpp
@@ -181,4 +181,8 @@ public:
extern ::std::unique_ptr<TokenStream> Macro_InvokeRules(const char *name, const MacroRules& rules, const Span& sp, TokenTree input, AST::Module& mod);
extern MacroRulesPtr Parse_MacroRules(TokenStream& lex);
+extern ::std::vector<MacroPatEnt> Parse_MacroRules_Pat(TokenStream& lex, enum eTokenType open, enum eTokenType close, ::std::vector< ::std::string>& names);
+extern ::std::vector<MacroExpansionEnt> Parse_MacroRules_Cont(TokenStream& lex, enum eTokenType open, enum eTokenType close, const ::std::vector< ::std::string>& var_names, ::std::map<unsigned int,bool>* var_set_ptr=nullptr);
+extern MacroRulesArm Parse_MacroRules_MakeArm(Span pat_sp, ::std::vector<MacroPatEnt> pattern, ::std::vector<MacroExpansionEnt> contents);
+
#endif // MACROS_HPP_INCLUDED
diff --git a/src/macro_rules/parse.cpp b/src/macro_rules/parse.cpp
index 98163998..4bd8a577 100644
--- a/src/macro_rules/parse.cpp
+++ b/src/macro_rules/parse.cpp
@@ -40,6 +40,7 @@ public:
int depth = 0;
while( GET_TOK(tok, lex) != close || depth > 0 )
{
+ DEBUG("tok = " << tok);
if( tok.type() == open )
{
depth ++;
@@ -142,7 +143,7 @@ public:
TokenStream& lex,
enum eTokenType open, enum eTokenType close,
const ::std::vector< ::std::string>& var_names,
- ::std::map<unsigned int,bool>* var_set_ptr=nullptr
+ ::std::map<unsigned int,bool>* var_set_ptr/*=nullptr*/
)
{
TRACE_FUNCTION;
@@ -310,6 +311,15 @@ void enumerate_names(const ::std::vector<MacroPatEnt>& pats, ::std::vector< ::st
}
}
+MacroRulesArm Parse_MacroRules_MakeArm(Span pat_sp, ::std::vector<MacroPatEnt> pattern, ::std::vector<MacroExpansionEnt> contents)
+{
+ // - Convert the rule into an instruction stream
+ auto rule_sequence = macro_pattern_to_simple(pat_sp, pattern);
+ auto arm = MacroRulesArm( mv$(rule_sequence), mv$(contents) );
+ enumerate_names(pattern, arm.m_param_names);
+ return arm;
+}
+
/// Parse an entire macro_rules! block into a format that exec.cpp can use
MacroRulesPtr Parse_MacroRules(TokenStream& lex)
{
@@ -336,13 +346,7 @@ MacroRulesPtr Parse_MacroRules(TokenStream& lex)
// Re-parse the patterns into a unified form
for(auto& rule : rules)
{
- // TODO: Transform the pattern into a DFA or similar here (seekable instruction stream?)
-
- auto rule_sequence = macro_pattern_to_simple(rule.m_pat_span, rule.m_pattern);
- MacroRulesArm arm = MacroRulesArm( mv$(rule_sequence), mv$(rule.m_contents) );
- enumerate_names(rule.m_pattern, arm.m_param_names);
-
- rule_arms.push_back( mv$(arm) );
+ rule_arms.push_back( Parse_MacroRules_MakeArm(rule.m_pat_span, mv$(rule.m_pattern), mv$(rule.m_contents)) );
}
auto rv = new MacroRules( );