From 0968bc75215161837f63b0b0e8cdf6c22a794893 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 5 Nov 2016 16:12:58 +0800 Subject: Parse patterns - Handle :expr fragments --- src/parse/pattern.cpp | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'src/parse') 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 // To convert :expr // NEWNODE is needed for the Value pattern type typedef ::std::unique_ptr 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(e.get()) ) { + return AST::Pattern( AST::Pattern::TagValue(), AST::Pattern::Value::make_String( mv$(n->m_value) ) ); + } + //else if( auto* n = dynamic_cast(e.get()) ) { + // return AST::Pattern( AST::Pattern::TagValue(), AST::Pattern::Value::make_ByteString( mv$(n->m_value) ) ); + //} + else if( auto* n = dynamic_cast(e.get()) ) { + return AST::Pattern( AST::Pattern::TagValue(), AST::Pattern::Value::make_Integer({CORETYPE_BOOL, n->m_value}) ); + } + else if( auto* n = dynamic_cast(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(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: -- cgit v1.2.3