【问题标题】:Cobol Copybook ParserCobol Copybook 解析器
【发布时间】:2018-01-30 10:54:55
【问题描述】:

谁能建议我如何提取 Cobol Copybook 的字段? 如果您可以提供代码 sn-p 或任何链接的帮助,将会很有帮助? 示例:

我想这样提取。

Field No.
Field Name
Field Type      (999 or S9(4) or x(5)....)
Field Type-add  (COMP, COMP-3, etc.,)
Other-Details   (Copy Everything until "." excluding PIC clause)

【问题讨论】:

  • 一般来说,这是一个相当混乱的问题,因为 COBOL 语法既具有表达性又具有特殊性。您没有提到 COBOL 数据结构的重要方面——组级别层次结构、REDEFINES、OCCURS、77s 和 88s 等。您有一组特定的字帖可以使用吗?这个集合是否使用了 COBOL 功能的子集?您也许可以自己构建一些东西。另外,考虑使用lex 之类的工具来扫描您的字帖以提取令牌。 lex 将使您更容易区分数字文字中的句点和小数点,例如
  • 欢迎来到 stackoverflow.com。请花一些时间阅读help pages,尤其是名为"What topics can I ask about here?" 和"What types of questions should I avoid asking?" 的部分。也请使用tour 并阅读有关how to ask good questions 的信息。最后请学习如何创建Minimal, Complete, and Verifiable Example。
  • 计算机科学有四个难题: 1. 命名事物; 2. 数东西; 3.解析COBOL。
  • 有许多解析器可用于多种语言,但它肯定归结为您可以使用哪种语言来解析 COBOL 的问题(flex/bison、GoldParser、Java、COBOL 是一些选项) -但正如 cschneid 已经提到的:请参观,这不是 Stackoverflow 格式的问题。
  • @IraBaxter 我从来没有写过编译器。我确实必须编写 ISPF 编辑宏来帮助开发人员,所以我使用 Rexx 来“解析”COBOL,以达到完成手头任务所需的程度。

标签: parsing cobol


【解决方案1】:

免责声明:我是 ProLeap COBOL 解析器的维护者。

您可以使用基于Java的ProLeap COBOL parser从COBOL文件中提取各种数据,例如level numbers、picture strings等。您也可以从使用条款@987654324中提取COMP、COMP-1等@。

ProLeap COBOL 解析器是在开源许可下获得许可的,因此可以免费使用。

