From e34c31e1090fe83b70dc98b8d16bbbbc29c33517 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Thu, 19 Mar 2015 14:48:41 +0800 Subject: Struct patterns, return with no semicolon --- src/ast/pattern.hpp | 9 +++++++-- src/parse/expr.cpp | 10 +++++----- 2 files changed, 12 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/ast/pattern.hpp b/src/ast/pattern.hpp index 355b5c2a..299a26a6 100644 --- a/src/ast/pattern.hpp +++ b/src/ast/pattern.hpp @@ -68,12 +68,17 @@ public: struct TagTuple {}; Pattern(TagTuple, ::std::vector sub_patterns): - m_data( Data::make_Tuple( { ::std::move(sub_patterns) } ) ) + m_data( Data::make_Tuple( { ::std::move(sub_patterns) } ) ) {} struct TagEnumVariant {}; Pattern(TagEnumVariant, Path path, ::std::vector sub_patterns): - m_data( Data::make_StructTuple( { ::std::move(path), ::std::move(sub_patterns) } ) ) + m_data( Data::make_StructTuple( { ::std::move(path), ::std::move(sub_patterns) } ) ) + {} + + struct TagStruct {}; + Pattern(TagStruct, Path path, ::std::vector< ::std::pair< ::std::string,Pattern> > sub_patterns): + m_data( Data::make_Struct( { ::std::move(path), ::std::move(sub_patterns) } ) ) {} // Mutators diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index af044ab3..7f600385 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -236,6 +236,8 @@ AST::Pattern Parse_PatternStruct(TokenStream& lex, AST::Path path) { TRACE_FUNCTION; Token tok; + + ::std::vector< ::std::pair< ::std::string, AST::Pattern> > subpats; do { GET_TOK(tok, lex); DEBUG("tok = " << tok); @@ -272,7 +274,8 @@ AST::Pattern Parse_PatternStruct(TokenStream& lex, AST::Path path) // TODO: Append } while( GET_TOK(tok, lex) == TOK_COMMA ); CHECK_TOK(tok, TOK_BRACE_CLOSE); - throw ParseError::Todo(lex, "struct patterns"); + + return AST::Pattern(AST::Pattern::TagStruct(), ::std::move(path), ::std::move(subpats)); } ExprNodeP Parse_ExprBlockNode(TokenStream& lex); @@ -696,12 +699,9 @@ ExprNodeP Parse_Stmt(TokenStream& lex) { case TOK_RWORD_RETURN: { ExprNodeP val; - if( GET_TOK(tok, lex) != TOK_SEMICOLON ) { - lex.putback(tok); + if( LOOK_AHEAD(lex) != TOK_SEMICOLON && LOOK_AHEAD(lex) != TOK_COMMA && LOOK_AHEAD(lex) != TOK_BRACE_CLOSE ) { val = Parse_Expr1(lex); } - else - lex.putback(tok); return NEWNODE( AST::ExprNode_Flow, AST::ExprNode_Flow::RETURN, "", ::std::move(val) ); } case TOK_RWORD_CONTINUE: -- cgit v1.2.3