.EBB .SPACING 1 .PAPER SIZE 54, 120 .LEFT MARGIN 8 .RIGHT MARGIN 120 .PERIOD .FLAGS HYPHENATE .SKIP 10 .CENTER 80 ^^FLECS:\\ .SKIP .CENTER 80 ^^USER'S MANUAL\\ .SKIP 4 .TITLE ^^########FLECS USER'S MANUAL .CENTER 80 ^CIVIL ^AEROMEDICAL ^INSTITUTE ^EDITION .SKIP 6 .CENTER 80 ^THIS MANUAL CORRESPONDS TO VERSION 22 OF ^^FLECS. .;**- .; Module name: FLEX DOCUMENTATION .; .CENTER 80;Version V22.34 Last edit: 15-JUL-80 11:34 .; Status: Development/Debugging .; .; Revision history: .; .; Version V22.34 30-JUN-80 08:32 - 15-JUL-80 11:34 .; Created by: K.J. CROSS .; .;**- .SKIP 4 .TAB STOPS 16 24 32 40 48 56 64 .CHAPTER INTRODUCTION .LC .LM 8.RM 120 .TITLE ########^^INTRODUCTION\\ ^FORTRAN CONTAINS FOUR BASIC MECHANISMS FOR CONTROLLING PROGRAM FLOW: ^^CALL/RETURN, IF, DO\\, AND VARIOUS FORMS OF THE ^^GO TO\\. .SKIP ^FLECS, A LANGUAGE EXTENSION TO ^FORTRAN, HAS ADDITIONAL CONTROL MECHANISMS THAT MAKE IT EASIER TO WRITE ^FORTRAN BY ELIMINATING MUCH OF THE CLERICAL DETAIL ASSOCIATED WITH CONSTRUCTING ^FORTRAN PROGRAMS. ^FLECS IS ALSO EASIER TO READ AND COMPREHEND. .SKIP ^THIS MANUAL IS A BRIEF BUT COMPLETE INTRODUCTION TO ^FLECS. ^IT IS NOT A PRIMER ON ^FLECS OR STRUCTURED PROGRAMMING. ^THE READER IS ASSUMED TO BE A KNOWLEDGEABLE ^FORTRAN PROGRAMMER. .SKIP ^PROGRAMMERS TO WHOM TRANSPORTABILITY OF THEIR PROGRAMS IS A .INDEX TRANSPORTABILITY CONCERN SHOULD NOTE THAN THE ^FLECS TRANSLATOR SOURCE CODE IS IN THE PUBLIC DOMAIN AND IS MADE FREELY AVAILABLE. ^THE TRANSLATOR WAS WRITTEN WITH TRANSPORTABILITY IN MIND AND REQUIRES LITTLE EFFORT TO MOVE FROM ONE MACHINE TO ANOTHER. ^THOSE INTERESTED IN MOVING ^FLECS TO ANOTHER MACHINE OR HAVING THEIR OWN COPY OF ^FLECS SHOULD CONTACT THE ^UNIVERSITY OF ^OREGON ^COMPUTING ^CENTER. .SKIP ^AT ^OREGON, ^FLECS IS IMPLEMENTED ON BOTH THE ^^PDP-10\\ AND THE ^^IBM S/360\\. ^THE MANNER OF IMPLEMENTATION IS THAT OF A PREPROCESSOR THAT TRANSLATES ^FLECS PROGRAMS INTO ^FORTRAN PROGRAMS. ^THE RESULTING ^FORTRAN PROGRAM IS THEN PROCESSED IN THE USUAL WAY. ^THE TRANSLATOR ALSO PRODUCES A NICELY FORMATTED LISTING OF THE ^FLECS PROGRAM THAT GRAPHICALLY PRESENTS THE CONTROL STRUCTURES USED. .SKIP ^THE FOLLOWING DIAGRAM ILLUSTRATES THE TRANSLATING PROCESS. .SKIP .NOFILL .TEST PAGE 9 ^FLECS ^FLECS ^TRANSLATED ^SOURCE----------->^TRANSLATOR--------->^FORTRAN ^PROGRAM ! SOURCE ! ! ! ! ^INDENTED ^TO ^LISTING ^FORTRAN ^COMPILER .FILL .HL 1 RETENTION OF FORTRAN FEATURES ^THE ^FLECS TRANSLATOR EXAMINES EACH STATEMENT IN THE ^FLECS .INDEX ^FORTRAN FEATURES PROGRAM TO SEE IF IT IS AN EXTENDED STATEMENT (A STATEMENT .INDEX EXTENDED STATEMENT VALID IN ^FLECS BUT NOT IN ^FORTRAN). ^IF IT IS RECOGNIZED AS AN EXTENDED STATEMENT, THE TRANSLATOR GENERATES THE CORRESPONDING ^FORTRAN STATEMENTS. ^IF, HOWEVER, THE STATEMENT IS NOT RECOGNIZED AS AN EXTENDED STATEMENT, THE TRANSLATOR ASSUMES IT MUST BE A ^FORTRAN STATEMENT AND PASSES IT THROUGH UNALTERED. ^THUS, THE ^FLECS SYSTEM DOES NOT RESTRICT THE USE OF FORTRAN STATEMENTS, IT SIMPLY PROVIDES ADDITIONAL STATEMENTS WHICH MAY BE USED. ^IN PARTICULAR, ^^GO TO\\S, ARITHMETIC ^^IF\\S, ^^CALL\\S, ARITHMETIC STATEMENT FUNCTIONS, AND ANY OTHER ^FORTRAN STATEMENTS, COMPILER DEPENDENT OR OTHERWISE, MAY BE USED IN A ^FLECS PROGRAM. .BR .HL 1 CORRELATION OF FLECS AND FORTRAN SOURCES .SKIP ^ONE DIFFICULTY OF PREPROCESSOR SYSTEMS LIKE ^FLECS IS THAT ERROR MESSAGES THAT COME FROM THE ^FORTRAN COMPILER MUST BE RELATED BACK TO THE ORIGINAL ^FLECS SOURCE PROGRAM. ^THIS DIFFICULTY IS REDUCED BY ALLOWING THE PLACEMENT OF ^^LINE NUMBERS\\ (NOT TO BE CONFUSED .INDEX LINE NUMBERS WITH ^FORTRAN STATEMENT NUMBERS) ON ^FLECS SOURCE STATEMENTS. ^THESE LINE NUMBERS THEN APPEAR ON THE LISTING AND IN THE ^FORTRAN SOURCE. ^WHEN AN ERROR MESSAGE IS PRODUCED BY EITHER THE ^FLECS TRANSLATOR OR THE ^FORTRAN COMPILER, IT WILL INCLUDE THE LINE NUMBER OF THE OFFENDING ^FLECS SOURCE STATEMENT, MAKING IT EASY TO LOCATE ON THE LISTING. .SKIP ^IF THE PROGRAMMER CHOOSES NOT TO SUPPLY LINE NUMBERS, THE TRANSLATOR WILL ASSIGN SEQUENTIAL NUMBERS AND PLACE THEM ON THE LISTING AND IN THE ^FORTRAN SOURCE. ^THUS, ERRORS FROM THE COMPILER MAY STILL BE RELATED TO THE ^FLECS LISTING. .SKIP ^DETAILS OF LINE NUMBERING ARE MACHINE DEPENDENT. ^ON MOST CARD-ORIENTED SYSTEMS, THE LINE NUMBERS MAY BE PLACED IN COLUMNS 76-80 OF EACH CARD. ^OTHER SYSTEMS MAY HAVE SPECIAL PROVISIONS FOR LINE NUMBERS. .SKIP ^THE BEGINNING ^FLECS PROGRAMMER SHOULD DISCOVER AND MAKE SPECIAL NOTE OF THE DETAILS OF THE MECHANISM BY WHICH ^FORTRAN COMPILER ERROR MESSAGES MAY BE TRACED BACK TO THE ^FLECS LISTING ON THE SYSTEM BEING USED. .BR .CHAPTER STRUCTURED STATEMENTS .LC .LM8.RM 120 .TITLE ########^^STRUCTURED STATEMENTS\\ ^A BASIC NOTION OF ^FLECS IS THAT OF THE STRUCTURED STATEMENT WHICH CONSISTS OF A CONTROL PHRASE AND ITS .INDEX STRUCTURED STATEMENT SCOPE. ^FORTRAN HAS TWO STRUCTURED STATEMENTS, THE LOGICAL ^^IF\\ AND THE ^^DO\\. ^THE FOLLOWING EXAMPLE ILLUSTRATES THIS TERMINOLOGY: .INDEX ^^IF\\ .INDEX ^^DO\\ .SKIP .NOFILL .TEST PAGE 7 #####STRUCTURED STATEMENT :##################################: ###CONTROL PHRASE##########SCOPE :#######################:##########: KEYWORD####SPECIFICATION :########:#############: ^^IF (X.EQ.Y)########U_=V+W\\ .SKIP 2 .TEST PAGE 6 ##KEYWORD##SPECIFICATION :#########:############: ###^^DO######30 I _= 1,N####\\CONTROL PHRASE^^) ###A(I) _= B(I)+C########)#############(##\\STRUCTURED^^ ###L(I) _= I-K(I)########(##\\SCOPE######(##STATEMENT^^ 30#CONTINUE\\##############)#############) .FILL .SKIP 2 ^NOTE THAT EACH STRUCTURED STATEMENT CONSISTS OF A CONTROL PHRASE .INDEX CONTROL PHRASE THAT CONTROLS THE EXECUTION OF A SET OF ONE OR MORE STATEMENTS CALLED ITS SCOPE. .INDEX SCOPE ^ALSO NOTE THAT EACH CONTROL PHRASE CONSISTS OF A KEYWORD PLUS .INDEX KEYWORD SOME ADDITIONAL INFORMATION CALLED THE SPECIFICATION. .INDEX SPECIFICATION ^A STATEMENT THAT DOES NOT CONSIST OF A CONTROL PHRASE AND A SCOPE IS SAID TO BE A SIMPLE STATEMENT. .INDEX SIMPLE STATEMENT ^EXAMPLES OF SIMPLE STATEMENTS ARE ASSIGNMENT STATEMENTS, SUBROUTINE ^^CALL\\S, ARITHMETIC ^^IF\\S, AND ^^GO TO\\S. .SKIP ^THE PROBLEM WITH THE ^FORTRAN LOGICAL ^^IF\\ STATEMENT IS THAT ITS SCOPE MAY CONTAIN ONLY A SINGLE SIMPLE STATEMENT. ^THIS RESTRICTION IS ELIMINATED IN THE CASE OF THE ^^DO\\, BUT AT THE COST OF CLERICAL DETAIL (HAVING TO STOP THINKING ABOUT THE PROBLEM WHILE A STATEMENT NUMBER IS INVENTED). ^NOTE ALSO THAT THE ^^IF\\ SPECIFICATION IS ENCLOSED IN PARENTHESES WHILE THE ^D^O SPECIFICATION IS NOT. .SKIP ^IN ^FLECS THERE IS A UNIFORM CONVENTION FOR WRITING CONTROL PHRASES AND INDICATING THEIR SCOPES. ^IN WRITING A STRUCTURED STATEMENT, THE KEYWORD IS PLACED ON A LINE BEGINNING IN COLUMN 7 FOLLOWED BY ITS SPECIFICATION ENCLOSED IN PARENTHESES. ^THE REMAINDER OF THE LINE IS LEFT BLANK. ^THE STATEMENTS COMPOSING THE SCOPE ARE PLACED ON SUCCESSIVE LINES. ^THE END OF THE SCOPE IS INDICATED BY A ^^FIN\\ STATEMENT. .INDEX ^^FIN\\ ^THIS CREATES A MULTILINE STRUCTURED STATEMENT. .INDEX MULTILINE STRUCTURED STATEMENT ^EXAMPLES OF MULTI-LINE STRUCTURED STATEMENTS: .SKIP .NOFILL .TEST PAGE 10 ###^^IF (X.EQ.Y) ###.##U _= V+W ###.##R _= S+T ###...FIN\\ .SKIP ###^^DO (I_=1,N) ###.##A(I) _= B(I)+C ###.##C _= C*2.14-3.14 ###...FIN\\ .SKIP .FILL .LEFT MARGIN 14 .INDENT -6 ^NOTE: ^THE STATEMENT NUMBER HAS BEEN ELIMINATED FROM THE ^^DO\\ SPECIFICATION SINCE IT IS NO LONGER NECESSARY, THE END OF THE LOOP BEING SPECIFIED BY THE ^^FIN\\. .SKIP .LEFT MARGIN 8 ^NESTING OF STRUCTURED STATEMENTS IS PERMITTED TO ANY DEPTH. .INDEX NESTING .SKIP ^EXAMPLE OF NESTED STRUCTURED STATEMENTS: .SKIP .NOFILL .TEST PAGE 8 ###^^IF (X.EQ.Y) ###.##U _= V+W ###.##DO (I _= 1,N) ###.##.##A(I) _= B(I)+C ###.##.##C _= C*2.14-3.14 ###.##...FIN ###.##R _= S+T ###...FIN\\ .SKIP 2 .FILL ^WHEN THE SCOPE OF A CONTROL PHRASE CONSISTS OF A SINGLE SIMPLE STATEMENT, IT MAY BE PLACED ON THE SAME LINE AS THE CONTROL PHRASE AND THE ^^FIN\\ MAY BE DISPENSED WITH. ^THIS CREATES A ONE-LINE STRUCTURED STATEMENT. .INDEX ONE-LINE STRUCTURED STATEMENT .SKIP ^EXAMPLES OF ONE-LINE STRUCTURED STATEMENTS: .SKIP ###^^IF (X.EQ.Y) U_=V+W\\ .SKIP ###^^DO (I_=1,N) A(I) _= B(I)+C\\ .SKIP ^SINCE EACH CONTROL PHRASE MUST BEGIN ON A NEW LINE, IT IS NOT POSSIBLE TO HAVE A ONE-LINE STRUCTURED STATEMENT WHOSE SCOPE CONSISTS OF A STRUCTURED STATEMENT. .SKIP ^EXAMPLE OF INVALID CONSTRUCTION: .SKIP ###^^IF (X.EQ.Y) DO (I_=1,N) A(I) _= B(I)+C\\ .SKIP ^TO ACHIEVE THE EFFECT DESIRED ABOVE, THE ^^IF\\ MUST BE WRITTEN IN A MULTILINE FORM. .SKIP ^EXAMPLE OF VALID CONSTRUCTION: .SKIP .NOFILL ###^^IF (X.EQ.Y) ###.##DO (I_=1,N) A(I) _= B(I)+C ###...FIN\\ .SKIP .FILL ^FLECS PROVIDES, IN ADDITION TO ^^IF\\ AND ^^DO\\, SEVERAL USEFUL STRUCTURED STATEMENTS NOT AVAILABLE IN ^FORTRAN. ^AFTER A BRIEF EXCURSION INTO THE SUBJECT OF INDENTATION, WE WILL PRESENT THESE ADDITIONAL STRUCTURES. .BR .BB;.UC .CHAPTER INCLUDE STATEMENT .TITLE ########INCLUDE STATEMENT It is often desirable to have the same FLEX and/or FORTRAN statements in multiple source files, such as definitions of variables in COMMON or FLEX internal procedures (q.v.). .index INCLUDE This capability is provided in FLEX by use of the INCLUDE statement. The FLEX INCLUDE statement is identical in function and syntax to the FORTRAN-IV-PLUS INCLUDE statement (except the default file extension is ".FLE" instead of ".FTN"). When encountered, FLEX will close the current input file, marking its position, open the specified INCLUDE file, and insert it into the program at that point. When the INCLUDE file is completely inserted, FLEX will re-open the original source file and continue. .s The syntax for the INCLUDE statement is as follows: .s .tp 8 .NOFILL (OTHER VALID FLEX STATEMENTS) INCLUDE "filespec [/NOLIST]" (MORE VALID FLEX STATEMENTS) .S .FILL In the INCLUDE statement, filespec is any valid RSX-11 file specification. The default device is SY:, the default UIC is your current UIC, and the default file extension is ".FLE". If /NOLIST is specified in the INCLUDE statement, then the contents of the INCLUDE file (and any other INCLUDE files called from within this INCLUDE file) will not show up on the FLEX listing. .s The INCLUDE statement will be converted to a comment line in the FLEX listing, and will therefore not be passed to the output FORTRAN file. The comment line will consist of a "C" in column 1 followed by a digit in column 2 which corresponds to the nesting level of INCLUDE files. The listing will also indicate the nesting level of INCLUDE files by a digit corresponding to the nesting level in the far left column of the line on the listing. .S The operator may override the "/NOLIST" switch in any INCLUDE files by specifying /LI or /-LI with the listing file specification. If /LI is specified, ALL INCLUDE files will be listed, regardless of the /NOLIST switch in the INCLUDE statement. Conversely, if /-LI is specified, NONE of the INCLUDE files will show up in the listing. For example, to get a quick listing of a flex file on your terminal, type "FLE#,TI:/-LI_=flexfile". To get a long listing that expands all INCLUDE files, type "FLE#,listfile/LI_=flexfile". .s INCLUDE statements can be nested up to five levels. Note that no statement number is allowed on the INCLUDE line in the source program. If a statement number is required, put it on the immediately preceeding line with a CONTINUE statement. .EB .CHAPTER INDENTATION, LINES, AND THE LISTING .LC .LM 8.RM 120 .TITLE ########^^INDENTATION, LINES, AND THE LISTING\\ ^IN THE EXAMPLES OF MULTILINE STRUCTURED STATEMENTS, THE STATEMENTS IN THE SCOPE WERE INDENTED AND AN ^L-SHAPED .INDEX INDENTATION LINE WAS DRAWN (IN DOTS) CONNECTING THE KEYWORD OF THE CONTROL PHRASE TO THE MATCHING ^^FIN\\. ^THE RESULTING GRAPHIC EFFECT HELPS TO REVEAL THE STRUCTURE OF THE PROGRAM. ^THE RULES FOR USING INDENTATION AND ^^FIN\\S ARE QUITE SIMPLE AND UNIFORM. ^THE CONTROL PHRASE OF A MULTILINE STRUCTURED STATEMENT ALWAYS CAUSES INDENTATION OF THE STATEMENTS THAT FOLLOW. ^NOTHING ELSE CAUSES INDENTATION. ^A LEVEL OF INDENTATION (I.E. A SCOPE) IS ALWAYS TERMINATED BY A ^^FIN\\. ^NOTHING ELSE TERMINATES A LEVEL OF INDENTATION. .SKIP ^WHEN WRITING A ^FLECS PROGRAM ON PAPER, THE PROGRAMMER SHOULD ADOPT THE INDENTATION AND LINE-DRAWING CONVENTIONS SHOWN IN .INDEX SOURCE PREPARATION ^FLECS LISTINGS. ^WHEN PREPARING A ^FLECS SOURCE PROGRAM IN MACHINE-READABLE FORM, HOWVEVER, EACH STATEMENT SHOULD BEGIN IN COLUMN 7. ^WHEN THE ^FLECS TRANSLATOR PRODUCES THE LISTING, IT WILL REINTRODUCE THE CORRECT INDENTATION AND PRODUCE CORRESPONDING LINES. ^IF THE PROGRAMMER ATTEMPTS TO INTRODUCE HIS OWN INDENTATION WITH THE USE OF LEADING BLANKS, THE PROGRAM WILL BE TRANSLATED CORRECTLY BUT THE RESULTING LISTING WILL BE IMPROPERLY INDENTED. .INDEX LISTING .SKIP .TP 12 ^EXAMPLE OF INDENTATION: .SKIP .NOFILL 1. ^PROGRAM AS ENTERED INTO COMPUTER. .SKIP .TEST PAGE 8 ##^^IF (X.EQ.Y) ##U _= V+W ##DO (I _= 1,N) ##A(I) _= B(I)+C ##C _= C*2.14-3.14 ##FIN ##R _= S+T ##FIN\\ .SKIP .TP 10 2. ^PROGRAM AS LISTED BY ^FLECS TRANSLATOR. .SKIP .TEST PAGE 8 ##^^IF (X.EQ.Y) ##.##U _= V+W ##.##DO (I _= 1,N) ##.##.##A(I) _= B(I)+C ##.##.##C _= C*2.14-3.14 ##.##...FIN ##.##R _= S+T ##...FIN\\ .SKIP .FILL ^THE CORRECTLY INDENTED LISTING IS A TREMENDOUS AID IN READING AND WORKING WITH PROGRAMS. ^EXCEPT FOR THE DOTS AND SPACES USED FOR INDENTATION, THE LINES ARE LISTED EXACTLY AS THEY APPEAR IN THE SOURCE PROGRAM; THAT IS, THE INTERNAL SPACING OF COLUMNS 7-72 IS PRESERVED. ^THERE IS SELDOM ANY NEED TO REFER TO THE STRAIGHT LISTING OF THE UNINDENTED SOURCE. .SKIP ^COMMENT LINES ARE TREATED IN THE FOLLOWING WAY ON THE LISTING TO .INDEX COMMENT LINE PREVENT INTERRUPTION OF THE DOTTED LINES INDICATING SCOPE. ^A COMMENT LINE THAT CONTAINS ONLY BLANKS IN COLUMNS 2 THROUGH 6 WILL BE LISTED WITH COLUMNS 7 THROUGH 72 INDENTED AT THE THEN-CURRENT LEVEL OF INDENTATION AS IF THE LINE WERE AN EXECUTABLE STATEMENT. ^IF, HOWEVER, ONE OR MORE NONBLANK CHARACTERS APPEAR IN COLUMNS 2 THROUGH 6 OF A COMMENT CARD, THE CARD WILL BE LISTED WITHOUT INDENTATION. ^BLANK LINES MAY BE INSERTED IN THE SOURCE AND WILL BE TREATED AS EMPTY COMMENTS. .CHAPTER CONTROL STRUCTURES .LC .LM 8.RM 120 .TITLE ########^^CONTROL STRUCTURES\\ ^THE COMPLETE SET OF CONTROL STRUCTURES .INDEX CONTROL STRUCTURES PROVIDED BY ^FLECS IS GIVEN BELOW TOGETHER WITH THE CORRESPONDING FLOW CHARTS. ^THE SYMBOL [^L] IS USED TO INDICATE A LOGICAL EXPRESSION. .INDEX LOGICAL EXPRESSION ^THE SYMBOL $ IS USED TO INDICATE A SCOPE OF ONE OR MORE STATEMENTS. ^SOME STATEMENTS, AS INDICATED BELOW, DO NOT HAVE A ONE-LINE CONSTRUCTION. .SKIP ^A CONVENIENT SUMMARY OF THE INFORMATION IN THIS CHAPTER MAY BE FOUND IN ^APPENDIX ^A. .BR .HL 1 DECISION STRUCTURES ^DECISION STRUCTURES ARE STRUCTURED STATEMENTS THAT CONTROL THE .INDEX DECISION STRUCTURES EXECUTION OF THEIR SCOPES ON THE BASIS OF A LOGICAL EXPRESSION OR TEST. .BR .HL 2 IF .INDEX ^^IF\\ ^DESCRIPTION: ^THE ^^IF\\ STATEMENT CAUSES A LOGICAL EXPRESSION TO BE EVALUATED. ^IF THE VALUE IS TRUE, THE SCOPE IS EXECUTED ONCE AND CONTROL PASSES TO THE NEXT STATEMENT. ^IF THE VALUE IS FALSE, CONTROL PASSES DIRECTLY TO THE NEXT STATEMENT WITHOUT EXECUTION OF THE SCOPE. .SKIP ^GENERAL FORM: .SKIP .NOFILL ^^IF ( [L] ) $\\ .SKIP ^EXAMPLES: .SKIP .TEST PAGE 6 ^^IF (X.EQ.Y) U _= V+W\\ .SKIP ^^IF (T.GT.0.AND.S.LT.R) . I _= I+1 . Z _= 0.1 ...FIN\\ .SKIP 2 .FILL .BR .HL 2 UNLESS .INDEX ^^UNLESS\\ ^DESCRIPTION: "^^UNLESS ( [L] )"\\ IS MORE FUNCTIONALLY EQUIVALENT TO "^^IF (.NOT.( [L] ))"\\ BUT IS MORE CONVENIENT IN SOME CONTEXTS. .SKIP ^GENERAL ^FORM: .SKIP .NOFILL ^^UNLESS ( [L] ) $ .S 2 E\\XAMPLES: .SKIP .TEST PAGE 6 ^^UNLESS (X.NE.Y) U _= V+W .SKIP UNLESS (T.LE.0.OR.S.GE.R) . I _= I+1 . Z _= 0.1 ...FIN\\ .SKIP 2 .FILL .BR .HL 2 WHEN...ELSE .INDEX ^^WHEN...ELSE\\ ^DESCRIPTION: ^THE ^^WHEN...ELSE\\ STATEMENTS CORRESPOND TO THE ^^IF...THEN...ELSE\\ STATEMENT OF ^ALGOL, ^P^L/1, ^PASCAL, ETC. ^IN ^FLECS, BOTH THE ^^WHEN\\ AND THE ^^ELSE\\ ACT AS STRUCTURED STATEMENTS ALTHOUGH ONLY THE ^^WHEN\\ HAS A SPECIFICATION. ^THE ^^ELSE\\ STATEMENT MUST IMMEDIATELY FOLLOW THE SCOPE OF THE ^^WHEN\\. ^THE SPECIFIER OF THE ^^WHEN\\ IS EVALUATED AND EXACTLY ONE OF THE TWO SCOPES IS EXECUTED. ^THE SCOPE OF THE ^^WHEN\\ IS EXECUTED IF THE EXPRESSION IS TRUE AND THE SCOPE OF THE ^^ELSE\\ STATEMENT IS EXECUTED IF THE EXPRESSION IS FALSE. ^IN EITHER CASE, CONTROL PASSES TO THE NEXT STATEMENT FOLLOWING THE ^^ELSE\\ STATEMENT. .SKIP ^GENERAL FORM: .SKIP .TEST PAGE 2 .NOFILL ^^WHEN ( [L] ) $1 ELSE $2\\ .SKIP ^EXAMPLES: .SKIP .TEST PAGE 2 ^^WHEN (X.EQ.Y) U _= V+W ELSE U _= V-W\\ .SKIP .TEST PAGE 5 ^^WHEN (X.EQ.Y) . U _= V+W . T _= T+1.5 ...FIN ELSE U _= V-W\\ .SKIP .TEST PAGE 5 ^^WHEN (X.EQ.Y) U _= V+W ELSE . U _= V-W . T _= T+1.5 ...FIN\\ .SKIP .TEST PAGE 8 ^^WHEN (X.EQ.Y) . U _= V+W . T _= T-1.5 ...FIN ELSE . U _= V-W . T _= T+1.5 ...FIN\\ .SKIP .FILL ^NOTE: ^^WHEN\\ AND ^^ELSE\\ ALWAYS COME AS A PAIR OF STATEMENTS, NEVER SEPARATELY. ^EITHER THE ^^WHEN\\ OR THE ^^ELSE\\ OR BOTH MAY ASSUME THE MULTILINE FORM. ^^ELSE\\ IS CONSIDERED TO BE A CONTROL PHRASE, HENCE IT CANNOT BE PLACED ON THE SAME LINE AS ^^WHEN\\. ^THUS "^^WHEN#(#[L])#$1#ELSE#$2"\\ IS ^^NOT\\ VALID. .BR .HL 2 CONDITIONAL .INDEX ^^CONDITIONAL\\ ^DESCRIPTION: ^THE ^^CONDITIONAL\\ STATEMENT IS BASED ON THE ^^LISP\\ CONDITIONAL. ^LOGICAL EXPRESSIONS ARE EVALUATED ONE BY ONE UNTIL THE FIRST TRUE EXPRESSION IS ENCOUNTERED. ^THE SCOPE CORRESPONDING TO THAT EXPRESSION IS EXECUTED, AND CONTROL THEN PASSES TO THE FIRST STATEMENT FOLLOWING THE ^^CONDITIONAL\\. ^IF ALL EXPRESSIONS ARE FALSE, NO SCOPE IS EXECUTED. (^SEE, HOWEVER, THE NOTE ABOUT ^^OTHERWISE\\ BELOW.) .SKIP ^GENERAL ^FORM: .SKIP .TEST PAGE 8 .NOFILL ^^CONDITIONAL . ( [L1] ) $1 . ( [L2] ) $2 . . . . . . . . . . ( [L\N] ) $\N ...FIN\\ .SKIP ^EXAMPLES: .SKIP .TEST PAGE 5 ^^CONDITIONAL . (X.LT. -5.0) U _= U+W . (X.LE. 1.0) U _= U+W+Z . (X.LE.10.5) U _= U-Z ...FIN\\ .SKIP .TEST PAGE 9 ^^CONDITIONAL . (A.EQ.B) Z _= 1.0 . (A.LE.C) . . Y _= 2.0 . . Z _= 3.4 . ...FIN . (A.GT.C.AND.A.LT.B) Z_=6.2 . (OTHERWISE) Z _= 0.0 ...FIN\\ .SKIP .FILL .NOTE ^THE ^^CONDITIONAL\\ ITSELF DOES NOT POSSES A ONE-LINE FORM. ^HOWEVER, EACH "^^( [L\I] ) $\I"\\ IS TREATED AS A STRUCTURED STATEMENT AND MAY BE IN ONE-LINE OR MULTILINE FORM. .END NOTE ^THE RESERVED WORD ^^OTHERWISE\\ REPRESENTS A CATCHALL CONDITION. .INDEX ^^OTHERWISE\\ ^THAT IS, "(^^OTHERWISE)#$\\I" IS EQUIVALENT TO "^^(.TRUE.)#$\\I" IN A ^^CONDITIONAL\\ STATEMENT. .BR .HL 2 SELECT .INDEX ^^SELECT\\ ^DESCRIPTION: ^THE ^^SELECT\\ STATEMENT IS SIMILAR TO THE ^^CONDITIONAL\\ BUT IS MORE SPECIALIZED. ^IT ALLOWS AN EXPRESSION TO BE TESTED FOR EQUALITY TO EACH EXPRESSION IN A LIST OF EXPRESSIONS. ^WHEN THE FIRST MATCHING EXPRESSION IS ENCOUNTERED, A CORRESPONDING SCOPE IS EXECUTED AND THE ^^SELECT\\ STATEMENT TERMINATES. ^IN THE DESCRIPTION BELOW, ^^[EL1], [EL2],..., [EL3]\\ REPRESENT ARBITRARY BUT COMPATIBLE EXPRESSIONS. ^ANY TYPE OF EXPRESSION (INTEGER, REAL, COMPLEX, ...) IS ALLOWED AS LONG AS THE UNDERLYING ^FORTRAN SYSTEM ALLOWS SUCH EXPRESSIONS TO BE COMPARED WITH AN ^^.EQ.\\ OR ^^.NE.\\ OPERATOR. .SKIP ^GENERAL ^FORM: .SKIP .TEST PAGE 8 .NOFILL ^^SELECT ( [EL] ) . ( [EL1] ) $1 . ( [EL2] ) $2 . . . . . . . . . . ( [EL\N] ) $\N ...FIN\\ .SKIP ^EXAMPLES: .SKIP .TEST PAGE 9 ^^SELECT (OPCODE(PC)) . (JUMP) PC _= AD . (ADD) . . A _= A+B . . PC _= PC+1 . ...FIN . (SKIP) PC _= PC+2 . (STOP) CALL STOPCD ...FIN\\ .SKIP .FILL .NOTE ^AS IN THE CASE OF ^^CONDITIONAL\\, AT MOST ONE OF THE $I WILL BE EXECUTED. .END NOTE ^THE CATCHALL ^^OTHERWISE\\ MAY ALSO BE USED IN A ^^SELECT\\ .INDEX ^^OTHERWISE\\ STATEMENT. ^THUS "(^^OTHERWISE)#$\\N" IS EQUIVALENT TO "^^([EL]) $\\N" WITHIN A "^^SELECT#([EL]\\)" STATEMENT. .SKIP ^THE EXPRESSION [^E^L] IS REEVALUATED FOR EACH COMPARISON IN THE LIST. ^THUS LENGTHY, TIME CONSUMING, OR IRREPRODUCABLE EXPRESSIONS SHOULD BE PRECOMPUTED, ASSIGNED TO A VARIABLE, AND THE VARIABLE USED IN THE SPECIFICATION PORTION OF THE ^^SELECT\\ STATEMENT. .HL 1 LOOP STRUCTURES .INDEX LOOPS ^THE STRUCTURED STATEMENTS DESCRIBED BELOW ALL HAVE A SCOPE THAT IS EXECUTED A VARIABLE NUMBER OF TIMES DEPENDING ON SPECIFIED CONDITIONS. .SKIP ^OF THE FIVE LOOPS PRESENTED, THE MOST USEFUL ARE THE ^^DO, WHILE,\\ AND ^^REPEAT UNTIL\\ LOOPS. ^TO AVOID CONFUSION, THE ^^REPEAT#WHILE\\ AND ^^UNTIL\\ LOOPS SHOULD BE IGNORED INITIALLY. .HL 2 DO .INDEX ^^DO\\ ^DESCRIPTION: ^THE ^FLECS ^^DO\\ LOOP IS FUNCTIONALLY IDENTICAL TO THE ^FORTRAN ^^DO\\ LOOP; THE ONLY DIFFERENCES ARE SYNTACTIC. ^IN THE ^FLECS ^^DO\\ LOOP, THE STATEMENT NUMBER IS OMITTED FROM THE ^^DO\\ STATEMENT, THE INCREMENTATION PARAMETERS ARE ENCLOSED IN PARENTHESES, AND THE SCOPE IS INDICATED BY EITHER THE ONE-LINE OR MULTILINE CONVENTION. ^SINCE THE SEMANTICS OF THE ^FORTRAN ^^DO\\ STATEMENT VARY FROM ONE ^FORTRAN COMPILER TO ANOTHER, A FLOWCHART CANNOT BE GIVEN. ^THE SYMBOL ^I@ REPRESENTS ANY LEGAL INCREMENTATION SPECIFICATION. .SKIP .NOFILL ^GENERAL ^FORM: ^EQUIVALENT ^FORTRAN: .SKIP .TEST PAGE 3 ^^DO (I@) $ DO 30 I@ $ 30 CONTINUE\\ .SKIP ^EXAMPLES: .SKIP ^^DO (I_=1,N) A(I) _= 0.0 .SKIP .TEST PAGE 4 DO (J_=3,K,3) . B(J) _= B(J-1)*B(J-2) . C(J) _= SIN(B(J)) ...FIN\\ .FILL .HL 2 WHILE .INDEX ^^WHILE\\ ^DESCRIPTION: ^THE ^^WHILE\\ LOOP CAUSES ITS SCOPE TO BE REPEATEDLY EXECUTED WHILE A SPECIFIED CONDITION IS TRUE. ^THE CONDITION IS CHECKED PRIOR TO THE FIRST EXECUTION OF THE LOOP. ^THUS, IF THE CONDITION IS INITIALLY FALSE, THE SCOPE WILL NOT BE EXECUTED AT ALL. .SKIP ^GENERAL ^FORM: .SKIP .NOFILL ^^WHILE ( [L] ) $ .SKIP E\\XAMPLES: .SKIP .TEST PAGE 6 ^^WHILE (X.LT.A(I)) I_=I+1 .SKIP WHILE (P.NE.0) . VAL(P) _= VAL(P)+1 . P _= LINK(P) ...FIN\\ .FILL .HL 2 REPEAT WHILE .INDEX ^^REPEAT WHILE\\ ^DESCRIPTION: ^BY USING THE ^^REPEAT\\ VERB, THE TEST CAN BE LOGICALLY MOVED TO THE END OF THE LOOP. ^THE ^^REPEAT WHILE\\ LOOP CAUSES ITS SCOPE TO BE REPEATEDLY EXECUTED WHILE A SPECIFIED CONDITION REMAINS TRUE. ^THE CONDITION IS NOT CHECKED UNTIL AFTER THE FIRST EXECUTION OF THE LOOP. ^THUS THE SCOPE WILL ALWAYS BE EXECUTED AT LEAST ONCE AND THE CONDITION INDICATES UNDER WHAT CONDITIONS THE SCOPE IS TO BE REPEATED. .NOTE "^^REPEAT WHILE([L])\\" IS FUNCTIONALLY EQUIVALENT TO "^^REPEAT UNTIL(.NOT.([L]))".\\ .END NOTE ^GENERAL ^FORM: .SKIP .NOFILL ^^REPEAT WHILE ([L]) $\\ .SKIP ^EXAMPLES: .SKIP ^^REPEAT WHILE (N.EQ.M(I)) I _= I+1 .SKIP .TEST PAGE 6 REPEAT WHILE (LINK(Q).NE.0) . R _= LINK(Q) . LINK(Q) _= P . P _= Q . Q _= R ...FIN\\ .FILL .HL 2 UNTIL .INDEX ^^UNTIL\\ ^DESCRIPTION: ^THE ^^UNTIL\\ LOOP CAUSES ITS SCOPE TO BE REPEATEDLY EXECUTED UNTIL A SPECIFIED CONDITION BECOMES TRUE. ^THE CONDITION IS CHECKED PRIOR TO THE FIRST EXECUTION OF THE SCOPE. ^THUS IF THE CONDITION IS INITIALLY TRUE, THE SCOPE WILL NOT BE EXECUTED AT ALL. ^NOTE THAT "^^UNTIL ([L]\\)" IS FUNCTIONALLY EQUIVALENT TO "^^WHILE (.NOT.([L]))\\". .SKIP ^GENERAL ^FORM: .SKIP .NOFILL ^^UNTIL ( [L] ) $\\ .SKIP ^EXAMPLES: .SKIP ^^UNTIL (X.EQ.A(I)) I _= I+1 .SKIP .TEST PAGE 4 UNTIL (P.EQ.0) . VAL(P) _= VAL(P)+1 . P _= LINK(P) ...FIN\\ .FILL .HL 2 REPEAT UNTIL .INDEX ^^REPEAT UNTIL\\ ^DESCRIPTION: ^BY USING THE ^^REPEAT\\ VERB, THE TEST CAN BE LOGICALLY MOVED TO THE END OF THE LOOP. ^THE ^^REPEAT UNTIL\\ LOOP CAUSES ITS SCOPE TO BE REPEATEDLY EXECUTED UNTIL A SPECIFIED CONDITION BECOMES TRUE. ^THE CONDITION IS NOT CHECKED UNTIL AFTER THE FIRST EXECUTION OF THE SCOPE. ^THUS THE SCOPE WILL ALWAYS BE EXECUTED AT LEAST ONCE AND THE CONDITION INDICATES UNDER WHAT CONDITIONS THE REPETITION OF THE SCOPE IS TO BE TERMINATED. .SKIP ^GENERAL ^FORM: .SKIP .NOFILL ^^REPEAT UNTIL ( [L] ) $\\ .SKIP ^EXAMPLES: .SKIP ^^REPEAT UNTIL (N.EQ.M(I)) I _= I+1 .SKIP .TEST PAGE 6 REPEAT UNTIL (LINK(Q).EQ.0) . R _= LINK(Q) . LINK(Q) _= P . P _= Q . Q _= R ...FIN\\ .FILL .CHAPTER INTERNAL PROCEDURES .LC .LM 8.RM 120 .TITLE ########^^INTERNAL PROCEDURES\\ .INDEX INTERNAL PROCEDURES ^IN ^FLECS A SEQUENCE OF STATEMENTS MAY BE DECLARED TO BE AN INTERNAL PROCEDURE AND GIVEN A NAME. ^THE PROCEDURE MAY THEN BE INVOKED FROM ANY POINT IN THE PROGRAM BY SIMPLY GIVING ITS NAME. .SKIP PROCEDURE NAMES MAY BE ANY STRING OF LETTERS, DIGITS, AND .INDEX PROCEDURE NAME .INDEX ^^TO\\ PROCEDURE-NAME HYPHENS (I.E. MINUS SIGNS) BEGINNING WITH A LETTER AND CONTAINING AT LEAST ONE HYPHEN. ^INTERNAL BLANKS ARE NOT ALLOWED. ^THE ONLY RESTRICTION ON THE LENGTH OF A NAME IS THAT IS MAY NOT BE CONTINUED ONTO A SECOND LINE. .SKIP ^EXAMPLES OF VALID INTERNAL PROCEDURE NAMES: .SKIP .NOFILL .TEST PAGE 4 ^^INITIALIZE-ARRAYS GIVE-WARNING SORT-INTO-DESCENDING-ORDER INITITATE-PHASE-3\\ .SKIP .FILL ^A PROCEDURE DECLARATION CONSISTS OF THE KEYWORD "^^TO\\" FOLLOWED BY THE PROCEDURE NAME AND ITS SCOPE. ^THE SET OF STATEMENTS COMPOSING THE PROCEDURE IS CALLED ITS SCOPE. ^IF THE SCOPE CONSISTS OF A SINGLE SIMPLE STATEMENT, IT MAY BE PLACED ON THE SAME LINE AS THE "^T^O" AND PROCEDURE NAME. ^OTHERWISE, THE STATEMENTS OF THE SCOPE ARE PLACED ON THE FOLLOWING LINES AND TERMINATED WITH A ^^FIN\\ STATEMENT. ^THESE RULES ARE ANALAGOUS WITH THE RULES FOR FORMING THE SCOPE OF A STUCTURED STATEMENT. .SKIP ^GENERAL FORM OF PROCEDURE DECLARATIONS: .SKIP .NOFILL ^^TO\\ PROCEDURE-NAME .FILL .SKIP ^EXAMPLES OF PROCEDURE DECLARATIONS: .SKIP .NOFILL ^^TO RESET-POINTER P _= 0 .SKIP TO DO-NOTHING CONTINUE .SKIP .TEST PAGE 10 TO SUMMARIZE-FILE . INITIALIZE-SUMMARY . OPEN-FILE . REPEAT UNTIL (EOF) . . ATTEMPT-TO-READ-RECORD . . WHEN (EOF) CLOSE-FILE . . ELSE UPDATE-SUMMARY . ...FIN . OUTPUT-SUMMARY ...FIN\\ .SKIP .FILL ^AN INTERNAL PROCEDURE REFERENCE IS A PROCEDURE NAME APPEARING WHERE AN EXECUTABLE STATEMENT WOULD BE EXPECTED. ^IN FACT, AN INTERNAL PROCEDURE REFERENCE IS AN EXECUTABLE SIMPLE STATEMENT AND THUS MAY BE USED IN THE SCOPE OF A STRUCTURED STATEMENT AS IN THE LAST EXAMPLE ABOVE. ^WHEN CONTROL REACHES A PROCEDURE REFERENCE DURING EXECUTION OF A ^FLECS PROGRAM, A RETURN ADDRESS IS SAVED AND CONTROL IS TRANSFERRED TO THE FIRST STATEMENT IN THE SCOPE OF THE PROCEDURE. ^WHEN CONTROL REACHES THE END OF THE SCOPE, CONTROL IS TRANSFERRED BACK TO THE STATEMENT LOGICALLY FOLLOWING THE PROCEDURE REFERENCE. .SKIP ^A TYPICAL ^FLECS PROGRAM OR SUBPROGRAM CONSISTS OF A SEQUENCE OF ^FORTRAN DECLARATIONS: (E.G., ^^INTEGER, DIMENSION, COMMON\\, ETC.) FOLLOWED BY A SEQUENCE OF EXECUTABLE STATEMENTS CALLED THE BODY OF THE PROGRAM FOLLOWED BY THE ^FLECS INTERNAL PROCEDURE DECLARATIONS, IF ANY, AND FINALLY, THE ^^END\\ STATEMENT. .SKIP ^HERE IS A COMPLETE (BUT UNINTERESTING) ^FLECS PROGRAM THAT ILLUSTRATES THE PLACEMENT OF THE PROCEDURE DECLARATIONS. .SKIP .NOFILL .TEST PAGE 33 00010 ^^C INTERACTIVE PROGRAM FOR PDP-10 TO COMPUTE X**2. 00020 C ZERO IS USED TO TERMINATE EXECUTION. 00030 00040 REAL X,XSQ 00050 REPEAT UNTIL (X.EQ.0) 00060 . GET-A-VALUE-OF-X 00070 . IF (X.NE.0) 00080 . . COMPUTE-RESULT 00090 . . TYPE-RESULT 00100 . ...FIN 00110 ...FIN 00120 CALL EXIT .SKIP ---------------------------------------- .SKIP 00130 TO GET-A-VALUE-OF-X 00140 . TYPE 10 00150 10 . FORMAT (' X _= ',$) 00160 . ACCEPT 20,X 00170 20 . FORMAT(F) 00180 ...FIN .SKIP ---------------------------------------- .SKIP 00190 TO COMPUTE-RESULT XSQ _= X*X .SKIP ---------------------------------------- .SKIP 00200 TO TYPE-RESULT 00210 . TYPE 30, XSQ 00220 30 . FORMAT(' X-SQUARED _= ',F7.2) 00230 ...FIN 00240 END\\ .PAGE .FILL ^NOTES CONCERNING INTERNAL PROCEDURES: .LIST .LE ^ALL INTERNAL PROCEDURE DECLARATIONS MUST BE PLACED AT THE END OF THE PROGRAM JUST PRIOR TO THE ^^END\\ STATEMENT. ^THE APPEARANCE OF THE FIRST "^^TO\\" STATEMENT TERMINATES THE BODY OF THE PROGRAM. ^THE TRANSLATOR EXPECTS TO SEE NOTHING BUT PROCEDURE DECLARATIONS FROM THAT POINT ON. .LE ^THE ORDER OF THE DECLARATIONS IS NOT IMPORTANT. ^ALPHABETICAL BY NAME IS AN EXCELLENT ORDER FOR PROGRAMS WITH A LARGE NUMBER OF PROCEDURES. .LE ^PROCEDURE DECLARATIONS MAY NOT BE NESTED. ^IN OTHER WORDS, THE SCOPE OF A PROCEDURE MAY NOT CONTAIN A PROCEDURE DECLARATION. ^IT MAY, OF COURSE, CONTAIN EXECUTABLE PROCEDURE REFERENCES. .LE ^ANY PROCEDURE MAY CONTAIN REFERENCES TO ANY OTHER PROCEDURES (EXCLUDING ITSELF). .LE ^DYNAMIC RECURSION OF PROCEDURE REFERENCING IS NOT PERMITTED. .LE ^ALL PROGRAM VARIABLES WITHIN A MAIN OR SUBPROGRAM ARE GLOBAL AND ARE ACCESSIBLE TO THE STATEMENTS IN ALL PROCEDURES DECLARED WITHIN THAT SAME MAIN PROGRAM OR SUBPROGRAM. .LE ^THERE IS NO FORMAL MECHANISM FOR DEFINING OR PASSING PARAMETERS TO AN INTERNAL PROCEDURE. ^WHEN PARAMETER PASSING IS NEEDED, THE ^FORTRAN FUNCTION OR SUBROUTINE SUBPROGRAM MECHANISM MAY BE USED OR THE PROGRAMMER MAY INVENT HIS OWN PARAMETER PASSING METHODS USING THE GLOBAL NATURE OF VARIABLES OVER INTERNAL PROCEDURES. .LE ^THE ^FLECS TRANSLATOR SEPARATES PROCEDURE DECLARATIONS ON THE LISTING BY DASHED LINES AS SHOWN IN THE PRECEDING EXAMPLE. .ELS .CHAPTER RESTRICTIONS AND NOTES .LC .LM 8.RM 120 .INDEX RESTRICTIONS ^IF ^FLECS WERE IMPLEMENTED BY A NICE, INTELLIGENT COMPILER THIS SECTION WOULD BE MUCH SHORTER. ^CURRENTLY, HOWEVER, ^FLECS IS IMPLEMENTED BY A STURDY BUT NAIVE TRANSLATOR. ^THUS THE ^FLECS PROGRAMMER MUST OBSERVE THE FOLLOWING RESTRICTIONS: .LIST 1 .LE ^FLECS MUST INVENT MANY STATEMENT NUMBERS IN CREATING THE .INDEX STATEMENT NUMBER ^FORTRAN PROGRAM. ^IT DOES SO BY BEGINNING WITH A LARGE NUMBER (USUALLY 99999) AND GENERATING SUCCESSIVELY SMALLER NUMBERS AS IT NEEDS THEM. ^DO NOT USE A NUMBER THAT WILL BE GENERATED BY THE TRANSLATOR. ^A GOOD RULE OF THUMB IS TO AVOID USING 5-DIGIT STATEMENT NUMBERS. .LE ^THE ^FLECS TRANSLATOR MUST GENERATE INTEGER VARIABLE NAMES. .INDEX INTEGER VARIABLE ^IT DOES SO BY USING NAMES OF THE FORM "^INNNNN" WHERE NNNNN IS A 5-DIGIT NUMBER RELATED TO A GENERATED STATEMENT NUMBER. ^DO NOT USE VARIABLES OF THE FORM ^INNNNN AND AVOID CAUSING THEM TO BE DECLARED OTHER THAN INTEGER. ^FOR EXAMPLE, THE DECLARATION "^^IMPLICIT#REAL#(A-Z)\\" LEADS TO TROUBLE. ^TRY "^^IMPLICT#REAL#(A-H,J-Z)"\\ INSTEAD. .LE ^THE TRANSLATOR DOES NOT RECOGNIZE CONTINUATION LINES IN THE SOURCE .INDEX CONTINUATION LINES FILE. ^THUS ^FORTRAN STATEMENTS MAY BE CONTINUED, SINCE THE STATEMENT AND ITS CONTINUATIONS WILL BE PASSED THROUGH THE TRANSLATOR WITHOUT ALTERATION (^SEE SECTION 1.1). ^HOWEVER, DO NOT CONTINUE AN EXTENDED ^FLECS STATEMENT WHICH REQUIRES TRANSLATION. ^THE REASONS ONE MIGHT WISH TO CONTINUE A ^FLECS STATEMENT ARE: (1) ^IT IS A STRUCTURED STATEMENT OR PROCEDURE DECLARATION WITH A ONE-STATEMENT SCOPE TOO LONG TO FIT ON A LINE, OR (2) IT CONTAINS AN EXCESSIVELY LONG SPECIFICATION PORTION, OR (3) BOTH THE ABOVE. ^PROBLEM (1) CAN BE AVOIDED BY GOING TO THE MULTILINE FORM. ^FREQUENTLY, PROBLEM (2) CAN BE AVOIDED WHEN THE SPECIFICATION IS AN EXPRESSION (LOGICAL OR OTHERWISE) BY ASSIGNING THE EXPRESSION TO A VARIABLE IN A PRECEDING STATEMENT AND THEN USING THE VARIABLE AS THE SPECIFICATION. .LE ^BLANKS ARE MEANINGLESS SEPARATORS IN ^FLECS STATEMENTS; DON'T .INDEX BLANKS PUT THEM IN DUMB PLACES, LIKE THE MIDDLE OF IDENTIFIERS, OR KEY WORDS, AND DO USE THEM TO SEPARATE DISTINCT WORDS, LIKE ^^REPEAT\\ AND ^^UNTIL\\. .LE ^LET ^FLECS INDENT THE LISTING. ^IF YOU ALL STATEMENTS IN COL. 7, .INDEX INDENTATION THE LISTING WILL ALWAYS REVEAL THE TRUE STRUCTURE OF THE PROGRAM (AS UNDERSTOOD BY THE TRANSLATOR, OF COURSE). .LE ^AS FAR AS THE TRANSLATOR IS CONCERNED, ^^FORMAT\\ STATEMENTS ARE EXECUTABLE ^FORTRAN STATEMENTS, SINCE IT DOESN'T RECOGNIZE THEM AS EXTENDED ^FLECS STATEMENTS. ^THUS, PLACE FORMAT STATEMENTS ONLY WHERE AN EXECUTABLE ^FORTRAN STATEMENT WOULD BE ACCEPTABLE. ^DON'T PUT THEM BETWEEN THE END OF A ^^WHEN\\ STATEMENT AND THE BEGINNING OF AN ^^ELSE\\ STATEMENT. ^DON'T PUT THEM BETWEEN PROCEDURE DECLARATIONS. .PAGE .NOFILL ^INCORRECT ^EXAMPLES:########^CORRECTED ^EXAMPLES: .SKIP .UC ####WHEN (FLAG) WRITE(3,30)######WHEN (FLAG) 30##FORMAT(7H TITLE:)############. WRITE(3,30) ####ELSE LINE _= LINE+1######30##. FORMAT(7H TITLE:) #################################...FIN #################################ELSE LINE _= LINE+1 .SKIP ####TO WRITE-HEADER##############TO WRITE-HEADER ####. PAGE _= PAGE+1############. PAGE _= PAGE+1 ####. WRITE(3,40)H, PAGE########. WRITE(3,40)H,PAGE ####...FIN###################40##. FORMAT(70A1,I3) 40##FORMAT(70A1,I3)##############. FIN\\ .FILL .LC .LE ^THE TRANSLATOR, BEING SIMPLE MINDED, RECOGNIZES EXTENDED ^FLECS STATEMENTS BY THE PROCESS OF SCANNING THE FIRST IDENTIFIER ON THE LINE. ^IF THE IDENTIFIER IS ONE OF THE ^FLECS KEYWORDS ^^IF, WHEN, UNLESS, FIN\\, ETC., THE LINE IS ASSUMED TO BE A ^FLECS STATEMENT AND IS TREATED AS SUCH. ^THUS, ^THE ^FLECS KEYWORDS ARE RESERVED; DO NOT USE THEM AS .INDEX KEYWORDS VARIABLE NAMES. ^IN CASE OF NECESSITY, A VARIABLE NAME -- SAY, ^^WHEN\\ -- MAY BE SLIPPED PAST THE TRANSLATOR BY EMBEDDING A BLANK WITHIN IT. ^THUS, "^^WH#EN"\\ WILL LOOK LIKE "^W^H" FOLLOWED BY "^E^N" TO THE TRANSLATOR WHICH IS BLANK SENSITIVE, BUT LIKE "^^WHEN\\" TO THE COMPILER, WHICH IGNORES BLANKS. .LE ^IN SCANNING A PARENTHESIZED SPECIFICATION, THE TRANSLATOR .INDEX PARENTHESES SCANS FROM LEFT TO RIGHT TO FIND THE PARENTHESIS THAT MATCHES THE INITIAL LEFT PARENTHESIS OF THE SPECIFICATION. ^THE TRANSLATOR, HOWEVER, IS IGNORANT OF ^FORTRAN SYNTAX INCLUDING THE CONCEPT OF ^HOLLERITH CONSTANTS AND WILL TREAT ^HOLLERITH .INDEX ^HOLLERITH PARENTHESES AS SYNTACTIC PARENTHESES. ^THUS, AVOID PLACING ^HOLLERITH CONSTANTS CONTAINING UNBALANCED PARENTHESES WITHIN SPECIFICATIONS. ^IF NECESSARY, ASSIGN SUCH CONSTANTS TO A VARIABLE BY USING ^^DATA\\ OR ASSIGNMENT STATEMENTS, AND PLACE THE VARIABLE IN THE SPECIFICATION. .SKIP .NOFILL ^INCORRECT ^EXAMPLE: ^CORRECTED ^EXAMPLE: .SKIP ^^IF (J.EQ.'(') LP _= '(' IF (J.EQ.LP)\\ .FILL .LE ^THE ^FLECS TRANSLATOR WILL NOT SUPPLY THE STATEMENTS NECESSARY TO CAUSE APPROPRIATE TERMINATION OF MAIN PROGRAMS AND SUBPROGRAMS. ^THUS, ALWAYS INCLUDE THE APPROPRIATE ^^RETURN, STOP, \\OR ^^CALL EXIT\\ STATEMENT PRIOR TO THE FIRST INTERNAL PROCEDURE DECLARATION. ^FAILURE TO DO SO WILL RESULT IN CONTROL ENTERING THE SCOPE OF THE FIRST PROCEDURE AFTER LEAVING THE BODY OF THE PROGRAM. ^DO NOT PLACE SUCH STATEMENTS BETWEEN THE PROCEDURE DECLARATIONS AND THE ^^END\\ STATEMENT. .CHAPTER ERRORS .LC .LM 8.RM 120 .TITLE ########^^ERRORS\\ ^THIS SECTION PROVIDES A FRAMEWORK FOR UNDERSTANDING THE ERROR-HANDLING .INDEX ERRORS MECHANISMS OF VERSION 22 OF THE ^FLECS ^TRANSLATOR. ^THE SYSTEM DESCRIBED BELOW IS AT AN EARLY POINT IN EVOLUTION, BUT IT HAS PROVED TO BE QUITE WORKABLE. .SKIP ^THE ^FLECS TRANSLATOR EXAMINES A ^FLECS PROGRAM LINE BY LINE. ^AS EACH LINE IS ENCOUNTERED, THE TRANSLATOR FIRST SUBJECTS IT TO A LIMITED SYNTAX ANALYSIS AND THEN A CONTEXT ANALYSIS. ^ERRORS MAY BE DETECTED DURING EITHER OF THESE ANALYSES. ^IT IS ALSO POSSIBLE FOR ERRORS TO GO UNDETECTED BY THE TRANSLATOR. .HL 1 SYNTAX ERRORS .INDEX SYNTAX ERRORS ^WHEN THE TRANSLATOR DETECTS SYNTAX ERROR, IT IGNORES A STATEMENT. ^ON THE ^FLECS LISTING THE LINE NUMBER OF THE STATEMENT IS OVERPRINTED WITH -'S TO INDICATE THAT THE STATEMENT HAS BEEN IGNORED. ^THE NATURE OF THE SYNTAX ERROR IS GIVEN IN A MESSAGE ON THE FOLLOWING LINE. .SKIP ^THE FACT THAT A STATEMENT HAS BEEN IGNORED MAY, OF COURSE, CAUSE SOME CONTEXT ERRORS IN LATER STATEMENTS. ^FOR EXAMPLE, THE CONTROL PHRASE "^^WHEN (X(I).LT.(3+4)\\" HAS A MISSING RIGHT PARENTHESIS. ^THIS STATEMENT WILL BE IGNORED, CAUSING, AS A MINIMUM, THE FOLLOWING ^^ELSE\\ TO BE OUT OF CONTEXT. ^THE PROGRAMMER SHOULD OF COURSE BE AWARE OF SUCH EFFECTS. ^MORE WILL BE SAID ABOUT THESE EFFECTS. .HL 1 CONTEXT ERRORS .INDEX CONTEXT ERRORS ^IF A STATEMENT SUCCESSFULLY PASSES THE SYNTAX ANALYSIS, IT IS CHECKED TO SEE IF IT IS IN THE APPROPRIATE CONTEXT WITHIN THE PROGRAM. ^FOR EXAMPLE, AN ^^ELSE\\ MUST APPEAR AFTER A ^^WHEN\\ AND NOWHERE ELSE. ^IF AN ^^ELSE\\ DOES NOT APPEAR AT THE APPROPRIATE POINT OR IF IT APPEARS AT SOME OTHER POINT, THEN A CONTEXT ERROR HAS OCCURRED. ^A FREQUENT SOURCE OF CONTEXT ERRORS IN THE INITIAL STAGES OF DEVELOPMENT OF A PROGRAM COMES FROM MISCOUNTING THE NUMBER OF ^^FIN\\S NEEDED AT SOME POINT IN THE PROGRAM. .SKIP ^WITH THE EXCEPTION OF EXCESS ^^FIN\\S THAT DO NOT MATCH ANY PRECEDING CONTROL PHRASE AND ARE IGNORED (AS INDICATED BY OVERPRINTING THE LINE NUMBER), ALL CONTEXT ERRORS ARE TREATED WITH A UNIFORM STRATEGY. ^WHEN AN OUT-OF-CONTEXT SOURCE STATEMENT IS ENCOUNTERED, THE TRANSLATOR GENERATES A "^^STATEMENT(S) NEEDED"\\ MESSAGE. ^IT THEN INVENTS AND PROCESSES A SEQUENCE OF STATEMENTS THAT, HAD IT BEEN INCLUDED AT THAT POINT IN THE PROGRAM, WOULD HAVE PLACED THE ORIGINAL SOURCE STATEMENT IN A CORRECT CONTEXT. ^A MESSAGE IS GIVEN FOR EACH SUCH STATEMENT INVENTED. ^THE ORIGINAL SOURCE STATEMENT IS THEN PROCESSED IN THE NEWLY CREATED CONTEXT. .SKIP ^BY INVENTING STATEMENTS THE TRANSLATOR IS NOT TRYING TO PATCH UP THE PROGRAM SO THAT IT WILL RUN CORRECTLY; IT IS SIMPLY TRYING TO ADJUST THE LOCAL CONTEXT SO THAT THE ORIGINAL SOURCE STATEMENT AND THE STATEMENTS THAT FOLLOW WILL BE ACCEPTABLE ON A CONTEXT BASIS. ^AS IN THE CASE OF CONTEXT ERRORS GENERATED BY IGNORING A SYNTACTICALLY INCORRECT STATEMENT, SUCH AN ADJUSTMENT OF CONTEXT FREQUENTLY CAUSES FURTHER CONTEXT ERRORS LATER ON. ^THIS IS CALLED PROPAGATION OF CONTEXT ERRORS. .SKIP ^ONE NICE FEATURE OF THE CONTEXT ADJUSTMENT STRATEGY IS THAT CONTEXT ERRORS CANNOT PROPAGATE PAST A RECOGNIZABLE PROCEDURE DECLARATION. ^THIS IS BECAUSE THE "^T^O" DECLARATION IS IN CONTEXT ONLY AT INDENTATION LEVEL 0. ^THUS, TO PLACE THE "^^TO\\" IN CONTEXT, THE TRANSLATOR MUST INVENT ENOUGH STATEMENTS TO TEMINATE ALL OPEN CONTROL STRUCTURES WHICH PRECEED THE "^T^O." ^THE PROGRAMMER WHO MODULARIZES HIS PROGRAM INTO A COLLECTION OF RELATIVELY SHORT INTERNAL PROCEDURES LIMITS THE POTENTIAL FOR PROPAGATION OF CONTEXT ERRORS. .BR .HL 1 UNDETECTED ERRORS ^THE ^FLECS TRANSLATOR IS IGNORANT OF MOST DETAILS OF .INDEX UNDETECTED ERRORS ^FORTRAN SYNTAX. ^THUS, MOST ^FORTRAN SYNTAX ERRORS WILL BE DETECTED BY THE ^FORTRAN COMPILER RATHER THAN BY THE ^FLECS TRANSLATOR. ^IN ADDITION, THERE ARE TWO MAJOR CLASSES OF ^FLECS ERRORS THAT WILL BE CAUGHT BY THE COMPILER AND NOT BY THE TRANSLATOR. .SKIP ^THE FIRST CLASS OF UNDETECTED ERRORS INVOLVES MISSPELLED ^FLECS KEYWORDS. .INDEX KEYWORDS ^A MISSPELLED KEYWORD WILL NOT BE RECOGNIZED BY THE TRANSLATOR. ^IT WILL ASSUME THE LINE ON WHICH THE WORD OCCURS TO BE A ^FORTRAN STATEMENT AND WILL PASS THE LINE UNALTERED TO THE COMPILER, WHICH WILL NO DOUBT OBJECT TO IT. ^FOR EXAMPLE, A COMMON ERROR IS SPELLING ^^UNTIL\\ WITH TWO ^LS. ^SUCH STATEMENTS ARE PASSED TO THE COMPILER, WHICH THEN PRODUCES AN ERROR MESSAGE. ^THE FACT THAT AN INTENDED CONTROL PHRASE WAS NOT RECOGNIZED FREQUENTLY CAUSES A LATER CONTEXT ERROR, SINCE A LEVEL OF INDENTATION WILL NOT BE TRIGGERED. .SKIP ^THE SECOND CLASS OF UNDETECTED ERRORS INVOLVES UNBALANCED PARENTHESES .INDEX PARENTHESES (^SEE ALSO ^NOTE 8 IN CHAPTER 6). ^WHEN SCANNING A PARENTHESIZED SPECIFICATION, THE TRANSLATOR LOOKS FOR A LEFT PARENTHESIS TO MATCH THE INITIAL RIGHT PARENTHESIS THAT BEGINS THE SPECIFICATION. ^AS SOON AS IT FINDS ONE, IT ASSUMES THAT THE REMAINDER OF THE LINE IS A SIMPLE ^FORTRAN STATEMENT, WHICH IT PASSES TO THE COMPILER. ^OF COURSE, THIS ASSUMPTION MAY BE WRONG. ^THUS THE STATEMENT .SKIP .NOFILL ^^WHEN (X.LT.A(I)+Z)) X _= O\\ .FILL .SKIP IS BROKEN INTO .SKIP .NOFILL KEYWORD ^^"WHEN"\\ SPECIFICATION ^^"(X.LT.A(I)+Z)\\" ^FORTRAN STATEMENT ^^"X _= O\\" .SKIP .FILL ^NEEDLESS TO SAY, THE COMPILER WILL OBJECT TO "^^X#_=#O\\" AS A STATEMENT. .SKIP ^PROGRAMMERS ON BATCH-ORIENTED SYSTEMS HAVE LESS DIFFICULTY WITH UNDETECTED ERRORS DUE TO THE PRACTICE OF RUNNING THE PROGRAM THROUGH BOTH THE TRANSLATOR AND THE COMPILER EACH TIME A RUN IS SUBMITTED. ^THE COMPILER ERRORS USUALLY POINT OUT ANY ERRORS UNDETECTED BY THE TRANSLATOR. .SKIP ^PROGRAMMERS ON INTERACTIVE SYSTEMS TEND TO HAVE A BIT MORE DIFFICULTY, SINCE AN UNDETECTED ERROR IN ONE LINE MAY TRIGGER A CONTEXT ERROR IN A MUCH LATER LINE. ^NOTICING THE CONTEXT ERROR, THE PROGRAMMER DOES NOT PROCEED WITH COMPILATION AND HENCE IS NOT WARNED BY THE COMPILER OF THE GENUINE CAUSE OF THE ERROR. ^ONE INDICATION OF THE TRUE SOURCE OF THE ERROR MAY BE AN INDENTATION FAILURE AT THE CORRESPONDING POINT IN THE LISTING. .BR .HL 1 OTHER ERRORS ^THE TRANSLATOR DETECTS A VARIETY OF OTHER ERRORS, SUCH AS MULTIPLE DEFINED OR UNDEFINED PROCEDURE REFERENCES. ^THE ERROR MESSAGES ARE SELF-EXPLANATORY. (^REALLY AND TRULY!) .CHAPTER PROCEDURE FOR USE .LC .LM 8.RM 120 .TITLE ########^^PROCEDURE FOR USE\\ ^FLECS IS INSTALLED AS A SYSTEM TASK AND RESPONDS .INDEX OPERATING PROCEDURE TO THE ^^MCR\\ COMMAND: .SKIP .NOFILL ^^MCR>FLE \\COMMAND LINE .SKIP .FILL .UC .INDEX Command Syntax .hl 1 COMMAND SYNTAX The format for the FLECS command is as follows. .S;.i 5 FLE [filespec][,filespec]_=filespec .S where filespec is any valid filespecification string (34 character maximum) of the form .S;.i 5 DVn:[uic]filename.typ;m .S where DV is a device mnemonic, n is a unit number, uic is a valid user identification code, filename is a valid filename, typ is a valid filetype, and m is a valid version number. The first output file is the FORTRAN output filename, with the default extension of ".FTN". The second output file is the FLECS listing file, with the default extension of ".FLL". The listing file is spooled by default, but may be kept using the "/-SP" switch. As with other MCR commands, DVn defaults to the users current default device and UIC, and m defaults to the highest existing version number. The default input filetype is ".FLE". As with other MCR commands the FLEcs command will accept indirect command files. .lc .hl 1 ERROR DETECTION ^CERTAIN ERRORS ARE DETECTED BY ^FLECS WHEN FILE SPECIFICATIONS ARE SCANNED. .INDEX ERROR CODES .SKIP .NOFILL ^ERROR 1. ^SYNTAX ERROR IN COMMAND STRING. ^ERROR 2. ^UNABLE TO OPEN ^FORTRAN FILE. ^ERROR 3. ^UNABLE TO OPEN ^FLECS LISTING. ^ERROR 4. ^UNABLE TO OPEN ^FLECS INPUT FILE. .FILL .APPENDIX FLECS SUMMARY .LC .LM 8.RM 120 .TITLE .NOFILL ^^IF ( [L] ) $#######UNLESS ( [L] ) $######WHEN ( [L] ) $1 ELSE $2 ------------- ------------------ ---------------- ! ! ! / _\ T / _\ F / _\ T <[L]>----->$ <[L]>----->$ <[L]>---->$1 _\./ ! _\./ ! _\./ ! ! ! ! ! ! ! F! ! T! ! F! ! ! ! ! ! $2 ! !--------' !--------' !--------' ! ! ! .SKIP 2 .TEST PAGE 12 REPEAT UNTIL ( [L] ) $ REPEAT WHILE ( [L] ) $ ------------------------ ------------------------ ! ! !<-----. !<-----. ! ! ! ! $ ! $ ! ! ! ! ! / _\ ^F ! / _\ T ! <[L]>----' <[L]>----' _\./ _\./ ! ! T! F! .SKIP 2 .TEST PAGE 14 UNTIL ( [L] ) $ WHILE ( [L] ) $ ----------------- ----------------- ! ! !<-----. !<-----. ! ! ! ! T / _\ ! F / _\ ! .--<[L]> ! .--<[L]> ! ! _\./ ! ! _\./ ! ! ! ! ! ! ! ! ^F! ! ! ^T! ! ! '------' ! '------' ! ! ----. ----. ! ! .SKIP .TP 5 LEGEND: [L] _= L\\OGICAL ^EXPRESSION $ _= ^STATEMENT(\S) [^E^L] _= ^EXPRESSION ^^ I@ _= DO \\SPECIFICATION^^ .S 2 .TP 30 ^^CONDITIONAL SELECT ( [EL] ) . ( [L1] ) $1 . ( [EL1] ) $1 . ( [L2] ) $2 . ( [EL2] ) $2 . . . . . . . ( [L\N] ) $\N . ( [EL\N] ) $\N --------------------- ------------------- ! ! / _\ / _\ / _\ T /[EL]_\ T <[L1] >----->$1-. <_=[EL1]>----->$1-. _\ / ! _\ / ! _\./ ! _\./ ! F! ! F! ! ! ! ! ! / _\ ! / _\ ! / _\ T ! /[EL]_\ T ! <[L2] >----->$2-! <_=[EL2]>----->$2-! _\ / ! _\ / ! _\./ ! _\./ ! F! ! F! ! : : : : ! ! ! ! / _\ ! / _\ ! / _\ T ! /[EL]_\ T ! <[L\N] >-----$\N--! <_=[EL\N]>-----$\N--! _\ / ! _\ / ! _\./ ! _\./ ! F! ! F! ! !------------' !-------------' ! ! .SKIP N\\OTE^^: OTHERWISE \\CAN BE USED AS A CATCHALL CONDITION IN ^^CONDITIONAL\\ AND ^^SELECT\\ STATEMENTS.^^ .SKIP 2 -------------------------- --------------------- .SKIP CARRY-OUT-ACTION DO (I@) $ .SKIP TO CARRY-OUT-ACTION $ --------------------- .SKIP -------------------------- .SKIP N\\OTE^^: P\\LACE A ^^RETURN, STOP\\, OR ^^CALL EXIT\\ STATEMENT AHEAD OF THE FIRST ^^TO\\ STATEMENT. .FILL .APPENDIX AVAILABLE DOCUMENTATION CONCERNING FLECS .LC .LM 8;.RM 120 .CENTER (^AS OF ^DECEMBER, 1974.) .SKIP 2 ^BEYER, ^J.: ^FLECS ^USERS ^MANUAL (^UNIVERSITY OF ^OREGON ^EDITION) .SKIP .LEFT MARGIN 12 ^CONTAINS A CONCISE DESCRIPTION OF THE ^FLECS EXTENSION OF ^FORTRAN AND OF THE DETAILS NECESSARY TO RUNNING A ^FLECS PROGRAM ON THE ^^PDP-10\\ OR THE ^^IBM S/360\\ AT ^OREGON. .SKIP 2 .LEFT MARGIN 8 ^BEYER, ^T.: ^FLECS: ^SYSTEM ^MODIFICATION ^GUIDE .SKIP .LEFT MARGIN 12 ^CONTAINS INFORMATION OF INTEREST TO ANYONE WHO WISHES TO INSTALL OR ADAPT THE ^FLECS SYSTEM TO A NEW MACHINE OR OPERATING SYSTEM. ^ALSO OF INTEREST TO THOSE WHO WISH TO IMPROVE THE EFFICIENCY OF THE SYSTEM BY REWRITING PORTIONS OF THE SYSTEM IN ASSEMBLY LANGUAGE. .LEFT MARGIN 8 .APPENDIX INDEX .LC .LM 8;.RM 120 .S 2 .CENTER 80 (^FLECS STATEMENTS APPEAR IN UPPER CASE) .PRINT INDEX .LC .LC .BLANK