diff options
author | Aleksey Kladov <[email protected]> | 2018-07-31 22:14:26 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-07-31 22:14:26 +0100 |
commit | a750135a0ac5a42035a1baa808e0af8ae562cd72 (patch) | |
tree | aa36d394a72cb4c41107152e5dabf255118dc92b /src | |
parent | a31cb829ed763f9dd1fcf422469eedd3402e5fbc (diff) |
If expr
Diffstat (limited to 'src')
-rw-r--r-- | src/grammar.ron | 2 | ||||
-rw-r--r-- | src/grammar/expressions.rs | 35 | ||||
-rw-r--r-- | src/syntax_kinds/generated.rs | 6 |
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 | ||
158 | fn tuple_expr(p: &mut Parser) -> CompletedMarker { | 160 | fn 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 | // } | ||
193 | fn 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", |