Gabriel Tran
Gabriel Tran

Reputation: 21

syntax error messages "not terminated" and "unexpected END-IF"

I'm having a constant issue with the UPDATE-PRODUCT portion. I'm getting an error at Line 103:

PERFORM statement not terminated by END-PERFORM

and at Line 117:

syntax error, unexpected END-IF.

       IDENTIFICATION DIVISION.
       PROGRAM-ID. Inventory-Management.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
         01 PRODUCT.
           05 ITEM-CODE       PIC X(5).
           05 NAME            PIC X(20).
           05 PRICE           PIC 9(5)V99.
           05 QUANTITY        PIC 9(5).
    
         01 CHOICE             PIC X.
         01 ITEM-FOUND         PIC X VALUE 'N'.
    
         01 INVENTORY.
           05 ITEM-CODE-LIST  OCCURS 100 TIMES.
               10 ITEM-CODE-ARRAY PIC X(5).
           05 NAME-LIST        OCCURS 100 TIMES.
               10 NAME-ARRAY     PIC X(20).
           05 PRICE-LIST       OCCURS 100 TIMES.
               10 PRICE-ARRAY    PIC 9(5)V99.
           05 QUANTITY-LIST    OCCURS 100 TIMES.
               10 QUANTITY-ARRAY PIC 9(5).
           05 NUM-OF-PRODUCTS  PIC 99 VALUE 0.
    
         01 ITEM-CODE-SEARCH    PIC X(5).
         01 NEW-PRODUCT.
           05 NEW-NAME         PIC X(20).
           05 NEW-PRICE        PIC 9(5)V99.
           05 NEW-QUANTITY     PIC 9(5).
    
         01 ITEM-INDEX          PIC 99.
    
         01 DEL-ITEM-CODE       PIC X(5).
    
       PROCEDURE DIVISION.
       MAIN-PROGRAM.
       PERFORM WELCOME-SCREEN.
       PERFORM UNTIL CHOICE = '5'
           PERFORM DISPLAY-MENU
           ACCEPT CHOICE
           PERFORM PROCESS-CHOICE
       END-PERFORM.
           STOP RUN.
    
       WELCOME-SCREEN.
           DISPLAY "WELCOME TO INVENTORY LIST MANAGEMENT".
           DISPLAY "1. Insert New Product".
           DISPLAY "2. Search Product Info".
           DISPLAY "3. Update Product".
           DISPLAY "4. Delete Product".
           DISPLAY "5. Exit".
    
       DISPLAY-MENU.
           DISPLAY "Please select an option:".
    
       PROCESS-CHOICE.
           EVALUATE CHOICE
               WHEN '1' PERFORM INSERT-PRODUCT
               WHEN '2' PERFORM SEARCH-PRODUCT
               WHEN '3' PERFORM UPDATE-PRODUCT
               WHEN '4' PERFORM DELETE-PRODUCT
               WHEN '5' CONTINUE
               WHEN OTHER DISPLAY "Invalid choice. Please select again."
           END-EVALUATE.
    
       INSERT-PRODUCT.
           DISPLAY "Enter Product Name:".
           ACCEPT NEW-NAME.
           DISPLAY "Enter Item Code:".
           ACCEPT ITEM-CODE.
           DISPLAY "Enter Price:".
           ACCEPT NEW-PRICE.
           DISPLAY "Enter Quantity:".
           ACCEPT NEW-QUANTITY.
    
           ADD 1 TO NUM-OF-PRODUCTS
           MOVE ITEM-CODE TO ITEM-CODE-LIST(NUM-OF-PRODUCTS)
           MOVE NEW-NAME TO NAME-LIST(NUM-OF-PRODUCTS)
           MOVE NEW-PRICE TO PRICE-LIST(NUM-OF-PRODUCTS)
           MOVE NEW-QUANTITY TO QUANTITY-LIST(NUM-OF-PRODUCTS).
    
       SEARCH-PRODUCT.
           DISPLAY "Enter Item Code to search:".
           ACCEPT ITEM-CODE-SEARCH.
           PERFORM VARYING ITEM-INDEX FROM 1 BY 1
           UNTIL ITEM-FOUND = 'Y' OR ITEM-INDEX > NUM-OF-PRODUCTS
           IF ITEM-CODE-SEARCH = ITEM-CODE-LIST(ITEM-INDEX)
            DISPLAY "Product Found:"
            DISPLAY "Item Code: " ITEM-CODE-LIST(ITEM-INDEX)
            DISPLAY "Name: " NAME-LIST(ITEM-INDEX)
            DISPLAY "Price: " PRICE-LIST(ITEM-INDEX)
            DISPLAY "Quantity: " QUANTITY-LIST(ITEM-INDEX)
            MOVE 'Y' TO ITEM-FOUND
           END-IF
       END-PERFORM.
           IF ITEM-FOUND = 'N'
               DISPLAY "Product not found."
           END-IF.
    
       UPDATE-PRODUCT.
           DISPLAY "Enter Item Code to update:".
           ACCEPT ITEM-CODE-SEARCH.
               PERFORM VARYING ITEM-INDEX FROM 1 BY 1
               UNTIL ITEM-FOUND = 'Y' OR ITEM-INDEX > NUM-OF-PRODUCTS
           IF ITEM-CODE-SEARCH = ITEM-CODE-LIST(ITEM-INDEX)
            DISPLAY "Enter New Name:".
            ACCEPT NEW-NAME.
            DISPLAY "Enter New Price:".
            ACCEPT NEW-PRICE.
            DISPLAY "Enter New Quantity:".
            ACCEPT NEW-QUANTITY.
            MOVE NEW-NAME TO NAME-LIST(ITEM-INDEX).
            MOVE NEW-PRICE TO PRICE-LIST(ITEM-INDEX).
            MOVE NEW-QUANTITY TO QUANTITY-LIST(ITEM-INDEX).
            DISPLAY "Product Updated."
            MOVE 'Y' TO ITEM-FOUND
           END-IF
       END-PERFORM
           IF ITEM-FOUND = 'N'
               DISPLAY "Product not found."
           END-IF.
    
       DELETE-PRODUCT.
           DISPLAY "Enter Item Code to delete:".
           ACCEPT DEL-ITEM-CODE.
           PERFORM VARYING ITEM-INDEX FROM 1 BY 1
               UNTIL ITEM-FOUND = 'Y' OR ITEM-INDEX > NUM-OF-PRODUCTS
               IF DEL-ITEM-CODE = ITEM-CODE-LIST(ITEM-INDEX)
                   MOVE SPACES TO ITEM-CODE-LIST(ITEM-INDEX)
                   MOVE SPACES TO NAME-LIST(ITEM-INDEX)
                   MOVE 0 TO PRICE-LIST(ITEM-INDEX)
                   MOVE 0 TO QUANTITY-LIST(ITEM-INDEX)
                   DISPLAY "Product Deleted."
                   SUBTRACT 1 FROM NUM-OF-PRODUCTS
                   MOVE 'Y' TO ITEM-FOUND
           END-IF
           END-PERFORM.
           IF ITEM-FOUND = 'N'
               DISPLAY "Product not found."
           END-IF.

