генерация исходного кода (COBOL) с использованием Java-программы - PullRequest
1 голос
/ 03 августа 2010

Я собираюсь написать генератор кода для генерации программы на языке COBOL, используя некоторый входной файл записей.Я собираюсь реализовать это как Java-программу.Я думаю, что подход XML / XSL не будет уместным в этом случае, потому что входной файл не в формате XML.

Я думаю, что процессор шаблонов будет полезен, потому что некоторые его части могут быть сгенерированы с использованием существующегоИсходный шаблон.Какой инструмент должен быть полезен для этого.А как насчет Apache Velocity?это поможет в этом отношении?

Ответы [ 2 ]

1 голос
/ 03 августа 2010

В прошлом я использовал Velocity для генерации исходного кода. Это сработало довольно хорошо, но я все равно написал немало генератора на Java.

Скорость хороша, когда от ваших структур данных напрямую зависит целевой код. Хитрость заключается в том, чтобы привести структуры данных в памяти в правильную форму перед началом генерации. Это может включать предварительную передачу данных для реорганизации.

(И я не собираюсь критиковать COBOL как целевой язык. Для этого явно прагматичная причина. Nuff сказал.)

Другие альтернативы Velocity включают Freemarker и JET (используемые в мире Eclipse / EMF).

0 голосов
/ 03 августа 2010

Мы использовали безголовый Eclipse, чтобы выполнить некоторые преобразования между исходным кодом и сгенерированным кодом Cobol.Мы определили правила преобразования в нескольких файлах XML, и Eclipse обработал их и исходный код

Это в некоторой степени зависит от вашего исходного ввода, но в нашем процессе преобразования разделение данных было намного сложнее, чем разделение процедур,Нам в значительной степени приходилось кодировать каждое преобразование Data Division как отдельный метод Java.Мы смогли использовать заводскую модель для Отдела процедур.На фабрике было 8 конкретных реализаций классов, одна из которых использовалась в большинстве преобразований.

Отредактировано для добавления примеров.

Вот что мы вставляем в рабочее хранилище:

01 PROGRAM-COMPILE-INFO.                                                 
    05  PGMNAME-COMPILED    PIC X(08)   VALUE 'J1PP2D0'.             
    05  PGMDATE-COMPILED    PIC X(10)   VALUE '2009-08-11'.          
    05  PGMTIME-COMPILED    PIC X(08)   VALUE '08:46:47'.             

Вот простое преобразование деления данных:

$$COPY J1PP2D1

преобразуется в

 COPY J1PP2D1.

Вот преобразование деления процедуры:

SQL-OTHER-ERROR IASN CLOSE

преобразуется в

IF SQL-DEADLOCK                                              
    MOVE '0329' TO ERROR-STATUS OF SUBSCHEMA-CTRL            
ELSE                                                         
    MOVE '0399' TO ERROR-STATUS OF SUBSCHEMA-CTRL            
END-IF                                                       
MOVE 'IASN'     TO ERROR-RECORD OF SUBSCHEMA-CTRL            
MOVE '000600,CLOSE  ,0056-PROCESS'                           
                TO XI-EHK-STMT-CONTEXT                       
PERFORM XI-SQL-ERROR                                         
GO TO IDMS-STATUS  

000600 - это код ошибки, автоматически рассчитываемый прекомпилятором.0056-PROCESS - это название абзаца, содержащего оператор прекомпилятора SQL-OTHER-ERROR.

Java-код для выполнения примеров с делением данных довольно прост.

Java-код дляdo Пример с делением процедур - это фабричный метод, написанный для глагола SQL-OTHER-ERROR.

Вот один из наших сценариев преобразования XML.У нас их несколько.

<?xml version="1.0" encoding="UTF-8"?>
<script>

  <transformation name="DB2Pre">
     <param name="cobol.in" kind="in" type="text-files"/>
     <param name="cobol.out" kind="inout" type="text-files"/>
     <param name="mapsusage-xml-files" kind="inout" type="xml-files"/>

     <call-transformation name="DB2PreInit"/>

     <call-transformation name="DB2PreImpl">
       <with-param name="cobol-src-files" value="$cobol.in"/>
       <with-param name="cobol-out-files" value="$cobol.out"/>
       <with-param name="mapsusage-xml-files" value="$mapsusage-xml-files"/>
       <with-param name="NEED_MAP_MACRO_FLAG" value="$YES"/>
     </call-transformation>

     <call-transformation name="Map2Cobol"/>

     <call-transformation name="GenStrutsConfig">
       <with-param name="cobol-src-files" value="$cobol.in"/>
       <with-param name="mapsusage-xml-files" value="$mapsusage-xml-files"/>
     </call-transformation>

  </transformation>

</script>
...