From a735e91e2f1ff8c688e9f8403860f8ef5bd74606 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Tue, 23 Feb 2016 18:29:22 +1100 Subject: Parse - Expression attributes --- src/ast/expr.hpp | 5 +++++ src/parse/expr.cpp | 15 ++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/ast/expr.hpp b/src/ast/expr.hpp index 96b83381..2b2a89f5 100644 --- a/src/ast/expr.hpp +++ b/src/ast/expr.hpp @@ -22,6 +22,7 @@ class ExprNode: public Serialisable { TypeRef m_res_type; + MetaItems m_attrs; Position m_pos; public: virtual ~ExprNode() = 0; @@ -32,6 +33,10 @@ public: void set_pos(Position p) { m_pos = ::std::move(p); } const Position& get_pos() const { return m_pos; } + + void set_attrs(MetaItems&& mi) { + m_attrs = mv$(mi); + } TypeRef& get_res_type() { return m_res_type; } diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index f253293d..47443ee1 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -202,6 +202,8 @@ ExprNodeP Parse_ExprBlockNode(TokenStream& lex) lex.putback(tok); bool expect_end = false; nodes.push_back(Parse_ExprBlockLine(lex, &expect_end)); + // TODO: VVV + //nodes.back().set_attrs( item_attrs ); // Set to TRUE if there was no semicolon after a statement if( expect_end ) { @@ -615,6 +617,14 @@ ExprNodeP Parse_Expr0(TokenStream& lex) { TRACE_FUNCTION; Token tok; + + ::AST::MetaItems expr_attrs; + while( LOOK_AHEAD(lex) == TOK_ATTR_OPEN ) + { + GET_TOK(tok, lex); + expr_attrs.push_back( Parse_MetaItem(lex) ); + GET_CHECK_TOK(tok, lex, TOK_SQUARE_CLOSE); + } ExprNodeP rv = Parse_Expr1(lex); auto op = AST::ExprNode_Assign::NONE; @@ -645,10 +655,13 @@ ExprNodeP Parse_Expr0(TokenStream& lex) case TOK_EQUAL: op = AST::ExprNode_Assign::NONE; - return NEWNODE( AST::ExprNode_Assign, op, ::std::move(rv), Parse_Expr0(lex) ); + rv = NEWNODE( AST::ExprNode_Assign, op, ::std::move(rv), Parse_Expr0(lex) ); + rv->set_attrs(mv$(expr_attrs)); + return rv; default: lex.putback(tok); + rv->set_attrs(mv$(expr_attrs)); return rv; } } -- cgit v1.2.3