0

Fortran 90 でソース コードのキーワードを大文字にするスクリプトを作成したいと思います。正規表現を使用することを考えましたsed(これが最初の間違いだったかもしれません:P)。!ただし、コメント(私のコードでは、 の後のすべて)および文字列(一'...'重引用符または二重引用符の間のすべて)の単語を破棄する一致を取得することはできませんでした"..."

アイデアは、Fortran のすべてのキーワード (if、end if、subroutine、abs、allocate...) を含むリストを作成し、この正規表現で sed を使用することです。これを行う方法と、このアプローチが正しいかどうか、または私が望むことを達成するためのより良い方法があるかどうかを教えてください。どういうわけか、編集者はこの言葉を正しく強調しているので、それは可能でなければなりません. 男、Emacsに「青い単語を大文字にしてください!」と言うことができれば。:)

4

4 に答える 4

0

https://gist.github.com/3414783

このコマンドはキーワードを大文字にする必要があります

警告:キーワードがそのように書かれていない場合、Emacsは予想しており、フォント化は失われます。

于 2012-08-21T11:45:58.543 に答える
0

確かにもっと良いアプローチがありますが、現時点ではわかりません

したがって、正規表現を使用すると、次の手順を実行する必要があります。

  1. コメントと文字列を削除します。それらをどこにでも保管してください
  2. キーワードを検索し、必要な強調表示を行います
  3. 削除された文字列とコメントをリセットする

リセットするには、おそらくそれらを格納する配列のインデックスに置き換えることができます

文字列が複数の行にまたがらない場合は、これらの手順を行ごとに実行できます

于 2012-08-20T07:54:16.360 に答える
0

sed については知りませんが、Perl では次のようなものを使用できます。

perl -p -E 's/(\'[^\']*\'|"[^"]*"|!.*)|\b(if|end|subroutine|abs|allocate)\b/$1\U$2/gi' file

(必要に応じて引用/コメント表現を調整します。)

于 2012-08-20T07:58:57.627 に答える
0

最後に、友人が正規表現ではなくPythonを使用して解決策を見つけました。他の誰かがこの問題に直面した場合に備えて、ここで共有します。Python コードは次のとおりです。入力ファイルと出力ファイルの 2 つの引数を取ります。

#!/usr/bin/python

import sys
import re

if (len(sys.argv)<3):
  print "Try with two arguments."
  sys.exit()

FILEIN  = sys.argv[1]
FILEOUT = sys.argv[2]

substitutions = {                                    \
            "call":"CALL"                           ,\
            "parameter":"PARAMETER"                 ,\
            "allocatable":"ALLOCATABLE"             ,\
            "dimension":"DIMENSION"                 ,\
            "integer":"INTEGER"                     ,\
            "logical":"LOGICAL"                     ,\
            "double precision":"DOUBLE PRECISION"    \
            }

patterns = []
for s in substitutions:
  patterns.append(["(^[^!]*)\\b%s\\b"%s,"\\1%s"%substitutions[s]])
  patterns.append(['("[^"]*)\\b%s\\b([^"]*")'%substitutions[s],"\\1%s\\2"%s])
  patterns.append(["('[^']*)\\b%s\\b([^']*')"%substitutions[s],"\\1%s\\2"%s])
  patterns.append(["(\([^\)]*)\\b%s\\b([^\)]*\))"%substitutions[s],"\\1%s\\2"%s])

retList = []
f = open(FILEIN,"r")
for line in f:
  for p in patterns:
    prevLine=""
    nextLine="1"
    while (prevLine!=nextLine):
      nextLine = re.sub(p[0],p[1],line)
      prevLine = line
      line = nextLine
  retList.append(line)
f.close()

f = open(FILEOUT,"w")
f.write(''.join(retList))
f.close()
于 2012-08-20T19:49:03.553 に答える