2

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

前任:

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

  07 SNO PIC X(15)

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

4

4 回答 4

4

I am the author of the COBOL ANTLR4 grammar you found in the ANTLR4 grammars project. The COBOL grammar generates only an Abstract Syntax Tree (AST).

In contrast, what you ask for is an Abstract Semantic Graph (ASG), which represents grouping of variables and in general relationships between AST elements.

Such an ASG is generated by the COBOL parser at my proleap-cobol-parser project. This project uses the mentioned COBOL grammar and resolves relationships between AST elements.

An example for parsing data description entries can be found in this unit test.

于 2016-11-25T20:49:17.400 回答
3

你实际上有两个问题:

“[...] 定义有效吗?” 不,这不是因为您没有以前的级别 07。如果您将级别更改为EEMPNAMEto07SNOto02它是有效的。组项目可能有一个USAGE子句但没有PICTURE

这导致了“我想了解编译器如何理解组中包含哪些元素以及在哪里停止”的问题。

您需要将级别编号与变量一起存储。如果您想知道组的一部分是什么,那么您需要检查此级别以及以下所有内容。如果您想检查完整的 02 级组,请仅使用下面具有更高级别编号的变量,直到您到达下一个级别 02 或更高级别(在本例中为 01),如果您想要根据您的需要,您需要检查具有相同级别的下一个变量是否具有REDEFINESin,在这种情况下,它属于同一组(存储方面)。类似情况适用于 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

于 2016-11-25T12:01:22.163 回答
1

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

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

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

于 2016-11-25T16:22:42.430 回答
0

自从我完成 COBOL 以来已经有一段时间了,但是如果我的记忆正确的话,会有很多问题。

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

4) 如果你定义了很多 new-var pic x。不要为每个级别使用新的 01 级别!

01 ws 标志。05 ws_flag1 pic x 值空间。05 ws_flag2 pic x 值空间。

等等

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

希望这可以帮助!

于 2016-12-12T15:34:42.183 回答