From 0bfd3352489411a1e1d6b98397979ad91e2a52b1 Mon Sep 17 00:00:00 2001 From: "John Hodge (bugs)" Date: Sun, 7 Dec 2014 18:53:17 +0800 Subject: Macro expansion working, onwards to field parsing --- parse/expr.cpp | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'parse/expr.cpp') 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()) ); + 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; -- cgit v1.2.3