我在cygwin终端中使用OpenCOBOL来编译这个程序,该程序只是从输入文本文件中读取并将其打印到格式化的输出文件中。当我尝试编译时,我收到此错误:
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 :(得分: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的代码),我建议删除PERFORM
中100-MAIN-MODULE
语句后的句点。
第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
在NUMBER-OF-PAGES
或引用中重命名var(我假设你的意思是WORKING-STORAGE
)。
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
答案 1 :(得分:0)
由于错误表示第13行。它似乎没有任何与程序划分相关的内容。我不太了解Open COBOL,因为我已经使用过COBOL-400所以我认为源计算机和对象计算机被视为注释,因此你应该尝试让它们发表评论(通过放*)并尝试,因为你不一定要定义它们。如果有帮助请通知。