From 1ac5429531c195755c7e1690912291e20e9a1717 Mon Sep 17 00:00:00 2001 From: "John Hodge (bugs)" Date: Fri, 5 Dec 2014 20:35:11 +0800 Subject: Pattern and impl parsing working --- parse/expr.cpp | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'parse/expr.cpp') diff --git a/parse/expr.cpp b/parse/expr.cpp index 3c6e2199..90a39b04 100644 --- a/parse/expr.cpp +++ b/parse/expr.cpp @@ -39,7 +39,7 @@ AST::Pattern Parse_Pattern(TokenStream& lex) // 1. Identifiers could be either a bind or a value // - If the path resolves to a single node, either a local enum value, or a binding lex.putback(tok); - path = Parse_Path(lex, false, true); + path = Parse_Path(lex, false, PATH_GENERIC_EXPR); if( path.length() == 1 && path[0].args().size() == 0 ) { // Could be a name binding, check the next token @@ -56,13 +56,20 @@ AST::Pattern Parse_Pattern(TokenStream& lex) // 2. Paths are enum/struct names { lex.putback(tok); - path = Parse_Path(lex, true, true); + path = Parse_Path(lex, true, PATH_GENERIC_EXPR); } switch( GET_TOK(tok, lex) ) { - case TOK_PAREN_OPEN: + case TOK_PAREN_OPEN: { // A list of internal patterns - throw ParseError::Todo("nested patterns"); + ::std::vector child_pats; + do { + AST::Pattern pat = Parse_Pattern(lex); + child_pats.push_back(pat); + } while( GET_TOK(tok, lex) == TOK_COMMA ); + CHECK_TOK(tok, TOK_PAREN_CLOSE); + return AST::Pattern(AST::Pattern::TagEnumVariant(), path, child_pats); + } default: lex.putback(tok); return AST::Pattern(AST::Pattern::TagValue(), ExprNode(ExprNode::TagNamedValue(), path)); @@ -70,6 +77,8 @@ AST::Pattern Parse_Pattern(TokenStream& lex) break; case TOK_INTEGER: return AST::Pattern( AST::Pattern::TagValue(), ExprNode(ExprNode::TagInteger(), tok.intval(), tok.datatype()) ); + case TOK_PAREN_OPEN: + throw ParseError::Todo("tuple patterns"); default: throw ParseError::Unexpected(tok); } @@ -177,10 +186,10 @@ AST::ExprNode Parse_ExprBlocks(TokenStream& lex) AST::ExprNode switch_val = Parse_Expr1(lex); GET_CHECK_TOK(tok, lex, TOK_BRACE_OPEN); ::std::vector< ::std::pair > arms; - if( (tok = lex.getToken()).type() == TOK_BRACE_CLOSE ) - throw ParseError::Unexpected(tok, Token(TOK_BRACE_CLOSE)); - lex.putback(tok); do { + if( GET_TOK(tok, lex) == TOK_BRACE_CLOSE ) + break; + lex.putback(tok); AST::Pattern pat = Parse_Pattern(lex); GET_CHECK_TOK(tok, lex, TOK_FATARROW); AST::ExprNode val = Parse_Expr0(lex); @@ -232,7 +241,7 @@ LEFTASSOC(Parse_Expr2, Parse_Expr3, LEFTASSOC(Parse_Expr3, Parse_Expr4, case TOK_DOUBLE_EQUAL: throw ParseError::Todo("expr - equal"); - case TOK_EXLAM_EQUAL: + case TOK_EXCLAM_EQUAL: throw ParseError::Todo("expr - not equal"); ) // 4: Comparisons @@ -298,7 +307,7 @@ AST::ExprNode Parse_Expr12(TokenStream& lex) { case TOK_DASH: throw ParseError::Todo("expr - negate"); - case TOK_EXLAM: + case TOK_EXCLAM: throw ParseError::Todo("expr - logical negate"); case TOK_STAR: throw ParseError::Todo("expr - dereference"); @@ -345,10 +354,10 @@ AST::ExprNode Parse_ExprVal(TokenStream& lex) case TOK_IDENT: // Get path lex.putback(tok); - path = Parse_Path(lex, false, true); + path = Parse_Path(lex, false, PATH_GENERIC_EXPR); if(0) case TOK_DOUBLE_COLON: - path = Parse_Path(lex, true, true); + path = Parse_Path(lex, true, PATH_GENERIC_EXPR); switch( GET_TOK(tok, lex) ) { case TOK_BRACE_OPEN: -- cgit v1.2.3