【讨论】:

    【解决方案2】:

    免责声明:我维护cb2xml

    您可以使用cb2xml 来解析您的字帖

    • 在 java 中,每个字段都被转换为 Cobol 对象(带有图片、用法、发生字段)
    • 对于其他语言,cobol 可以转换为 xml

    见Looking for The right way with Regular Expression with groups in different order

    Cobol:

       01 Ams-Vendor.
           03 Brand               Pic x(3).
           03 Location-details.
              05 Location-Number  Pic 9(4).
              05 Location-Type    Pic XX.
              05 Location-Name    Pic X(35).
           03 Address-Details.
              05 actual-address.
                 10 Address-1     Pic X(40).
                 10 Address-2     Pic X(40).
                 10 Address-3     Pic X(35).
              05 Postcode         Pic 9(4).
              05 Empty            pic x(6).
              05 State            Pic XXX.
           03 Location-Active     Pic X.
    

    cb2xml 的输出:

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <copybook filename="cbl2xml_Test110.cbl">
        <item display-length="173" level="01" name="Ams-Vendor" position="1" storage-length="173">
            <item display-length="3" level="03" name="Brand" picture="x(3)" position="1" storage-length="3"/>
            <item display-length="41" level="03" name="Location-details" position="4" storage-length="41">
                <item display-length="4" level="05" name="Location-Number" numeric="true" picture="9(4)" position="4" storage-length="4"/>
                <item display-length="2" level="05" name="Location-Type" picture="XX" position="8" storage-length="2"/>
                <item display-length="35" level="05" name="Location-Name" picture="X(35)" position="10" storage-length="35"/>
            </item>
            <item display-length="128" level="03" name="Address-Details" position="45" storage-length="128">
                <item display-length="115" level="05" name="actual-address" position="45" storage-length="115">
                    <item display-length="40" level="10" name="Address-1" picture="X(40)" position="45" storage-length="40"/>
                    <item display-length="40" level="10" name="Address-2" picture="X(40)" position="85" storage-length="40"/>
                    <item display-length="35" level="10" name="Address-3" picture="X(35)" position="125" storage-length="35"/>
                </item>
                <item display-length="4" level="05" name="Postcode" numeric="true" picture="9(4)" position="160" storage-length="4"/>
                <item display-length="6" level="05" name="Empty" picture="x(6)" position="164" storage-length="6"/>
                <item display-length="3" level="05" name="State" picture="XXX" position="170" storage-length="3"/>
            </item>
            <item display-length="1" level="03" name="Location-Active" picture="X" position="173" storage-length="1"/>
        </item>
    </copybook>                
    

    cb2xml 的一个有趣应用在Dynamically Reading COBOL Redefines with C#

    中有描述

    【讨论】:

      【解决方案3】:

      免责声明:我维护https://www.cobolcopybook.co.in

      您好,查看网站https://www.cobolcopybook.co.in,该网站专为分析COBOL字帖而设计。

      例如。您输入的字帖是:

      000100 01  BGG-FILE-REC.
      000200     03  BGG-RCD-KEY.
      000300         05  BGG-DUDENAME            PIC XXXX.
      000400         05  BGG-DUDEADDR            PIC XX.
      000500         05  BGG-HAIRCOLOR           PIC X(71).
      000600         05  BGG-EYECOLOR            PIC X(8).
      

      那么输出将是:

      SR#  LEVEL   FIELD NAME                 PICTURE   TYPE      START      END   LENGTH
      
      0  1  BGG-FILE-REC.                 @         AN            1       85       85
      1  3  BGG-RCD-KEY.                  @         AN            1       85       85
      2  5  BGG-DUDENAME                  XXXX.     AN            1        4        4
      3  5  BGG-DUDEADDR                  XX.       AN            5        6        2
      4  5  BGG-HAIRCOLOR                 X(71).    AN            7       77       71
      5  5  BGG-EYECOLOR                  X(8).     AN           78       85        8
      

      希望这能解决你的问题。

      【讨论】:

      • 您列出的网站发生了什么事?动了吗?如果有,新的 URL 是什么?
      • 啊。我在寻找 Java 代码而不是在线的东西。此外,每个页面上的弹出式提醒都是上个世纪的事情,并且会迅速将流量从您的网站上赶走。
      • @Roger 感谢您的留言。要继续运行该站点需要资金,但弹出窗口是临时的,很快就会被删除。感谢您访问我的网站。
      【解决方案4】:

      对于 python,请查看 Copybook 包 (https://github.com/zalmane/copybook)。它支持 Copybook 的大部分功能,包括 REDEFINES 和 OCCURS 以及各种 PIC 格式。

      pip install copybook
      root = copybook.parse_file('sample.cbl')
      

      免责声明:我是https://github.com/zalmane/copybook的维护者

      【讨论】:

        【解决方案5】:

        如果您使用为此目的而设计的 COBOL 解析器,那么这相对容易。

        这样的解析器必须愿意解析,而不仅仅是 整个程序,但要解析各个子部分,例如包含段落或数据声明的字帖。这样的工具必须准备好 处理在真正的字帖中发现的复杂性,例如字段声明、PIC 字符串、REDEFINE、77 和 88 级变量、用作初始化器的各种疯狂的文字值,以及行延续和复制替换的混乱/丑陋问题,或者它会只处理香草字帖。根据字帖的来源,您可能必须将文本处理为 EBCDIC。构建一个处理所有这些的解析器实际上需要做很多工作。

        如果您尝试使用正则表达式或其他无法执行诸如上下文无关解析之类的操作来破解它,您生成的工具将根本无法处理任何复杂的情况。

        一个好的解析器会生成一个抽象语法树,将所有这些细节捕获为一个数据结构 在内存中进行处理(这是有效的)或作为 XML 文件 由其他工具处理。

        我们用于 DMS 的 COBOL parser 可以处理上述所有问题并生成 AST 转储或等效的 XML。

        鉴于此 COBOL 字帖片段:

        003110****************************************
        003120* GEGVD    - GEGVD-0872-WS
        003130****************************************
        003140 01  GEGVDC.
        003150****************************************
        003160****************************************
        003170        10 GEJVD-CDA                            PIC X(11)
        003180                                     VALUE
        003190             '<<<GEGVD>>>'.
        003200        10 GEJVD-COUNT                          PIC 9(9)
        003210                                     VALUE     ZERO
        003220                                     COMPUTATIONAL-3.
        003230        10 GEJVD-ITER                           PIC 9(3)
        003240                                     VALUE     ZERO
        003250                                     COMPUTATIONAL-3.
        003260        10 GEJVD-OP-CODE                        PIC X(1)
        003270                                     VALUE     SPACE.
        003280        10 GEJVD-STATUS                         PIC X(2)
        003290                                     VALUE     SPACE.
        003300        10 GEJVD-OPEN-SW                        PIC X(1)
        003310                                     VALUE     SPACE.
        003320        10 GEGVD-STATUS                         PIC X(2)
        003330                                     VALUE     SPACE.
        003340         10 STATUS-CODE REDEFINES
        003350           GEGVD-STATUS                         PIC X(2).
        003360 01  GEGVD.
        003370****************************************
        003380****************************************
        003390     02 GEGVD-C.
        003400        10 GEGVD-INPT-SCTN.
        003410           15 GEGVD-ACTL-SERL-LN-CD             PIC X(1)
        003420                                     VALUE     SPACE.
        003430           15 GEGVD-FORM-VER-CD                 PIC X(5)
        003440                                     VALUE     SPACE.
        003450        10 GEGVD-OUTP-SCTN.
        003460           15 GEGVD-GE-RULE-RSLT-CD             PIC X(1)
        003470                                     VALUE     SPACE.
        003480        10 GEGVD-WORK-SCTN.
        003490           15 GEGVD-GE-RSN-00826-ID             PIC S9(5)
        003500                                     VALUE     +00826
        003510                                     COMPUTATIONAL-3.
        003520           15 GEGVD-WS-N-LIT                    PIC X(1)
        003530                                     VALUE     'N'.
        003540           15 GEGVD-WS-S-LIT                    PIC X(1)
        003550                                     VALUE     'S'.
        003560           15 GEGVD-MPN-FORM-VER-CD             PIC X(5)
        003570                                     VALUE     '99-00'.
        003580           15 GEGVD-PLUS-MPN-FORM-VER-CD        PIC X(5)
        003590                                     VALUE     '03-04'.
        

        我们的 COBOL 解析器直接应用于 copybook 文件, 生成以下抽象语法树:

        C:\DMS\Domains\COBOL\IBMEnterprise\Tools\Parser\Source>run ../domainparser ++AST c:/DMS/Domains/COBOL/IBMEnterprise/Examples/SallieMae/copylibs/GEGVD.COP
        COBOL~IBMEnterprise Domain Parser Version 2.7.17
        Copyright (C) 1996-2017 Semantic Designs, Inc; All Rights Reserved; SD Confidential
        Powered by DMS (R) Software Reengineering Toolkit
        AST Optimizations: remove constant tokens, remove unary productions, compact sequences
        Using encoding Unicode-UTF-8?ANSI +CRLF +1 /^I
        393 tree nodes in tree.
        (cobol_source_file@COBOL~IBMEnterprise=17#92facc0^0 Line 4 Column 8
         (record_or_data_item_entry_list@COBOL~IBMEnterprise=721#92fac80^1#92facc0:1 Line 4 Column 8
          (record_01_description_entry@COBOL~IBMEnterprise=576#92f6240^1#92fac80:1 Line 4 Column 8
           (one@COBOL~IBMEnterprise=2170#92f10e0^1#92f6240:1 Line 4 Column 8
           |(unsigned_integer_number@COBOL~IBMEnterprise=2579#92f1080^1#92f10e0:1[1] Line 4 Column 8
           | precomment 0:1 Type 0 Line 1 Column 7 `****************************************'
           | precomment 0:2 Type 0 Line 2 Column 7 `* GEGVD    - GEGVD-0872-WS'
           | precomment 0:3 Type 0 Line 3 Column 7 `****************************************')unsigned_integer_number
           )one#92f10e0
           (data_description_entry@COBOL~IBMEnterprise=607#92f12c0^1#92f6240:2 Line 4 Column 12
           |(composed_identifier@COBOL~IBMEnterprise=2351#92f12a0^1#92f12c0:1 Line 4 Column 12
           | (identifier@COBOL~IBMEnterprise=2850#92f10c0^1#92f12a0:1[`GEGVDC'] Line 4 Column 12
           |)composed_identifier#92f12a0
           )data_description_entry#92f12c0
           ('.'@COBOL~IBMEnterprise=2358#92f1280^1#92f6240:3[Keyword:4] Line 4 Column 18
           (subsidiary_description_entry_list@COBOL~IBMEnterprise=585#92f61c0^1#92f6240:4 Line 7 Column 15
           |(subsidiary_description_entry@COBOL~IBMEnterprise=588#92f1800^1#92f61c0:1 Line 7 Column 15
           | (level_number@COBOL~IBMEnterprise=2174#92f1360^1#92f1800:1 Line 7 Column 15
           |  (unsigned_integer_number@COBOL~IBMEnterprise=2579#92f1320^1#92f1360:1[10] Line 7 Column 15
           |   precomment 0:1 Type 0 Line 5 Column 7 `****************************************'
           |   precomment 0:2 Type 0 Line 6 Column 7 `****************************************')unsigned_integer_number
           | )level_number#92f1360
           | (data_description_entry@COBOL~IBMEnterprise=608#92f1720^1#92f1800:2 Line 7 Column 18
           |  (composed_identifier@COBOL~IBMEnterprise=2351#92f13c0^1#92f1720:1 Line 7 Column 18
           |   (identifier@COBOL~IBMEnterprise=2850#92f1340^1#92f13c0:1[`GEJVD-CDA'] Line 7 Column 18
        er
           |  )composed_identifier#92f13c0
           |  (data_description_clause_list@COBOL~IBMEnterprise=613#92f16e0^1#92f1720:2 Line 7 Column 55
           |   (picture_clause@COBOL~IBMEnterprise=653#92f1520^1#92f16e0:1 Line 7 Column 55
           |   |(pic_picture@COBOL~IBMEnterprise=194#92f1420^1#92f1520:1 Line 7 Column 55
           |   | ('PIC'@COBOL~IBMEnterprise=2430#92f13a0^1#92f1420:1[Keyword:0] Line 7 Column 55
           |   |)pic_picture#92f1420
           |   |(optional_is@COBOL~IBMEnterprise=59#92f1440^1#92f1520:2 Line 7 Column 59
           |   |(picture_string@COBOL~IBMEnterprise=656#92f1500^1#92f1520:3 Line 7 Column 59
           |   | (alphanumeric_picture_string@COBOL~IBMEnterprise=2543#92f1400^1#92f1500:1[`X(11)'] Line 7 Column 59
        VD.COP)alphanumeric_picture_string
           |   |)picture_string#92f1500
           |   )picture_clause#92f1520
           |   (value_is_clause@COBOL~IBMEnterprise=711#92f16a0^1#92f16e0:2 Line 8 Column 44
           |   |(value_values@COBOL~IBMEnterprise=202#92f1600^1#92f16a0:1 Line 8 Column 44
           |   | ('VALUE'@COBOL~IBMEnterprise=2437#92f14e0^1#92f1600:1[Keyword:0] Line 8 Column 44
           |   |)value_values#92f1600
           |   |(optional_is_are@COBOL~IBMEnterprise=63#92f1620^1#92f16a0:2 Line 9 Column 20
           |   |(non_figurative_non_numeric_literal@COBOL~IBMEnterprise=2205#92f1680^1#92f16a0:3 Line 9 Column 20
        COP
           |   | (non_numeric_literal_string@COBOL~IBMEnterprise=2187#92f1660^1#92f1680:1 Line 9 Column 20
           |   |  (non_numeric_literal_quote@COBOL~IBMEnterprise=2840#92f15e0^1#92f1660:1[`<<<GEGVD>>>'] Line 9 Column 20
        s/GEGVD.COP)non_numeric_literal_quote
           |   | )non_numeric_literal_string#92f1660
           |   |)non_figurative_non_numeric_literal#92f1680
           |   )value_is_clause#92f16a0
           |  )data_description_clause_list#92f16e0
           | )data_description_entry#92f1720
           | ('.'@COBOL~IBMEnterprise=2358#92f1640^1#92f1800:3[Keyword:0] Line 9 Column 33
           |)subsidiary_description_entry#92f1800
           |(subsidiary_description_entry_list@COBOL~IBMEnterprise=585#92f6120^1#92f61c0:2 Line 10 Column 15
           | (subsidiary_description_entry@COBOL~IBMEnterprise=588#92f1c20^1#92f6120:1 Line 10 Column 15
           |  (level_number@COBOL~IBMEnterprise=2174#92f18a0^1#92f1c20:1 Line 10 Column 15
           |   (unsigned_integer_number@COBOL~IBMEnterprise=2579#92f17e0^1#92f18a0:1[10] Line 10 Column 15
        igned_integer_number
           |  )level_number#92f18a0
           |  (data_description_entry@COBOL~IBMEnterprise=608#92f1bc0^1#92f1c20:2 Line 10 Column 18
           |   (composed_identifier@COBOL~IBMEnterprise=2351#92f18e0^1#92f1bc0:1 Line 10 Column 18
           |   |(identifier@COBOL~IBMEnterprise=2850#92f1820^1#92f18e0:1[`GEJVD-COUNT'] Line 10 Column 18
        tifier
           |   )composed_identifier#92f18e0
           |   (data_description_clause_list@COBOL~IBMEnterprise=613#92f1ba0^1#92f1bc0:2 Line 10 Column 55
           |   |(data_description_clause_list@COBOL~IBMEnterprise=613#92f1aa0^1#92f1ba0:1 Line 10 Column 55
           |   | (picture_clause@COBOL~IBMEnterprise=653#92f19a0^1#92f1aa0:1 Line 10 Column 55
           |   |  (pic_picture@COBOL~IBMEnterprise=194#92f1920^1#92f19a0:1 Line 10 Column 55
           |   |   ('PIC'@COBOL~IBMEnterprise=2430#92f18c0^1#92f1920:1[Keyword:0] Line 10 Column 55
           |   |  )pic_picture#92f1920
           |   |  (optional_is@COBOL~IBMEnterprise=59#92f1940^1#92f19a0:2 Line 10 Column 59
           |   |  (picture_string@COBOL~IBMEnterprise=655#92f1980^1#92f19a0:3 Line 10 Column 59
           |   |   (numeric_picture_string@COBOL~IBMEnterprise=2542#92f1900^1#92f1980:1[`9(9)'] Line 10 Column 59
        COP)numeric_picture_string
           |   |  )picture_string#92f1980
           |   | )picture_clause#92f19a0
           |   | (value_is_clause@COBOL~IBMEnterprise=711#92f1a80^1#92f1aa0:2 Line 11 Column 44
           |   |  (value_values@COBOL~IBMEnterprise=202#92f1a00^1#92f1a80:1 Line 11 Column 44
           |   |   ('VALUE'@COBOL~IBMEnterprise=2437#92f1960^1#92f1a00:1[Keyword:0] Line 11 Column 44
           |   |  )value_values#92f1a00
           |   |  (optional_is_are@COBOL~IBMEnterprise=63#92f1a20^1#92f1a80:2 Line 11 Column 54
        e
           |   |  (non_all_figurative_numeric_or_non_numeric_literal@COBOL~IBMEnterprise=2203#92f1a60^1#92f1a80:3 Line 11 Column 54
        ae/copylibs/GEGVD.COP
           |   |   ('ZERO'@COBOL~IBMEnterprise=2533#92f19e0^1#92f1a60:1[Keyword:0] Line 11 Column 54
           |   |  )non_all_figurative_numeric_or_non_numeric_literal#92f1a60
           |   | )value_is_clause#92f1a80
           |   |)data_description_clause_list#92f1aa0
           |   |(usage_clause@COBOL~IBMEnterprise=684#92f1b80^1#92f1ba0:2 Line 12 Column 44
           |   | (optional_usage_is@COBOL~IBMEnterprise=674#92f1ae0^1#92f1b80:1 Line 12 Column 44
        ge_is
           |   | ('COMPUTATIONAL-3'@COBOL~IBMEnterprise=2565#92f1a40^1#92f1b80:2[Keyword:0] Line 12 Column 44
        'COMPUTATIONAL-3'
           |   |)usage_clause#92f1b80
           |   )data_description_clause_list#92f1ba0
           |  )data_description_entry#92f1bc0
           |  ('.'@COBOL~IBMEnterprise=2358#92f1b60^1#92f1c20:3[Keyword:0] Line 12 Column 59
           | )subsidiary_description_entry#92f1c20
           | (subsidiary_description_entry_list@COBOL~IBMEnterprise=585#92f5fe0^1#92f6120:2 Line 13 Column 15
           |  (subsidiary_description_entry@COBOL~IBMEnterprise=588#92f4120^1#92f5fe0:1 Line 13 Column 15
           |   (level_number@COBOL~IBMEnterprise=2174#92f1d40^1#92f4120:1 Line 13 Column 15
           |   |(unsigned_integer_number@COBOL~IBMEnterprise=2579#92f1be0^1#92f1d40:1[10] Line 13 Column 15
        signed_integer_number
           |   )level_number#92f1d40
           |   (data_description_entry@COBOL~IBMEnterprise=608#92f40c0^1#92f4120:2 Line 13 Column 18
           |   |(composed_identifier@COBOL~IBMEnterprise=2351#92f1d80^1#92f40c0:1 Line 13 Column 18
           |   | (identifier@COBOL~IBMEnterprise=2850#92f1d00^1#92f1d80:1[`GEJVD-ITER'] Line 13 Column 18
        tifier
           |   |)composed_identifier#92f1d80
           |   |(data_description_clause_list@COBOL~IBMEnterprise=613#92f40a0^1#92f40c0:2 Line 13 Column 55
           |   | (data_description_clause_list@COBOL~IBMEnterprise=613#92f1fa0^1#92f40a0:1 Line 13 Column 55
           |   |  (picture_clause@COBOL~IBMEnterprise=653#92f1e40^1#92f1fa0:1 Line 13 Column 55
           |   |   (pic_picture@COBOL~IBMEnterprise=194#92f1dc0^1#92f1e40:1 Line 13 Column 55
           |   |   |('PIC'@COBOL~IBMEnterprise=2430#92f1d60^1#92f1dc0:1[Keyword:0] Line 13 Column 55
           |   |   )pic_picture#92f1dc0
           |   |   (optional_is@COBOL~IBMEnterprise=59#92f1de0^1#92f1e40:2 Line 13 Column 59
           |   |   (picture_string@COBOL~IBMEnterprise=655#92f1e20^1#92f1e40:3 Line 13 Column 59
           |   |   |(numeric_picture_string@COBOL~IBMEnterprise=2542#92f1da0^1#92f1e20:1[`9(3)'] Line 13 Column 59
        .COP)numeric_picture_string
           |   |   )picture_string#92f1e20
           |   |  )picture_clause#92f1e40
           |   |  (value_is_clause@COBOL~IBMEnterprise=711#92f1f80^1#92f1fa0:2 Line 14 Column 44
           |   |   (value_values@COBOL~IBMEnterprise=202#92f1f00^1#92f1f80:1 Line 14 Column 44
           |   |   |('VALUE'@COBOL~IBMEnterprise=2437#92f1e00^1#92f1f00:1[Keyword:0] Line 14 Column 44
        
           |   |   )value_values#92f1f00
           |   |   (optional_is_are@COBOL~IBMEnterprise=63#92f1f20^1#92f1f80:2 Line 14 Column 54
        re
           |   |   (non_all_figurative_numeric_or_non_numeric_literal@COBOL~IBMEnterprise=2203#92f1f60^1#92f1f80:3 Line 14 Column 54
        Mae/copylibs/GEGVD.COP
           |   |   |('ZERO'@COBOL~IBMEnterprise=2533#92f1ee0^1#92f1f60:1[Keyword:0] Line 14 Column 54
           |   |   )non_all_figurative_numeric_or_non_numeric_literal#92f1f60
           |   |  )value_is_clause#92f1f80
           |   | )data_description_clause_list#92f1fa0
           |   | (usage_clause@COBOL~IBMEnterprise=684#92f4080^1#92f40a0:2 Line 15 Column 44
           |   |  (optional_usage_is@COBOL~IBMEnterprise=674#92f4000^1#92f4080:1 Line 15 Column 44
        age_is
           |   |  ('COMPUTATIONAL-3'@COBOL~IBMEnterprise=2565#92f1f40^1#92f4080:2[Keyword:0] Line 15 Column 44
        )'COMPUTATIONAL-3'
           |   | )usage_clause#92f4080
           |   |)data_description_clause_list#92f40a0
           |   )data_description_entry#92f40c0
           |   ('.'@COBOL~IBMEnterprise=2358#92f4060^1#92f4120:3[Keyword:0] Line 15 Column 59
           |  )subsidiary_description_entry#92f4120
           |  (subsidiary_description_entry_list@COBOL~IBMEnterprise=585#92f5e60^1#92f5fe0:2 Line 16 Column 15
        
           |   (subsidiary_description_entry@COBOL~IBMEnterprise=588#92f45c0^1#92f5e60:1 Line 16 Column 15
           |   |(level_number@COBOL~IBMEnterprise=2174#92f4240^1#92f45c0:1 Line 16 Column 15
           |   | (unsigned_integer_number@COBOL~IBMEnterprise=2579#92f40e0^1#92f4240:1[10] Line 16 Column 15
        nsigned_integer_number
           |   |)level_number#92f4240
           |   |(data_description_entry@COBOL~IBMEnterprise=608#92f44e0^1#92f45c0:2 Line 16 Column 18
           |   | (composed_identifier@COBOL~IBMEnterprise=2351#92f4280^1#92f44e0:1 Line 16 Column 18
           |   |  (identifier@COBOL~IBMEnterprise=2850#92f4200^1#92f4280:1[`GEJVD-OP-CODE'] Line 16 Column 18
        identifier
           |   | )composed_identifier#92f4280
           |   | (data_description_clause_list@COBOL~IBMEnterprise=613#92f44a0^1#92f44e0:2 Line 16 Column 55
           |   |  (picture_clause@COBOL~IBMEnterprise=653#92f4340^1#92f44a0:1 Line 16 Column 55
           |   |   (pic_picture@COBOL~IBMEnterprise=194#92f42c0^1#92f4340:1 Line 16 Column 55
           |   |   |('PIC'@COBOL~IBMEnterprise=2430#92f4260^1#92f42c0:1[Keyword:0] Line 16 Column 55
           |   |   )pic_picture#92f42c0
           |   |   (optional_is@COBOL~IBMEnterprise=59#92f42e0^1#92f4340:2 Line 16 Column 59
           |   |   (picture_string@COBOL~IBMEnterprise=656#92f4320^1#92f4340:3 Line 16 Column 59
           |   |   |(alphanumeric_picture_string@COBOL~IBMEnterprise=2543#92f42a0^1#92f4320:1[`X(1)'] Line 16 Column 59
        GEGVD.COP)alphanumeric_picture_string
           |   |   )picture_string#92f4320
           |   |  )picture_clause#92f4340
           |   |  (value_is_clause@COBOL~IBMEnterprise=711#92f4480^1#92f44a0:2 
        

        ** 由于 SO 答案的大小限制,删除了 AST 的中间部分 **

           |   |   (level_number@COBOL~IBMEnterprise=2174#92f7140^1#92f7600:1 Line 44 Column 18
           |   |   |(unsigned_integer_number@COBOL~IBMEnterprise=2579#92f6fa0^1#92f7140:1[15] Line 44 Column 18
        P)unsigned_integer_number
           |   |   )level_number#92f7140
           |   |   (data_description_entry@COBOL~IBMEnterprise=608#92f7540^1#92f7600:2 Line 44 Column 21
           |   |   |(composed_identifier@COBOL~IBMEnterprise=2351#92f71a0^1#92f7540:1 Line 44 Column 21
           |   |   | (identifier@COBOL~IBMEnterprise=2850#92f70c0^1#92f71a0:1[`GEGVD-WS-S-LIT'] Line 44 Column 21
        COP)identifier
           |   |   |)composed_identifier#92f71a0
           |   |   |(data_description_clause_list@COBOL~IBMEnterprise=613#92f74a0^1#92f7540:2 Line 44 Column 55
        P
           |   |   | (picture_clause@COBOL~IBMEnterprise=653#92f72c0^1#92f74a0:1 Line 44 Column 55
           |   |   |  (pic_picture@COBOL~IBMEnterprise=194#92f7220^1#92f72c0:1 Line 44 Column 55
           |   |   |   ('PIC'@COBOL~IBMEnterprise=2430#92f7160^1#92f7220:1[Keyword:0] Line 44 Column 55
           |   |   |  )pic_picture#92f7220
           |   |   |  (optional_is@COBOL~IBMEnterprise=59#92f7260^1#92f72c0:2 Line 44 Column 59
           |   |   |  (picture_string@COBOL~IBMEnterprise=656#92f72a0^1#92f72c0:3 Line 44 Column 59
           |   |   |   (alphanumeric_picture_string@COBOL~IBMEnterprise=2543#92f7200^1#92f72a0:1[`X(1)'] Line 44 Column 59
        bs/GEGVD.COP)alphanumeric_picture_string
           |   |   |  )picture_string#92f72a0
           |   |   | )picture_clause#92f72c0
           |   |   | (value_is_clause@COBOL~IBMEnterprise=711#92f7460^1#92f74a0:2 Line 45 Column 44
           |   |   |  (value_values@COBOL~IBMEnterprise=202#92f7380^1#92f7460:1 Line 45 Column 44
           |   |   |   ('VALUE'@COBOL~IBMEnterprise=2437#92f7280^1#92f7380:1[Keyword:0] Line 45 Column 44
        UE'
           |   |   |  )value_values#92f7380
           |   |   |  (optional_is_are@COBOL~IBMEnterprise=63#92f73a0^1#92f7460:2 Line 45 Column 54
        s_are
           |   |   |  (non_figurative_non_numeric_literal@COBOL~IBMEnterprise=2205#92f7440^1#92f7460:3 Line 45 Column 54
        /GEGVD.COP
           |   |   |   (non_numeric_literal_string@COBOL~IBMEnterprise=2187#92f7420^1#92f7440:1 Line 45 Column 54
        COP
           |   |   |   |(non_numeric_literal_quote@COBOL~IBMEnterprise=2840#92f7360^1#92f7420:1[`S'] Line 45 Column 54
        EGVD.COP)non_numeric_literal_quote
           |   |   |   )non_numeric_literal_string#92f7420
           |   |   |  )non_figurative_non_numeric_literal#92f7440
           |   |   | )value_is_clause#92f7460
           |   |   |)data_description_clause_list#92f74a0
           |   |   )data_description_entry#92f7540
           |   |   ('.'@COBOL~IBMEnterprise=2358#92f73c0^1#92f7600:3[Keyword:0] Line 45 Column 57
           |   |  )subsidiary_description_entry#92f7600
           |   |  (subsidiary_description_entry_list@COBOL~IBMEnterprise=585#92fa180^1#92fa200:2 Line 46 Column 18
        .COP
           |   |   (subsidiary_description_entry@COBOL~IBMEnterprise=588#92f7b40^1#92fa180:1 Line 46 Column 18
        
           |   |   |(level_number@COBOL~IBMEnterprise=2174#92f7760^1#92f7b40:1 Line 46 Column 18
           |   |   | (unsigned_integer_number@COBOL~IBMEnterprise=2579#92f75a0^1#92f7760:1[15] Line 46 Column 18
        OP)unsigned_integer_number
           |   |   |)level_number#92f7760
           |   |   |(data_description_entry@COBOL~IBMEnterprise=608#92f7a60^1#92f7b40:2 Line 46 Column 21
           |   |   | (composed_identifier@COBOL~IBMEnterprise=2351#92f77c0^1#92f7a60:1 Line 46 Column 21
           |   |   |  (identifier@COBOL~IBMEnterprise=2850#92f7660^1#92f77c0:1[`GEGVD-MPN-FORM-VER-CD'] Line 46 Column 21
        s/GEGVD.COP)identifier
           |   |   | )composed_identifier#92f77c0
           |   |   | (data_description_clause_list@COBOL~IBMEnterprise=613#92f7a20^1#92f7a60:2 Line 46 Column 55
        OP
           |   |   |  (picture_clause@COBOL~IBMEnterprise=653#92f7880^1#92f7a20:1 Line 46 Column 55
           |   |   |   (pic_picture@COBOL~IBMEnterprise=194#92f7800^1#92f7880:1 Line 46 Column 55
           |   |   |   |('PIC'@COBOL~IBMEnterprise=2430#92f77a0^1#92f7800:1[Keyword:0] Line 46 Column 55
        
           |   |   |   )pic_picture#92f7800
           |   |   |   (optional_is@COBOL~IBMEnterprise=59#92f7820^1#92f7880:2 Line 46 Column 59
           |   |   |   (picture_string@COBOL~IBMEnterprise=656#92f7860^1#92f7880:3 Line 46 Column 59
           |   |   |   |(alphanumeric_picture_string@COBOL~IBMEnterprise=2543#92f77e0^1#92f7860:1[`X(5)'] Line 46 Column 59
        ibs/GEGVD.COP)alphanumeric_picture_string
           |   |   |   )picture_string#92f7860
           |   |   |  )picture_clause#92f7880
           |   |   |  (value_is_clause@COBOL~IBMEnterprise=711#92f79c0^1#92f7a20:2 Line 47 Column 44
           |   |   |   (value_values@COBOL~IBMEnterprise=202#92f7920^1#92f79c0:1 Line 47 Column 44
           |   |   |   |('VALUE'@COBOL~IBMEnterprise=2437#92f7840^1#92f7920:1[Keyword:0] Line 47 Column 44
        LUE'
           |   |   |   )value_values#92f7920
           |   |   |   (optional_is_are@COBOL~IBMEnterprise=63#92f7940^1#92f79c0:2 Line 47 Column 54
        is_are
           |   |   |   (non_figurative_non_numeric_literal@COBOL~IBMEnterprise=2205#92f79a0^1#92f79c0:3 Line 47 Column 54
        s/GEGVD.COP
           |   |   |   |(non_numeric_literal_string@COBOL~IBMEnterprise=2187#92f7980^1#92f79a0:1 Line 47 Column 54
        .COP
           |   |   |   | (non_numeric_literal_quote@COBOL~IBMEnterprise=2840#92f7900^1#92f7980:1[`99-00'] Line 47 Column 54
        ibs/GEGVD.COP)non_numeric_literal_quote
           |   |   |   |)non_numeric_literal_string#92f7980
           |   |   |   )non_figurative_non_numeric_literal#92f79a0
           |   |   |  )value_is_clause#92f79c0
           |   |   | )data_description_clause_list#92f7a20
           |   |   |)data_description_entry#92f7a60
           |   |   |('.'@COBOL~IBMEnterprise=2358#92f7960^1#92f7b40:3[Keyword:0] Line 47 Column 61
           |   |   )subsidiary_description_entry#92f7b40
           |   |   (subsidiary_description_entry@COBOL~IBMEnterprise=588#92fa0c0^1#92fa180:2 Line 48 Column 18
        
           |   |   |(level_number@COBOL~IBMEnterprise=2174#92f7c80^1#92fa0c0:1 Line 48 Column 18
           |   |   | (unsigned_integer_number@COBOL~IBMEnterprise=2579#92f7ae0^1#92f7c80:1[15] Line 48 Column 18
        OP)unsigned_integer_number
           |   |   |)level_number#92f7c80
           |   |   |(data_description_entry@COBOL~IBMEnterprise=608#92f7fc0^1#92fa0c0:2 Line 48 Column 21
           |   |   | (composed_identifier@COBOL~IBMEnterprise=2351#92f7cc0^1#92f7fc0:1 Line 48 Column 21
           |   |   |  (identifier@COBOL~IBMEnterprise=2850#92f7b60^1#92f7cc0:1[`GEGVD-PLUS-MPN-FORM-VER-CD'] Line 48 Column 21
        pylibs/GEGVD.COP)identifier
           |   |   | )composed_identifier#92f7cc0
           |   |   | (data_description_clause_list@COBOL~IBMEnterprise=613#92f7f60^1#92f7fc0:2 Line 48 Column 55
        OP
           |   |   |  (picture_clause@COBOL~IBMEnterprise=653#92f7de0^1#92f7f60:1 Line 48 Column 55
           |   |   |   (pic_picture@COBOL~IBMEnterprise=194#92f7d20^1#92f7de0:1 Line 48 Column 55
           |   |   |   |('PIC'@COBOL~IBMEnterprise=2430#92f7ca0^1#92f7d20:1[Keyword:0] Line 48 Column 55
        
           |   |   |   )pic_picture#92f7d20
           |   |   |   (optional_is@COBOL~IBMEnterprise=59#92f7d40^1#92f7de0:2 Line 48 Column 59
           |   |   |   (picture_string@COBOL~IBMEnterprise=656#92f7da0^1#92f7de0:3 Line 48 Column 59
           |   |   |   |(alphanumeric_picture_string@COBOL~IBMEnterprise=2543#92f7ce0^1#92f7da0:1[`X(5)'] Line 48 Column 59
        ibs/GEGVD.COP)alphanumeric_picture_string
           |   |   |   )picture_string#92f7da0
           |   |   |  )picture_clause#92f7de0
           |   |   |  (value_is_clause@COBOL~IBMEnterprise=711#92f7f20^1#92f7f60:2 Line 49 Column 44
           |   |   |   (value_values@COBOL~IBMEnterprise=202#92f7e80^1#92f7f20:1 Line 49 Column 44
           |   |   |   |('VALUE'@COBOL~IBMEnterprise=2437#92f7d80^1#92f7e80:1[Keyword:0] Line 49 Column 44
        LUE'
           |   |   |   )value_values#92f7e80
           |   |   |   (optional_is_are@COBOL~IBMEnterprise=63#92f7ea0^1#92f7f20:2 Line 49 Column 54
        is_are
           |   |   |   (non_figurative_non_numeric_literal@COBOL~IBMEnterprise=2205#92f7f00^1#92f7f20:3 Line 49 Column 54
        s/GEGVD.COP
           |   |   |   |(non_numeric_literal_string@COBOL~IBMEnterprise=2187#92f7ee0^1#92f7f00:1 Line 49 Column 54
        .COP
           |   |   |   | (non_numeric_literal_quote@COBOL~IBMEnterprise=2840#92f7e60^1#92f7ee0:1[`03-04'] Line 49 Column 54
        ibs/GEGVD.COP)non_numeric_literal_quote
           |   |   |   |)non_numeric_literal_string#92f7ee0
           |   |   |   )non_figurative_non_numeric_literal#92f7f00
           |   |   |  )value_is_clause#92f7f20
           |   |   | )data_description_clause_list#92f7f60
           |   |   |)data_description_entry#92f7fc0
           |   |   |('.'@COBOL~IBMEnterprise=2358#92f7ec0^1#92fa0c0:3[Keyword:0] Line 49 Column 61
           |   |   )subsidiary_description_entry#92fa0c0
           |   |  )subsidiary_description_entry_list#92fa180
           |   | )subsidiary_description_entry_list#92fa200
           |   |)subsidiary_description_entry_list#92fa340
           |   )subsidiary_description_entry_list#92fa3c0
           |  )subsidiary_description_entry#92fa500
           | )subsidiary_description_entry_list#92fa6e0
           |)subsidiary_description_entry_list#92fa7a0
           )subsidiary_description_entry#92fa840
          )record_01_description_entry#92faac0
         )record_or_data_item_entry_list#92fac80
        )cobol_source_file#92facc0
        
        C:\DMS\Domains\COBOL\IBMEnterprise\Tools\Parser\Source>
        

        一旦你有了树,就可以很简单地遍历树并提取关于 COBOL 符号声明的事实。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-29
          • 1970-01-01
          相关资源
          最近更新 更多