diff options
author | John Hodge <tpg@mutabah.net> | 2016-11-05 16:12:58 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-11-05 16:12:58 +0800 |
commit | 0968bc75215161837f63b0b0e8cdf6c22a794893 (patch) | |
tree | a0b37dac9f3ff011b15aec1b83eceed9fb1e5eb8 /src/parse | |
parent | 87e5aba682a8d6d8123fe66a4165e39a33572a9a (diff) | |
download | mrust-0968bc75215161837f63b0b0e8cdf6c22a794893.tar.gz |
Parse patterns - Handle :expr fragments
Diffstat (limited to 'src/parse')
-rw-r--r-- | src/parse/pattern.cpp | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/parse/pattern.cpp b/src/parse/pattern.cpp index f43a1205..05945bf8 100644 --- a/src/parse/pattern.cpp +++ b/src/parse/pattern.cpp @@ -7,6 +7,7 @@ */ #include "common.hpp" #include "parseerror.hpp" +#include <ast/expr.hpp> // To convert :expr // NEWNODE is needed for the Value pattern type typedef ::std::unique_ptr<AST::ExprNode> ExprNodeP; @@ -237,6 +238,28 @@ AST::Pattern Parse_PatternReal1(TokenStream& lex, bool is_refutable) return AST::Pattern( AST::Pattern::TagValue(), AST::Pattern::Value::make_String( mv$(tok.str()) ) ); case TOK_BYTESTRING: return AST::Pattern( AST::Pattern::TagValue(), AST::Pattern::Value::make_ByteString({ mv$(tok.str()) }) ); + case TOK_INTERPOLATED_EXPR: { + auto e = tok.take_frag_node(); + if( auto* n = dynamic_cast<AST::ExprNode_String*>(e.get()) ) { + return AST::Pattern( AST::Pattern::TagValue(), AST::Pattern::Value::make_String( mv$(n->m_value) ) ); + } + //else if( auto* n = dynamic_cast<AST::ExprNode_ByteString*>(e.get()) ) { + // return AST::Pattern( AST::Pattern::TagValue(), AST::Pattern::Value::make_ByteString( mv$(n->m_value) ) ); + //} + else if( auto* n = dynamic_cast<AST::ExprNode_Bool*>(e.get()) ) { + return AST::Pattern( AST::Pattern::TagValue(), AST::Pattern::Value::make_Integer({CORETYPE_BOOL, n->m_value}) ); + } + else if( auto* n = dynamic_cast<AST::ExprNode_Integer*>(e.get()) ) { + return AST::Pattern( AST::Pattern::TagValue(), AST::Pattern::Value::make_Integer({n->m_datatype, n->m_value}) ); + } + else if( auto* n = dynamic_cast<AST::ExprNode_Float*>(e.get()) ) { + return AST::Pattern( AST::Pattern::TagValue(), AST::Pattern::Value::make_Float({n->m_datatype, n->m_value}) ); + } + else { + TODO(lex.getPosition(), "Convert :expr into a pattern value - " << *e); + } + } break; + case TOK_PAREN_OPEN: return AST::Pattern( AST::Pattern::TagTuple(), Parse_PatternTuple(lex, is_refutable) ); case TOK_SQUARE_OPEN: |