From e7f360039578f4453c3b16db8541347d6bcaca5a Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 27 Feb 2016 14:15:30 +0800 Subject: Parse/expr - Support `in PLACE { val }` syntax --- src/ast/expr.cpp | 2 ++ src/ast/expr.hpp | 2 ++ src/dump_as_rust.cpp | 1 + src/parse/expr.cpp | 10 ++++++++++ 4 files changed, 15 insertions(+) diff --git a/src/ast/expr.cpp b/src/ast/expr.cpp index dc0eb59f..104c6094 100644 --- a/src/ast/expr.cpp +++ b/src/ast/expr.cpp @@ -392,6 +392,7 @@ void operator%(::Serialiser& s, const ExprNode_BinOp::Type t) { _(MODULO); _(ADD); _(SUB); + _(PLACE_IN); #undef _ } } @@ -450,6 +451,7 @@ NODE(ExprNode_BinOp, { case ADD: os << "+"; break; case SUB: os << "-"; break; case RANGE: os << ".."; break; + case PLACE_IN: os << "<-"; break; } os << " " << *m_right << ")"; }) diff --git a/src/ast/expr.hpp b/src/ast/expr.hpp index 2b2a89f5..2d6016d7 100644 --- a/src/ast/expr.hpp +++ b/src/ast/expr.hpp @@ -527,6 +527,8 @@ struct ExprNode_BinOp: MODULO, ADD, SUB, + + PLACE_IN, // `in PLACE { expr }` or `PLACE <- expr` }; Type m_type; diff --git a/src/dump_as_rust.cpp b/src/dump_as_rust.cpp index 86439115..fc338267 100644 --- a/src/dump_as_rust.cpp +++ b/src/dump_as_rust.cpp @@ -485,6 +485,7 @@ public: case AST::ExprNode_BinOp::ADD: m_os << "+"; break; case AST::ExprNode_BinOp::SUB: m_os << "-"; break; case AST::ExprNode_BinOp::RANGE: m_os << ".."; break; + case AST::ExprNode_BinOp::PLACE_IN: m_os << "<-"; break; } m_os << " "; if( IS(*n.m_right, AST::ExprNode_BinOp) ) diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index 152946bc..9330d925 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -629,6 +629,7 @@ bool Parse_IsTokValue(eTokenType tok_type) case TOK_RWORD_SELF: case TOK_RWORD_SUPER: case TOK_RWORD_BOX: + case TOK_RWORD_IN: case TOK_PAREN_OPEN: case TOK_MACRO: @@ -781,6 +782,15 @@ ExprNodeP Parse_Expr12(TokenStream& lex) return NEWNODE( AST::ExprNode_Deref, Parse_Expr12(lex) ); case TOK_RWORD_BOX: return NEWNODE( AST::ExprNode_UniOp, AST::ExprNode_UniOp::BOX, Parse_Expr12(lex) ); + case TOK_RWORD_IN: { + ExprNodeP dest; + { + SET_PARSE_FLAG(lex, disallow_struct_literal); + dest = Parse_Expr1(lex); + } + auto val = Parse_ExprBlockNode(lex); + return NEWNODE( AST::ExprNode_BinOp, AST::ExprNode_BinOp::PLACE_IN, mv$(dest), mv$(val)); + } case TOK_DOUBLE_AMP: // HACK: Split && into & & lex.putback( Token(TOK_AMP) ); -- cgit v1.2.3