@@ -318,6 +318,7 @@ BLOCKS :: { [ Block A0 ] } : BLOCKS BLOCK { $2 : $1 } | {- EMPTY -} { [ ] }
318
318
BLOCK :: { Block A0 }
319
319
: IF_BLOCK MAYBE_COMMENT NEWLINE { $ 1 }
320
320
| CASE_BLOCK MAYBE_COMMENT NEWLINE { $ 1 }
321
+ | DO_BLOCK MAYBE_COMMENT NEWLINE { $ 1 }
321
322
| INTEGER_LITERAL STATEMENT MAYBE_COMMENT NEWLINE
322
323
{ BlStatement () (getTransSpan $ 1 $ 2 ) (Just $ 1 ) $ 2 }
323
324
| STATEMENT MAYBE_COMMENT NEWLINE { BlStatement () (getSpan $ 1 ) Nothing $ 1 }
@@ -328,7 +329,6 @@ BLOCK :: { Block A0 }
328
329
| COMMENT_BLOCK { $ 1 }
329
330
330
331
IF_BLOCK :: { Block A0 }
331
- IF_BLOCK
332
332
: if ' (' EXPRESSION ' )' then MAYBE_COMMENT NEWLINE BLOCKS ELSE_BLOCKS
333
333
{ let { startSpan = getSpan $ 1 ;
334
334
(endSpan, conds, blocks, endLabel) = $ 9 ;
@@ -354,7 +354,6 @@ IF_BLOCK
354
354
in BlIf () span startLabel (Just startName) ((Just $ 6 ): conds) ((reverse $ 11 ): blocks) endLabel }
355
355
356
356
ELSE_BLOCKS :: { (SrcSpan , [Maybe (Expression A0 )], [[Block A0 ]], Maybe (Expression A0 )) }
357
- ELSE_BLOCKS
358
357
: maybe (INTEGER_LITERAL ) elsif ' (' EXPRESSION ' )' then MAYBE_COMMENT NEWLINE BLOCKS ELSE_BLOCKS
359
358
{ let (endSpan, conds, blocks, endLabel) = $ 10
360
359
in (endSpan, Just $ 4 : conds, reverse $ 9 : blocks, endLabel) }
@@ -364,14 +363,12 @@ ELSE_BLOCKS
364
363
| END_IF { let (endSpan, endLabel) = $ 1 in (endSpan, [] , [] , endLabel) }
365
364
366
365
END_IF :: { (SrcSpan , Maybe (Expression A0 )) }
367
- END_IF
368
366
: endif { (getSpan $ 1 , Nothing ) }
369
367
| endif id { (getSpan $ 2 , Nothing ) }
370
368
| INTEGER_LITERAL endif { (getSpan $ 2 , Just $ 1 ) }
371
369
| INTEGER_LITERAL endif id { (getSpan $ 3 , Just $ 1 ) }
372
370
373
371
CASE_BLOCK :: { Block A0 }
374
- CASE_BLOCK
375
372
: selectcase ' (' EXPRESSION ' )' MAYBE_COMMENT NEWLINE CASES
376
373
{ let { (caseRanges, blocks, endLabel, endSpan) = $ 7 ;
377
374
span = getTransSpan $ 1 endSpan }
@@ -414,6 +411,39 @@ END_SELECT :: { (Maybe (Expression A0), SrcSpan) }
414
411
: maybe (INTEGER_LITERAL ) endselect maybe (id )
415
412
{ ($ 1 , maybe (getSpan $ 2 ) getSpan $ 3 ) }
416
413
414
+ DO_BLOCK :: { Block A0 }
415
+ : START_DO MAYBE_COMMENT NEWLINE BLOCKS END_DO
416
+ {% let { (startSpan, startConstruct, startLabel) = $ 1 ;
417
+ (endSpan, endConstruct, endLabel) = $ 5 ; }
418
+ in if startConstruct /= endConstruct
419
+ then fail $ " Unexpected id for end do " <> show endConstruct <> " at " <> show endSpan
420
+ else return $ BlDo () (getTransSpan startSpan endSpan) startLabel startConstruct Nothing Nothing (reverse $ 4 ) endLabel }
421
+ | START_DO DO_SPECIFICATION MAYBE_COMMENT NEWLINE BLOCKS END_DO
422
+ {% let { (startSpan, startConstruct, startLabel) = $ 1 ;
423
+ (endSpan, endConstruct, endLabel) = $ 6 ; }
424
+ in if startConstruct /= endConstruct
425
+ then fail $ " Unexpected id for end do " <> show endConstruct <> " at " <> show endSpan
426
+ else return $ BlDo () (getTransSpan startSpan endSpan) startLabel startConstruct Nothing (Just $ 2 ) (reverse $ 5 ) endLabel }
427
+ | START_DO while ' (' EXPRESSION ' )' MAYBE_COMMENT NEWLINE BLOCKS END_DO
428
+ {% let { (startSpan, startConstruct, startLabel) = $ 1 ;
429
+ (endSpan, endConstruct, endLabel) = $ 9 ; }
430
+ in if startConstruct /= endConstruct
431
+ then fail $ " Unexpected id for end do " <> show endConstruct <> " at " <> show endSpan
432
+ else return $ BlDoWhile () (getTransSpan startSpan endSpan) startLabel startConstruct Nothing $ 4 (reverse $ 8 ) endLabel
433
+ }
434
+
435
+ START_DO :: { (SrcSpan , Maybe String , Maybe (Expression A0 )) }
436
+ : do { (getSpan $ 1 , Nothing , Nothing )}
437
+ | id ' :' do { let TId s id = $ 1 in (s, Just id , Nothing ) }
438
+ | INTEGER_LITERAL do { (getSpan $ 1 , Nothing , Just $ 1 ) }
439
+ | INTEGER_LITERAL id ' :' do { let TId _ id = $ 2 in (getSpan $ 1 , Just id , Just $ 1 ) }
440
+
441
+ END_DO :: { (SrcSpan , Maybe String , Maybe (Expression A0 )) }
442
+ : enddo { (getSpan $ 1 , Nothing , Nothing ) }
443
+ | INTEGER_LITERAL enddo { (getSpan $ 2 , Nothing , Just $ 1 )}
444
+ | enddo id { let TId s id = $ 2 in (s, Just id , Nothing )}
445
+ | INTEGER_LITERAL enddo id { let TId s id = $ 3 in (s, Just id , Just $ 1 ) }
446
+
417
447
MAYBE_EXPRESSION :: { Maybe (Expression A0 ) }
418
448
: EXPRESSION { Just $ 1 }
419
449
| {- EMPTY -} { Nothing }
@@ -562,26 +592,13 @@ EXECUTABLE_STATEMENT :: { Statement A0 }
562
592
| endwhere { StEndWhere () (getSpan $ 1 ) Nothing }
563
593
| if ' (' EXPRESSION ' )' INTEGER_LITERAL ' ,' INTEGER_LITERAL ' ,' INTEGER_LITERAL
564
594
{ StIfArithmetic () (getTransSpan $ 1 $ 9 ) $ 3 $ 5 $ 7 $ 9 }
565
- | do { StDo () (getSpan $ 1 ) Nothing Nothing Nothing }
566
- | id ' :' do
567
- { let TId s id = $ 1
568
- in StDo () (getTransSpan s $ 3 ) (Just id ) Nothing Nothing }
569
595
| do INTEGER_LITERAL MAYBE_COMMA DO_SPECIFICATION
570
596
{ StDo () (getTransSpan $ 1 $ 4 ) Nothing (Just $ 2 ) (Just $ 4 ) }
571
- | do DO_SPECIFICATION { StDo () (getTransSpan $ 1 $ 2 ) Nothing Nothing (Just $ 2 ) }
572
- | id ' :' do DO_SPECIFICATION
573
- { let TId s id = $ 1
574
- in StDo () (getTransSpan s $ 4 ) (Just id ) Nothing (Just $ 4 ) }
575
597
| do INTEGER_LITERAL MAYBE_COMMA while ' (' EXPRESSION ' )'
576
598
{ StDoWhile () (getTransSpan $ 1 $ 7 ) Nothing (Just $ 2 ) $ 6 }
577
- | do while ' (' EXPRESSION ' )'
578
- { StDoWhile () (getTransSpan $ 1 $ 5 ) Nothing Nothing $ 4 }
579
- | id ' :' do while ' (' EXPRESSION ' )'
580
- { let TId s id = $ 1
581
- in StDoWhile () (getTransSpan s $ 7 ) (Just id ) Nothing $ 6 }
582
- | enddo { StEnddo () (getSpan $ 1 ) Nothing }
583
- | enddo id
584
- { let TId s id = $ 2 in StEnddo () (getTransSpan $ 1 s) (Just id ) }
599
+ -- | enddo { StEnddo () (getSpan $1) Nothing }
600
+ -- | enddo id
601
+ -- { let TId s id = $2 in StEnddo () (getTransSpan $1 s) (Just id) }
585
602
| cycle { StCycle () (getSpan $ 1 ) Nothing }
586
603
| cycle VARIABLE { StCycle () (getTransSpan $ 1 $ 2 ) (Just $ 2 ) }
587
604
| exit { StExit () (getSpan $ 1 ) Nothing }
0 commit comments