首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cobol -解析cobol程序中的组项。

Cobol -解析cobol程序中的组项。
EN

Stack Overflow用户
提问于 2016-11-25 11:23:12
回答 4查看 666关注 0票数 2

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

例:

代码语言:javascript
复制
  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?这样做安全吗?级别信息是否足以派生出组中的哪些元素?任何指点都会受到赞赏。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-11-25 12:01:22

你其实有两个问题:

“定义有效吗?”不,这并不是因为你之前没有07级。如果将EEMPNAME级别更改为07,或将SNO级别更改为02,则该级别是有效的。组项可能有USAGE子句,但没有PICTURE

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

您需要将级别号与变量一起存储。如果您想知道什么是组的一部分,那么您需要检查这个级别和下面的所有内容。如果您想要检查完整的级别02组,只使用下面具有较高级别号的变量,直到到达下一个级别02或更高的级别(在本例中为01),如果您想要根据您的需要,另外需要检查具有相同级别的下一个变量是否有REDEFINES,在这种情况下,它属于同一个组(存储)。类似的应用于第66级(重命名,没有自己的存储)。

级别88也没有存储空间,它只是用于验证条目,这取决于您想要做的解析,您可以忽略它们。注意:级别88不创建子项,您可以有多个子项,然后再创建一个较低级别的编号。

始终定义新项的级别编号为01,扩展名为66、77和78。

代码语言:javascript
复制
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来源,并提出一个新的问题,如果必要的话。例如,倾卸

票数 3
EN

Stack Overflow用户

发布于 2016-11-25 20:49:17

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

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

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

在这个单元测试中可以找到一个解析数据描述条目的示例。

票数 4
EN

Stack Overflow用户

发布于 2016-11-25 16:22:42

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

ANTLR将无法达到的一些挑战是: 1)组项可以包含组项;2)组项可以重新定义其他项,或者重新定义;3)很少使用但非常复杂的级别-66重命名子句。

如果您将每个编号的数据定义视为单独的产品,并维护一个堆栈,按下新项,在处理完某个项后弹出,并且知道在再次看到相同的级别号后您已经完成了一个组,那么您的生活就会更容易。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40803898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档