マクロ処理 -- 機能の追加
2017-01-13


機能を2つ追加します。定義してあるマクロを取り消す--undef と簡単な条件判断を 行う--ifdef です。

undefは、以下のように使います。定義していないマクロ名を指定しても無視されます。

     define(EOF,-1) # マクロEOFの定義
          :
          :
          :
     undef(EOF)     # マクロEOFの削除

ifdefは、以下のように使います。

     define(CPU1,1)
          :
          :
          :
     ifdef(CPU1,define(WORD,4)) # CPU1が定義されていれば、WORDは、4
     ifdef(CPU2,define(WORD,8)) # CPU2が定義されていれば、WORDは、8

これらの機能を組み込むには、defineの変更が必要です。undef,ifdefを マクロテーブルに登録することと、undefルーチンuninst()の呼び出し、 ifdefの処理ロジックの追加が必要です。

RATFOR版は、

# define.r4 -- simple string replacement macro processor
      program define
      integer gettok
      character defn(MAXDEF),t,token(MAXTOK)
      integer lookup

      string defnam "define"
      string udenam "undef"
      string ifdnam "ifdef"

      character deftyp(2)
      data deftyp(1)/DEFTYPE/,deftyp(2)/EOS/
      character udftyp(2)
      data udftyp(1)/UDFTYPE/,udftyp(2)/EOS/
      character ifdtyp(2)
      data ifdtyp(1)/IFDTYPE/,ifdtyp(2)/EOS/

      call initfile
      call inittbl
      call initbuf
      call instal(defnam,deftyp)
      call instal(udfnam,udftyp)
      call instal(ifdnam,ifdtyp)

      for(t = gettok(token,MAXTOK);t != EOF;t = gettok(token,MAXTOK))
          if (t != ALPHA)               # output non-alpha tokens
              call putlin(token,STDOUT)
          else if (lookup(token,defn) == NO)
              call putlin(token,STDOUT)
          else if (defn(1) == DEFTYPE) { # get definition
              call getdef(token,MAXTOK,defn,MAXTOK)
              call instal(token,defn)
              }
          else if (defn(1) == UDFTYPE ) {
              call getnam(token,MAXTOK)
              if (lookup(token,defn) == YES) # and defined
                  call uninst(token)
              }
          else if (defn(1) == IFDTYPE) {
              call getdef(token,MAXTOK,defn,MAXDEF))
              if (lookup(token,junk) == YES)
                  call pbstr(defn)
              }
          else
              call pbstr(defn)          # push replacement
      stop
      end

WATCOM fortran 77版は、



続きを読む


コメント(全50件)
※コメントの受付件数を超えているため、この記事にコメントすることができません。


記事を書く
powered by ASAHIネット