0

我想制作一个脚本,将我在 Fortran 90 中的源代码的关键字大写,为此我考虑过使用正则表达式和sed(这可能是我的第一个错误:P)。但是,我还没有设法获得一个匹配项,它丢弃注释上的单词(在我的代码中,之后的所有内容!)和字符串(单'...'引号或双引号之间的所有内容"...")。

这个想法是有一个包含 Fortran 的所有关键字(if、end if、subroutine、abs、allocate...)的列表,并将 sed 与这个正则表达式一起使用。请告诉我如何做到这一点,以及这种方法是否正确或有更好的方法来完成我想要的。它必须是可能的,因为编辑器以某种方式正确地突出了这些词。伙计,如果我能告诉 Emacs “请把蓝色单词大写!” :)

4

4 回答 4

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代码;它有两个参数:输入和输出文件。

#!/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 回答
0

https://gist.github.com/3414783

此命令应将关键字大写

警告:当关键字没有按照 Emacs 的方式编写时,字体化将会丢失。

于 2012-08-21T11:45:58.543 回答