我需要从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)之后,在组EMPREC中包含所有元素(=>2和<=49),直到遇到另一项01或77?这样做安全吗?级别信息是否足以派生出组中的哪些元素?任何指点都会受到赞赏。
发布于 2016-11-25 12:01:22
你其实有两个问题:
“定义有效吗?”不,这并不是因为你之前没有07级。如果将EEMPNAME级别更改为07,或将SNO级别更改为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来源,并提出一个新的问题,如果必要的话。例如,倾卸。
发布于 2016-11-25 20:49:17
发布于 2016-11-25 16:22:42
我怀疑您需要在ANTLR解析器后面添加一些额外的代码。如果您标记每个单独的项,那么保持一个组项的堆栈有点简单。然而,试图把整个组项目作为一个单一的生产将是非常困难的。
ANTLR将无法达到的一些挑战是: 1)组项可以包含组项;2)组项可以重新定义其他项,或者重新定义;3)很少使用但非常复杂的级别-66重命名子句。
如果您将每个编号的数据定义视为单独的产品,并维护一个堆栈,按下新项,在处理完某个项后弹出,并且知道在再次看到相同的级别号后您已经完成了一个组,那么您的生活就会更容易。
https://stackoverflow.com/questions/40803898
复制相似问题