gnucobol-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [open-cobol-list] How does Cobol parse the Procedure Division ?


From: Dave Stratford
Subject: Re: [open-cobol-list] How does Cobol parse the Procedure Division ?
Date: Wed, 25 Sep 2013 14:15:46 +0100 (BST)
User-agent: SquirrelMail/1.4.8-21.el5.centos

Patrick wrote:
> Hi Everyone
>
> It's easy to see how Cobol can be parsed in all of the parts outside of
> the PROCEDURE DIVISION, statements end with periods.
>
> I can't see how the compiler could understand what is going on in
> PROCEDURE though. Every language I know of has some sort of character to
> end a statement. It might be a non printable character but it's there.
>
> PROCEDURE ends in a period and paragraphs end in periods but if we have
> a statement like this:
>
> MOVE foo TO moo
>
> I could see how the compiler would implicitly know that it ends one
> token after TO but we can also have:
>
>   MOVE foo TO moo koo boo
>
> Does the next reserved word that is not a part of the current sentence
> signify an end to the current statement and the final period indicate
> that there are no further statements coming ?
>
> If this is true, was it always this way. From what I understand it was
> not.
>
> If this is true did it dramatically increase the complexity of the
> compiler?
>
> Thanks
Patrick,

Full stops vs END-xxx changed at cobol 85. Cobol 74, and earlier, only has
full stops, while END-xx were added at 85.

Both have advantages and disadvantages.

Imagine:

IF A = B
   IF A > C
      MOVE 1 TO X
   ELSE
      MOVE 1 TO Y
   MOVE 1 TO Z


Where does the final MOVE 1 to Z belong? What happens if you want the ELSE
to be part of the IF A = B?

When you ONLY had full stops, put a stop after the Y and the final move was
independant of the IF's. Put it after the Z and it becomes part of the Z.
An END-IF allows the programmer to be much more specific and flexible
about things like this.

An END-ADD, for example, is really only of use when you also use the ON
OVERFLOW clause, which is why there is no END-MOVE, there is no ON OVERFLOW
or equivalent. (I don't think!)

At work I use a version of Cobol 74, so I don't have the END-xx, but it
does mean I have to be a lot more careful about what I need to do.

Personally I prefer full stops as it does mean I have to be a lot more
precise, but there are cases when I would have liked to have had the
inline perform that isn't available in cobol 74.

That said, only yesterday, I had the following:

C-010.
    MOVE I1-PROP-NO              TO I4-PROP-NO.
    OBTAIN ANY R04-PROPERTY USING K4-PROP-NO
           ON DB-REC-NOT-FOUND
              DISPLAY "NO R04-PROPERTY FOR " I1-PROP-REF
                      " CUSTOMER REF " I1-ACC-REF.
              GO TO C-020.

    MOVE I4-POST-CODE            TO FAA-POST-CODE.

    WRITE FAA-EXT-REC.

    ADD 1                        TO WC-WRITE-COUNT
                                    WC-CHECKPOINT-COUNT.

C-020.
    IF WC-CHECKPOINT-COUNT NOT < WY-CHECKPOINT-LIMIT
       PERFORM Z-TAKE-CHECKPOINT.

Can you work out why my program eventually fell over with a page lock
table full error and an empty output file?

Took me narly an hour and I lost even more hair!!!

If anyone is interested, and I can find it, I had a cobol program that
parses cobol programs to ensure they met the site coding standards of the
site I was then working on. I myself wrote the data division parser. It's
written in cobol 74, and parses cobol 74 programs. It would have found
this fault.

Dave




reply via email to

[Prev in Thread] Current Thread [Next in Thread]