From a750135a0ac5a42035a1baa808e0af8ae562cd72 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 1 Aug 2018 00:14:26 +0300 Subject: If expr --- src/grammar.ron | 2 ++ src/grammar/expressions.rs | 35 ++++++++++++++++++++++++++++++----- src/syntax_kinds/generated.rs | 6 ++++++ 3 files changed, 38 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/grammar.ron b/src/grammar.ron index a9a3847c9..9912f9698 100644 --- a/src/grammar.ron +++ b/src/grammar.ron @@ -60,6 +60,7 @@ Grammar( "loop", "while", "if", + "else", "match", "const", "static", @@ -134,6 +135,7 @@ Grammar( "LAMBDA_EXPR", "STRUCT_LIT", "STRUCT_LIT_FIELD", + "IF_EXPR", "EXTERN_BLOCK", "ENUM_VARIANT", diff --git a/src/grammar/expressions.rs b/src/grammar/expressions.rs index e2be13a77..ed9236b02 100644 --- a/src/grammar/expressions.rs +++ b/src/grammar/expressions.rs @@ -145,14 +145,16 @@ fn atom_expr(p: &mut Parser) -> Option { return Some(path_expr(p)); } - match p.current() { - L_PAREN => Some(tuple_expr(p)), - PIPE => Some(lambda_expr(p)), + let done = match p.current() { + L_PAREN => tuple_expr(p), + PIPE => lambda_expr(p), + IF_KW => if_expr(p), _ => { p.err_and_bump("expected expression"); - None + return None; } - } + }; + Some(done) } fn tuple_expr(p: &mut Parser) -> CompletedMarker { @@ -182,6 +184,29 @@ fn lambda_expr(p: &mut Parser) -> CompletedMarker { m.complete(p, LAMBDA_EXPR) } +// test if_expr +// fn foo() { +// if true {}; +// if true {} else {}; +// if true {} else if false {} else {} +// } +fn if_expr(p: &mut Parser) -> CompletedMarker { + assert!(p.at(IF_KW)); + let m = p.start(); + p.bump(); + expr(p); + block(p); + if p.at(ELSE_KW) { + p.bump(); + if p.at(IF_KW) { + if_expr(p); + } else { + block(p); + } + } + m.complete(p, IF_EXPR) +} + // test call_expr // fn foo() { // let _ = f(); diff --git a/src/syntax_kinds/generated.rs b/src/syntax_kinds/generated.rs index 2f7c29008..35d9640fa 100644 --- a/src/syntax_kinds/generated.rs +++ b/src/syntax_kinds/generated.rs @@ -61,6 +61,7 @@ pub enum SyntaxKind { LOOP_KW, WHILE_KW, IF_KW, + ELSE_KW, MATCH_KW, CONST_KW, STATIC_KW, @@ -125,6 +126,7 @@ pub enum SyntaxKind { LAMBDA_EXPR, STRUCT_LIT, STRUCT_LIT_FIELD, + IF_EXPR, EXTERN_BLOCK, ENUM_VARIANT, NAMED_FIELD, @@ -223,6 +225,7 @@ impl SyntaxKind { LOOP_KW => &SyntaxInfo { name: "LOOP_KW" }, WHILE_KW => &SyntaxInfo { name: "WHILE_KW" }, IF_KW => &SyntaxInfo { name: "IF_KW" }, + ELSE_KW => &SyntaxInfo { name: "ELSE_KW" }, MATCH_KW => &SyntaxInfo { name: "MATCH_KW" }, CONST_KW => &SyntaxInfo { name: "CONST_KW" }, STATIC_KW => &SyntaxInfo { name: "STATIC_KW" }, @@ -287,6 +290,7 @@ impl SyntaxKind { LAMBDA_EXPR => &SyntaxInfo { name: "LAMBDA_EXPR" }, STRUCT_LIT => &SyntaxInfo { name: "STRUCT_LIT" }, STRUCT_LIT_FIELD => &SyntaxInfo { name: "STRUCT_LIT_FIELD" }, + IF_EXPR => &SyntaxInfo { name: "IF_EXPR" }, EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" }, ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" }, NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" }, @@ -344,6 +348,7 @@ impl SyntaxKind { "loop" => LOOP_KW, "while" => WHILE_KW, "if" => IF_KW, + "else" => ELSE_KW, "match" => MATCH_KW, "const" => CONST_KW, "static" => STATIC_KW, @@ -445,6 +450,7 @@ impl SyntaxKind { LOOP_KW => "loop", WHILE_KW => "while", IF_KW => "if", + ELSE_KW => "else", MATCH_KW => "match", CONST_KW => "const", STATIC_KW => "static", -- cgit v1.2.3