Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Antlr4 Cobol-解析Cobol程序中的组项_Antlr4_Cobol_Gnucobol - Fatal编程技术网

Antlr4 Cobol-解析Cobol程序中的组项

Antlr4 Cobol-解析Cobol程序中的组项,antlr4,cobol,gnucobol,Antlr4,Cobol,Gnucobol,我需要从COBOL程序中提取信息。我使用的是COBOL的ANTLR语法。我需要从整体上提取组变量。我无法使用ANTLR提取这个,因为解析器将每个变量细分/组项提取为单个元素。 我需要以某种方式将组项目作为一堆。我是COBOL新手,所以我想了解编译器如何理解在一个组中包含哪些元素,以及在哪里停止 例: 上述定义有效吗?编译器是否包含所有元素(=>2和您实际上有两个问题: “该[…]定义有效吗?”没有,因为您之前没有级别07。如果您将EEMPNAME的级别更改为07或SNO更改为02,则该定义有效。

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

例:


上述定义有效吗?编译器是否包含所有元素(=>2和您实际上有两个问题:

“该[…]定义有效吗?”没有,因为您之前没有级别07。如果您将
EEMPNAME
的级别更改为
07
SNO
更改为
02
,则该定义有效。组项可能有
用法
子句,但没有
图片

这就引出了一个问题:“我想了解编译器如何理解在一个组中包含哪些元素,以及在哪里停止”

您需要将级别编号与变量一起存储。如果您想知道组的组成部分,则需要检查此级别和下面的所有级别。如果您想检查完整的级别02组,请仅使用下面级别编号较高的变量,直到到达下一个级别02或更高级别(在本例中为01),如果你想要 根据您的需要,您还需要检查具有相同级别的下一个变量是否在中具有
重定义
,在这种情况下,它属于同一组(存储方面)。类似情况也适用于级别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源代码,并在必要时提出一个新的问题。例如。

我怀疑您需要在ANTLR解析器后面添加一些额外的代码。如果您标记每个单独的项,那么保持组项的堆栈有点容易。但是,尝试将整个组项作为sin抓取生产将非常困难

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


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

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

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

这样的ASG是由我的项目中的COBOL解析器生成的。该项目使用上述COBOL语法并解析AST元素之间的关系


解析数据描述项的一个例子可以在这里找到。

自从我使用COBOL以来,已经有相当长的一段时间了,但是如果我的内存没有问题的话,会有很多问题

1) 01级别始终从第8列开始。 2) 当分配子级别时,最好增加my+5 01我的记录。 05我的名字pic x(30)值空间。 05 my-address1 pic x(40)值空间。 3) 我认为77个级别现在已经过时了,因为它们不能有效地使用内存。此外,当使用77个级别时,应始终在“工作存储”部分的开头定义这些级别。显然,除非使用write-from和read-into,否则记录布局是在文件部分定义的

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

01 ws鞭毛。 05 ws_flag1图片x值空间。 05 ws_flag2图片x值空间

等等

有关COBOL手册,请尝试Stern&Stern


希望这有帮助

嗯。那么您是说级别编号应该足以确定数据项是否属于某个组?i、 e,级别编号在2和49之间(具有有效编号)的所有数据项,在级别01之后,将属于单个组。下一个新变量只能有级别编号01、77、66或88?似乎还有另一个错误:级别02组2级别10以下,但仍定义为PIC X。我的记忆正在衰退,但我想我记得这是不可能的。感谢详细解释。我需要有人告诉我“总是定义新项的级别号是01,扩展名是66和77。”:)我目前正在使用级别号信息将数据项分组。如果级别信息足够,那么我的逻辑应该可以。谢谢你指出这一点。这很有帮助。目前,我正在使用级别编号信息将数据项分组到一个组中。再次感谢,谢谢。是 啊我现在使用类似的逻辑来取出组项。
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.