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