find -- 文型の照合 その2 照合パターンの作りこみ
2015-08-09


照合パターンを作りこみは、 getpat()で行います。実際には、makpat()が照合パターンの作成を行う。

findでは、この文型照合パターンpatに特別な記号を挿入し、管理します。

getpat()は、findとmakpat()のつなぎこみをするだけである。

RATFOR版は、下記の通り。

# getpat.r4 -- convert arguments into pattern
      integer function getpat(arg,pat)
      character arg(MAXARG),pat(MAXPAT)
      integer makpat

      getpat = makpat(arg,1,EOS,pat)
      return
      end
WATCOM Fortran 77版は下記の通り。
c getpat.for -- convert arguments into pattern
      integer function getpat(arg,pat)
      integer*1 arg(81),pat(81)         ! MAXARG(81) MAXPAT(81)
      integer makpat

      getpat = makpat(arg,1,-2,pat)     ! EOS(-2)
      return
      end

makpat()では、照合パターンの先頭以外に出てきた"%"は、そのものを表すことにします。 同様に、文型の末尾以外に出現した"$"、文型の先頭に出てきた"*"を特別扱いしないで、 その文字そのものとして扱う ようにします。そうすれば、エスケープ"@"を使って文字そのものの意味にする必要がなくなり、 使い勝手が向上します。

makpat()では、patに照合パターンをaddset()を使って設定していきます。 これを使うことでpatからあふれ出すことなく 安全に照合パターンを作りことができます。

文字の類が出現した場合、getccl()使って文字の類の符号化をします。 また、stclos()を使って閉包の処理に必要な情報をセットします。 これを使うことにより閉包の情報構造を隠ぺいすることができます。

RATFOR版は下記の通り。

# makpat.r4 -- make pattern from arg(from), teminate delim
      integer function makpat(arg,from,delim,pat)
      character arg(MAXARG),delim,pat(MAXPAT)
      integer from
      character esc
      integer stclos,addset,getccl
      integer i,j,junk,lastcl,lastj,lj
      
      j = 1
      lastj = 1
      lastcl = 0
      
      for (i = from; arg(i) != delim & arg(i) != EOS; i = i + 1) {
          lj = j
          if (arg(i) == ANY)
              junk = addset(ANY,pat,j,MAXPAT)
          else if (arg(i) == BOL & i == from)
              junk = addset(BOL,pat,j,MAXPAT)
          else if (arg(i) == EOL & arg(i+1) == delim)
              junk = addset(EOL,pat,j,MAXPAT)
          else if (arg(i) == CCL) {
              if (getccl(arg,i,pat,j) == ERR) then
                  exit
              end if
              junk = addset(COLEND,pat,j,MAXPAT)
              }
          else if (arg(i) == CLOSURE & i > from) {
              lj = lastj
              if (pat(lj) == BOL | pat(lj) == EOL | pat(lj) == CLOSURE)
                  break
              lastcl = stclos(pat,j,lastj,lastcl)
              }
          else {
              junk = addset(CHAR,pat,j,MAXPAT)
              junk = addset(esc(arg,i),pat,j,MAXPAT)
              }
          lastj = lj
          }
      if (arg(i) .ne. delim) then       # terminated erarly
          makpat = ERR
      else if (addset(EOS,pat,j,MAXPAT) == NO) # no room
          makpat = ERR
      else
          makpat = i
      end if
      return
      end

WATCOM Fortran77版は下記の通り。



続きを読む

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

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


記事を書く
powered by ASAHIネット