diff options
author | John Hodge <tpg@mutabah.net> | 2015-03-10 15:37:02 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2015-03-10 15:37:02 +0800 |
commit | e71fccd80610bc05b0a90338b2b3beb9a0b94c22 (patch) | |
tree | 22162a90d614a200483bd0ceae629671ff798e41 /src/parse/expr.cpp | |
parent | 65558948954daaa2aec68b76814b043bf829d608 (diff) | |
download | mrust-e71fccd80610bc05b0a90338b2b3beb9a0b94c22.tar.gz |
Rework macro handling to support correct repetitions
Diffstat (limited to 'src/parse/expr.cpp')
-rw-r--r-- | src/parse/expr.cpp | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index 7fb41b0f..be4d67a6 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -356,22 +356,34 @@ ExprNodeP Parse_Expr_Match(TokenStream& lex) Token tok;
// 1. Get expression
- ExprNodeP switch_val = Parse_Expr1(lex);
+ ExprNodeP switch_val;
+ {
+ SET_PARSE_FLAG(lex, disallow_struct_literal);
+ switch_val = Parse_Expr1(lex);
+ }
GET_CHECK_TOK(tok, lex, TOK_BRACE_OPEN);
- ::std::vector< ::std::pair<AST::Pattern, ExprNodeP> > arms;
+ ::std::vector< AST::ExprNode_Match::Arm > arms;
do {
if( GET_TOK(tok, lex) == TOK_BRACE_CLOSE )
break;
lex.putback(tok);
- AST::Pattern pat = Parse_Pattern(lex);
+ AST::ExprNode_Match::Arm arm;
+ do {
+ arm.m_patterns.push_back( Parse_Pattern(lex) );
+ } while( GET_TOK(tok, lex) == TOK_PIPE );
- GET_CHECK_TOK(tok, lex, TOK_FATARROW);
+ if( tok.type() == TOK_RWORD_IF )
+ {
+ arm.m_cond = Parse_Expr1(lex);
+ GET_TOK(tok, lex);
+ }
+ CHECK_TOK(tok, TOK_FATARROW);
bool opt_semicolon = false;
- ExprNodeP val = Parse_Stmt(lex, opt_semicolon);
+ arm.m_code = Parse_Stmt(lex, opt_semicolon);
- arms.push_back( ::std::make_pair( ::std::move(pat), ::std::move(val) ) );
+ arms.push_back( ::std::move(arm) );
if( GET_TOK(tok, lex) == TOK_COMMA )
continue;
@@ -708,6 +720,9 @@ TokenTree Parse_TT(TokenStream& lex, bool unwrapped) case TOK_BRACE_OPEN:
closer = TOK_BRACE_CLOSE;
break;
+ case TOK_EOF:
+ case TOK_NULL:
+ throw ParseError::Unexpected(lex, tok);
default:
return TokenTree(tok);
}
@@ -717,6 +732,8 @@ TokenTree Parse_TT(TokenStream& lex, bool unwrapped) items.push_back(tok);
while(GET_TOK(tok, lex) != closer && tok.type() != TOK_EOF)
{
+ if( tok.type() == TOK_NULL )
+ throw ParseError::Unexpected(lex, tok);
lex.putback(tok);
items.push_back(Parse_TT(lex, false));
}
|