summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2015-03-19 14:48:41 +0800
committerJohn Hodge <tpg@mutabah.net>2015-03-19 14:48:41 +0800
commite34c31e1090fe83b70dc98b8d16bbbbc29c33517 (patch)
tree3dfa0832a8ae8b26395ed77b0cd395f08cbfc3f8 /src
parent01b1749e3b008e0f11219c842da1492f1e42aba1 (diff)
downloadmrust-e34c31e1090fe83b70dc98b8d16bbbbc29c33517.tar.gz
Struct patterns, return with no semicolon
Diffstat (limited to 'src')
-rw-r--r--src/ast/pattern.hpp9
-rw-r--r--src/parse/expr.cpp10
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: