Я все-таки дошел до необходимости переписывать тонны кода, поэтому хочется сделать это поумнее...
Есть условно два ЯП с близкими синтаксисами: Fortran 77 и Fortran 90.
Задача взять код на F77 и переписать на F90 и запихнуть его в модули, параллельно развернув неявные определения переменных, дописав окончания циклов*, исправив некоторые строки формата вывода на что-то более читаемое в 2020 году :-)
Думаю делать так:
1. Разделить код на функции/сабрутины и процессорить в дальнейшем их по отдельности.
2. Хранить информацию об используемых переменных и их типах, каких-то ключевых блоков, как например блоки DATA и COMMON, и сам код, в виде связного списка с указанием уровня вложенности. И получить какое-то такое представление:
(функция имя-функции ((use-statements)) ((список-переменных-аргументов)) ((список-внутренних-переменных)) ((список-блоков)) (код))
переменная хранится в виде:
(переменная (параметры-переменной)).
Различные условные операторы можно хранить в виде: ( оператор (условие) ( внутренний-код ) ).
3. Дальше можно вывести это дерево в синтаксисе нужного языка программирования.
Ну и вопросы:
1. Что я переизобрел?
2. Как быть с комментариями и директивами препроцессора: их место не должно поменяться? В каком виде их лучше хранить?
3. В каком виде надо хранить структуру кода? То есть то, что я назвал (код) в п.2.
4. Как быть с детектом goto меток?
------
* Следующая запись корректна:
do 1 i=1, 5
do 1 j=1, 5
1 print *, i*j
Но должно быть исправлено на:
do i=1, 5
do j=1, 5
print *, i*j
end do
end do