在long fortran代码中识别if-endif和do-enddo构造

时间:2016-08-25 06:30:18

标签: fortran fortran90 fortran77

我正在尝试修改一个非常大的Fortran遗留代码(fortran77),但由于代码的作者不关心写评论而且也没有使用适当的缩进等,我在修改时遇到了很大的困难代码。我需要的是某种方式(包或命令行工具),如果我在它开始的地方显示它,它将使我能够识别给定构造的结束,如if-thendo-enddo。例如:

if(x .eq. 0)then
  if (y .eq. 0)then
    print*, y

  endif
endif

假设我想看看第一个if语句的结束位置,那么这个工具应该显示最后一行,依此类推。

如果有任何帮助,我将非常感激。提前致谢。

3 个答案:

答案 0 :(得分:2)

以下是两种做你想做的事情:

http://www.polyhedron.com/pf-plusfort0html

https://sourceforge.net/projects/findent/files/

另一个是(自己)一个小代码来缩进FORTRAN文件。这并不困难:))

答案 1 :(得分:0)

在堡垒中有如下标记构建体(它可能是F90中的标准):

 Cat_Loop:
&DO I = 1, N
    !<stuff>
  Dog_Loop: DO K = 1, M, 9  !Because Dogs are canines!
    !<stuff>
  Lizard_Loop:
&  DO J = 1, M
    !<stuff>

    ENNDO Lizard_Loop
  ENNDO Dog_Loop
ENDDO Cat_Loop

在IF语句通常所在的位置,SELECTED CASE有时很有用。这是另一个90标准:

SELECTED CASE (Dog)
  CASE(-9)
    <Stuff>
  !ENDCASE
  CASE(1)
    <Stuff>
  !ENDCASE
  CASE(2)
    <Stuff>
  !ENDCASE
  CASE(9)
    <Stuff>
  ENDCASE
  DEFAULT
    WRITE(*,*)' Why am I here with Dog=',Dog
  ENDCASE
END SELECT

我要做的第一件事就是为已知输入捕获一些输出,然后构建一些单元测试的方法&#39;它。 并定期确保你坚持走近它的道路。

答案 2 :(得分:-1)

你有什么特别的理由限制自己使用Fortran 90;它已有近三十年的历史。现代Fortran允许控制结构的标识符,exit不再局限于do循环,并且goto最终被使用Fortran 2008 block构造弃用。

alpha: block
    bravo: do i = 1, num_in_set
        charlie: if (x == a(i)) then
            delta: select case (i)
                case (FIRST)
                    call do_something(x)
                case (SECOND)
                    call do_something_else(x)
                case (THIRD)
                    cycle bravo
                case default
                    exit alpha
            end select delta
        else if (x == a(i+1)) then
            x = foo(a)
        else
            x = bar(a)
            exit alpha
        end if charlie
        call finally_do_something(x)
    end do bravo
end block alpha