diff options
author | John Hodge <tpg@mutabah.net> | 2015-03-19 14:48:41 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2015-03-19 14:48:41 +0800 |
commit | e34c31e1090fe83b70dc98b8d16bbbbc29c33517 (patch) | |
tree | 3dfa0832a8ae8b26395ed77b0cd395f08cbfc3f8 | |
parent | 01b1749e3b008e0f11219c842da1492f1e42aba1 (diff) | |
download | mrust-e34c31e1090fe83b70dc98b8d16bbbbc29c33517.tar.gz |
Struct patterns, return with no semicolon
-rw-r--r-- | src/ast/pattern.hpp | 9 | ||||
-rw-r--r-- | src/parse/expr.cpp | 10 |
2 files changed, 12 insertions, 7 deletions
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<Pattern> 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<Pattern> 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:
|