diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ast/expr.hpp | 5 | ||||
-rw-r--r-- | src/parse/expr.cpp | 15 |
2 files changed, 19 insertions, 1 deletions
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;
}
}
|