Cobol - 解析 Cobol 程序中的组项

Cobol - parsing group items in a cobol program

我需要从 COBOL 程序中提取信息。我正在为 COBOL 使用 ANTLR 语法。我需要整体提取组变量。我无法使用 ANTLR 提取它,因为解析器将每个变量 subdivision/group 项提取为单个元素。 我需要以某种方式将组项目作为一堆。我是 COBOL 的新手,所以我想了解编译器如何理解要包含在组中的元素以及在何处停止。

EX:

  01 EMPREC.
  02 EEMPNAME.
  10 FIRSTNAME PIC X(10)
  10 LASTNAM PIC X(15)

  07 SNO PIC X(15)

以上定义是否有效?编译器是否会在 EMPREC 组中的第一项 (01 EMPREC) 之后包含所有元素(=>2 和 <=49),直到遇到另一个 01 或 77 ?这样假设安全吗? 级别信息是否足以得出哪些元素属于一个组? 感谢任何指点。

你其实有两个问题:

"Is the [...] definition valid?" 不,不是,因为你没有之前的等级 07。如果你将 EEMPNAME 的等级更改为 07SNO 的等级为 [=14= 】 有效。组项可能有 USAGE 子句但没有 PICTURE.

这引出了问题"I want to get an understanding of how the compiler understands which elements to include in a group, and where to stop"。

您需要将层数与变量一起存储。如果你想知道什么是组的一部分,那么你需要检查这个级别和下面的所有内容。如果你想检查完整的 02 级组,只使用下面具有更高级别编号的变量,直到你到达下一个级别 02 或更高级别(在本例中为 01),如果你想要 根据您的需要,您 additional 需要检查具有相同级别的下一个变量是否具有 REDEFINES ,在这种情况下它属于同一组(存储方式) .类似适用于 66 级(重命名,没有自己的存储空间)。

88级也没有存储,它只是用于验证条目,具体取决于您要进行的解析,您可以忽略它们。 重要提示:88级不会创建子项,你可以有多个和一个较低的级别数。

始终定义新项目的级别编号为 01,扩展名为 66、77 和 78。

01 vargroup.
   02 var-1  pic 9.
      88  var-is-even  values 0, 2, 4 6 8   . 
      88  var-is-not-even  values 1 3 5 7 9. 
      88  var-is-big   value 6 thru 9.
   02 var-2  pic x.
   01 new-var pic x.
   77 other-var  pic 9.

我建议阅读一些 COBOL 资源,并在必要时提出一个新问题。例如 CBL_OC_DUMP.

我怀疑您需要在 ANTLR 解析器后面添加一些额外的代码。如果您对每个单独的项目进行标记,那么跟上一堆组项目就比较容易了。然而,试图将整个组项目作为一个作品来抓取将非常困难。

ANTLR 无法应对的一些挑战是 1) 组项可以包含组项; 2)分组项可以重新定义其他项,或者被重新定义; 3) 很少使用,但非常复杂的 66 级重命名子句。

如果你将每个编号的数据定义视为一个单独的生产,并维护一个堆栈,推送新项目,一旦完成处理一个项目就弹出,并且一旦看到相同的级别就知道你已经完成了一组重新编号,你的生活会更轻松。

我是您在 ANTLR4 语法项目中找到的 COBOL ANTLR4 语法的作者。 COBOL 语法仅生成抽象语法树 (AST)。

相比之下,您要求的是抽象语义图 (ASG),它表示变量分组以及 AST 元素之间的一般关系。

这样的 ASG 是由我的 proleap-cobol-parser 项目中的 COBOL 解析器生成的。该项目使用提到的 COBOL 语法并解析 AST 元素之间的关系。

可以在unit test中找到解析数据描述条目的示例。

我已经有一段时间没有做COBOL了,但是如果我没记错的话,问题还是挺多的。

1) 01 级别始终从第 8 列开始。 2)分配后续级别时,最好增加我的+5 01 我的记录。 05 我的名字图片 x(30) 值 spaces。 05 我的地址 1 图片 x(40) 值 spaces。 3) 我认为 77 个关卡现在已经过时了,因为它们不能有效地使用内存。此外,当使用 77 个级别时,应始终在工作存储部分的开头定义它们。显然记录布局是在文件部分定义的,除非使用写入和读入?

4) 如果您要定义大量新变量 pic x。不要为每个级别使用新的 01 级别!

01 ws-flages。 05 ws_flag1 图片 x 值 space。 05 ws_flag2 图片 x 值 space.

等等

对于 COBOL 手册,请尝试 Stern 和 Stern。

希望对您有所帮助!