2016-09-13 66 views
1

我在cygwin终端中使用OpenCOBOL来编译该程序,该程序只应从输入文本文件中读取并将其打印到格式化的输出文件中。当我尝试编译我得到这个错误:COBOL期待文件结尾

programonerjm.cbl:13: Error: syntax error, unexpected "SOURCE-COMPUTER", expecting "end of file" 

我不能完全肯定我procedure division是正确的要么。

有人能告诉我我做错了什么吗?我知道这可能是一个小错误,它让我发疯。

 IDENTIFICATION DIVISION. 
     PROGRAM-ID. PROGRAM1. 
     AUTHOR. ME. 
     ********************************************************** 
     * Purpose: Program that outputs an Inventory Report for 
     * Drakea Bike Parts Warehouse. 
     ********************************************************** 
     ENVIRONMENT DIVISION. 

     CONFIGURATION SECTION. 
     SOURCE-COMPUTER. IBM-PC. 
     OBJECT-COMPUTER. IBM-PC. 

     INPUT-OUTPUT SECTION. 

     FILE-CONTROL. 
      SELECT INV-FILE ASSIGN TO 'PR1FA16.txt' 
       ORGANIZATION IS LINE SEQUENTIAL. 
      SELECT OUTPUT-INV-REPORT 
       ASSIGN TO PRINTER 'OUTPUT-INV-REPORT.DAT'. 

     ********************************************************** 

     DATA DIVISION. 

     FILE SECTION. 

     FD INV-FILE. 
     01 INV-RECORD. 
      05 CAT-NUM     PIC X(5). 
      05 ITEM-DESC     PIC X(20). 
      05 UNIT-PURCHASE-PRICE  PIC 999V99. 
      05        PIC X(7). 
      05 QUANTITY-IN-STOCK   PIC 9(3). 
      05 QUANTITY-ON-ORDER   PIC 9(3). 
      05 REORDER-POINT    PIC 9(3). 

     FD OUTPUT-INV-REPORT. 
     01 INVENTORY-REPORT.  
      05        PIC X(80). 

     WORKING-STORAGE SECTION. 
     * EOF FLAG 
     * REPORT SECTION - CREATE HEADERS 

     01 FLAGS-N-SWITCHES. 
      05 EOF-FLAG    PIC X(3)  VALUE 'YES'. 

     01 NUMBER-OF-PAGES   PIC 9(2)  VALUE 1. 

     01 HEADER-LINE-ONE. 
      05 MYDATE    PIC X(10)  VALUE '09/16/2016'. 
      05      PIC X(5)  VALUE SPACES. 
      05 INITIALS    PIC X(3)  VALUE 'RJM'. 
      05      PIC X(10)  VALUE SPACES. 
      05  PIC X(27)  VALUE 'DRAKEA BIKE PARTS WAREHOUSE'. 
      05      PIC X(16)  VALUE SPACES. 
      05 NUM-OF-PAGES   PIC X(7)  VALUE('PAGE 0X'). 
      05      PIC X(2)  VALUE SPACES. 

     01 HEADER-LINE-TWO. 
      05      PIC X(36)  VALUE SPACES. 
      05 NAME-OF-REPORT PIC X(12)  VALUE 'STOCK REPORT'. 
      05      PIC X(32)  VALUE SPACES. 

     01 CATEGORY-HEADER-ONE. 
      05      PIC X(1)  VALUE SPACES. 
      05      PIC X(5)  VALUE 'CAT'. 
      05      PIC X(11)  VALUE SPACES. 
      05      PIC X(4)  VALUE 'ITEM'. 
      05      PIC X(11)  VALUE SPACES. 
      05      PIC X(8)  VALUE 'PURCHASE'. 
      05      PIC X(3)  VALUE SPACES. 
      05      PIC X(8)  VALUE 'QUANTITY'. 
      05      PIC X(4)  VALUE SPACES. 
      05      PIC X(8)  VALUE 'QUANTITY'. 
      05      PIC X(4)  VALUE SPACES. 
      05      PIC X(7)  VALUE 'REORDER'. 
      05      PIC X(8)  VALUE SPACES. 

     01 CATEGORY-HEADER-TWO. 
      05      PIC X(1)  VALUE SPACES. 
      05      PIC X(3)  VALUE 'NUM'. 
      05      PIC X(8)  VALUE SPACES. 
      05      PIC X(11)  VALUE 'DESCRIPTION'. 
      05      PIC X(8)  VALUE SPACES. 
      05      PIC X(5)  VALUE 'PRICE'. 
      05      PIC X(6)  VALUE SPACES. 
      05      PIC X(6)  VALUE 'IN STK'. 
      05      PIC X(5)  VALUE SPACES. 
      05      PIC X(8)  VALUE 'ON ORDER'. 
      05      PIC X(5)  VALUE SPACES. 
      05      PIC X(5)  VALUE 'POINT'. 
      05      PIC X(8)  VALUE SPACES. 

     01 DETAIL-LINE. 
      05 CATALOG-NUM   PIC X(5). 
      05      PIC X(3)  VALUE SPACES. 
      05 ITEM-DESCRIPTION  PIC X(20). 
      05      PIC X(3)  VALUE SPACES. 
      05 PURCHASE-PRICE  PIC $$$$V99. 
      05      PIC X(4)  VALUE SPACES. 
      05 QUANTITY-IN-STK  PIC 99V999. 
      05      PIC X(6)  VALUE SPACES. 
      05 QUANT-ON-ORDER  PIC 99V999. 
      05      PIC X(5)  VALUE SPACES. 
      05 REORDER-PNT   PIC 99V999. 
      05      PIC X(8)  VALUE SPACES. 

     ********************************************************** 

     PROCEDURE DIVISION. 
     100-MAIN-MODULE. 
      PERFORM 110-HOUSEKEEPING. 
      PERFORM 120-READ-FILES. 
      PERFORM 130-PRINT-HEADERS. 
      PERFORM 140-PROCESS-RECORDS. 
      PERFORM 150-PRINT. 
      PERFORM 160-CLOSE-ROUTINE. 
      . 

     110-HOUSEKEEPING. 
      OPEN INPUT  INV-FILE 
        OUTPUT OUTPUT-INV-REPORT 
      . 

     120-READ-FILES. 
      PERFORM UNTIL EOF-FLAG = 'NO' 
        READ INV-FILE 
         AT END 
          MOVE 'NO' TO EOF-FLAG 
         NOT AT END 
          PERFORM 140-PROCESS-RECORDS 
        END-READ 
      END-PERFORM 
      . 

     130-PRINT-HEADERS 
      MOVE NUM-OF-PAGES TO NUM-PAGES 
      MOVE HEADER-LINE-ONE TO INVENTORY-REPORT 
       WRITE INVENTORY-REPORT 
       AFTER ADVANCING 1 LINE 
      MOVE HEADER-LINE-TWO TO INVENTORY-REPORT 
       WRITE INVENTORY-REPORT 
       AFTER ADVANCING 2 LINES 
      MOVE CATEGORY-HEADER-ONE TO INVENTORY-REPORT 
       WRITE INVENTORY-REPORT 
       AFTER ADVANCING 2 LINES 
      MOVE CATEGORY-HEADER-TWO TO INVENTORY-REPORT 
       WRITE INVENTORY-REPORT 
       AFTER ADVANCING 1 LINE. 

     140-PROCESS-RECORDS 
      MOVE CAT-NUM TO CATALOG-NUM 
      MOVE ITEM-DESC TO ITEM-DESCRIPTION 
      MOVE UNIT-PURCHASE-PRICE TO PURCHASE-PRICE 
      MOVE QUANTITY-IN-STOCK TO QUANTITY-IN-STK 
      MOVE QUANTITY-ON-ORDER TO QUANT-ON-ORDER 
      MOVE REORDER-POINT TO REORDER-PNT.   

     150-PRINT 
      MOVE DETAIL-LINE TO INVENTORY-REPORT 
      WRITE INVENTORY-REPORT. 

     160-CLOSE-ROUTINE 
      CLOSE INV-FILE 
        INVENTORY-REPORT 
      STOP RUN. 

