我需要从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?这是安全的吗? 水平信息是否足以得出哪些元素属于一个群体? 任何指针都表示赞赏。
答案 0 :(得分:4)
我是您在ANTLR4语法项目中找到的COBOL ANTLR4语法的作者。 COBOL语法仅生成抽象语法树(AST)。
相比之下,您要求的是抽象语义图(ASG),它表示变量的分组以及AST元素之间的一般关系。
这样的ASG由我的proleap-cobol-parser项目中的COBOL解析器生成。该项目使用提到的COBOL语法并解析AST元素之间的关系。
可以在此unit test中找到解析数据描述条目的示例。
答案 1 :(得分:3)
你实际上有两个问题:
" [...]定义是否有效?"不,不是因为您之前没有级别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来源,并在必要时提出一个新问题。例如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&船尾。
希望这有帮助!