代码之家  ›  专栏  ›  技术社区  ›  cobp

使用Java程序生成源代码(COBOL)

  •  1
  • cobp  · 技术社区  · 14 年前

    我将编写一个代码生成器,使用一些记录的输入文件生成COBOL程序。我将把它作为Java程序来实现。我认为XML/XSL方法在这种情况下不合适,因为输入文件不是XML格式。

    我认为模板处理器会有所帮助,因为它的某些部分可以使用现有的源模板生成。哪种工具应该对此有用。阿帕奇速度怎么样?在这方面有帮助吗?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Stephen C    14 年前

    在过去,我使用Velocity生成源代码。它工作得相当好,但是我最终还是用Java编写了一个公平的生成器。

    当数据结构直接指向目标代码时,速度是很好的。技巧是在开始生成之前将内存中的数据结构转换成正确的形式。这可能涉及到对数据进行初步传递以重新组织事物。

    (我不会批评COBOL作为目标语言。显然有一个实用的理由来使用它。Nuff说。

    速度的其他替代方案包括FreeMarker和Jet(在Eclipse/EMF世界中使用)。

        2
  •  0
  •   Gilbert Le Blanc    14 年前

    我们使用无头Eclipse在源代码和生成的COBOL代码之间进行一些转换。我们在几个XML文件中定义了转换规则,Eclipse处理它们和源代码

    这在一定程度上取决于您的源输入,但是在我们的转换过程中,数据划分比过程划分困难得多。我们几乎必须将每个数据划分转换编码为单独的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代码做的程序分割例子是为Sq-Tor的错误动词编写的一个工厂方法。

    下面是我们的一个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>