$Punch
$
$ BNF for Student PL/I
$
$ Reverse engineered by: Daniel Weaver
$ February 2019
$
<PROGRAM> <STATEMENT LIST>
<STATEMENT LIST> <STATEMENT>
<STATEMENT LIST> <STATEMENT LIST> <STATEMENT>
<STATEMENT> <BASIC STATEMENT>
<STATEMENT> <CONDITIONAL STATEMENT>
<BASIC STATEMENT> <ASSIGNMENT STATEMENT> ;
<BASIC STATEMENT> <GO TO STATEMENT> ;
<BASIC STATEMENT> <RETURN STATEMENT> ;
<BASIC STATEMENT> <CALL STATEMENT> ;
<BASIC STATEMENT> <DECLARATION STATEMENT> ;
<BASIC STATEMENT> <BLOCK> ;
<BASIC STATEMENT> <GROUP> ;
<BASIC STATEMENT> <PROCEDURE DEFINITION> ;
<BASIC STATEMENT> <ALLOCATION STATEMENT> ;
<BASIC STATEMENT> <FREE STATEMENT> ;
<BASIC STATEMENT> ;
<BASIC STATEMENT> <LABEL DEFINITION> <BASIC STATEMENT>
<CONDITIONAL STATEMENT> <IF CLAUSE> THEN <STATEMENT>
<CONDITIONAL STATEMENT> <IF CLAUSE> THEN <BASIC STATEMENT> ELSE <STATEMENT>
<CONDITIONAL STATEMENT> <LABEL DEFINITION> <CONDITIONAL STATEMENT>
<IF CLAUSE> IF <EXPRESSION>
<BLOCK> <BLOCK HEAD> <STATEMENT LIST> <ENDING>
<BLOCK HEAD> BEGIN ;
<GROUP> <GROUP HEAD> <STATEMENT LIST> <ENDING>
<LABEL DEFINITION> <IDENTIFIER> :
<ENDING> END
<ENDING> END <IDENTIFIER>
<ENDING> <LABEL DEFINITION> <ENDING>
<PROCEDURE DEFINITION> <PROCEDURE HEAD> <STATEMENT LIST> <ENDING>
<PROCEDURE HEAD> <LABEL DEFINITION> PROCEDURE ;
<PROCEDURE HEAD> <LABEL DEFINITION> PROCEDURE <ATTRIBUTE LIST> ;
<PROCEDURE HEAD> <LABEL DEFINITION> PROCEDURE <FORMAL PARAMETERS> ;
<PROCEDURE HEAD> <LABEL DEFINITION> PROCEDURE <FORMAL PARAMETERS> <ATTRIBUTE LIST> ;
<FORMAL PARAMETERS> (1 <PARAMETER LIST> )
<PARAMETER LIST> <IDENTIFIER>
<PARAMETER LIST> <PARAMETER LIST> ,1 <IDENTIFIER>
<ATTRIBUTE LIST> <ATTRIBUTE>
<ATTRIBUTE LIST> <ATTRIBUTE LIST> <ATTRIBUTE>
<ATTRIBUTE> (2 <ASTERISK LIST> )
<ATTRIBUTE> <TYPE>
<ATTRIBUTE> ENTRY
<ATTRIBUTE> LABEL
<DECLARATION STATEMENT> DECLARE <DECLARATION LIST>
<DECLARATION LIST> <DECLARATION ELEMENT>
<DECLARATION LIST> <DECLARATION LIST> ,2 <DECLARATION ELEMENT>
<DECLARATION ELEMENT> <DECLARATION PRIMARY>
<DECLARATION ELEMENT> <DECLARATION PRIMARY> <ATTRIBUTE LIST>
<DECLARATION PRIMARY> <IDENTIFIER>
<DECLARATION PRIMARY> (5 <DECLARATION LIST> )
<ASTERISK LIST> *
<ASTERISK LIST> <ASTERISK LIST> ,3 *
<TYPE> BIT
<TYPE> FIXED
<TYPE> FLOAT
<TYPE> CHARACTER
<ASSIGNMENT STATEMENT> <VARIABLE> =1 <EXPRESSION>
<ASSIGNMENT STATEMENT> <VARIABLE> ,8 <ASSIGNMENT STATEMENT>
<GO TO STATEMENT> <GO TO> <VARIABLE>
<GO TO> GO TO
<GO TO> GOTO
<RETURN STATEMENT> RETURN
<RETURN STATEMENT> RETURN <EXPRESSION>
<CALL STATEMENT> CALL <VARIABLE>
<ALLOCATION STATEMENT> ALLOCATE <ALLOCATION LIST>
<ALLOCATION LIST> <ALLOCATION ELEMENT>
<ALLOCATION LIST> <ALLOCATION LIST> ,4 <ALLOCATION ELEMENT>
<ALLOCATION ELEMENT> <IDENTIFIER 1> (3 <BOUNDS LIST> )
<BOUNDS LIST> <BOUNDS>
<BOUNDS LIST> <BOUNDS LIST> ,5 <BOUNDS>
<BOUNDS> <EXPRESSION>
<BOUNDS> <EXPRESSION> : <EXPRESSION>
<FREE STATEMENT> FREE <FREE LIST>
<FREE LIST> <IDENTIFIER>
<FREE LIST> <FREE LIST> ,6 <IDENTIFIER>
<GROUP HEAD> <CONTROL CLAUSE> ;
<CONTROL CLAUSE> <REPETITION CONTROL>
<CONTROL CLAUSE> <CONTROL CLAUSE> <CASE SELECTOR>
<CASE SELECTOR> CASE <ARITHMETIC EXPRESSION>
<REPETITION CONTROL> <WHILE LIST>
<REPETITION CONTROL> <ITERATION LIST>
<WHILE CLAUSE> WHILE <EXPRESSION>
<WHILE LIST> DO
<WHILE LIST> <WHILE LIST> <WHILE CLAUSE>
<ITERATION LIST> <DO VARIABLE> =2 <ITERATION ELEMENT>
<ITERATION LIST> <ITERATION LIST> ,9 <ITERATION ELEMENT>
<DO VARIABLE> DO <VARIABLE>
<ITERATION ELEMENT> <ITERATION HEAD>
<ITERATION ELEMENT> <ITERATION HEAD> <INCREMENTATION CONTROL>
<ITERATION ELEMENT> <ITERATION ELEMENT> <WHILE CLAUSE>
<ITERATION HEAD> <EXPRESSION>
<INCREMENTATION CONTROL> TO <ARITHMETIC EXPRESSION>
<INCREMENTATION CONTROL> BY <ARITHMETIC EXPRESSION>
<INCREMENTATION CONTROL> TO <ARITHMETIC EXPRESSION> BY <ARITHMETIC EXPRESSION>
<INCREMENTATION CONTROL> BY <ARITHMETIC EXPRESSION> TO <ARITHMETIC EXPRESSION>
<EXPRESSION> <LOGICAL FACTOR>
<EXPRESSION> <EXPRESSION> | <LOGICAL FACTOR>
<LOGICAL FACTOR> <LOGICAL SECONDARY>
<LOGICAL FACTOR> <LOGICAL FACTOR> & <LOGICAL SECONDARY>
<LOGICAL SECONDARY> <LOGICAL PRIMARY>
<LOGICAL SECONDARY> ^ <LOGICAL SECONDARY>
<LOGICAL PRIMARY> <STRING EXPRESSION>
<LOGICAL PRIMARY> <STRING EXPRESSION> <RELATION> <STRING EXPRESSION>
<RELATION> <
<RELATION> >
<RELATION> =
<RELATION> < =
<RELATION> > =
<RELATION> ^ <
<RELATION> ^ >
<RELATION> ^ =
<STRING EXPRESSION> <ARITHMETIC EXPRESSION>
<STRING EXPRESSION> <STRING EXPRESSION> || <ARITHMETIC EXPRESSION>
<ARITHMETIC EXPRESSION> <TERM>
<ARITHMETIC EXPRESSION> <ARITHMETIC EXPRESSION> + <TERM>
<ARITHMETIC EXPRESSION> <ARITHMETIC EXPRESSION> - <TERM>
<TERM> <FACTOR>
<TERM> <TERM> * <FACTOR>
<TERM> <TERM> / <FACTOR>
<FACTOR> <PRIMARY>
<FACTOR> <PRIMARY> ** <FACTOR>
<FACTOR> <PREFIX +> <FACTOR>
<FACTOR> <PREFIX -> <FACTOR>
<PREFIX +> +
<PREFIX -> -
<PRIMARY> <CONSTANT>
<PRIMARY> <VARIABLE>
<PRIMARY> (6 <EXPRESSION> )
<PRIMARY> <TYPE> (6 <EXPRESSION> )
<VARIABLE> <IDENTIFIER>
<VARIABLE> <IDENTIFIER> (4 <SUBSCRIPT LIST> )
<SUBSCRIPT LIST> <SUBSCRIPT>
<SUBSCRIPT LIST> <SUBSCRIPT LIST> ,7 <SUBSCRIPT>
<SUBSCRIPT> <EXPRESSION>
<SUBSCRIPT> *
<IDENTIFIER 1> <IDENTIFIER>
=1 =
=2 =
(1 (
(2 (
(3 (
(4 (
(5 (
(6 (
,1 ,
,2 ,
,3 ,
,4 ,
,5 ,
,6 ,
,7 ,
,8 ,
,9 ,
$Iterate