From 756abd3f2fd768e73a014e190c7a446a3f5aa44c Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 30 Apr 2016 13:05:14 +0800 Subject: Parser - Handle '?', '...', and 'default fn` --- src/parse/expr.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'src/parse/expr.cpp') 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); -- cgit v1.2.3