这里是我尝试读取文本文件:

X7Y10Gas Tank   12595  010001000100005000750010 
X8Y20Gas Cap    07599  020001000000002500000000 
X6N30Seat    50000  001000000005000200020003 
Y9T40Spark Plugs   02595  002001800200018000800045 
T8N50Helmet    00385  010000000050000000800000 
S9M60Slick 50   05999  000000500020001000000005 
J9M70Gear Box   99999  070500000700000000000100 
K3L80Muffler    35095  100000051000000205000256 
L3D90Water Hose   02995  257000002000000005700300 
M3100Tool Box   25995  078002501500025010000750 
D4110Carborator   05900  000501000050007500250001 
S8120Generator   17700  001000800025001500200015 
+0

您是否有能够在源数据中显示“特殊字符”的编辑器(行结束符等)。你可能有一些奇怪的松散的。您是使用OpenCOBOL还是更新的GnuCOBOL来处理该错误。 –

+0

附加提示:您可能希望在标题后添加一个“WRITE”,并且我假设您要在“NOT AND END”中执行“150-PRINT”(否则您可能并且只有一个书写的详细信息行) –

+0

@ user3538149你错过了什么,或者你的答案是否适合你?在第二种情况下,请将它标记为“适合我”这种类型的问题。 –

回答

