@@ -318,6 +318,7 @@ BLOCKS :: { [ Block A0 ] } : BLOCKS BLOCK { $2 : $1 } | {- EMPTY -} { [ ] }
318318BLOCK :: { Block A0 }
319319: IF_BLOCK MAYBE_COMMENT NEWLINE { $ 1 }
320320| CASE_BLOCK MAYBE_COMMENT NEWLINE { $ 1 }
321+ | DO_BLOCK MAYBE_COMMENT NEWLINE { $ 1 }
321322| INTEGER_LITERAL STATEMENT MAYBE_COMMENT NEWLINE
322323 { BlStatement () (getTransSpan $ 1 $ 2 ) (Just $ 1 ) $ 2 }
323324| STATEMENT MAYBE_COMMENT NEWLINE { BlStatement () (getSpan $ 1 ) Nothing $ 1 }
@@ -328,7 +329,6 @@ BLOCK :: { Block A0 }
328329| COMMENT_BLOCK { $ 1 }
329330
330331IF_BLOCK :: { Block A0 }
331- IF_BLOCK
332332: if ' (' EXPRESSION ' )' then MAYBE_COMMENT NEWLINE BLOCKS ELSE_BLOCKS
333333 { let { startSpan = getSpan $ 1 ;
334334 (endSpan, conds, blocks, endLabel) = $ 9 ;
@@ -354,7 +354,6 @@ IF_BLOCK
354354 in BlIf () span startLabel (Just startName) ((Just $ 6 ): conds) ((reverse $ 11 ): blocks) endLabel }
355355
356356ELSE_BLOCKS :: { (SrcSpan , [Maybe (Expression A0 )], [[Block A0 ]], Maybe (Expression A0 )) }
357- ELSE_BLOCKS
358357: maybe (INTEGER_LITERAL ) elsif ' (' EXPRESSION ' )' then MAYBE_COMMENT NEWLINE BLOCKS ELSE_BLOCKS
359358 { let (endSpan, conds, blocks, endLabel) = $ 10
360359 in (endSpan, Just $ 4 : conds, reverse $ 9 : blocks, endLabel) }
@@ -364,14 +363,12 @@ ELSE_BLOCKS
364363| END_IF { let (endSpan, endLabel) = $ 1 in (endSpan, [] , [] , endLabel) }
365364
366365END_IF :: { (SrcSpan , Maybe (Expression A0 )) }
367- END_IF
368366: endif { (getSpan $ 1 , Nothing ) }
369367| endif id { (getSpan $ 2 , Nothing ) }
370368| INTEGER_LITERAL endif { (getSpan $ 2 , Just $ 1 ) }
371369| INTEGER_LITERAL endif id { (getSpan $ 3 , Just $ 1 ) }
372370
373371CASE_BLOCK :: { Block A0 }
374- CASE_BLOCK
375372: selectcase ' (' EXPRESSION ' )' MAYBE_COMMENT NEWLINE CASES
376373 { let { (caseRanges, blocks, endLabel, endSpan) = $ 7 ;
377374 span = getTransSpan $ 1 endSpan }
@@ -414,6 +411,39 @@ END_SELECT :: { (Maybe (Expression A0), SrcSpan) }
414411: maybe (INTEGER_LITERAL ) endselect maybe (id )
415412 { ($ 1 , maybe (getSpan $ 2 ) getSpan $ 3 ) }
416413
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+
417447MAYBE_EXPRESSION :: { Maybe (Expression A0 ) }
418448: EXPRESSION { Just $ 1 }
419449| {- EMPTY -} { Nothing }
@@ -562,26 +592,13 @@ EXECUTABLE_STATEMENT :: { Statement A0 }
562592| endwhere { StEndWhere () (getSpan $ 1 ) Nothing }
563593| if ' (' EXPRESSION ' )' INTEGER_LITERAL ' ,' INTEGER_LITERAL ' ,' INTEGER_LITERAL
564594 { 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 }
569595| do INTEGER_LITERAL MAYBE_COMMA DO_SPECIFICATION
570596 { 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 ) }
575597| do INTEGER_LITERAL MAYBE_COMMA while ' (' EXPRESSION ' )'
576598 { 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) }
585602| cycle { StCycle () (getSpan $ 1 ) Nothing }
586603| cycle VARIABLE { StCycle () (getTransSpan $ 1 $ 2 ) (Just $ 2 ) }
587604| exit { StExit () (getSpan $ 1 ) Nothing }
0 commit comments