GnuCOBOL编译报错:PERFORM需END-PERFORM却提示其意外
GnuCOBOL编译矛盾错误排查(FIZZBUZZ程序场景)
这种矛盾错误的核心是PERFORM语句的语法风格混用,GnuCOBOL支持两种PERFORM写法,但不能在同一结构里混合使用,否则编译器就会出现前后矛盾的报错:
错误原因拆解
- 结构化PERFORM(COBOL 85+标准):用
END-PERFORM标记结束,不需要在执行体内部加句点。如果你的代码里在PERFORM和END-PERFORM之间加了句点,编译器会误以为PERFORM块已经结束,后续的END-PERFORM就会被判定为意外语法。 - 老式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
相关产品推荐
相关产品推荐

