diff options
author | John Hodge <tpg@ucc.asn.au> | 2019-01-27 11:06:21 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2019-01-27 11:06:21 +0800 |
commit | 4f48058690ffc6af273a49eeb909d792163cade9 (patch) | |
tree | 95bd3f0a836ca2a3081e5c473e93be69b031f4c6 /src/macro_rules/macro_rules.hpp | |
parent | d1ea840742dac3d3af66667508c8a841a6c6ca70 (diff) | |
download | mrust-4f48058690ffc6af273a49eeb909d792163cade9.tar.gz |
macro_rules - Rework pattern matching into a "compiled" format (easier to disambiguate)
Diffstat (limited to 'src/macro_rules/macro_rules.hpp')
-rw-r--r-- | src/macro_rules/macro_rules.hpp | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/src/macro_rules/macro_rules.hpp b/src/macro_rules/macro_rules.hpp index 29c4f93d..02b302d8 100644 --- a/src/macro_rules/macro_rules.hpp +++ b/src/macro_rules/macro_rules.hpp @@ -18,6 +18,7 @@ #include <set> class MacroExpander; +class SimplePatEnt; TAGGED_UNION(MacroExpansionEnt, Token, // TODO: have a "raw" stream instead of just tokens @@ -42,6 +43,7 @@ struct MacroPatEnt { ::std::string name; unsigned int name_index = 0; + // TODO: Include a point span for the token? Token tok; ::std::vector<MacroPatEnt> subpats; @@ -95,6 +97,39 @@ struct MacroPatEnt friend ::std::ostream& operator<<(::std::ostream& os, const MacroPatEnt::Type& x); }; +struct SimplePatIfCheck +{ + MacroPatEnt::Type ty; // If PAT_TOKEN, token is checked + Token tok; +}; + +/// Simple pattern entry for macro_rules! arm patterns +TAGGED_UNION( SimplePatEnt, End, + // End of the pattern stream (expects EOF, and terminates the match process) + (End, struct{}), + (LoopStart, struct{}), + (LoopNext, struct{}), + (LoopEnd, struct{}), + (Jump, struct { + size_t jump_target; + }), + // Expect a specific token, erroring/failing the arm if nt met + (ExpectTok, Token), + // Expect a pattern match + (ExpectPat, struct { + MacroPatEnt::Type type; + unsigned int idx; + }), + // Compare the head of the input stream and poke the pattern stream + (If, struct { + bool is_equal; + size_t jump_target; + ::std::vector<SimplePatIfCheck> ents; + }) + ); + +extern::std::ostream& operator<<(::std::ostream& os, const SimplePatEnt& x); + /// An expansion arm within a macro_rules! blcok struct MacroRulesArm { @@ -102,14 +137,15 @@ struct MacroRulesArm ::std::vector< ::std::string> m_param_names; /// Patterns - ::std::vector<MacroPatEnt> m_pattern; + ::std::vector<SimplePatEnt> m_pattern; /// Rule contents ::std::vector<MacroExpansionEnt> m_contents; + ~MacroRulesArm(); MacroRulesArm() {} - MacroRulesArm(::std::vector<MacroPatEnt> pattern, ::std::vector<MacroExpansionEnt> contents): + MacroRulesArm(::std::vector<SimplePatEnt> pattern, ::std::vector<MacroExpansionEnt> contents): m_pattern( mv$(pattern) ), m_contents( mv$(contents) ) {} |