I am confused at to why it's giving me an issue there and not the other instances as the program works when taking out the update-products and WHEN '3' PERFORM UPDATE-PRODUCT.

Upvotes: 2

Views: 120

Answers (2)

rmp14
rmp14

Reputation: 11

"syntax error, unexpected END-IF." - is due to the period/periods "." placed inside the IF statement. The compiler treats the IF as terminated already by the period, so the END-IF is now a syntax error because of the missing IF on the statement.

IF ITEM-CODE-SEARCH = ITEM-CODE-LIST(ITEM-INDEX) DISPLAY "Enter New Name:".

Upvotes: 1

cschneid
cschneid

Reputation: 10775

An IF statement is terminated by either an END-IF explicit scope terminator or a full-stop (a period, ".").

An inline PERFORM statement is terminated by either an END-PERFORM explicit scope terminator or a full-stop (a period, ".").

The inline PERFORM in paragraph UPDATE-PRODUCT contains an IF statement which is terminated by the full-stop following DISPLAY "Enter New Name:". I suspect this full-stop also terminates the inline PERFORM.

The remaining statements up until the END-IF are syntactically correct, but the END-IF is a surprise to the compiler because the IF statement has already been terminated. The END-PERFORM is also a surprise to the compiler because the PERFORM has already been terminated.

A common coding style is to only code full-stops in the Procedure Division to terminate labels (paragraph and section names) and the paragraphs and sections themselves, always using explicit scope terminators such as END-IF and END-PERFORM to terminate COBOL verbs.

Upvotes: 5

Related Questions