summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-02-26 21:45:14 +0800
committerJohn Hodge <tpg@mutabah.net>2016-02-26 21:45:14 +0800
commitaa03f6016ce7699e167321e127691575aa191a55 (patch)
treebcd77c3d442c835741be7a8d23a044f8ce2e83b4
parente73e8d843b57933e041ffff784d46d8db80a84c6 (diff)
downloadmrust-aa03f6016ce7699e167321e127691575aa191a55.tar.gz
Parse/pattern - Cleaner literal handling
-rw-r--r--src/parse/pattern.cpp26
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: