summaryrefslogtreecommitdiff
path: root/parse/expr.cpp
diff options
context:
space:
mode:
authorJohn Hodge (bugs) <tpg@mutabah.net>2014-12-07 18:53:17 +0800
committerJohn Hodge (bugs) <tpg@mutabah.net>2014-12-07 18:53:17 +0800
commit0bfd3352489411a1e1d6b98397979ad91e2a52b1 (patch)
treec3e41ae23991f4b95ad155e7601f6f5a5c36aa64 /parse/expr.cpp
parent6178198e6a5f0ff2384660253347b6e9b5d686e2 (diff)
downloadmrust-0bfd3352489411a1e1d6b98397979ad91e2a52b1.tar.gz
Macro expansion working, onwards to field parsing
Diffstat (limited to 'parse/expr.cpp')
-rw-r--r--parse/expr.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/parse/expr.cpp b/parse/expr.cpp
index b3c00247..22f774bb 100644
--- a/parse/expr.cpp
+++ b/parse/expr.cpp
@@ -406,6 +406,11 @@ AST::ExprNode Parse_ExprVal(TokenStream& lex)
return ExprNode(ExprNode::TagInteger(), tok.intval(), tok.datatype());
case TOK_FLOAT:
throw ParseError::Todo("Float");
+ case TOK_RWORD_SELF: {
+ AST::Path path;
+ path.append( AST::PathNode("self", ::std::vector<TypeRef>()) );
+ return ExprNode(ExprNode::TagNamedValue(), path);
+ }
case TOK_MACRO: {
// Need to create a token tree, pass to the macro, then pass the result of that to Parse_Expr0
MacroExpander expanded_macro = Macro_Invoke(tok.str().c_str(), Parse_TT(lex));
@@ -477,6 +482,8 @@ TokenTree Parse_TT_Val(TokenStream& lex)
return inner;
}
break; }
+ case TOK_RWORD_SELF:
+ return TokenTree(tok);
case TOK_RWORD_MATCH:
ret.push_back(TokenTree(tok));
ret.push_back(Parse_TT(lex));
@@ -516,6 +523,23 @@ TokenTree Parse_TT_Expr(TokenStream& lex)
ret.push_back(tok);
ret.push_back(Parse_TT_Val(lex));
break;
+ case TOK_DOT:
+ ret.push_back(tok);
+ GET_CHECK_TOK(tok, lex, TOK_IDENT);
+ ret.push_back(tok);
+ switch(GET_TOK(tok, lex))
+ {
+ case TOK_DOUBLE_COLON:
+ throw ParseError::Todo("Generic type params in TT expr");
+ case TOK_PAREN_OPEN:
+ lex.putback(tok);
+ ret.push_back(Parse_TT(lex));
+ break;
+ default:
+ lex.putback(tok);
+ break;
+ }
+ break;
default:
lex.putback(tok);
cont = false;