Beispiele:
Fortran-Quellcode-Reorganisation mit SPAG.


Original Fortran 66

Dieses Code-Fragment ermittelt den Dezimal-Bruchteil einer Zahl, um dann in Abhängigkeit von der bestimmten Ziffer zu verzweigen.

13   IF (TODO.EQ.0) GO TO 12
     ACT=MOD(TODO,10)
     TODO=TODO/10
     GO TO (62,42,43,62,404,
    &       45,62,62,62), ACT
     GO TO 13
42   CALL COPY
     GO TO 127
43   CALL MOVE
     GO TO 144
404  N=-N
44   CALL DELETE
     GO TO 127
45   CALL PRINT
     GO TO 144
62   CALL BADACT(ACT)
     GO TO 12
127  LENGTH=LENGTH+1
144  DONE=DONE+1
     CALL RESYNC
     GO TO 13
12   RETURN
     END


VAX Fortran Form

SPAG hat das rückwärts gerichtete GOTO durch ein DO WHILE ersetzt und alle Variablen- und Routinen-Namen in Kleinschrift umgewandelt.

   DO WHILE ( todo.NE.0 )
      act = mod(todo,10)
      todo = todo/10
      IF( act.EQ.1 .OR. act.EQ.4 .OR.
    &            act.EQ.7 .OR. act.EQ.8
    &            .OR. act.EQ.9 ) THEN
          CALL badact(act)
          GO TO 200
      ELSEIF ( act.EQ.2 ) THEN
          CALL copy
          length = length + n
      ELSEIF ( act.EQ.3 ) THEN
          CALL move
      ELSEIF ( act.EQ.5 ) THEN
         n=-n
         CALL delete
         length = length + n
      ELSEIF ( act.EQ.6 ) THEN
         CALL print
      ELSE
         GO TO 100
      ENDIF
      done = done +1
      CALL resync
100   ENDDO
200   RETURN
   END



Fortran 77 Form

Die Option “Code-Wiederholung” wurde gesetzt und SPAG hat die Zeile LENGTH=LENGTH+N eingefügt.

100  IF ( TODO.NE.0 ) THEN
      ACT = MOD(TODO,10)
      TODO = TODO/10
      IF (ACT.EQ.1 .OR. ACT.EQ.4 .OR.
    &           ACT.EQ.7 .OR. ACT.EQ.8
    &          .OR.  ACT.EQ.9 ) THEN
         CALL BADACT(ACT)
         GO TO 200
      ELSEIF ( ACT.EQ.2 ) THEN
         CALL COPY
         LENGTH = LENGTH + N
      ELSEIF ( ACT.EQ.3 ) THEN
         CALL MOVE
      ELSEIF ( ACT.EQ.5 ) THEN
         n=-n
         CALL DELETE
         LENGTH = LENGTH + N
      ELSEIF ( ACT.EQ.6 ) THEN
         CALL PRINT
      ELSE
         GO TO 100
      ENDIF
      DONE = DONE +1
      CALL RESYNC
      GO TO 100
     ENDIF
200  RETURN
   END


Fortran 90 Form

Sämtliche GOTOs und zugehörige Labels wurden eliminiert und durch EXIT, CYCLE ersetzt. Der IF-Block wurde in eine SELECT CASE Konstruktion umgeformt.

   DO WHILE ( todo.NE.0 )
      act = mod(todo,10)
      todo = todo/10
      SELECT CASE (act)
         CASE (1,4,7,8,9)
            CALL badact(act)
            EXIT
         CASE (2)
            CALL copy
            length = length + n
         CASE (3)
            CALL move
         CASE (5)
            n=-n
            CALL delete
            length = length + n
         CASE (6)
            CALL print
         CASE DEFAULT
            CYCLE
      END SELECT
      done = done +1
      CALL resync
   ENDDO
   RETURN
   END