Ratforで書かれたプログラム文は、parse()で解析され、lex()が返す綴り別に それがコードの始まりの時は、コード生成ルーチンを呼び出し、スタックに綴りの種類と 名札が積まれる。コードの終わりの時は、unstak()が呼ばれスタックから取りおろしをします。 綴りは、defineやmacroのように、initkw()でテーブルにセットします。
parse()のRatofor版は以下の通り。
# parse.r4 -- parse Ratfor source program include ratfor.def subroutine parse character lexstr(MAXTOK) character lex, token integer lab,sp integer labval(MAXSTACK) character lextyp(MAXSTACK) call initkw # install keywords in table sp = 1 lextyp(1) = EOF for (token = lex(lexstr); token != EOF; token = lex(lexstr) ) { if (token == LEXIF) call ifcode(lab) else if (token == LEXDO) call docode(lab) else if (token == LEXWHILE) call whilec(lab) else if (token == LEXFOR) call forcod(lab) else if (token == LEXREPEAT) call repcod(lab) else if (token == LEXUNTIL) { if (lextyp(sp) == LEXREPEAT) call synerr('illegal until.') } else if (token == LEXSTRING) call strngc else if (token == LEXDIGITS) call labelc(lexstr) else if (token == LEXELSE) { if (lextyp(sp) == LEXIF) call elseif(labval(sp)) else call synerr('illegal else.') } if (token == LEXIF | token == LEXELSE | token == LEXWHILE | token == LEXDO | token == LEXDIGITS | token == LBRACE | token == LEXFOR | token == LEXREPEAT) { sp = sp + 1 if (sp > MAXSTACK) call synerr('stack overflow in paser.') lextyp(sp) = token labval(sp) = lab } else } if (token == RBRACE) if (lextyp(sp) == LBRACE) sp = sp - 1 else call synerr('illegal right brace.') else if (token == LEXOTHER) call otherc(lexstr) else if (token == LEXBREAK | token == LEXNEXT) call brknxt(sp,lextyp,labval,token) token = lex(lexstr) # peek at next token call pbstr(lexstr) call unstak(sp,lextyp,labval,token) } } if (sp != 1) call synerr('unexpected EOF.') return end
WATCOM Fortran77版は以下の通り。
セコメントをする