У меня есть несколько исходных файлов на Fortran 77, которые я пытаюсь преобразовать из нестандартного синтаксиса STRUCTURE
и RECORD
в стандартизированный синтаксис Fortran 90 TYPE
.Один хитрый аспект этого заключается в другом способе адресации элементов структуры.
Нестандартный:
s.member = 1
Стандарт:
s%member = 1
Итак, мне нужноперехватывать все случаи использования в таких сценариях и заменять их %
символами.Не так уж плохо, за исключением тех случаев, когда вы думаете обо всех способах использования периодов (десятичные точки в числах, имена файлов в операторах include
, знаки препинания в комментариях, операторы отношений Fortran 77, возможно, другие).Я сделал некоторую предварительную обработку, чтобы исправить реляционные операторы для использования символов Фортрана-90, и я не очень беспокоюсь о том, чтобы искажать грамматику комментариев, но я не нашел хорошего подхода для перевода .
в%
для случаев выше.Кажется, что я должен быть в состоянии сделать это с помощью sed, но я не уверен, как сопоставить случаи, которые мне нужно исправить.Вот правила, о которых я подумал:
Построчно:
Если строка начинается с <whitespace>include
, то мы не должныничего не делать с этой линией;передать его на выход, чтобы мы не испортили имя файла внутри оператора include.
Следующие строки являются операторами, которые не имеют символьных эквивалентов, поэтому они должны бытьоставлено в покое: .not. .and. .or. .eqv. .neqv.
В противном случае, если мы находим период, который окружен 2 нечисловыми символами (так что это не десятичная точка), то это должен быть оператор, которыйЯ ищу заменить.Измените этот период на %
.
Я сам не являюсь носителем языка Фортран, поэтому вот несколько примеров:
include 'file.inc' ! We don't want to do anything here. The line can
! begin with some amount of whitespace
if x == 1 .or. y > 2.0 ! In this case, we don't want to touch the periods that
! are part of the logical operator ".or.". We also don't
! want to touch the period that is the decimal point
! in "2.0".
if a.member < 4.0 .and. b.othermember == 1.0 ! We don't want to touch the periods
! inside the numbers, but we need to
! change the "a." and "b." to "a%"
! and "b%".
Любой хороший способрешая эту проблему?
Редактировать: На самом деле я нашел несколько дополнительных операторов, которые содержат точку, в которой нет символьных эквивалентов.Я обновил список правил выше.