Чтение кода cobol с помощью C#.net для генерации графа вызовов
Я работаю над проектом по автоматизации COBOL для диаграммы классов. Я занимаюсь разработкой с использованием консольного приложения C#.net. Пожалуйста, помогите мне отследить имя процедуры, где используется оператор execute в приведенном ниже примере.
**Z-POST-COPYRIGHT.
move 0 to RETURN-CODE
perform Z-WRITE-FILE**
как отследить имя процедуры 'Z-Post-COPYRIGHT', где вызывается процедура 'Z-write-file'? Единственная идея, которую я мог придумать в терминах COBOL, - это отступ, так как имена процедур всегда с отступом..Идеально в базе данных, код должен отслеживать имя процедуры после слова "выполнять" и процедуру, в которой она вызывается (в данном случае это Z-POST-COPYRIGHT).
1 ответ
Я предполагаю, что вы хотите сделать это "самостоятельно" без внешних инструментов (более быстрый подход можно найти в конце).
Сначала вы должны "знать" свой источник:
- с каким компилятором он был скомпилирован (получите руководство для этого компилятора)
- какие варианты были использованы
Затем вы должны подготовить источник:
- включить тетради (делать по
REPLACING
правила, если таковые имеются) - если источник в формате ссылки в свободной форме: объединить содержимое последней строки и текущей строки, если вы найдете
-
в колонке 7 - проверить
REPLACE
и измените результат соответственно - удалить все комментарии (возможно только
*
а также\
в столбце 7 в справочном формате фиксированной формы или аналогичном (такие расширения, как "переменный" формат / "терминальный" формат ", ... существуют, возможно, только встроенные комментарии - когда в справочном формате свободной формы, в противном случае могут быть встроенные комментарии)*>
или специфичные для компилятора расширения, такие как|
) - в зависимости от дальнейшей реинжиниринга, которую вы хотите сделать, было бы неплохо извлечь их и сохранить как минимум со ссылкой на номер строки
Наконец, вы можете отслеживать имя процедуры по следующему правилу:
- вернуться назад к последнему периоду разделителя (есть больше правил, но правило "по крайней мере, один разрыв строки, другой период, пробел, запятая или точка с запятой" [Я никогда не видел последние два в реальном коде, но это возможно " должно быть достаточно)
- проверьте, есть ли только одно слово между этим периодом разделителя и следующим
- если это слово не является зарезервированным словом COBOL (это зависит от вашего компилятора), скорее всего, это имя процедуры
Начните отсюда и проверьте выходные данные, затем уточните правило по фактическим ложным срабатываниям или пропущенным записям.
Если вы хотите сделать больше, чем просто извлечь имена процедур для PERFORM
а также GO TO
(Вы должны по крайней мере проверить источники PERFROM ... THRU
) тогда это может получить много работы...
Более быстрый подход с использованием внешних инструментов:
- запустите компилятор COBOL на полных источниках и скажите, чтобы он делал только предварительную подготовку - таким образом, у вас уже решена большая вторая точка
- если у вас есть опция: указать компилятору или внешнему инструменту создать таблицу символов / перекрестную ссылку - это скажет вам, в какой строке находится процедура, и ее имя (вы можете просто найти правильную процедуру, сравнив строку)
Просто примечание: вы можете проверить GnuCOBOL (ранее OpenCOBOL) для предварительной обработки и / или генерации таблиц символов / перекрестных ссылок и / или printcbl для полностью внешнего инструмента, выполняющего предварительную обработку и / или cobxref для полной генерации перекрестных ссылок.