@@ -60,7 +60,7 @@ pub(crate) enum Expression<'src> {
60
60
right : Box < Expression < ' src > > ,
61
61
} ,
62
62
Function {
63
- expr : Option < Box < Expression < ' src > > > ,
63
+ expr : Option < Box < Expression < ' src > > > ,
64
64
name : & ' src str ,
65
65
arguments : Vec < Expression < ' src > > ,
66
66
} ,
@@ -184,17 +184,23 @@ impl<'src> Function<'src> {
184
184
match tokens. next ( ) {
185
185
Some ( ( Token :: BracketRoundOpen , l, c) ) => match tokens. next ( ) {
186
186
Some ( ( Token :: BracketRoundClose , ..) ) => ( ) ,
187
- Some ( ( pre, ..) ) => {
187
+ Some ( ( mut pre, ..) ) => {
188
188
loop {
189
189
let ( expr, last_tk) = Expression :: parse ( pre, tokens) ?;
190
190
args. push ( expr) ;
191
191
match last_tk {
192
192
Some ( Token :: Comma ) => ( ) ,
193
193
Some ( Token :: BracketRoundClose ) => break ,
194
+ None => err ! ( UnexpectedEOF , 0 , 0 ) ,
194
195
tk => {
195
196
panic ! ( "Expression did not parse all tokens: {:?}" , tk)
196
197
}
197
198
}
199
+ pre = if let Some ( ( tk, ..) ) = tokens. next ( ) {
200
+ tk
201
+ } else {
202
+ err ! ( UnexpectedEOF , 0 , 0 ) ;
203
+ } ;
198
204
}
199
205
lines. push ( Statement :: Call { func : name, args } ) ;
200
206
}
@@ -245,6 +251,7 @@ impl<'src> Function<'src> {
245
251
}
246
252
}
247
253
Some ( ( Token :: Indent ( 0 ) , ..) ) | None => return Ok ( ( lines, 0 ) ) ,
254
+ Some ( ( Token :: Indent ( i) , ..) ) if i < expected_indent => return Ok ( ( lines, 0 ) ) ,
248
255
Some ( ( Token :: Indent ( i) , ..) ) if i == expected_indent => ( ) ,
249
256
Some ( ( Token :: Indent ( i) , l, c) ) => err ! ( UnexpectedIndent , i, l, c) ,
250
257
Some ( ( tk, ..) ) => todo ! ( "{:?}" , tk) ,
@@ -293,8 +300,15 @@ impl<'src> Expression<'src> {
293
300
None => err ! ( UnexpectedEOF , 0 , 0 ) ,
294
301
}
295
302
}
296
- let expr = None ;
297
- ( Expression :: Function { expr, name, arguments } , None )
303
+ let expr = None ;
304
+ (
305
+ Expression :: Function {
306
+ expr,
307
+ name,
308
+ arguments,
309
+ } ,
310
+ None ,
311
+ )
298
312
}
299
313
Some ( ( tk, ..) ) => ( Expression :: Atom ( Atom :: Name ( name) ) , Some ( tk) ) ,
300
314
e => todo ! ( "{:?}" , e) ,
@@ -305,7 +319,7 @@ impl<'src> Expression<'src> {
305
319
match last_tk {
306
320
Token :: Op ( opl) => match tokens. next ( ) {
307
321
Some ( ( Token :: Name ( mid) , ..) ) => {
308
- let og_mid = mid;
322
+ let og_mid = mid;
309
323
let mid = Expression :: Atom ( Atom :: Name ( mid) ) ;
310
324
match tokens. next ( ) {
311
325
Some ( ( Token :: Op ( opr) , ..) ) => match tokens. next ( ) {
@@ -335,20 +349,21 @@ impl<'src> Expression<'src> {
335
349
}
336
350
e => todo ! ( "{:?}" , e) ,
337
351
} ,
338
- Some ( ( Token :: BracketRoundOpen , ..) ) => {
339
- // FIXME handle function args & check for ending brace
340
- tokens. next ( ) ;
341
- match opl {
342
- Op :: Access => {
343
- Ok ( ( Expression :: Function {
344
- expr : Some ( Box :: new ( lhs) ) ,
345
- name : og_mid,
346
- arguments : Vec :: new ( ) ,
347
- } , Some ( Token :: BracketRoundClose ) ) )
348
- }
349
- e => todo ! ( "{:?}" , e) ,
350
- }
351
- }
352
+ Some ( ( Token :: BracketRoundOpen , ..) ) => {
353
+ // FIXME handle function args & check for ending brace
354
+ tokens. next ( ) ;
355
+ match opl {
356
+ Op :: Access => Ok ( (
357
+ Expression :: Function {
358
+ expr : Some ( Box :: new ( lhs) ) ,
359
+ name : og_mid,
360
+ arguments : Vec :: new ( ) ,
361
+ } ,
362
+ Some ( Token :: BracketRoundClose ) ,
363
+ ) ) ,
364
+ e => todo ! ( "{:?}" , e) ,
365
+ }
366
+ }
352
367
Some ( ( tk, ..) ) if tk == Token :: BracketRoundClose => Ok ( (
353
368
Expression :: Operation {
354
369
left : Box :: new ( lhs) ,
@@ -379,8 +394,7 @@ impl<'src> Expression<'src> {
379
394
}
380
395
Some ( ( Token :: Comma , ..) ) => return Ok ( ( lhs, Some ( Token :: Comma ) ) ) ,
381
396
Some ( ( Token :: Indent ( i) , ..) ) => return Ok ( ( lhs, Some ( Token :: Indent ( i) ) ) ) ,
382
- Some ( ( tk, ..) ) => todo ! ( "{:?}" , tk) ,
383
- None => todo ! ( "none" ) ,
397
+ e => todo ! ( "{:?}" , e) ,
384
398
}
385
399
}
386
400
}
0 commit comments