Метод, который я использовал для конвертации до сих пор, полуавтоматизирован: множество редакторов и текстовых скриптов.
Во-первых, коллимируйте все источники на Фортране в один файл (расставляя маркеры так, чтобы файлы могли быть разделены).
Затем преобразуйте числовые метки в именованные метки (например, добавив перед ними L для gotos и F для форматов). Сделайте соответствующие изменения в местах, которые ссылаются на ярлыки.
Затем отметьте метку - продолжайте комбинации и продолжения операторов (например, с отметкой в начале каждой строки, где они встречаются). Затем снова соедините строки метки-продолжения и оператора-продолжения. В редакторе, таком как vi, это означало бы выполнение серии (скажем) 1000J, а затем массовую замену:% s / # / ^ V ^ M / g, если маркер начала строки - #. Поскольку строки продолжения были специально помечены, как и комбинации с продолжением, они воссоединяются.
Убедитесь, что if-метки и do-метки разделены (например, напишите шаблон grep, чтобы извлечь соответствующие строки, а затем напишите простую программу для сопоставления скобок, чтобы проверить их). После того, как вы отделены, вы можете превратить продолжение в скобки.
Включите скобки if-then-else и dowhile / enddo, подпрограмму / ends и т. Д. Сделайте подпрограмму недействительной, добавьте поддельные имена для основных типов (например, логическое, символьное, целое, вещественное, двойное, сложное, сложное).
Комментарии преобразуются в C ++ // comments; оба столбца 0 и! комментарии.
Затем вы можете заново создать прототип функции. По сути, это преобразование KR в ANSI-C и требует простой программы для чтения заголовков функций и объявлений переменных для их сопоставления. В идеале вы можете сначала поместить объявления переменных в строку. Это также требует сценария редактирования и утилиты. Например, "Double A, B, C, ..." будет преобразовано в "#Double \ nA \ nB \ n." а затем утилита настроена на префикс всех # строк с самой последней предшествующей строкой.
Операторы параметров воссоединяются с объявлениями типов и преобразуются в операторы "const". Сохранения конвертируются в статические объявления. Commons Я еще не нашел хороший способ работать с ним.
Теперь идут следующие части HARD: размерность массива, анализ переменных ввода / вывода (чтобы определить, какие переменные должны быть переданы по значению или по ссылке). Вы должны получить компилятор C, который распознает ссылочный тип и / или использует C ++. Для переназначения массива вам также может понадобиться перейти на C ++, который позволяет переопределить [].
Анализ in-out - это то, что я еще не проработал, также как и измерение. Но в
На этом этапе соответствующий источник находится в основном на C или C ++.
Имейте в виду: Fortran 2010 допускает параллельную обработку, которая выходит за рамки C и даже C ++ (за исключением их многопоточных возможностей). Если в ваших программах они есть, все станет намного сложнее.