diff options
Diffstat (limited to 'src/parse')
-rw-r--r-- | src/parse/expr.cpp | 14 | ||||
-rw-r--r-- | src/parse/paths.cpp | 17 | ||||
-rw-r--r-- | src/parse/pattern.cpp | 4 |
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 ); |