summaryrefslogtreecommitdiff
path: root/src/macro_rules/macro_rules.hpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@ucc.asn.au>2019-01-27 11:06:21 +0800
committerJohn Hodge <tpg@ucc.asn.au>2019-01-27 11:06:21 +0800
commit4f48058690ffc6af273a49eeb909d792163cade9 (patch)
tree95bd3f0a836ca2a3081e5c473e93be69b031f4c6 /src/macro_rules/macro_rules.hpp
parentd1ea840742dac3d3af66667508c8a841a6c6ca70 (diff)
downloadmrust-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.hpp40
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) )
{}