diff options
author | John Hodge <tpg@mutabah.net> | 2016-02-26 21:45:14 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-02-26 21:45:14 +0800 |
commit | aa03f6016ce7699e167321e127691575aa191a55 (patch) | |
tree | bcd77c3d442c835741be7a8d23a044f8ce2e83b4 | |
parent | e73e8d843b57933e041ffff784d46d8db80a84c6 (diff) | |
download | mrust-aa03f6016ce7699e167321e127691575aa191a55.tar.gz |
Parse/pattern - Cleaner literal handling
-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: |