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

Re: PERFORM token (was RE: gnubol: Hacks needed to parse COBOL



Concerning the optional number of subclauses on a PERFORM's VARYING clause,
In a message dated 12/3/99 9:55:40 AM EST, wmklein@ix.netcom.com writes:

<< How about 6 levels deep in the '85 Standard - it was 3 in '74.
 
 Bill Klein
   wmklein <at> ix.netcom.com
  >>


Compilers I have seen also impose a limit of just one level for the inline 
perform.  Is this from the standard or vendor specific? Will we need to make 
the subrule distinct for the inline variation in contrast to the out-of-line 
variation?

This also brings up my favorite subject.  What if the code violates the rule, 
by say way to many sub-clauses. Will not the error cause the optimistic rules 
that hard workers have so generously posted to loose control? In the case of 
an inline perform are we not then in great jeopardy of misinterpreting 
subsequent code? This exact location in the parse rules also presents an 
intriguing error possibility.

In compilers I have seen, the END-PERFORM is required on the inline perform, 
but is actually wrong on out-of-line performs. I defy anyone to detect that 
correctly. Since rules have to be concurrently scoped, any out-of-line 
perform can quite possibly be scoped internnaly to an inline perform. If you 
attempt to trap the END-PERFORM on the end of the out-of-line perform where 
it does not belong, then you swallow the outer inline perform's explicit 
scope terminator. Consequently spurious END-PERFORM tokens seem destined to 
fly high into the upper rule hierarchy. 

This is going far into my concurrent rule depiction, I know. But we may need 
a rule for what appear to be stand-alone END-PERFORM 'statements' (which are 
errors of course).

When you look at this problem what you see is that the END-PERFORM not only 
_is_ illegal in out-of-line performs if _must_ be illegal for the language to 
be implementable as currently defined. The whole thing is a bit of a mind 
teaser, but when looked at from the perspective of concurrently running 
scopes you can not have an END-PERFORM on out-of-line performs be optional. 
It is either required, or disallowed; as far as alternative ways to define 
the language. Because of the concurrency of the inline performs you can not 
have it as optional on the 
out-of-line performs.

I think that the END-PERFORM is the only scope terminator that has this 
problem. Although the optional scope terminators for SEARCH and EVALUATE are 
near cousins in the family of monster.

A spurious END-PERFORM will definitely disrupt an inline perform that ought 
to be continuing. In atleast two ways an END-PERFORM can bubble out as an 
apparent naked statement. Sometimes it is just spurious, sometimes it is the 
END-PERFORM that belongs to an inline perform which got disrupted by an 
internal spurious END-PERFORM (that will have been mistaken as the inline 
performs explicit scope terminator).

This is an odd entry point for the suggestion, but generally we need 
productions to catch all manner of END-xyz at some basic statement recurse 
rule. This will be a garbage collection point for refuse from broken 
statements and actual spurious END-xyz tokens. The spurious
END-PERFORM is only a special case.  I think that is the only explicit scope 
terminator that is actually disallowed in some cases.

But trying to set that garbage collector up will be a challenge, because it 
will get intimately ambiguous with all rules that can optionally have an 
explicit scope terminator. Here I must swim upstream of other suggestions and 
say that this should not be done with tokens visible to the grammar. It may 
be necessary to code it as simple the error symbol in competition with all 
statments, and in the action code a rather large case structure to find out 
just what has dropped out as spurious. 

In other word the following probably can not work

super_block :
   add_simple
   {;}
|  add_simple_ENDed
   {;}
|  add_complex
   {;}
|  add_complex_ENDed
   {;}
 .....
|  END-ADD
   {;}
|  END-SUB
   {;}
|  END-PERFORM
   {;}
.../* way to ambiguous */
;



This might work

super_block :
   add_simple
   {;}
|  add_simple_ENDed
   {;}
|  add_complex
   {;}
|  add_complex_ENDed
   {;}
 .....
|  error
   { switch(yylex) {
      case END_ADD: printf "unmatched END-ADD"
      case END_SUB: printf "unmatched END-SUB"
      case END_PERFORM: printf "unmatched END-PERFORM"
     ...
      default:  printf "we is up tha creek"
    };   
    }
 ;

This would need to be more intelligent since error might bubble up in a 
number of ways besides a spurious END-xyz; its the concept that counts.





--
This message was sent through the gnu-cobol mailing list.  To remove yourself
from this mailing list, send a message to majordomo@lusars.net with the
words "unsubscribe gnu-cobol" in the message body.  For more information on
the GNU COBOL project, send mail to gnu-cobol-owner@lusars.net.