diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/parse/pattern.cpp | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/src/parse/pattern.cpp b/src/parse/pattern.cpp index 2d3a0615..682f7d46 100644 --- a/src/parse/pattern.cpp +++ b/src/parse/pattern.cpp @@ -181,13 +181,27 @@ AST::Pattern Parse_PatternReal1(TokenStream& lex, bool is_refutable) case TOK_DOUBLE_COLON: // 2. Paths are enum/struct names return Parse_PatternReal_Path( lex, Parse_Path(lex, true, PATH_GENERIC_EXPR), is_refutable ); - case TOK_DASH: { - GET_CHECK_TOK(tok, lex, TOK_INTEGER); - auto dt = tok.datatype(); - if(dt == CORETYPE_ANY) - dt = CORETYPE_I32; - return AST::Pattern( AST::Pattern::TagValue(), NEWNODE(AST::ExprNode_Integer, -tok.intval(), dt) ); + case TOK_DASH: + if(GET_TOK(tok, lex) == TOK_INTEGER) + { + auto dt = tok.datatype(); + if(dt == CORETYPE_ANY) + dt = CORETYPE_I32; + return AST::Pattern( AST::Pattern::TagValue(), NEWNODE(AST::ExprNode_Integer, -tok.intval(), dt) ); + } + else if( tok.type() == TOK_FLOAT ) + { + auto dt = tok.datatype(); + if(dt == CORETYPE_ANY) + dt = CORETYPE_F32; + return AST::Pattern( AST::Pattern::TagValue(), NEWNODE(AST::ExprNode_Float, -tok.floatval(), dt) ); + } + else + { + throw ParseError::Unexpected(lex, tok, {TOK_INTEGER, TOK_FLOAT}); } + case TOK_FLOAT: + return AST::Pattern( AST::Pattern::TagValue(), NEWNODE(AST::ExprNode_Float, tok.floatval(), tok.datatype()) ); case TOK_INTEGER: return AST::Pattern( AST::Pattern::TagValue(), NEWNODE(AST::ExprNode_Integer, tok.intval(), tok.datatype()) ); case TOK_RWORD_TRUE: |