0

由于错误说行13.似乎并不具备相关的程序师什么。我对开放COBOL并不了解,因为我在COBOL-400上工作过,所以我认为源计算机和对象计算机都是作为注释使用的,因此您应该尝试让它们发表评论(通过放*)并尝试,因为你不一定要定义它们。请告知是否有帮助。

+1

您被邀请给GnuCOBOL(以前称为OpenCOBOL)a请尝试:-) “是”:它们被视为评论,“否”,您不需要将它们明确标记为评论。 –

3

给出的样本我得到GnuCOBOL 1.1以下错误(至少更新到该版本)在源:

PROGRAM1.cob:58: Error: syntax error, unexpected '(' 

这是指VALUE('PAGE 0X').,我敢肯定你会在一个解决这个问题你自己。

使用GnuCOBOL 2.0 RC-1的编译器错误消息是:

PROGRAM1.cob: 58: error: syntax error, unexpected (
PROGRAM1.cob: in paragraph '100-MAIN-MODULE': 
PROGRAM1.cob: 119: warning: ignoring redundant . 
PROGRAM1.cob: in paragraph '120-READ-FILES': 
PROGRAM1.cob: 137: error: unknown statement '130-PRINT-HEADERS' 

可以忽略“忽略重复”消息,或者修复它(这只是一个警告,因为这可能点问题 - 但你没有)。要遵循程序其余部分的风格(并编写看起来不像COBOL-74的代码),我建议删除100-MAIN-MODULEPERFORM语句后的句点。

行137错过段落名称后的一段时间(同样适用于以下段落名称,但解析器当前不会从“未知语句”中恢复,因此您只能一个一个地看到它)。

下一个错误是:139接下来会发出:

in paragraph '130-PRINT-HEADERS': 
139: error: 'NUM-PAGES' is not defined 
in paragraph '160-CLOSE-ROUTINE': 
167: error: 'INVENTORY-REPORT' is not a file name 

无论是在WORKING-STORAGE或引用重命名VAR(我假设你的意思NUMBER-OF-PAGES)。 CLOSE应该使用文件名(本例中为OUTPUT-INV-REPORT)而不是记录名(INVENTORY-REPORT)。

这解决了语法问题。

额外提示:与其

 MOVE HEADER-LINE-ONE TO INVENTORY-REPORT 
      WRITE INVENTORY-REPORT 
      AFTER ADVANCING 1 LINE 

您可以省略附加MOVE(是做在任何情况下内部的,但它只是看起来更好;-),并清楚表明这只是为WRITE完成:

 WRITE INVENTORY-REPORT 
      FROM HEADER-LINE-ONE 
      AFTER ADVANCING 1 LINE