Ratforプリプロセッサー -- 構文解析
2017-05-25


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版は以下の通り。



続きを読む

[コンピューター]
[RATFOR]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット