aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2018-07-31 22:14:26 +0100
committerAleksey Kladov <[email protected]>2018-07-31 22:14:26 +0100
commita750135a0ac5a42035a1baa808e0af8ae562cd72 (patch)
treeaa36d394a72cb4c41107152e5dabf255118dc92b /src
parenta31cb829ed763f9dd1fcf422469eedd3402e5fbc (diff)
If expr
Diffstat (limited to 'src')
-rw-r--r--src/grammar.ron2
-rw-r--r--src/grammar/expressions.rs35
-rw-r--r--src/syntax_kinds/generated.rs6
3 files changed, 38 insertions, 5 deletions
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(
60 "loop", 60 "loop",
61 "while", 61 "while",
62 "if", 62 "if",
63 "else",
63 "match", 64 "match",
64 "const", 65 "const",
65 "static", 66 "static",
@@ -134,6 +135,7 @@ Grammar(
134 "LAMBDA_EXPR", 135 "LAMBDA_EXPR",
135 "STRUCT_LIT", 136 "STRUCT_LIT",
136 "STRUCT_LIT_FIELD", 137 "STRUCT_LIT_FIELD",
138 "IF_EXPR",
137 139
138 "EXTERN_BLOCK", 140 "EXTERN_BLOCK",
139 "ENUM_VARIANT", 141 "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<CompletedMarker> {
145 return Some(path_expr(p)); 145 return Some(path_expr(p));
146 } 146 }
147 147
148 match p.current() { 148 let done = match p.current() {
149 L_PAREN => Some(tuple_expr(p)), 149 L_PAREN => tuple_expr(p),
150 PIPE => Some(lambda_expr(p)), 150 PIPE => lambda_expr(p),
151 IF_KW => if_expr(p),
151 _ => { 152 _ => {
152 p.err_and_bump("expected expression"); 153 p.err_and_bump("expected expression");
153 None 154 return None;
154 } 155 }
155 } 156 };
157 Some(done)
156} 158}
157 159
158fn tuple_expr(p: &mut Parser) -> CompletedMarker { 160fn tuple_expr(p: &mut Parser) -> CompletedMarker {
@@ -182,6 +184,29 @@ fn lambda_expr(p: &mut Parser) -> CompletedMarker {
182 m.complete(p, LAMBDA_EXPR) 184 m.complete(p, LAMBDA_EXPR)
183} 185}
184 186
187// test if_expr
188// fn foo() {
189// if true {};
190// if true {} else {};
191// if true {} else if false {} else {}
192// }
193fn if_expr(p: &mut Parser) -> CompletedMarker {
194 assert!(p.at(IF_KW));
195 let m = p.start();
196 p.bump();
197 expr(p);
198 block(p);
199 if p.at(ELSE_KW) {
200 p.bump();
201 if p.at(IF_KW) {
202 if_expr(p);
203 } else {
204 block(p);
205 }
206 }
207 m.complete(p, IF_EXPR)
208}
209
185// test call_expr 210// test call_expr
186// fn foo() { 211// fn foo() {
187// let _ = f(); 212// 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 {
61 LOOP_KW, 61 LOOP_KW,
62 WHILE_KW, 62 WHILE_KW,
63 IF_KW, 63 IF_KW,
64 ELSE_KW,
64 MATCH_KW, 65 MATCH_KW,
65 CONST_KW, 66 CONST_KW,
66 STATIC_KW, 67 STATIC_KW,
@@ -125,6 +126,7 @@ pub enum SyntaxKind {
125 LAMBDA_EXPR, 126 LAMBDA_EXPR,
126 STRUCT_LIT, 127 STRUCT_LIT,
127 STRUCT_LIT_FIELD, 128 STRUCT_LIT_FIELD,
129 IF_EXPR,
128 EXTERN_BLOCK, 130 EXTERN_BLOCK,
129 ENUM_VARIANT, 131 ENUM_VARIANT,
130 NAMED_FIELD, 132 NAMED_FIELD,
@@ -223,6 +225,7 @@ impl SyntaxKind {
223 LOOP_KW => &SyntaxInfo { name: "LOOP_KW" }, 225 LOOP_KW => &SyntaxInfo { name: "LOOP_KW" },
224 WHILE_KW => &SyntaxInfo { name: "WHILE_KW" }, 226 WHILE_KW => &SyntaxInfo { name: "WHILE_KW" },
225 IF_KW => &SyntaxInfo { name: "IF_KW" }, 227 IF_KW => &SyntaxInfo { name: "IF_KW" },
228 ELSE_KW => &SyntaxInfo { name: "ELSE_KW" },
226 MATCH_KW => &SyntaxInfo { name: "MATCH_KW" }, 229 MATCH_KW => &SyntaxInfo { name: "MATCH_KW" },
227 CONST_KW => &SyntaxInfo { name: "CONST_KW" }, 230 CONST_KW => &SyntaxInfo { name: "CONST_KW" },
228 STATIC_KW => &SyntaxInfo { name: "STATIC_KW" }, 231 STATIC_KW => &SyntaxInfo { name: "STATIC_KW" },
@@ -287,6 +290,7 @@ impl SyntaxKind {
287 LAMBDA_EXPR => &SyntaxInfo { name: "LAMBDA_EXPR" }, 290 LAMBDA_EXPR => &SyntaxInfo { name: "LAMBDA_EXPR" },
288 STRUCT_LIT => &SyntaxInfo { name: "STRUCT_LIT" }, 291 STRUCT_LIT => &SyntaxInfo { name: "STRUCT_LIT" },
289 STRUCT_LIT_FIELD => &SyntaxInfo { name: "STRUCT_LIT_FIELD" }, 292 STRUCT_LIT_FIELD => &SyntaxInfo { name: "STRUCT_LIT_FIELD" },
293 IF_EXPR => &SyntaxInfo { name: "IF_EXPR" },
290 EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" }, 294 EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" },
291 ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" }, 295 ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
292 NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" }, 296 NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
@@ -344,6 +348,7 @@ impl SyntaxKind {
344 "loop" => LOOP_KW, 348 "loop" => LOOP_KW,
345 "while" => WHILE_KW, 349 "while" => WHILE_KW,
346 "if" => IF_KW, 350 "if" => IF_KW,
351 "else" => ELSE_KW,
347 "match" => MATCH_KW, 352 "match" => MATCH_KW,
348 "const" => CONST_KW, 353 "const" => CONST_KW,
349 "static" => STATIC_KW, 354 "static" => STATIC_KW,
@@ -445,6 +450,7 @@ impl SyntaxKind {
445 LOOP_KW => "loop", 450 LOOP_KW => "loop",
446 WHILE_KW => "while", 451 WHILE_KW => "while",
447 IF_KW => "if", 452 IF_KW => "if",
453 ELSE_KW => "else",
448 MATCH_KW => "match", 454 MATCH_KW => "match",
449 CONST_KW => "const", 455 CONST_KW => "const",
450 STATIC_KW => "static", 456 STATIC_KW => "static",