Ratforのdo文にであったら、doの限界指定部を取り出して、ラベルL、L+1を 作りだし、
do L 限界指定部を出力します。そして、doの終わりに達したら、
L continue L+1 continueを出力します。ここで、ラベルL+1は、breakに出会ったときの行き先になります。また、ラベルLは、 do分のループの終わりを示すとともに、nextに出会った時の行き先になります。 具体的には、docode()でdo文のはじめを生成します。
docode()のRatofor版は以下の通り。
# docode.r4 -- generate code for beginning of do include ratfor.def subroutine docode(lab) integer lab integer labgen string(dostr,"do") call outtab call outstr(dostr) call outch(BLANK) lab = labgen(2) call outnum(lab) call outch(BLANK) call eatup call outdon return end
WATCOM Fortran77版は以下の通り。
c docode.f -- generate code for beginning of do include ratfor.def subroutine docode(lab) integer lab integer labgen string(dostr,"do") call outtab call outstr(dostr) call outch(BLANK) lab = labgen(2) call outnum(lab) call outch(BLANK) call eatup call outdon return end
eatup()は、まだ取り込んでいない部分を継続行を含めて処理します。
eatup()のRatofor版は以下の通り。
# eatup.r4 -- process rest of statement; interpret continuations include ratfor.def subroutine eatup character gtoken character ptoken(MAXTOK),t,token(MAXTOK) integer nlpar nlpar = 0 repeat ` t = gtoken(token,MAXTOK) if (t == SEMICOL | t == NEWLINE) break if (t == LBRACE) { call pbstr(token) break } if (t == RBRACE | t == EOF) { call synerr('unexpected brace or EOF.') call pbstr(token) break } if (t == COMMA) { if (gtoken(ptoken,MAXTOK) != NEWLINE) call pbstr(ptoken) } else if (t == LPAREN) nlpar = nlpar + 1 else if (t == RPAREN) nlpar = nlpar - 1 call outstr(token) } until (nlpar < 0) if (nlpar != 0) call synerr('unbalanced parentheses.') return end
WATCOM Fortran77版は以下の通り。
c eatup.f -- process rest of statement; interpret continuations include ratfor.def subroutine eatup integer*1 gtoken integer*1 ptoken(MAXTOK),t,token(MAXTOK) integer nlpar nlpar = 0 loop t = gtoken(token,MAXTOK) if ((t .eq. SEMICOL) .or. (t .eq. NEWLINE)) then exit end if if (t .eq. LBRACE) then call pbstr(token) exit end if if ((t .eq. RBRACE) .or. (t .eq. EOF)) then call synerr('unexpected brace or EOF.') call pbstr(token) exit end if if (t .eq. COMMA) then if (gtoken(ptoken,MAXTOK) .ne. NEWLINE) then call pbstr(ptoken) end if else if (t .eq. LPAREN) then nlpar = nlpar + 1 else if (t .eq. RPAREN) then nlpar = nlpar - 1 end if call outstr(token) until (nlpar .lt. 0) if (nlpar .ne. 0) then call synerr('unbalanced parentheses.') end if return end
doの終わりのコードは、dostat()で生成します。
dostat()のRatofor版は以下の通り。
# dostat.r4 -- generate code for end of do statement subroutine dostat(lab) integer lab call outcon(lab) call outcon(lab+1) return end
WATCOM Fortran77版は以下の通り。
c dostat.f -- generate code for end of do statement subroutine dostat(lab) integer lab call outcon(lab) call outcon(lab+1) return end
セコメントをする