Cobol - 解析cobol程序中的组项

时间:2016-11-25 11:23:12

标签: antlr4 cobol gnucobol

我需要从COBOL程序中提取信息。我正在使用ANTLR语法进行COBOL。我需要提取组变量作为一个整体。我无法用ANTLR提取它,因为解析器将每个变量细分/组项提取为单个元素。 我需要以某种方式将组项目作为一堆。我是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?这是安全的吗? 水平信息是否足以得出哪些元素属于一个群体? 任何指针都表示赞赏。

4 个答案:

答案 0 :(得分:4)

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

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

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

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

答案 1 :(得分:3)

你实际上有两个问题:

" [...]定义是否有效?"不,不是因为您之前没有级别07.如果您将EEMPNAME的级别更改为07SNO更改为02,则该级别有效。组项目可能有USAGE条款,但没有PICTURE

这导致了问题"我希望了解编译器如何理解要在组中包含哪些元素,以及在何处停止"。

您需要将级别编号与变量一起存储。如果您想知道小组的哪一部分,那么您需要检查此级别以及以下所有级别。如果要检查完整级别02组,请仅使用具有更高级别编号的变量,直到达到下一级别02或更高级别(在本例中为01),如果您需要 根据您的需要,附加需要检查具有相同级别的下一个变量是否具有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

答案 2 :(得分:1)

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

ANTLR无法解决的一些挑战是1)组项目可以包含组项目; 2)组项可以重新定义其他项,或者重新定义; 3)使用很少,但非常复杂的66级重命名条款。

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

答案 3 :(得分:0)

现在已经有一段时间了,因为我已经完成了COBOL,但如果我的记忆正确地为我服务,那么会有很多问题。

1)01级始终从第8列开始。 2)在分配次级时,最好增加+5    01我的记录。       05 my-name pic x(30)值空间。       05 my-address1 pic x(40)值空格。 3)我认为现在已经过时了77级,因为它们不是对记忆的高效使用。此外,当使用77级时,应始终在工作存储部分的开头定义它们。显然,记录布局是在文件部分中定义的,除非使用write from和read into?

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

01 ws-flages。       05 ws_flag1 pic x值空间。       05 ws_flag2 pic x value space。

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

希望这有帮助!