Cobol Copybook 解析器

Cobol Copybook Parser

谁能建议我如何提取 Cobol Copybook 的字段? 如果您可以提供代码片段或任何链接方面的帮助,将会有所帮助吗? 示例:

我想这样解压

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)

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

您可以使用基于 Java 的 ProLeap COBOL parser to extract all kinds of data from COBOL files such as level numbers, picture strings etc. Also you can extract COMP, COMP-1 etc. from the usage clause like this

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

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

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

如果您尝试使用正则表达式或其他无法执行上下文无关解析等操作的工具对其进行破解,您得到的工具将无法处理任何复杂情况。

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

我们的 COBOL parser for DMS 可以处理以上所有内容并生成 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 解析器直接应用于字帖文件, 生成以下抽象语法树:

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 符号声明的事实就相当简单了。

免责声明:我维护 cb2xml

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

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

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.

cb2 的输出xml:

<?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 的一个有趣应用在

中有描述

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

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

例如。您输入的字帖是:

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

希望这能解决您的问题。

对于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

的维护者