嵌套执行需要并且不需要最终执行

时间:2015-02-22 15:02:35

标签: cobol

使用此代码,我得到了

16: Perform stmnt not terminated by end-perform

33: syntax error, unexpected end-perform

为什么说我需要最终表演而又不需要它?

   identification division.
   program-id.  xxx.     
  * will accept and display a num until 0 is called then
  * asks to go again


   data division.
   file section.

   working-storage section.     
   01  num                 pic 9(4).
   01  hold                pic 9(4).
   01  another             pic x.
   procedure division.
     perform until another = 'N'                 (line 16)
        Display "Another Session (Y/N)? "
              with no advancing
        if another = 'Y'
        Display "Enter a 4-digit unsigned number (0 to stop): "
             with no advancing
        accept num
        move num to hold
        perform until num = 0
        Display "Enter a 4-digit unsigned number (0 to stop): "
             with no advancing
        accept num
          if num <> 0
       move num to hold
        end-perform.
        display space
        Display "The last number entered: "hold
     End-perform.                            (Line 33)

     stop run.

2 个答案:

答案 0 :(得分:5)

   end-perform.
    display space
    Display "The last number entered: "hold
 End-perform.                            (Line 33)

这是杀手的全停/周期(第30行)。

虽然自1985年标准COBOL在全停/周期方面更加放松,但是单一的COBOL将使所有当前的范围尖叫停止。你可以将50级深度嵌套,并且一次性完成一个句号就可以一次性结束。

我的建议是在PROCEDURE DIVISION中使用绝对最小值的句号。

即:终止PROCEDURE DIVISION标题;一个终止每个段落/ SECTION标签;一个终止paragrpah / SECTION;一个终止程序(对于没有段落/ SECTIONS的程序)。此外,如果您有PROCEDURE DIVISION COPY或REPLACE语句,则需要使用句号/句号来终止这些语句。

除了标签的终止之外,我将每个句号/句点放在自己的一行上,从不附加到任何代码。然后,我可以移动代码并插入代码,而不必担心是否需要添加/删除句号/句号。

至于为什么你需要END-PERFORM,它是一个“内联PERFORM”。从语法上讲,内联PERFORM需要END-PERFORM,但是在END-PERFORM定位之前,使用全停止/周期会导致PERFORM范围终止,因此第16行出错。随后END-PERFORM未连接到找到了PERFORM,因此错误就在第33行。

在您的问题中添加错误消息时,重要的是您完全按照您的方式包含错误消息。复制/粘贴,请不要重新尝试。还包括任何消息编号。

答案 1 :(得分:1)

你绝对不能混合句号&#34;。&#34; Cobol-74的范围终止符和Cobol-85的End- *范围终止符。

不同之处在于完全停止&#34;。&#34;终止所有范围。

End- *仅终止最近的范围,就像您期望的那样。

放一个&#34;。&#34;在End- *的代码中间有点像在它的中间丢弃核弹。作为一项规则,对于在过去四分之一世纪左右制作的编译器,一段时间应该只发生在一个段落名称末尾的程序部分,或一个段落的末尾(和部分也是如此,但是那些在一个段落中是无用的)。由操作系统管理分段和叠加的年龄。我喜欢使用&#34;退出。&#34;或者&#34;继续。&#34;只是为了强调我在程序部门中使用了一个讨厌的,最好避免的时期。