From 5722f6aa867e5d979e524abd9c685094b6d8e203 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sun, 25 Sep 2016 13:00:57 +0800 Subject: Parse+Expand - Support `let` in expression macros --- src/expand/mod.cpp | 4 +++- src/parse/common.hpp | 1 + src/parse/expr.cpp | 8 ++++++-- 3 files changed, 10 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp index 8060d104..962e49de 100644 --- a/src/expand/mod.cpp +++ b/src/expand/mod.cpp @@ -309,7 +309,9 @@ struct CExpandExpr: { SET_MODULE( (*ttl), mod ); // Reparse as expression / item - auto newexpr = Parse_Expr0(*ttl); + bool add_silence_if_end = false; + auto newexpr = Parse_ExprBlockLine(*ttl, &add_silence_if_end); + // TODO: use add_silence_if_end - Applies if this node is the last node in the block. // Then call visit on it again DEBUG("--- Visiting new node"); this->visit(newexpr); diff --git a/src/parse/common.hpp b/src/parse/common.hpp index 49a0bdf8..12d56eb3 100644 --- a/src/parse/common.hpp +++ b/src/parse/common.hpp @@ -54,6 +54,7 @@ extern AST::Expr Parse_ExprBlock(TokenStream& lex); extern AST::ExprNodeP Parse_Expr0(TokenStream& lex); extern AST::ExprNodeP Parse_ExprVal(TokenStream& lex); extern AST::ExprNodeP Parse_ExprBlockNode(TokenStream& lex, bool is_unsafe=false); +extern AST::ExprNodeP Parse_ExprBlockLine(TokenStream& lex, bool *add_silence); extern AST::ExprNodeP Parse_Stmt(TokenStream& lex); diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index 56b28546..ffc2fa19 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -23,7 +23,7 @@ static inline ExprNodeP mk_exprnodep(const TokenStream& lex, AST::ExprNode* en){ #define NEWNODE(type, ...) mk_exprnodep(lex, new type(__VA_ARGS__)) //ExprNodeP Parse_ExprBlockNode(TokenStream& lex, bool is_unsafe=false); // common.hpp -ExprNodeP Parse_ExprBlockLine(TokenStream& lex, bool *add_silence); +//ExprNodeP Parse_ExprBlockLine(TokenStream& lex, bool *add_silence); ExprNodeP Parse_ExprBlockLine_Stmt(TokenStream& lex, bool *add_silence); //ExprNodeP Parse_Stmt(TokenStream& lex); // common.hpp ExprNodeP Parse_Expr0(TokenStream& lex); @@ -256,7 +256,11 @@ ExprNodeP Parse_ExprBlockLine_Stmt(TokenStream& lex, bool *add_silence) // If this expression statement wasn't followed by a semicolon, then it's yielding its value out of the block. // - I.e. The block should be ending if( GET_TOK(tok, lex) != TOK_SEMICOLON ) { - CHECK_TOK(tok, TOK_BRACE_CLOSE); + // - Allow TOK_EOF for macro expansion. + if( tok.type() == TOK_EOF ) + ; + else + CHECK_TOK(tok, TOK_BRACE_CLOSE); PUTBACK(tok, lex); } else { -- cgit v1.2.3