summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-02-27 10:48:43 +0800
committerJohn Hodge <tpg@mutabah.net>2016-02-27 10:48:43 +0800
commit211935d0802733cb85ccfb5ee7cb4cd73552d01c (patch)
tree76d7b824f2e022e97a8e0bbb3cdad6085b744050 /src
parent51841b63537145446d5b989ae71f563eaed69200 (diff)
downloadmrust-211935d0802733cb85ccfb5ee7cb4cd73552d01c.tar.gz
Parse/path - Unify pattern and expr path parsing
Diffstat (limited to 'src')
-rw-r--r--src/parse/expr.cpp14
-rw-r--r--src/parse/paths.cpp17
-rw-r--r--src/parse/pattern.cpp4
3 files changed, 22 insertions, 13 deletions
diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp
index f49d3305..342c1bd0 100644
--- a/src/parse/expr.cpp
+++ b/src/parse/expr.cpp
@@ -1006,21 +1006,15 @@ ExprNodeP Parse_ExprVal(TokenStream& lex)
}
else
{
- GET_CHECK_TOK(tok, lex, TOK_DOUBLE_COLON);
- path = Parse_Path(lex, false, PATH_GENERIC_EXPR);
+ lex.putback(tok);
+ path = Parse_Path(lex, PATH_GENERIC_EXPR);
}
}
if(0)
case TOK_RWORD_SUPER:
{
- GET_CHECK_TOK(tok, lex, TOK_DOUBLE_COLON);
- unsigned int count = 1;
- while( LOOK_AHEAD(lex) == TOK_RWORD_SUPER ) {
- count += 1;
- GET_TOK(tok, lex);
- GET_CHECK_TOK(tok, lex, TOK_DOUBLE_COLON);
- }
- path = AST::Path(AST::Path::TagSuper(), count, Parse_PathNodes(lex, PATH_GENERIC_EXPR));
+ lex.putback(tok);
+ path = Parse_Path(lex, PATH_GENERIC_EXPR);
}
if(0)
case TOK_IDENT:
diff --git a/src/parse/paths.cpp b/src/parse/paths.cpp
index 2e4557df..1c8695d7 100644
--- a/src/parse/paths.cpp
+++ b/src/parse/paths.cpp
@@ -19,6 +19,19 @@ AST::Path Parse_Path(TokenStream& lex, eParsePathGenericMode generic_mode)
Token tok;
switch( GET_TOK(tok, lex) )
{
+ case TOK_RWORD_SELF:
+ GET_CHECK_TOK(tok, lex, TOK_DOUBLE_COLON);
+ return Parse_Path(lex, false, generic_mode);
+ case TOK_RWORD_SUPER: {
+ GET_CHECK_TOK(tok, lex, TOK_DOUBLE_COLON);
+ unsigned int count = 1;
+ while( LOOK_AHEAD(lex) == TOK_RWORD_SUPER ) {
+ count += 1;
+ GET_TOK(tok, lex);
+ GET_CHECK_TOK(tok, lex, TOK_DOUBLE_COLON);
+ }
+ return AST::Path(AST::Path::TagSuper(), count, Parse_PathNodes(lex, generic_mode));
+ }
case TOK_DOUBLE_COLON:
return Parse_Path(lex, true, generic_mode);
case TOK_DOUBLE_LT:
@@ -32,9 +45,9 @@ AST::Path Parse_Path(TokenStream& lex, eParsePathGenericMode generic_mode)
else
lex.putback(tok);
GET_CHECK_TOK(tok, lex, TOK_GT);
- // TODO: Terminating the "path" here is sometimes valid
+ // TODO: Terminating the "path" here is sometimes valid?
GET_CHECK_TOK(tok, lex, TOK_DOUBLE_COLON);
- return AST::Path(AST::Path::TagUfcs(), ty, trait, Parse_PathNodes(lex, PATH_GENERIC_EXPR));
+ return AST::Path(AST::Path::TagUfcs(), ty, trait, Parse_PathNodes(lex, generic_mode));
}
default:
lex.putback(tok);
diff --git a/src/parse/pattern.cpp b/src/parse/pattern.cpp
index 1c7440f9..d6b646b5 100644
--- a/src/parse/pattern.cpp
+++ b/src/parse/pattern.cpp
@@ -178,9 +178,11 @@ AST::Pattern Parse_PatternReal1(TokenStream& lex, bool is_refutable)
return AST::Pattern( AST::Pattern::TagReference(), Parse_Pattern(lex, is_refutable) );
lex.putback(tok);
return AST::Pattern( AST::Pattern::TagReference(), Parse_Pattern(lex, is_refutable) );
+ case TOK_RWORD_SELF:
+ case TOK_RWORD_SUPER:
case TOK_IDENT:
lex.putback(tok);
- return Parse_PatternReal_Path( lex, Parse_Path(lex, false, PATH_GENERIC_EXPR), is_refutable );
+ return Parse_PatternReal_Path( lex, Parse_Path(lex, PATH_GENERIC_EXPR), is_refutable );
case TOK_DOUBLE_COLON:
// 2. Paths are enum/struct names
return Parse_PatternReal_Path( lex, Parse_Path(lex, true, PATH_GENERIC_EXPR), is_refutable );