You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GnuCOBOL编译报错:PERFORM需END-PERFORM却提示其意外

GnuCOBOL编译矛盾错误排查(FIZZBUZZ程序场景)

这种矛盾错误的核心是PERFORM语句的语法风格混用,GnuCOBOL支持两种PERFORM写法,但不能在同一结构里混合使用,否则编译器就会出现前后矛盾的报错:

错误原因拆解

  1. 结构化PERFORM(COBOL 85+标准):用END-PERFORM标记结束,不需要在执行体内部加句点。如果你的代码里在PERFORM和END-PERFORM之间加了句点,编译器会误以为PERFORM块已经结束,后续的END-PERFORM就会被判定为意外语法。
  2. 老式PERFORM(COBOL 74及更早标准):靠句点.标记结束,不需要END-PERFORM。如果你的代码里用了这种写法又额外加了END-PERFORM,编译器会提示PERFORM未被END-PERFORM终止(因为句点打断了结构化块的识别),同时又认为END-PERFORM是多余的。

正确代码示例(FIZZBUZZ 3的倍数替换逻辑)

结构化写法(推荐,符合现代COBOL标准)

IDENTIFICATION DIVISION.
PROGRAM-ID. FIZZ-PART.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 COUNTER PIC 9(3) VALUE 1.
01 MAX-NUM PIC 9(3) VALUE 100.
PROCEDURE DIVISION.
MAIN-LOGIC.
    PERFORM UNTIL COUNTER > MAX-NUM
        IF COUNTER MOD 3 = 0
            DISPLAY "FIZZ"
        ELSE
            DISPLAY COUNTER
        END-IF
        ADD 1 TO COUNTER
    END-PERFORM
    STOP RUN.

老式写法(兼容旧标准)

IDENTIFICATION DIVISION.
PROGRAM-ID. FIZZ-PART.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 COUNTER PIC 9(3) VALUE 1.
01 MAX-NUM PIC 9(3) VALUE 100.
PROCEDURE DIVISION.
MAIN-LOGIC.
    PERFORM UNTIL COUNTER > MAX-NUM
        IF COUNTER MOD 3 = 0
            DISPLAY "FIZZ"
        ELSE
            DISPLAY COUNTER
        END-IF
        ADD 1 TO COUNTER
    .
    STOP RUN.

排查修复步骤

  • 检查第12行的PERFORM块:如果用结构化写法,删除块内所有多余句点,确保PERFORM和END-PERFORM是完整的配对结构。
  • 检查第18行的END-PERFORM:如果用老式写法,直接删除该行的END-PERFORM,确保PERFORM块末尾用句点终止。
  • 确认编译标准:用cobc -std=cobol85 your-program.cob编译,强制使用支持结构化写法的标准;如果需要兼容旧标准,用cobc -std=cobol74 your-program.cob,此时必须用句点终止PERFORM。

内容的提问来源于stack exchange,提问作者Durandal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 10:30:27