diff options
author | John Hodge <tpg@mutabah.net> | 2016-04-30 13:05:14 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-04-30 13:05:14 +0800 |
commit | 756abd3f2fd768e73a014e190c7a446a3f5aa44c (patch) | |
tree | 77cd0718121eec7d992ea7ea2a06e24bbb49a52d /src/parse/expr.cpp | |
parent | 8f694dbd8ee7b0ea786229642b994a6d00cbe478 (diff) | |
download | mrust-756abd3f2fd768e73a014e190c7a446a3f5aa44c.tar.gz |
Parser - Handle '?', '...', and 'default fn`
Diffstat (limited to 'src/parse/expr.cpp')
-rw-r--r-- | src/parse/expr.cpp | 14 |
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);
|