diff options
author | John Hodge <tpg@mutabah.net> | 2016-02-27 08:37:15 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-02-27 08:37:15 +0800 |
commit | e73e93f6d7d2d8cbc45eac2921e37bea589f8e4f (patch) | |
tree | 78b83a71d886be25958a8fca484e6bd02b6d3e4e /src | |
parent | 11dfb163601c8cc71f7b0ee9f9103b5b9cf72706 (diff) | |
download | mrust-e73e93f6d7d2d8cbc45eac2921e37bea589f8e4f.tar.gz |
Parse/pattern - IDENT ... IDENT
Diffstat (limited to 'src')
-rw-r--r-- | src/parse/pattern.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/parse/pattern.cpp b/src/parse/pattern.cpp index 682f7d46..88abe196 100644 --- a/src/parse/pattern.cpp +++ b/src/parse/pattern.cpp @@ -21,6 +21,9 @@ AST::Pattern Parse_PatternReal_Path(TokenStream& lex, AST::Path path, bool is_re AST::Pattern Parse_PatternReal(TokenStream& lex, bool is_refutable); AST::Pattern Parse_PatternStruct(TokenStream& lex, AST::Path path, bool is_refutable); +AST::Pattern Parse_PatternReal(TokenStream& lex, bool is_refutable); +AST::Pattern Parse_PatternReal1(TokenStream& lex, bool is_refutable); + /// Parse a pattern /// @@ -97,6 +100,15 @@ AST::Pattern Parse_Pattern(TokenStream& lex, bool is_refutable) case TOK_PAREN_OPEN: lex.putback(tok); return Parse_PatternReal_Path(lex, path, is_refutable); + // - If the next token is a `...`, it's a constant + case TOK_TRIPLE_DOT: { + auto leftval = NEWNODE(AST::ExprNode_NamedValue, ::std::move(path)); + auto right_pat = Parse_PatternReal1(lex, is_refutable); + if( !right_pat.data().is_Value() ) + throw ParseError::Generic(lex, "Using '...' with a non-value on right"); + auto rightval = right_pat.take_node(); + return AST::Pattern(AST::Pattern::TagValue(), ::std::move(leftval), ::std::move(rightval)); + } // - Else, treat as a MaybeBind default: lex.putback(tok); @@ -125,9 +137,6 @@ AST::Pattern Parse_Pattern(TokenStream& lex, bool is_refutable) return ::std::move(pat); } -AST::Pattern Parse_PatternReal(TokenStream& lex, bool is_refutable); -AST::Pattern Parse_PatternReal1(TokenStream& lex, bool is_refutable); - AST::Pattern Parse_PatternReal(TokenStream& lex, bool is_refutable) { Token tok; |