summaryrefslogtreecommitdiff
path: root/src/parse/expr.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-04-30 13:05:14 +0800
committerJohn Hodge <tpg@mutabah.net>2016-04-30 13:05:14 +0800
commit756abd3f2fd768e73a014e190c7a446a3f5aa44c (patch)
tree77cd0718121eec7d992ea7ea2a06e24bbb49a52d /src/parse/expr.cpp
parent8f694dbd8ee7b0ea786229642b994a6d00cbe478 (diff)
downloadmrust-756abd3f2fd768e73a014e190c7a446a3f5aa44c.tar.gz
Parser - Handle '?', '...', and 'default fn`
Diffstat (limited to 'src/parse/expr.cpp')
-rw-r--r--src/parse/expr.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp
index 58c82a0b..407afbf3 100644
--- a/src/parse/expr.cpp
+++ b/src/parse/expr.cpp
@@ -578,12 +578,12 @@ bool Parse_IsTokValue(eTokenType tok_type)
}
}
-ExprNodeP Parse_Expr1_5(TokenStream& lex);
+ExprNodeP Parse_Expr1_1(TokenStream& lex);
// Very evil handling for '..'
ExprNodeP Parse_Expr1(TokenStream& lex)
{
Token tok;
- ExprNodeP (*next)(TokenStream&) = Parse_Expr1_5;
+ ExprNodeP (*next)(TokenStream&) = Parse_Expr1_1;
ExprNodeP left, right;
if( GET_TOK(tok, lex) != TOK_DOUBLE_DOT )
@@ -610,6 +610,12 @@ ExprNodeP Parse_Expr1(TokenStream& lex)
return NEWNODE( AST::ExprNode_BinOp, AST::ExprNode_BinOp::RANGE, ::std::move(left), ::std::move(right) );
}
+// TODO: Is this left associative?
+LEFTASSOC(Parse_Expr1_1, Parse_Expr1_5,
+ case TOK_TRIPLE_DOT:
+ rv = NEWNODE( AST::ExprNode_BinOp, AST::ExprNode_BinOp::RANGE_INC, mv$(rv), next(lex) );
+ break;
+)
// 1: Bool OR
LEFTASSOC(Parse_Expr1_5, Parse_Expr2,
case TOK_DOUBLE_PIPE:
@@ -765,6 +771,10 @@ ExprNodeP Parse_ExprFC(TokenStream& lex)
Token tok;
switch(GET_TOK(tok, lex))
{
+ case TOK_QMARK:
+ val = NEWNODE( AST::ExprNode_UniOp, AST::ExprNode_UniOp::QMARK, mv$(val) );
+ break;
+
case TOK_PAREN_OPEN:
// Expression method call
lex.putback(tok);