Чтение кода 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 для полной генерации перекрестных ссылок.

Другие вопросы по тегам