генериране на изходен код (COBOL) с помощта на java програма

Ще напиша генератор на код за генериране на COBOL програма, използвайки някакъв входен файл със записи. Ще го внедря като java програма. Мисля, че XML/XSL подходът не би бил подходящ в този случай, тъй като входният файл не е в XML формат.

Мисля, че шаблонен процесор би бил полезен, защото някои части от него могат да бъдат генерирани с помощта на съществуващия изходен шаблон. Кой инструмент трябва да бъде полезен за това. Какво ще кажете за Apache Velocity? би било полезно в това отношение?


person cobp    schedule 03.08.2010    source източник
comment
ДОБАВЕТЕ някои проби от това, което бихте генерирали, и съответния вход.   -  person Thorbjørn Ravn Andersen    schedule 03.08.2010
comment
Преди някой да скочи да критикува нещото Java за генериране на COBOL, бих искал да отбележа, че най-добрият Java програмист, когото познавам в реалния живот, който се оказва и най-добре платеният програмист, когото познавам, е използвайки Java за генериране на COBOL (той работи за голяма европейска банка).   -  person NoozNooz42    schedule 03.08.2010
comment
... повече от добавяне на проби, защо не обясните естеството на входа, който възнамерявате да обработвате, и откъде идва този вход, и обясните естеството на изхода и защо не искате да го кодирате чрез ръка.   -  person Ira Baxter    schedule 09.08.2010


Отговори (2)


В миналото съм използвал Velocity за генериране на изходен код. Работи доста добре, но така или иначе в крайна сметка написах доста от генератора на Java.

Скоростта е добра, когато има пряка връзка от вашите структури от данни към целевия код. Номерът е да поставите структурите от данни в паметта в правилната форма, преди да започнете да генерирате. Това може да включва извършване на предварителни пропуски над данните за реорганизиране на нещата.

(И няма да критикувам COBOL като целеви език. Очевидно има прагматична причина за използването му. Наф каза.)

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

person Stephen C    schedule 03.08.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'.             

Ето една проста трансформация на Data Division:

$$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 кодът за изпълнение на примерите за Data Division е доста прост.

Кодът на Java за изпълнение на примера за разделяне на процедури е фабричен метод, написан за глагола 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>
person Gilbert Le Blanc    schedule 03.08.2010
comment
И входът беше какъв (вие предлагате изходен код; това съвпада ли с въпроса на OP)? Предполагате, че трансформациите са кодирани в XML; какво точно се трансформира? - person Ira Baxter; 09.08.2010
comment
Изявленията на предкомпилатора се трансформират в код на Cobol. Добавих примери към моя отговор. - person Gilbert Le Blanc; 02.09.2010