************************************************************************ *** *** *** *** *** 1. TESTS OF SCANNER *** *** *** *** *** ************************************************************************ // JOB AL001 **TEST LOUIS // EXEC SCANNER2 # DONNEES POUR TEST GLOBAL DU SCANNER # # PROCEDURES FOR BINARY OUTPUT ########### 'PR' 'MODE' 'OUTSTRUCT'= ###AN ACTUAL DECLARER SPECIFYING A MODE UNITED FROM ALL MODES ### 'UNION' 'INTYPE'=(/'REF''INT','REF''REAL','REF''BOOL', 'REF''CHAR','REF' 'OUTSTRUCT' /) ., 'PR' 'PROC' READ BIN=((//)'INTYPE' X).. GET BIN(STAND BACK,X)., 'PROC' GET BIN=('FILE' FILE,(/1:/) 'INTYPE' X).. 'IF' BIN POSSIBLE (/CHAN 'OF' FILE/)'AND' OPENED 'OF' FILE 'AND' GET POSSIBLE (/CHAN 'OF' FILE/) 'THEN' 'IF' 'NOT' SET POSSIBLE (/CHAN 'OF' FILE/) 'THEF' STATE DEF 'OF' FILE 'THEN' ('NOT' STATE GET 'OF' FILE 'OR' 'NOT' STATE BIN 'OF' FILE ! UNDEFINED) 'ELSE' 'SKIP' 'ELSE' UNDEFINED ' F I ' . , ###### # PROCEDURE MULT FOR A FAST MATRIX MULTIPLICATION ####### 'PROC' MULT = ((/1:,1:/)'REAL' A ., (/1:2'UPB' A , 1: /)'REAL' B) (/ , /) 'REAL' .. ### FAST MATRIX MULTIPLICATION ### 'BEGIN' 'PROC' ADD = ( (//) 'REAL' A , B ) (//) 'REAL' .. ( 'INT' N = 'UPB' A ., (/1:N/) 'REAL' C ., 'FOR' K 'TO' N 'DO' C(/K/) .= A(/K/) + B(/K/) ., C ) ., 'PROC' MULT = ( (//) 'REAL' A , B ) 'REAL' .. ( 'LONG''REAL' S .= 'LONG' 0 ., 'FOR' K 'TO' 'UPB' A 'DO' S 'PRUS' 'LENG' A(/ K /) * 'LENG' B(/ K /) ., 'SHORT' S ) ., 'INT' M = 1 'UPB' A , P = 2 'UPB' B , N = 2 'UPB' A ., 'IF' 'ODD' N 'THEN' (/ 1:M,1:N+1/) 'REAL' A1 , (/1:N+1,1:P/) 'REAL' B1 ., A1(/,:N/) .= A ., B1(/:N,/) .=B ., 'FOR' I 'TO' M 'DO' A1(/I,N+1/) .= 0 ., 'FOR' J 'TO' P 'DO' B1(/N+1,J/) .= 0 ., (A1 * B1) 'ELSE' (/1:M/) 'REAL' ALFA , 'INT' L = N 'OVER' 2 ., (/1:M,1:P/) 'REAL' C ., 'FOR' I 'TO' M 'DO' ALFA(/I/).=A(/I,:L/)*A(/I,L+1:/) ., 'FOR' J 'TO' P 'DO' 'BEGIN''REAL' BETA=B(/:L,J/)*B(/L+1:J/)., 'FOR' I 'TO' M 'DO' C(/I,J/).=(A(/I,:L/)+B(/L+1:,J/)* (A(/I,L+1:/)+B(/:L,J/) -ALFA(/I/)-BETA 'END' ., C 'FI' 'END' ###### 'PR' THIS IS THE END OF PROCEDURE MULT 'PR' 'PROC' INNERP1 = ( 'INT' N , 'PROC' ( 'INT')'REAL' X,Y)'REAL'.. # THE INNER PRODUCT OF TWO VECTORS , EACH WITTH N COMPONENTS , X(I) , Y(I) , I=1...N ,# 'PR' WHERE X AND Y ARE ARBITRARY MAPPINGS FROM INTEGER TO REAL NUMBERS 'PR' 'BEGIN' 'LONG' 'REAL' S.='LONG''LONG''INT'..ZERO., 'FOR'I'TO'N'DO'S'PLUS''LENG'X(I)*'LENG'Y(I)., 'SHORT'S 'END' 'PROC' INNER2 =('REF'(/UN:/)'REAL'A.,'REF'(/UN'UPB'A/)'REAL'B)'REAL'.. # THE INNER PRODUCT OF TWO VECTORS A AND B WITH EQUAL NUMBERS OF ELEMENTS # 'BEGIN' 'LONG''REAL' S .= 'LONG''INT'..ZERO., 'FOR' I 'TO' 'UPB' A 'DO' S += 'LENG' A (/I/) * 'LENG' B(/I/)., 'SHORT' S 'END' /* SPL // EXEC SCANNER2 # DONNEES POUR TEST GLOBAL DU SCANNER # #####THE FOLLOWING IS A COMPLETE PROGRAM FOR CALCULATING THE DATE OF EASTER ACCORDING TO THE GREGORIAN RULE . ##### 'BEGIN' 'INT' YEAR,DATE,MOON,PASCHAL,EASTER., # WE SHALL RECKON DATES BY THE NUMBER OF DAYS SINCE THE START OF THE YEAR. THUS # 'INT' MARCH 21ST=31+28+21., # THE GREGORIAN CALENDAR WAS INTRODUCED INTO VARIOUS PARTS OF THE WORLD AT DIFFERENT DATES. IN BELGIUM , THE YEAR WAS # 'INT' GREGORY START=1752 #OR WHATEVER DATE YOU PREFER#., LOOP..READ(YEAR)., 'IF' YEAR 'LT' GREGORY START 'THEN' PRINT(("THE GREGORIAN CALENDER WAS NOT INTRODUCED UNTIL", GREGORY START,NEWLINE)) 'ELSE''INT' CENTURY=YEAR 'OVER' +100, LEAP='ABS'(YEAR'MOD'4'EQ'0'OR'YEAR'MOD'+100'NE'0 'AND' YEAR 'MOD' 400'EQ'0)., # LEAP=1 FOR A LEAP YEAR,AND 0 OTHERWISE # PRINT((NEWPAGE,YEAR, 'IF' LEAP 'EQ' 1 'THEN'" (LEAP YEAR)" 'ELSE' "" 'FI', NEWLINE))., # TO CALCULATE THE DAY OF THE WEEK CORRESPONDING TO ANY DATE, WE ASSOCIATE WITH EACH YEAR A DOMINICAL LETTER,WHOSE POSITION IN THE ALPHABET GIVES THE DATE OF THE FIRST SUNDAY IN JANUARY # 'INT' DOMINIC=7-(YEAR+YEAR 'OVER' 4 - CENTURY + CENTURY 'OVER' 4 -1-LEAP)'MOD' 7., PRINT(("THE DOMINICAL LETTER IS ", 'CASE' DOMINIC 'IN' "A","B","C","D","E","F","G" 'ESAC', 'IF' LEAP 'EQ' 1 'THEN' 'CASE' (DOMINIC - 2) 'MOD' 7+1 'IN' "/A","/B","/C","/D","/E","/F","/G" 'ESAC' 'ELSE' "" 'FI', NEWLINE))., 'PROC' WEEKDAY=('INT'DATE)'STRING'.. 'CASE' (DATE - DOMINIC)'MOD' 7+1 'IN' "SUNDAY","MONDAY","TUESDAY","WEDNESDAY", "THURSDAY","FRIDAY","SATURDAY" 'ESAC'., 'PROC' MONTH=('REF''INT' DATE)'STRING'.. # THIS PROC HAS A REF INT PARAMETER WHICH IT WILL ALTER TO BECOME THE DATE WITHIN THE MONTH # 'IF' DATE 'LE' 31 'THEN' "JANUARY" 'ELSF' (DATE.=DATE-31)'LE'28+LEAP 'THEN' "FEBRUARY" 'ELSF' (DATE.=DATE-28-LEAP)'LE'31 'THEN' "MARCH" 'ELSF' (DATE.=DATE-31)'LE'30 'THEN' "APRIL" 'ELSF' (DATE.=DATE-30)'LE'31 'THEN' "MAY" 'ELSF' (DATE.=DATE-31)'LE'30 'THEN' "JUNE" 'ELSF' (DATE.=DATE-30)'LE'31 'THEN' "JULY" 'ELSF' (DATE.=DATE-31)'LE'31 'THEN' "AUGUST" 'ELSF' (DATE.=DATE-31)'LE'30 'THEN' "SEPTEMBER" 'ELSF' (DATE.=DATE-30)'LE'31 'THEN' "OCTOBER" 'ELSE' DATE.=DATE-30.,"DECEMBER" 'FI' # THE MOON REVOLVES AROUND THE EARTH ONCE EVERY 29.530588 DAYS. 235 SUCH LUNATIONS LAST JUST 1 1/2 HOURS LESS THAN 19 JULIAN YEARS . THE CALENDAR IS THEREFORE BASED ON A METONIC CYCLE OF 19 YEARS , EACH YEAR IN A CYCLE BEING ALLOTED A "GOLDEN NUMBER" IN THE RANGE 1 TO 19 # 'INT' GOLDEN = YEAR 'MOD' 19+1., PRINT(("THE GOLDEN NUMBER IS ",GOLDEN,NEWLINE))., # HOWEVER , FOLLOWING THIS CYCLE INDEFINITELY WOULD INTRODUCE AN ERROR OF APPROXIMATIVELY 0.43 DAYS PER CENTURY. THERE IS THEREFORE A CORRECTION WHICH,FOR CONVENIENCE , IS ONLY ALLOWED TO CHANGE AT THE END OF THE CENTURY # 'INT' LILIUS # WHO IS NOT INHERENTLY A MEANINGFULL IDENTIFIER # =(CENTURY-CENTURY 'OVER' 4 #FOR THE LEAP YEARS OMMITED AT THE START OF SOME CENTURIES # -(CENTURY-(+CENTURY-17)'OVER'25)'OVER'3 #THE 1 1/2 HOURS ERROR# -8)'MOD' 30 ., # ON THE 1ST JANUARY OF ANY YEAR , THE NUMBER OF DAYS SINCE THE LAST MOON IS GIVEN BY THE EPACT # 'INT' EPACT=(11*(GOLDEN-1)-LILIUS)'MOD'30., PRINT(("THE EPACT IS",EPACT,NEWLINE))., # IF SUCCESSIVE NEW MOONS WERE TO OCCUR EVERY 30 DAYS , THEN WE SHOULD BE ABLE TO ASSOCIATE WITH EACH DATE A UNIQUE EPACT,ONE LESS FOR EACH DAY MODULO 30 (THEN THAT DATE WOULD BE A NEW MOON IN YEARS WITH THAT EPACT). IN FACT , SIX TIMES IN THE YEAR(AND ONCE EXTRA AT THE END OF 19 YEARS)WE MUST HAVE A LUNATION OF ONLY 29 DAYS,WHEREUPON THE SEQUENCE OF EPACTS SLIPS BACK A DAY AND SOME DATE WILL HAVE TWO EPACTS LISTED AGAINST IT.THESE DATES HAVE BEEN CAREFULLY CHOSEN(IT IS ALLEGED)SO AS TO MINIMISE THE DEVIATION FROM THE TRUE MOON.ONE OF THEM OCCURS IN FEBRUARY AND SO HAPPENINGS IN MARCH OCCUR EXACTLY 59 DAYS AFTER THOSE IN JANUARY(OR 60 IN A LEAP YEAR,SINCE THE INTERCALARY DAY,IF ANY,IN FEBRUARY IS AUTOMATICALLY ADDED TO THE LUNATION IN WHICH IT OCCURS).THEREFORE,THERE IS A NEW MOON ON # MOON.= 31-EPACT+59+LEAP., 'IF'(PASCHAL.= MOON +13)'LT'MARCH21ST +LEAP 'THEN' #THE FOURTEENTH DAY OF THIS MOON FALLS BEFORE THE VERNAL EQUINOX AND WE WANT THE NEXT ONE.THE NEXT DATE WITH TWO EPACTS AGAINST IT OCCURS IN APRIL,THE CRITICAL EPACT BEING GIVEN BY # 'INT' CLAVIUS= 'IF' GOLDEN 'GT' 11 'THEN' 26 'ELSE' 25 'FI' ., PASCHAL .=MOON + 13 'FI' ., MOON.=MOON+(EPACT 'GE' CLAVIUS ! 30 ! 29) ., PRINT(("THE PASCHAL FULL MOON FALLS UPON ", WEEKDAY(PASCHAL),SPACE, MONTH(DATE.=PASCHAL),SPACE))., # NOTE HOW WE HAVE TO BREAK OFF THE PRINT HERE AND START ANOTHER ONE, SO THAT WE CAN USE THE VALUE OF DATE,AS CALCULATED THEREIN,IN THE NEXT PRINT. IF IT HAD ALL BEEN DONE IN ONE PRINT,THEN WE MIGHT HAVE BEEN USING DATE AND ASSIGNING TO IT AT THE SAME TIME(I.E. COLLATERALLY),AND ANYTHING MIGHT HAVE HAPPENED # PRINT((DATE,NEWLINE))., PRINT(("EASTER DAY,BEING THE NEXT SUNDAY AFTER THE PASCHAL FULL M" ,"OON,THEREFORE FALLS UPON ",MONTH(DATE.=EASTER.=PASCHAL+7 -(PASCHAL-DOMINIC) 'MOD'7)))., PRINT((DATE,NEWLINE)) 'FI'., 'GO TO' LOOP 'END' /* SPL // EXEC SCANNER2 # DONNEES POUR TEST GLOBAL DU SCANNER # 'BEGIN' #THIS EXAMPLE CONCERNS PEOPLE : # 'STRUCT''PERSON' = ('STRING' SURNAME,GIVEN#NAME#, 'REF''PERSON'FATHER,MOTHER,WIFE#OR HUSBAND#, (/1:0'FLEX'/) 'REF''PERSON' CHILDREN, 'BOOL' MALE = 'TRUE',FEMALE = 'FALSE',ALIVE 'BOOL' MALE = 'TRUE',FEMALE = 'FALSE, 'BOOL' MALE = 'TRUE',FEMALE = 'FALSE',ALIVE = 'FALSE', DEAD = 'T RUE' ., 'STRUCT'('INT'DAY,(/1:3/) 'CHAR' MONTH, 'INT' YEAR) DATE ., #SOMETIMES IT WILL BE CONVENIENT TO HAVE A PERSON'S GIVEN NAME AND SURNAME TOGETHER : # 'PROC' NAMES = ('REF''PERSON' PERS)'STRUCT'('STRING'GIVEN,SURNAME) : (GIVEN 'OF' PERS,SURNAME'OF'PERS) ., # ALL OUR FORMAL-PARAMETERS WILL BE OF MODE REF PERSON RATHER THAN PERSON, TO SAVE MAKING UNNECESSARY COPIES OF PERSONS(WHICH ARE RATHER LARGE) AT RUN TIME. # # HERE IS A PROCEDURE THAT WILL BE USED TO ADD A LITTLE RANDOM SPICE TO THE MESSAGES THAT WE SHALL PRODUCE. IT YIELDS A RANDOM INTEGER IN THE RANGE SPECIFIED BY ITS PARAMETER.# 'PROC' RANDINT = ('INT'RANGE)'INT': 1+ 'ENTIER(RANDOM*RANGE) ., READ(LAST RANDOM).,#TO START IT OFF# 'FILE'FILE.=STAND OUT ., 'IF' GET POSSIBLE (/STAND OUT CHANNEL/) #YOU SHOULD CERTAINLY TRY TO PERSUADE YOUR IMPLEMENTOR TO PROVIDE GET POSSIBLE ON HIS OUTPUT CHANNELS.SO LONG AS SET AND RESET ARE NOT POSSIBLE THIS RAISES NO DIFFICULTIES(IT CERTAINLY DOES NOT ENABLE YOU TO USE THEM AS INPUT CHANNELS).WHAT IT DOES ENABLE YOU TO DO, HOWEVER, IS TO READ BACK WHAT YOU HAVE JUST WRITTEN(BUT ONLY WITHIN THE CURRENT LINE),AND TO AMEND IT IF YOU WISH, WITHOUT KNOWING WHICH OCCURRENCE OF PRINT OR OUT PUT IT THERE IN THE FIRST PLACE. THE FOLLOWING PIECE OF PROGRAMM IS INTENDED TO CATCH YOU WHEN YOU HAVE OVERSTEPPED THE END OF A LINE, TO GO BACK TO THE LAST SPACE,AND TO TRANSFER THE WHOLE OF THE WORLD WHICH WAS ABOUT TO BE SPLIT ON TO THE NEXT LINE. THIS WOULD BE ALMOST IMPOSSIBLE TO DO WITHOUT THE PROPOSED FACILITY.# 'THEN' PHYSICAL FILE END 'OF' FILE .='BOOL': 'BEGIN''STRING' S.=(),'CHAR C ., 'IF' LINE ENDED(FILE) 'THEN''WHILE'BACKSPACE(FILE).,GET(FILE) .,C'NOT''EQ' "." 'DO' C 'PRUS' S ., 'WHILE''NOT' LINE ENDED(FILE)'DO'PUT(FILE,".")., NEWLINE(FILE)., 'ELSF' PAGE ENDED(FILE) 'THEN' NEWPAGE (FILE).,'TRUE' 'ELSE''FALSE' 'FI''END' 'ELSE' PHYSICAL FILE END 'OF' FILE .= 'BOOL' 'IF' LINE ENDED(FILE) 'THEN' NEWLINE(FILE)., 'TRUE' 'ELSF' PAGE ENDED(FILE) 'THEN' NEWPAGE(FILE) .,'TRUE' 'ELSE''FALSE' 'FI' #IN WHICH CASE, THE WORDS WILL JUST HAVE TO REMAIN SPLIT# 'FI' ., 'PROC' GENERATE = ( 'REF''PERSON'INFANT,FATHER,MOTHER, 'STRING'GIVEN NAME, 'BOOL' MALE): 'IF' MALE 'OF' FATHER 'OR''NOT'MALE'OF' MOTHER'AND''NOT' DEAD 'OF' MOTHER 'THEN''OP''PLUS' = ('REF'(/1:'FLEX'/)'REF''PERSON'NAMES., 'REF''PERSON'PERS): NAMES.=('INT'UPB = 'UPB'NAMES ., (/1:UPB+1/)'REF''PERSON'NEW NAMES ., NEW NAMES(/1:UPB/) .=NAMES ., NEW NAMES(/UPB+1/) .V PERS.,NEW NAMES)., INFANT.=(SURNAME'OF'MOTHER, GIVEN NAME, FATHER, MOTHER, 'NIL', (),#NOT YET]# ALIVE, MALE)., CHILDREN 'OF' FATHER 'PLUS' INFANT ., CHILDREN 'OF' MOTHER 'PLUS' INFANT ., 'IF' WIFE 'OF' FATHER .=. MOTHER #THAT WAS AN IDENTITY RELATION.IF YOU HAVE NOT YET READ 5.7.4, PLEASE ACCEPT OUR ASSURANCE THAT ".=." IS A SORT OF OPERATOR WHICH YIELDS 'TRUE' IF THE TWO NAMES WHICH ARE ITS OPERANDS IN FACT REFER TO THE SAME VALUE. IN THIS CASE, THE OPERANDS WERE OF MODE 'REF''PERSON',AND IF THE PERSONS REFED TO TURN OUT TO BE THE SAME PERSON # 'THEN' OUTF(FILE, $21"BIRTH" L 4X T, #SURNAME# "..ON." ZDX,3AX,2D, #DATE# ".TO."T, #MOTHER# ", WIFE OF."T, #FATHER# ", A "C("DARLING", "BOUNCING", "BEAUTIFUL","TINY",#RANDINT# X C("DAUGHTER","SON") #SEX# " " T"."$, #GIVEN# (SURNAME 'OF' INFANT,DATE,GIVEN 'OF' MOTHER,GIVEN 'OF' FATHER,RANDINT(4), 'ABS' MALE+1,GIVEN NAME))., # 'ELSE' NO COMMENT # 'FI' ., #THE ABOVE CALL OF OUTF IS INTENTED TO PRODUCE MESSAGES SUCH AS : BIRTH. FITZWILLIAM. ON 3 MAR 28 TO ELEANOR, WIFE OF EBENEZER, A BEAUTIFUL SON -JAPHET.# 'ELSE' EXIT #THE BIRTH WAS QUITE IMPOSSIBLE # 'FI' ., #END OF GENERATE # #THE FOLLOWING PROC CALLS ITSELF RECURSIVELY FOR EACH GENERATION# 'PROC' PRINT CHILDREN OF =((/1:/)'REF''PERSON' PARENTS, 'INT' GENERATION): 'BEGIN''INT' I.=0,J.=0., (/1:('INT' I .= 0 ., 'FOR' J 'TO' 'UPB' PARENTS 'DO' I 'PLUS' H 'UPB' CHILDREN 'OF' PARENTS(/J/) ., I)/) 'REF''PERSON' CHILDREN,LIVING CHILDREN ., 'FOR' K 'TO' 'UPB' PARENTS 'DO' 'FOR' L 'TO' 'UPB' CHILDREN 'OF' PARENTS(/K/) 'DO' 'BEGIN' 'REF''PERSON' CHILD = (CHILDREN 'OF' PARENTS(/K/))(/L/) ., CHILDREN(/I 'PLUS' L/) .= ( 'NOT' DEAD 'OF' CHILD !LIVING CHILDREN(/J 'PLUS' L/) .= CHILD !CHILD) 'END' ., 'IF' J 'NOT' 'EQ' 0 'THEN' #THERE ARE LIVING CHILDREN TO BE PRINTED # 'FI' ., 'IF' 'UPB' CHILDREN 'NOT''EQ' 0 'THEN' PRINT CHILDREN OF(CHILDREN,GENERATION + 1)'FI' ., 'END' #OF PRINT CHILDREN OF # ., PRINT CHILDREN OF(BLOKE,0) ., PUT (FILE,".") 'ELSE' EXIT #THE BLOKE WAS DEAD ALREADY# 'FI' #END OF KILL# ., #NOW WE ARE READY TO START OUR TALE9SINCE WE DO NOT WISH TO GO RIGHT BACK TO ADAM, WE SHALL START BY DECLARING THE STORY SO FAR : # 'PERSON' ALOYSIUS .= ("FITZWILLIAM","ALOYSIUS",'SKIP','SKIP','SKIP',(),ALIVE,MALE) ., , 'PERSON' ANASTASIA .= ("FITZWILLIAM","ANASTASIA",'SKIP','SKIP',ALOYSIUS,(),DEAD,FEMAL E ) ., 'PERSON' EBENEZER .= ("FITZWILLIAM","EBENEZER",ALOYSIUS,ANASTASIA,'NIL',(),ALIVE,MAL E) ., 'PERSON' ALARIC .= ("FITZWILLIAM","ALARIC",ALOYSIUS,ANASTASIA,'NIL',(),ALIVE,MALE) ., #WE WERE UNABLE TO INCLUDE ANASTASIA AS ALOYSIUS' WIFE WHEN INITIALISING HIM, BE CAUSE HER DECLARATION HAD NOT BEEN ELABORATED AT THAT TIME. WE CAN RECTIFY THIS, AND THE SIMILAR CASE OF THEIR CHILDREN,NOW# WIFE OF ALOYSIUS .= ANASTASIA ., CHILDREN OF ALOYSIUS .= CHILDREN 'OF' ANASTASIA .= (EBENEZER, ALARIC) ., #WE SHALL DECLARE THE NEXT FAMILY DIFFERENTLY, SO AVOIDING THIS PROBLEM :# 'PERSON' EMRYS,MYFANWY,FREDERICK,ELEANOR ., # THESE ARE THE UNBORN GENERATIONS, AND ARE THEREFORE UNDEFINED. # DATE .= (1,"APR",24) .,MARRY(ELEANOR,EBENEZER) ., DATE .= (1,"JAN",25) ., GENERATE(SHEM,EBENEZER,ELEANOR, "SHEM",MALE) ., # WE DON'T WASTE MUCH TIME IN THIS PROGRAM.# DATE .= (31,"MAR",26).,GENERATE(HAM,EBENEZER,ELEANOR, "HAM",MALE)., DATE .= (3,"MAR",28)., GENERATE (JAPPET,EBENEZER,ELEANOR, "JAPHET",MALE)., # THIS WILL PRODUCE THE EXAMPLE GIVEN IN THE 'PROC' GENERATE. # DATE .= (14,"JUL",48)) ., # NOW WE NEED TO DECLARE SOME ELIGIBLE YOUNG LADIES.# 'PERSON' A,B,JOSIE,ROSIE ., JOSIE .= ("SMITH","JOSEPHINE",A,B,'NIL',(),ALIVE,FEMALE) ., ROSIE .= ("SMITH","ROSE",A,B,'NIL',ALIVE,FEMALE) ., MARRY(JOSIE,SHEM) ., DATE .= (238"JAN",49) .,GENERATE(ANANIAS,SHEM,JOSIE, "ANANIAS",MALE) ., # WELL, PERHAPS IT WAS PREMATURE # DATE .= (14,"DEC",50) ., GENERATE(AZARIAS,SHEM,JOSIE, "AZARIAS",MALE)., DATE .= (29,"FEB",52) ., KILL(JOSIE) ., @ # ALAS] BUT......# DATE .= (28,"DEC",52) ., MARRY(ROSIE,SHEM) ., #THERE ARE SOME INTERESTING ECCLESIASTICAL PROBLEMS IN THAT ONE. # DATE .= (14,"JAN",54) ., GENERATE (MISAEL,SHEM,ROSIE, "MISAEL",MALE) ., # HERE IS A NOT SO ELIGIBLE YOUNG LADY :# 'PERSON' X .= ('SKIP','SKIP','SKIP','SKIP','NIL','SKIP',ALIVE, FEMALE) ., DATE .= (20,"DEC",68) .,GENERATE (TOM,AZARIAS,X,"TOM",MALE)., # AND SO THE PERMISSIVE SOCIETY HAS ARRIVED.NOTHING WILL BE PRINTED.# DATE .= (21,"DEC",68)., KILL(EBENEZER) # POOR CHAP] THIS WILL PRODUCE THE EXAMPLE GIVEN IN THE 'PROC' KILL.# 'END' /* SPL ************************************************************************ *** *** *** 2. TESTS FIRST PASS *** *** *** ************************************************************************ ************************************************************************ * * * TESTS ON BLOCK * * * ************************************************************************ // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # 7 ASSIGNATION WITH A SLICE AS L.H.S. # TEST .. 'BEGIN' 'INT' I,J,K,L ., (/ I % I /) 'REAL' A1 ., (/ I % I , J % J /) 'REAL' A2 ., 'REF' (//) 'REAL' A3 = A1 ., 'REF' (/ , /) 'REAL' A4 ., 'REF''REF' (/ , , /) 'REAL' A5 = A1 ., (/ , , , /) 'REF''REAL' A6 = A1 ., A1(/I/) .= 3 ., A2(/I,J/) .= 3 ., A3(/I/) .= 3 ., A4(/I,J/) .= 3 ., A5(/I,J,K/) .= 3 ., A6(/I,J,K,L/) .= 3 ., # NOW , ERRORS CONCERNING MODE OF PRIMARY # 'BEGIN' (//)'REAL'X=I ., X(/I/).= 3.0 'END' ., 'BEGIN' 'REAL' X ., X(/I/).=3.0 'END' ., 'BEGIN' 'REF''REAL'X ., X(/I/).=3.0 'END' ., 'BEGIN' 'REF''REAL'X=I ., X(/I/).=3.0 'END' ., 'BEGIN' 'REF''REF''REF''REF''REF''REF''REF''REF''REF''REF' 'REF''REF''REF''REF''REF''REF''REF''REF''REF''REF' (//)'REAL' X ., X(/I/) .=3.0 'END' ., # NOW , ERRORS CONCERNING NUMBER OF INDEXERS # 'BEGIN' 'REF'(//)'REAL'X ., X(/I,J/).=3.0 'END' ., 'BEGIN' 'REF'(/ , /)'REAL'X ., X(/I/).=3.0 'END' ., 'BEGIN' 'REF'(/ , /)'REAL' X ., X(/I,J,K/) .=3.0 'END' ., # OTHER ERRORS # 'BEGIN' 'REF'(//)'REAL'X ., X(/).=1.0 'END' ., 'BEGIN' 'REF'(//)'REAL' X ., X(/I/)=1.0 'END' 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # 5 CALL WITH PARAMETERS # 'PR' 'PROC' ('INT' ) DCS1 , 'PROC' ( 'INT' , 'REAL' ) DCS2 'PR' PROGRA .. 'BEGIN' 'INT' INT ., 'REAL' REAL ., 'PROC' ('INT' ) A = (('INT' A ) .. 'SKIP' ) ., 'PROC' ( 'INT' ) B ., 'REF''PROC' ( 'INT' ) C = A ., 'REF''PROC' ( 'INT' ) D ., 'PROC' ( 'INT' , 'REAL' ) E = (('INT' A , 'REAL' B ) .. 'SKIP ' ) ., A(INT) ., DCS1(INT) ., DCS2(INT,REAL) ., E(INT,REAL) ., B(INT); C(INT); D(INT); # NOW , ERRORS # 'BEGIN' (//)'REAL' A = INT ., A(INT) 'END' ., 'BEGIN' 'PROC'('INT') A ., A(DDD) 'END' ., 'BEGIN' 'REF' (//) 'REAL' A ., A (INT) 'END' ., 'BEGIN' 'REF''REF''REF''REF''REF''REF''REF''REF''REF''REF' 'REF''REF''REF''REF''REF''REF''REF''REF''REF''REF' # OUF # 'PROC'('INT') A ., A(INT) .,'SKIP' 'END' ., 'BEGIN' 'REF''BOOL' A ., A(INT) 'END' ., 'BEGIN' 'PROC' A ., A(INT) 'END' ., 'BEGIN' 'PROC'('INT') A ., A(INT,REAL) 'END' ., 'BEGIN' 'PROC' ('INT','REAL') A ., A(INT) 'END' ., 'BEGIN' # NO ERROR # 'PROC'('REF''REF''REF''INT','REF''REAL') A ., A(INT,REAL) 'END' ., 'BEGIN' 'PROC'('INT') A ., A(INT/) 'END' ., 'BEGIN' 'PROC'('INT') A ., A(INT.,'SKIP' 'END' ., 'BEGIN' # NO ERROR # 'PROC'('PROC'('INT','REAL'),'REF''PROC', 'PROC'('PROC'('PROC'))) A ., A(INT,INT,INT) ., 'SKIP'.,'SKIP' 'END 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # D) STATEMENTS IN THE CONTEXT OF A 'FOR' STATEMENT # MAIN .. 'BEGIN' 'INT' A1,A2,A3 ., 'BOOL' TRUE ., 'PROC' PROC1 ., 'PROC'('INT')PROC2 ., 'REAL' AA ., 'REF'(//)'REAL' BB ., 'FOR' I 'FROM' A1 'BY' A2 'TO' A3 'DO' ('SKIP' ., 'SKIP' ) ., 'FOR' I 'FROM' A1 'BY' A2 'TO' A3 'DO' ( 'GOTO' MAIN ., 'GOTO' MAIN ) ., 'FOR' I 'FROM' A1 'BY' A2 'TO' A3 'DO' ( 'IF'TRUE'THEN''SKIP''FI' ., 'IF'TRUE'THEN''SKIP''FI' ) ., 'FOR' I 'FROM' A1 'BY' A2 'TO' A3 'DO' ('FOR' I 'FROM' A1 'BY' A2 'TO' A3 'DO' ('SKIP')., 'FOR' I 'FROM' A1 'BY' A2 'TO' A3 'DO' ('SKIP') ) ., 'FOR' I 'FROM' A1 'BY' A2 'TO' A3 'DO' ( PROC1 ., PROC1 ) ., 'FOR' I 'FROM' A1 'BY' A2 'TO' A3 'DO' ( PROC2(A1) ., PROC2(A1) ) ., 'FOR' I 'FROM' A1 'BY' A2 'TO' A3 'DO' ( AA .= AA ., AA .= AA ) ., 'FOR' I 'FROM' A1 'BY' A2 'TO' A3 'DO' ( BB (/I/) .= A1 ., BB(/I/) .= A1 ) ., 'FOR' I 'FROM' A1 'BY' A2 'TO' A3 'DO' ( 'BEGIN' 'SKIP' 'END' ., 'BEGIN' 'SKIP' 'END' ) 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # B) STATEMENTS IN THE CONTEXT OF A ROUTINE DECLARATION # MAIN .. 'BEGIN' 'BOOL' TRUE ., 'INT' A1 , A2 , A3 ., 'REF'(//)'REAL' A4 = A1 ., 'REAL' A5 ., 'PROC' A = (..'SKIP') ., 'PROC' B = (.. 'IF' TRUE ' THEN' 'SKIP' 'FI' ) ., 'PROC' C = ( .. 'FOR' I 'FROM' A1 'BY' A2 'TO' A3 'DO' ( 'SKIP' )) ., 'PROC' D = ( .. D ) ., 'PROC' ('INT') ) E (('INT' F ) .. E(F ) ) ., 'PROC' F = ( .. A5.=A5) ., 'PROC' G = (.. A4(/A1/) .= A1 ) ., 'PROC' H = ( .. 'BEGIN' 'SKIP' 'END' ) ., 'SKIP' 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # E ) STATEMENTS IN THE CONTEXT OF 'IF' STATEMENT # MAIN..' BEGIN ' 'BOOL' TRUE ., 'IF' TRUE 'THEN' 'SKIP' ., 'SKIP' 'FI' ., 'IF' TRUE 'THEN' 'SKIP' 'ELSE' 'SKIP' ., 'SKIP' 'FI' ., 'IF' TRUE 'THEN' 'IF' TRUE 'THEN' 'SKIP' 'FI' 'FI' ., 'IF' TRUE 'THEN' 'IF' TRUE 'THEN' 'SKIP' 'FI' 'ELSE' 'SKIP' 'FI' ., 'IF' TRUE 'THEN' 'IF' TRUE 'THEN' 'SKIP' 'ELSE' 'SKIP' 'FI' 'FI' ., 'IF' TRUE 'THEN' 'IF' TRUE 'THEN' 'SKIP' 'ELSE' 'SKIP' 'FI' 'ELSE' 'SKIP' 'FI' ., 'IF' TRUE 'THEN' 'SKIP' 'ELSE' 'IF' TRUE 'THEN' 'SKIP' 'FI' 'FI' ., 'IF' TRUE 'THEN''SKIP' 'ELSE' 'IF' TRUE 'THEN' 'SKIP' 'ELSE' 'SKIP' 'FI' ., 'IF' TRUE 'THEN' 'SKIP' 'FI' ., 'SKIP' 'FI' 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # C) STATEMENTS IN THE CONTEXT OF A 'BEGIN' BLOCK # MAIN .. 'BEGIN' LABEL .. 'SKIP' ., L1..'BEGIN' 'SKIP' ., 'SKIP' 'END' ., 'BEGIN' 'GOTO' LABEL ., 'GO TO' LABEL 'END' ., 'BEGIN' 'INT' A1,A2,A3., L4..'FOR'I'FROM'A1'BY'A2'TO'A3'DO'('SKIP')., 'FOR'I'FROM'A1'BY'A2'TO'A3'DO'('SKIP') 'END' ., L2..'BEGIN' 'BOOL' A ., 'IF' A 'THEN' 'SKIP' 'FI' ., L5..'IF' A 'THEN' 'SKIP' 'FI' 'END' ., 'BEGIN' 'PROC' A ., L6.. A ., A 'END' ., L3 .. 'BEGIN' 'PROC'('INT') A ., 'INT' B ., A(B) ., L7 .. A(B) 'END' ., 'BEGIN' 'REAL' A ., A.= A ., A.= A 'END' ., 'BEGIN' 'REF'(//)'REAL' A ., 'INT' I ., L8 .. A(/I/).=I ., A(/I/).=I 'END' ., 'BEGIN' 'BEGIN' 'SKIP' 'END' ., 'BEGIN' 'SKIP' 'END' 'END' 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # 6 ASSIGNATION WITH AN IDENTIFIER AS L.H.S. # TEST .. 'BEGIN' 'INT' A ., 'REF''INT' B = A ., 'PROC'('REAL') C ., A .= 1 ., B .= A ., C .= SIN ., # NOW , ERRORS # 'BEGIN' 'INT' X = A ., X .= A ., 'SKIP' ., 'SKIP' 'END' ., 'BEGIN' (//)'INT' X = A ., X .= A 'END' ., 'BEGIN' (//) 'REF''INT' X = A ., X .= A ., 'SKIP' 'END' ., A .= 2 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA 'PROC'('REF'(//)'REAL','INT') A = (('REF'(//)'REAL' B , 'INT' I ) .. B(/I/) .= I ) /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # FATAL ERROR # /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA 'PROC' A = ( .. 'BEGIN' 'SKIP' 'END' ) /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA 'PROC'('REF''REAL') A = (('REF''REAL' B ) .. B.= B ) /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA 'PROC'('INT') A = (('INT'B) .. A(B) ) /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA 'PROC' A = ( .. A ) /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA 'PROC'('INT','INT','INT') A = (('INT' A1 , A2, A3 ) .. 'FOR' I 'FROM' A1 'BY' A2 'TO' A3 'DO' ( 'SKIP' ) ) /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # GENERAL BOOKKEEPING OF STATEMENTS # # A) STATEMENTS IN THE CONTEXT OF A SEPARATELY COMPILED ROUTINE # 'PROC' A = ( .. 'SKIP' ) /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # TESTS FOR DEBUGGING ROUTINE BLOCK # # PAY ATTENTION , WE USE LITTLE ROUTINE EXPRESSION # # 1 VERY SAMPLE PROGRAMS # MAIN .. 'BEGIN' 'SKIP' 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # TESTS ON ALIGNMENT # TEST .. 'BEGIN' 'REAL' A ., 'LONG''REAL' B ., 'INT' C ., 'LONG''INT' D ., 'BOOL' E ., 'CHAR' F ., A .= 1.0., # 4,2 # A .= 1.0., # 4,0 # F .= 'A' ., B .= 'LONG' 1.0 ., # 8,7 # B .= 'LONG' 1.0 ., # 8,0 # F .= 'A' ., C .= 1 ., # 2,1 # C .= 1 ., # 2,0 # D .= 'LONG' 1 ., # 4,2 # D .= 'LONG' 1 ., # 4,0 # 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # 3 DECLARATIONS OF ROUTINES # MAIN .. 'BEGIN' 'INT' I ., 'PROC' A = ( .. 'SKIP' ) ., 'PROC' ( 'INT' ) B = (('INT' C ) .. 'SKIP' ) ., 'PROC' ( 'INT' , 'REAL' ) C = (( 'INT' E , 'REAL' F ) .. 'SKIP' ) ., 'BEGIN' 'PROC' C = A ., # NO ERROR # 'SKIP' 'END' ., 'BEGIN' 'PROC' A = (( 'INT' B ) #ERROR# .. 'SKIP' 'END' ., 'BEGIN' 'PROC' A = (( B #ERROR# ) .. 'SKIP' ) 'END' ., 'BEGIN' 'PROC' A = (('REF' B #ERROR# ) .. 'SKIP' ) 'END' ., 'BEGIN' 'PROC' A = (( (/ I % I /) 'REAL' X #ERROR# ) .. ) 'END' ., 'BEGIN' 'PROC' ( 'INT' ) A = (( 'REAL' B ) #ERROR# 'END' ., 'BEGIN' 'PROC'('INT') A = (('INT' B , 'REAL' C #ERROR# 'END' ., 'BEGIN' 'PROC' ('INT','REAL') A = (('INT' B ) .. #ERROR# 'END' ., 'BEGIN' 'PROC' ('INT') A = ( .. 'SKIP') #ERROR# 'END' ., 'BEGIN' 'PROC' A = ( 'SKIP' ) #ERROR# 'END' ., 'BEGIN' 'PROC' ('INT') A = (('INT' B ) 'SKIP' ) #ERROR# 'END' ., 'BEGIN' 'REAL' X ., 'PROC' X = ( .. 'SKIP' ) #ERROR# 'END' 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # 4 CALL WITHOUT PARAMETERS # 'PR' 'PROC' DCS 'PR' TEST .. 'BEGIN' 'PROC' A = ( .. 'SKIP' ) ., 'PROC' B ., 'REF''PROC' C = A ., 'REF''PROC' D ., A ., # WITHOUT DEREF # DCS ., # IDEM # B ., # WITH DEREF # C ., # WITH DEREF # D ., # WITH DEREF # # NOW , ERRORS # 'BEGIN' 'INT' A ., A 'END' ., 'BEGIN' 'PROC'('REAL') B =(('REAL'C)..'SKIP').,B 'END' ., 'BEGIN' 'REAL' D = A ., D 'END' ., 'BEGIN' 'REF''REAL' A ., A 'END' ., 'BEGIN' 'REF''REAL' F = A ., F 'END' ., 'BEGIN' (/A%A/) 'REAL' G ., G 'END' ., 'BEGIN' 'REF'(/,,/)'REAL' H ., H 'END' ., 'BEGIN' 'REF''REF''REF''REF''REF''REF''REF''REF''REF' 'REF''REF''REF''REF''REF''REF''REF''REF''REF' #OUF# 'PROC' I ., I 'END' ., 'BEGIN' (//)'PROC' J = DCS ., J 'END' ., 'SKIP' 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA MAIN .. 'BEGIN' 'SKIP' ., 'SKIP' ., 'SKIP' ., 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # 2 VARIABLE AND CONSTANT DECLARATIONS # PROG .. 'BEGIN' 'PROC' A ., 'PROC'('INT') B ., 'PROC' C , D ., 'REAL' E ., 'REAL' F , G ., 'BEGIN' 'INT' A ., (/ A % A /) 'REAL' B ., (/ /) 'REAL' C ., #ERROR # 'SKIP' 'END' ., 'BEGIN' 'INT' A , # ERROR # 'SKIP' 'END' ., 'BEGIN' 'REAL' X = E ., 'REAL' Y = X , #ERROR# 'SKIP' ., 'SKIP' 'ENS' ., 'BEGIN' 'REAL' X = X ., # ERROR # 'SKIP' 'END' ., 'BEGIN' 'REAL' X = I ., # ERROR # 'SKIP' 'END' ., 'BEGIN' 'REAL' X ., 'REAL' X ., # ERROR # 'SKIP' 'END' ., 'BEGIN' 'REAL' X = E ., 'REAL' X = E # ERROR # 'END' ., 'SKIP' ., 'SKIP' ., 'SKIP' ., 'SKIP' 'END' /* /& ************************************************************************ * * * TESTS ON EXTRESSION * * * ************************************************************************ // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # ARITHMETIC EXPRESSIONS TO TEST OPERATORS # ############################################# MAINPG .. 'BEGIN' 'INT' A1 = 1 ., 'INT' A2 ., 'LONG''INT' A3 = 'LONG' 1 ., 'LONG''INT' A4., 'REAL' A5 = 1.0 ., 'REAL' A6 ., 'LONG''REAL' A7 = 'LONG' 1.0 ., 'LONG''REAL' A8 ., 'BOOL' A9 = 'TRUE' ., 'BOOL' A10 ., 'CHAR' A11 = 'A' ., 'CHAR' A12 ., (/1%3/)'REAL' A13 ., (/1%3,1%0/)'REAL' A14 ., (//)'REAL' A15 = A13 ., (/,/)'REAL' A16 = A14 ., # OPERATORS + - * # #################### # BETWEEN INT # A2 .= 1+1 ., A2 .= 1-1 ., A2 .= 1*1 ., # MONADIC INT # A2 .= +1 ., A2 .= -1 ., # BETWEEN LONGINT # A4.='LONG'1+'LONG' 1 ., A4.='LONG'1-'LONG'1 ., A4.='LONG'1*'LONG'1 ., # MONADIC LONGINT # A4.=+'LONG'1 ., A4.=-'LONG'1 ., # BETWEEN REAL # A6.=1.0+1.0 ., A6.=1.0-1.0 ., A6.=1.0*1.0 ., # MONADIC REAL # A6 .= +1.0 ., A6 .= -1.0 ., #BETWEEN LONG REAL' # A8 .= 'LONG'1.0+'LONG'1.0 ., A8 .= 'LONG'1.0-'LONG'1.0 ., A8 .= 'LONG'1.0*'LONG'1.0 ., # MONADIC LONG REAL # A8.=+'LONG'1.0 ., A8.=-'LONG'1.0 ., # BETWEEN INT REAL # A6.=1+1.0 ., A6.=1-1.0 ., A6.=1*1.0 ., #BETWEEN REAL INT # A6.=1.0+1 ., A6.=1.0-1 ., A6.=1.0*1 ., # BETWEEN LONG INT LONG REAL # A8.='LONG'1+'LONG'1.0 ., A8.='LONG'1-'LONG'1.0 ., A8.='LONG'1*'LONG'1.0 ., # BETWEEN LONG REAL LONG INT # A8.='LONG'1.0+'LONG'1 ., A8.='LONG'1.0-'LONG'1 ., A8.='LONG'1.0*'LONG'1 ., # OPERATOR / # ############## # BETWEEN REAL # A6 .= 1.0/1.0 ., #BETWEEN LONG REAL # A8.='LONG'1.0/'LONG'1.0 ., # BETWEEN INT REAL # A6.=1/1.0 ., #BETWEEN REAL INT # A6.=1.0/1 ., #BETWEEN LONG INT LONG REAL # A8.='LONG'1/'LONG'1.0 ., #BETWEEN LONG REAL LONG INT # A8.='LONG'1.0/'LONG'1 ., # OPERATORS OVER ( .-. ) AND MOD ( .-... ) # ############################################ # BETWEEN INT # A2.=1'OVER'1 ., A2.=1'MOD'1 ., #BETWEEN LONG INT # A4.='LONG'1'OVER''LONG'1 ., A4.='LONG'1'MOD''LONG'1 ., # OPERATOR ** # ############### #BETWEEN INT INT # A2.=1**1 ., # BETWEEN REAL INT # A6 .= 1.0**1 ., #BETWEEN LONG INT INT # A4.='LONG'1**1 ., # BETWEEN LONG REAL INT # A8 .= 'LONG'1.0**1 ., # OPERATORS LWB AND UPB # ######################### # MONADIC # A2 .= 'LWB' A15 ., A2 .= 'UPB' A15 ., # DYADIC # A2.=1'LWB'A16 ., A2.=1'UPB'A16 ., # OPERATORS ENTIER AND ROUND # ############################## # WITH REAL # A2 .= 'ENTIER'1.356 ., A2 .= 'ROUND'1.653 ., # WITH LONG REAL # A4.='ENTIER''LONG'1.2.,A4.='ROUND''LONG'1.6., # OPERATOR SIGN # ################# # WITH INT # A2 .= 'SIGN' 1 ., # WITH LONG INT # A2 .= 'SIGN' 'LONG' 1 ., # WITH REAL # A2 .= 'SIGN' 1.0 ., # WITH LONG REAL # A2 .= 'SIGN' 'LONG' 1.0 ., # OPERATOR LENG # ################# # WITH INT # A4 .= 'LENG' 1 ., # WITH REAL' A8 .= 'LENG' 1.0 ., # OPERATOR ABS # ################ # WITH INT' A2 .= 'ABS' 1 ., # WITH LONG INT # A4 .= 'ABS' 'LONG' 1 ., # WITH REAL # A6 .= 'ABS' 1.0 ., # WITH LONG REAL # A8 .= 'ABS' 'LONG' 1.0 ., # WITH CHAR # A2 .= 'ABS' 'A' ., # OPERATOR REPR # ################# # WITH INT # A12 .= 'REPR' 1 ., # OPERATOR SHORT # ################## # WUTH LONG INT # A2 .= 'SHORT' 'LONG' 1 ., # WUTH LONG REAL # A6 .= 'SHORT' 'LONG' 1.0 ., # OPERATOR ODD # ################ # WITH INT # A10 .= 'ODD' 1 ., # WITH LONG INT # A10 .= 'ODD' 'LONG' 2 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # EXPRESSIONS DE PROCEDURES # M A I N P G .. 'BEGIN' 'PROC' A = ( .. 'SKIP' ) ., 'PROC' B ., 'REF''PROC' C ., 'PROC' D = A ., 'PROC' E = B ., 'PROC' F = C ., 'PROC'('PROC','PROC'('INT')) G = (('PROC' A1 , 'PROC'('INT') A2 ) .. 'SKIP' ) ., 'PROC'('INT' H = (('INT' A1 ) .. 'SKIP' ) ., 'PROC'('INT') I ., 'PROC'('PROC','PROC'('INT')) J ., B .= B ., B .= C ., B .= A ., C .= B ., I .= H ., J .= G ., G ( A , H ) ., G ( B , I ) ., G ( C , H ) 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # THIS IS A RATHER HIGHLY COMPLEX PROGRAM # ########################################### TEST .. 'BEGIN' 'INT' F ., 'PROC'('PROC'('INT','INT','INT'),'INT,'INT,'INT','INT') AA = (('PROC'('INT','INT','INT')X,'INT' Y1,'INT'Y2,'INT'Y3) .. 'BEGIN' 'PROC' ( 'PROC' ('INT','INT','INT'))B = (('PROC'('INT','INT','INT') Z ) .. 'BEGIN' Z ( Y1 , Y2 , Y3 ) 'END' ) ,. B ( X ) 'END' ) ., 'PROC' C = ( .. 'BEGIN' 'REAL' A , B , C ., 'PROC' ( 'INT' , 'INT' , 'INT' ) FOR = ( ( 'INT' FROM , 'INT' BY , 'INT' TO ) .. 'BEGIN' 'FOR' I 'FROM' FROM 'BY' BY 'TO' TO 'DO' ( F .= I ) 'END' ) ., AA ( FOR , A , B , C ) 'END' ) ., C # THIS IS THE ONLY EXECUTABLE STATEMANT OF THIS PROGRAM # 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # ERRORS IN EXPRESSIONS # M .. 'BEGIN' 'PROC'('INT') A ., 'REAL' B ., 'REF''REF''REF''REF''REF''REF''REF''REF''REF''REF''REF' 'REF''REF''REF''REF''REF''REF''REF''REF''REF''REF''REAL' C ., 'REF''REF''REAL' D ., 'PROC'('REAL') E ., 'INT' G ., 'BOOL' H ., # 1 MODE A PRIORI 'NE' MODE A POSTERIORI # ############################################ # 'NE' IN LENGTH # A .= 1.0 ., B .= A ., # DEREFERENCING CANNOT BE MADE # D .= 1.0 ., B .= C ., # SAME LENGTH BUT DIFFERENT MODES # A .= E ., # RHS CANNOT BE COERCED # B .= 'TRUE' ., G .= 1.0 ., H .= 1.0 ., 'BEGIN' 'INT' A ., 'BOOL' B ., (/1%3/)'REAL' C ., (/1%3,1%3/)'REAL' D ., # 2 MODE OF AN OPERAND OF AN OPERATOR IS NOT CONVENIENT # ######################################################### B .= 'TRUE' 'OR' 1.0 ., B .= 1.0 'AND' 'TRUE' ., B .= 'TRUE' 'AND' 1 ., B .= 1.0 'OR' 'FALSE' ., A .= 1 'LWB' 'TRUE' ., A .= 'TRUE' 'LWB' C ., A .= 1 'UPB' 1 ., A .= 1.0 'UPB' C ., A .= 1 'OVER' 1.0 ., A .= 1.0 'OVER' 1 ., A .= 1 'MOD' 1.0 ., A .= 1.0 'MOD' 1 ., A .= 1 + 'TRUE' ., A .= 'TRUE' + 1 ., A .= 1 - 'TRUE' ., A .= 'TRUE' - 1 ., A .= 1 * 'TRUE' ., A .= 'TRUE' * 1 ., A .= 1.0 / 'TRUE' ., A .= 'TRUE' / 1 ., A .= 1.0 ** 1.0 ., A .= 'TRUE' ** 1 ., A .= 1.'EQ' 'TRUE' ., A .= 'TRUE' 'EQ' 1 ., A .= 1 'NE' 'TRUE' ., A .= 'TRUE' 'NE' 1 ., A .= 1.'GT' 'TRUE' ., A .= 'TRUE' 'GT' 1 ., A .= 1 'LT' 'TRUE' ., A .= 'TRUE' 'LT' 1 ., A .= 1 'LE' 'TRUE' ., A .= 'TRUE' 'LE' 1 ., A .= 1 'GE' 'TRUE' ., A .= 'TRUE' 'GE' 1 ., A .= 'UPB' 1 ., A .= 'LWB' 1.0 ., A .= + 'TRUE' ., A .= - 'TRUE' ., A .= 'NOT' 1 ., A .= 'ENTIER' 1 ., A .= 'ROUND' 1 ., A .= 'SHORT' 1 ., A .= 'LENG' 'LONG' 1 ., A .= 'ABS' 'TRUE' ., A .= 'REPR' 'TRUE' ., A .= 'SIGN' 'TRUE' ., A .= 'ODD' 'TRUE' ., 'END' 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # ARITHMETIC EXPRESSIONS WITH COERCIONS # 'PROC' A = ( .. 'BEGIN' 'REAL' A1 = 1.0 ., 'REAL' A2 ., 'REF''REAL' A3 = A2 ., 'REF''REAL' A4 ., 'REF''REF''REAL' A5 ., 'INT' A6 = 1., 'INT' A7 ., 'REF''INT' A8 = A7 ., 'REF''INT' A9 ., 'REF''REF''INT' A10 ., # COERCIONS FROM RIGTH TO LEFT # A2 .= 1 # WIDENING # ., A2 .= A6 # WIDENING # ., A2 .= 1.0 # NO COERCIONS # ., A2 .= A1 # DEFERERENCING # ., A2 .= A3 # DEFERERENCING # ., A2 .= A4 # DEFERERENCING # ., A2 .= A5 # DEFERERENCING # ., A2 .= A7 # WIDENING AND DEREFERENCING # ., A2 .= A8 # WIDENING AND DEREFERENCING # ., A2 .= A9 # WIDENING AND DEREFERENCING # ., A2 .= A10 # WIDENING AND DEREFERENCING # ., # COMPLETE EXPRESSIONS WITH PRIORITIES # A7 .= 1 + 1 + 1 ., A7 .= 1 + 1 - 1 ., A7 .= 1 - 1 + 1 ., A7 .= ((( 1 ))) ., A7 .= 1 + 1 * 1 ** +1 ., A7 .= 1 + 1 * 1 ** 1 - 1 ., A7 .= 1 + (1*1) - (1*1**1) * 1 + 1 + +++ 'ABS' ( 1 - 'SIGN' 1 ) ., A7 .= ++ ( ++ ( ++ 1 - 1 * 1 )) - -+-+1 ., # COERCIONS IN EXPRESSIONS # A7 .= A6+A7+A8+A9+A10 ., A7 .= A6+(+A7) ., A2 .= A8+A3+A9+A4+(+A5)+(+A10) ., A2 .= A6+A7+A8+A9+A10 'END' ) /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # BOOLEAN EXPRESSIONS # PR .. 'BEGIN' 'INT' X = 1 ., 'INT' XX ., 'REAL' Y = 1.0 ., 'REAL' YY ., 'BOOL' A = 'TRUE' ., 'BOOL' B ., 'REF''BOOL' C ., 'REF''REF''BOOL' D ., 'REF''REF''BOOL' E = D ., 'REF''REF''REF''REF''REF''BOOL' M ., 'REF''REF''BOOL' N ., N .= M ., 'IF' A 'THEN' 'SKIP' FI' ., 'IF' B 'THEN' 'SKIP' FI' ., 'IF' C 'THEN' 'SKIP' FI' ., 'IF' D 'THEN' 'SKIP' FI' ., 'IF' E 'THEN' 'SKIP' FI' ., 'IF' 'TRUE' 'THEN' 'SKIP' 'FI' ., 'IF' 'FALSE' 'THEN' 'SKIP' FI' ., 'IF' 'TRUE' 'OR' 'FALSE' 'THEN' 'SKIP' 'ELSE' 'SKIP' 'FI' ., 'IF' 'FALSE' 'AND' 'TRUE' 'THEN' 'SKIP' 'FI' ., 'IF' 'NOT' (( 'NOT' 'NOT' 'TRUE' )) 'THEN' 'SKIP' 'FI' ., B .= 'NOT' A 'OR' A ., B .= A 'AND' 'NOT' A ., B .= 'NOT' ( D 'OR' ( A 'AND' 'TRUE' 'AND' 'FALSE' ) 'OR' 'NOT' ((( C ))) 'OR' B ) ., B .= X 'EQ' X ., B .= X 'LE' XX ., B .= X 'GE' Y ., B .= Y 'LT' X ., B .= (( XX 'LE' YY ) 'OR' 'NOT' ( X 'LT' Y ) 'OR' ( X 'EQ' YY ) 'AND' ( 'TRUE' )) 'AND' ( XX 'EQ' Y ) ., B .= A 'AND' A 'OR' A ., B .= A 'OR' A 'AND' A 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # ERRORS IN EXPRESSIONS # M .. 'BEGIN' 'INT' A ., (/0%0/) 'REAL'C ., (/0%0,0%0/)'REAL' D ., 'REAL' A1 ., 'REAL' A2 = 1.0 ., 'REF''REAL' A3 = A1 ., 'REF''REAL' A4 ., # 3 EXPRESSIONS DO NOT BEGIN WITH A CONVENIENT SYMBOL # ####################################################### A .= (/ 'SKIP' ., A .= 1 + (/ 'SKIP' ., A .= + (/ 'SKIP' ., # 4 IDENTIFIER NOT DEFINED IN EXPRESSION # ############################################ A .= ZZ ., A .= 1+1-MERDE ., # 5 SLICE IDENTIFIER IS NOT ROW OF ... # ########################################## A .= A1(/1/) ., A .= A2(/1/) ., A .= A3(/1/) ., A .= A4(/1/) ., # 6 NO BALANCING IN PARANTHESIS # #################################### A .= (((A ., A .= ( A )) ., A .= ( A + A ., # 7 NO BALANCING IN (/ # ########################## A .= C (/ 1 ., A .= D (/ 1 , 1 ., # 8 MODE IS NOT INTEGER FOR AN INDEXER # ########################################### A .= C(/1.0 /) ., A .= D (/ 1,1.0 /) ., # 9 NUMBER OF INDEXERS IS NOT CORRECT # ########################################## A .= C(/1,1 /) ., A .= D(/1/) ., # 10 NUMBER OF LEVELS OF SUBSCRIPTING 'GT' 7 # ############################################### A .= C(/C(/C(/C(/C(/C(/C(/C(/C(/C(/1/)/)/)/)/)/)/)/)/)/) ., 'SKIP' 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # EXPRESSIONS IN SLICES AND SLICES IN EXPRESSIONS # LOUIS .. 'BEGIN' 'BEGIN' # IN A DECLARATION # 'INT' I1 = 1 ., 'INT' I2 ., 'REF''INT' I3 = I2 ., 'REF''INT' I4 ., (/1%3/)'INT' I5 ., (/1%0,1%0/)'INT' I6 ., (/1+I5(/I5(/2+3/)/)+I6(/I5(/2+3/)+1,I5(/2+I5(/3/)*1/)**1/)%0/) 'REAL' A1 ., (/1+1-1%2+1-1*I5(/1/),1+1%3+4/)'REAL' A2 ., (/I1+I2+I3+I4%I1-I2,1%I1,I1-I2*I3%0,1%+++0/)'REAL' A4 ., 'SKIP' 'END' ., 'BEGIN' # IN A LEFT HAND SIDE OF AN ASSIGNATION # (/1%0/)'REAL'A1 ., (/1%0,1%0/)'REAL' A2 ., 'INT' I1=1 ., 'INT' I2 ., 'REF''INT' I3 = I2 ., 'REF''INT' I4 ., A1(/1/) .= 1.0 ., A1(/'ENTIER' 1.0 + 'ROUND' 1.7/) .= 1.0 ., A2(/1,2/) .= 1.0 ., A2(/I1-I2*I3**I4,+++I1-(+++I2)*+++I3**---I4/) .= 1.0., 'SKIP' 'END' ., 'BEGIN' # SLICES IN EXPRESSIONS # (/1%0/)'INT' A1 ., (/1%0,1%0/)'INT' A2 ., 'REAL' A ., A .= A1(/A1(/1/)-A1(/1/)*A2(/1,A2(/1,2/)/)/) -A2(/A1(/1/),A2(/1,A2(/1,2+A1(/1/)-A1(/1/)/)+3 /)/) 'END' 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # EXPRESSIONS IN FROM-BY-TO AND IN RHS OF DECLARATIONS # RYPENS .. 'BEGIN' 'INT' I1 = 1 ., 'INT' I2 ., 'REF''INT' I3 = I2 ., 'REF''INT' I4 ., 'BOOL' Z1 , Z2 ., (/1%0/)'INT' I5 ., (//) 'INT' I6 = I5 ., 'REF'(//)'INT' I7 ., 'REF'(/,,,/)'INT' I8 ., (/1%0,1%0/)'INT' I9 ., 'REF'(/,/)'INT' II ., (/,/)'INT' I10 = I9 ., 'INT' I11 = 1+'ROUND'3.0*I5(/I10(/1,2/)+3/) **I8(/I5(/I1/),I6(/I2/),I7(/I3/),1972/) -I5(/I1+I2+I3+I4/)**I9(/0,0/)**I7(/3/)** I6(/I1+I5(/1/)/) ., 'BOOL' BOOL = Z1'AND''TRUE''OR''NOT'Z2'OR'(I1'EQ'I2) ., 'FOR' I 'FROM' 'ENTIER'(1+1-1*3-4.0) 'BY' I1**I2*I3**I4 'TO' I5(/I5(/I5(/I5(/I4/)/)/)/) 'DO' ( 'SKIP' ) 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA # EXPRESSIONS # # FURTHER TESTS ON SLICES # M..'BEGIN' 'REAL' A ., 'REF''REAL' B ., (/1%3/)'REF''REAL' A0 ., (/1%3/)'REF''REF''REAL' A1 ., (//)'REF''REAL' A2 = A0 ., (//)'REF''REF''REAL' A3 = A1 ., (/1%3/)'REAL' A4 ., (//)'REAL' A5 = A4 ., A .= A4(/1/)+A0(/1/)+A1(/1/)+A2(/1/)+A3(/1/)+A5(/1/) ., A0(/1/) .= A ., A1(/1/) .= B ., A2(/1/) .= A ., A3(/1/) .= B ., A4(/1/) .= A ., 'SKIP' 'END' /* /& // JOB AL001 **TEST LOUIS // EXEC ALGOLSA M:'BEGIN' 'REAL' X ; 'REF''REAL' XX; <1:3>'REAL' A1 ; 'REF'<>'REAL' A2 = A1 ; 'REF'<>'REAL' A3 ; 'REF''REF'<>'REAL' A4 = A3 ; <1:3>'REF''REAL' A5 ; <>'REF''REAL' A6 = A5 ; <1:3>'REF''REAL' A7 ; <>'REF''REF''REAL' A8 = A7 ; 'BEGUN' 'REAL' Z1 = A<1> ; 'REAL' Z2 = A2<1> ; 'REAL' Z3 = A3<1> ; 'REAL' Z4 = A4 ; 'REAL' Z5 = A5<1> ; 'REAL' Z6 = A6 ; 'REAL' Z7 = A7<1> ; 'REAL' Z8 = A8<1> ; 'SKIP' 'END' ; 'BEGIN' 'REF''REAL' T1 = A1<1> ; 'REF''REAL' T2 = A2<1> ; 'REF''REAL' T3 = A3<1> ; 'REF''REAL' T4 = A4<1> ; 'REF''REAL' T5 = A5<1> ; 'REF''REAL' T6 = A6<1> ; 'REF''REAL' T7 = A7<1> ; 'REF''REAL' T8 = A8<1> ; 'SKIP' 'END' ; A1<1> := 1.0 ; A2<1> := 1.0 ; A3<1> := 1.0 ; A4<1> := 1.0 ; A5<1> := X ; A6<1> := 1.0 ; A7<1> := XX ; A8<1> := X ; 'END' /* /& ************************************************************************ * * * TESTS OF THE ROUTINE "DECLARER" * * * ************************************************************************ // JOB AL001 **TEST LOUIS // OPTION LINK // EXEC ALGOL72 # TESTS FOR TESTING ERRORS IN ROUTINE DECLARER # # THESE TESTS MUST STILL BE DONE WITH REAL ROUTINE EXPRESSION (/ OTHER AND (/A:B, OTHER # MAIN..'BEGIN' 'REAL' X , (/,,,) (/,,,,,,,/)'REAL' (/X., (/X:X) (/X:X,X., (/X:X,X:X) (/X:X,X:X,X:X,X:X,X:X,X:X,X:X,X:X/)'REAL' 'REF'(/) 'REF'(/,,) 'REF'(/,,,,,,,/)'REAL' 'PROC'((/) 'PROC'((/,,) 'PROC'((/,,,,,,,/)'REAL' 'PROC'('INT',(/) 'PROC'('INT',(/,,) 'PROC'('INT',(/,,,,,,,/)'REAL' 'PROC'('REAL','INT'), 'PROC'('REAL')'INT' 'PROC'('REAL')) (//)'PROC', (//)'REAL', 'REF'(//)'PROC', 'REF'(//)'CHAR', 'REF', 'PROC', 'REAL', 'REF''PROC', 'REF''REAL', 'PROC'('PROC'., (//)(/ (/X:X/)(/ 'REF'(//)(/ (//)'REF'( (//)'REF') 'PROC') /* SPL // EXEC // EXEC LNKEDT /& // JOB AL001 **TEST LOUIS // EXEC ALGOL72 // OPTION LINK # TESTS FOR THE DEBUGGING OF ROUTINE 'DECLARER' WE ONLY NEED - TABLES WITH POINTERS - SYNTACTIC ANALYSER - ROUTINES 'DECLARER','STACK','ERROR','DEATH' AND 'SCAN' ROUTINES 'LABEL','STRING','ID-STRING','CLOSE-BL','OPEN-BL', 'MODE-IDENT','ENTERST','APMOID','LOOKUP' AND 'APLAID' MUST BE ONLY A RETURN STATEMENT WE USE SMALL ROUTINES 'EXPRESSION' AND 'BLOCK' AT THE END OF ROUTINE DECLARER , WE PRINT - ACT,ER,I,INTCOD,ID - ST,MOD,STACK(I=MOD,ST),NMPE WE ALSO NEED A DUMP AT THE END OF SYNTACTIC ANALYSIS # MAIN.. 'BEGIN' # 1 ACTUAL DECLARATION # # A WITHOUT BOUNDS # # PRIMITIVE # 'INT' X , 'INT' X , Y , 'INT' X , Y , Z , 'REAL' X , Y , Z , T , U , V , 'LONG''INT' X , 'LONG''REAL' X , 'BOOL' X , 'CHAR' X , # REF + PRIMITIVE # 'REF''INT' X , 'REF''REF''REAL' X , 'REF''REF''REF''REF''LONG''REAL' X , 'REF''REF''REF''REF''REF''BOOL' X , 'REF''REF''REF''REF''REF''REF''CHAR' X , 'REF''REF''PROC' X , # PROC # 'PROC' X , # REF + PROC # 'REF''REF''REF''REF''REF''REF''PROC' X , # PROC WITH ONE PARAMETER WHICH IS PRIMITIVE OR REF + PRIMITIVE # 'PROC'('INT') X , 'PROC'('REF''REF''REF''LONG''INT') X , 'PROC'('BOOL') X , 'PROC'('REF''CHAR') X , 'PROC'('LONG''REAL') X , 'PROC'('REF''REF''REF''BOOL') X , 'PROC'('PROC') X , 'PROC'('REF''REF''PROC') X , # REF + PROC WITH ONE PARAMETER WHICH IS REF * PRIMITIVE # 'REF''PROC'('INT') X , 'REF''REF''PROC'('LONG''REAL') X,Y , 'REF''REF''REF''REF''PROC'('REF''CHAR') X , 'REF''PROC'('PROC') X , 'REF''REF''PROC'('REF''PROC') X , # REF * PROC WITH MORE THAN ONE PARAMETER WHICH ARE REF * PRIMITIVE # 'PROC'('INT','LONG''INT') X , 'PROC'('REAL','REF''LONG''REAL','REF''REF''BOOL') X , 'PROC'('REF''REF''REF''CHAR','INT','LONG''INT','REAL','REAL', 'INT') X , 'REF''PROC'('INT','INT','INT','REF''CHAR') X , 'REF''REF''REF''PROC'('PROC','REF''REF''PROC','INT') X , # REF + ROW OF * REF * PRIMITIVE # 'REF' (//)'INT' X , 'REF'(/ , /)'REAL' X , 'REF''REF'(/ ,,, /) 'LONG''REAL' X , 'REF''REF''REF'(/,,,,,/)'REF''BOOL' X , 'REF'(//)'REF''REF''REF''LONG''INT' X , 'REF''REF'(/,,,,/)'REF''REF''CHAR' X , 'REF'(//)'PROC' X , 'REF'(/,/)'REF''REF''PROC' X , # REF + ROW OF * REF * PROC # 'REF'(//) 'PROC' X , 'REF''REF'(/,/) 'PROC'('REF''INT') X , 'REF''REF''REF'(//)'PROC'('INT','REF''REF''INT') X , 'REF'(//)'REF''PROC'('REF''LONG''REAL','REF''REF''REF''CHAR', 'REF''LONG''LONG''REAL') X , 'REF''REF'(/,,,/)'REF''REF''REF''PROC'('REF''INT','LONG''LONG' 'LONG''INT') X , 'REF'(//)'PROC'('PROC','REF''PROC') X ., LABEL .. 'GOTO' LABEL 'END' /* SPL // EXEC ALGOL72 # REF * PROC WITH ROW OF PARAMETERS # MAIN .. 'BEGIN' 'PROC'((//)'REAL') X , 'REF''PROC'('INT',(//)'LONG''REAL') X , 'REF''REF''PROC'((/,/)'INT',(//)'REF''REF''BOOL') X , 'REF''REF''REF''REF''PROC'('REF'(//)'INT','REF''REF'(//)'REF'' REF''LONG''REAL') X , 'PROC'('REF''REF'(/,,,/)'REF''REF''REF''REAL') X , 'PROC'((//)'REF''REAL',(/,,,/)'REF''CHAR','REF'(/,/)'BOOL') X , 'PROC'((//)'REF''PROC','REF'(/,,/)'PROC','REF''REF'(/,/)'REF''REF'' PROC') X , # IMBRICATED ROWS # 'REF'(/,,,/)'REF'(/,/)'INT' X , 'REF'(//)'REF'(//)'PROC' X , 'REF'(//)'REF''REF'(//)'REF''BOOL' X , 'REF'(/,,,/)'REF'(/,,,/)'REF''REF''REF''PROC' X , 'REF''REF'(//)'REF'(//)'INT' X , 'REF'(//)'REF'(//)'REF'(//)'REF'(/,/)'REF'(//)'LONG''REAL' X , # IMBRICATED PROCS # 'PROC'('PROC'('PROC'('PROC'))) X , 'PROC'('INT','PROC'('REF''REF''PROC','REAL','REF''PROC'( 'REF''LONG''INT','PROC'),'INT')) X , 'PROC'('INT','PROC','PROC'('INT','PROC','REF''REAL','REF''PROC')) X, 'PROC'('INT','PROC'('INT','INT'),'PROC'('INT'),'REAL') X , # MIXED ROWS AND PROCS # 'REF'(//)'PROC'((/,/)'INT','PROC'((//)'PROC'),(/,/)'PROC'('PROC', 'INT'),'REF'(//)'PROC') X , # B WITH BOUNDS # (/ X : X /) 'INT' X , (/ X : X , X : X /) 'REF''LONG''REAL' X , (/ X : X , X : X , X:X /)'REF''REF''PROC' X , (/X:X/)'PROC' X , (/X:X/)'PROC'('INT') X, (/X:X/)'PROC'('INT','REAL','REF''PROC') X , (/X:X,X:X,X:X,X:X/)'REF''REF''PROC'('INT') X , (/X:X/)'REF'(//)'INT' X , (/X:X/)'REF'(/,,,/)'REF''PROC' X , (/X:X/)'REF''PROC'((//)'INT') X , (/X:X/)'PROC'((//)'REF''PROC','REF'(/,,/)'PROC', 'REF''REF''REF''REF'(/,/)'REF''REF''REF''PROC') X , (/X:X/)'REF'(//)'REF'(/,,/)'REF''REF'(//)'LONG''REAL' X , (/X:X/)'PROC'('REF'(//)'PROC',(//)'PROC',(//)'REF''INT') X., LABEL..'GOTO'LABEL'END' /* SPL // EXEC LNKEDT // EXEC /* /& ************************************************************************ *** *** *** *** *** 3. TESTS SECOND PASS *** *** *** ************************************************************************ ************************************************************************ ************************************************************************ * * * TESTS ON LABEL AND APLAID * * * ************************************************************************ // JOB AL001 **TEST LOUIS // EXEC ALGOL722 MAIN .. 'BEGIN' 'INT' A ., LABEL0 .. A .= 1 ., LABEL1 .. A .= 1 ., 'GOTO' LABEL2 ., A .= 1 ., 'GOTO' LABEL3 ., A .= 1 ., 'GOTO' LABEL3 ., A .= 1 ., 'GOTO' LABEL4 ., A .= 1 ., 'GOTO' LABEL4 ., A .= 1 ., 'GOTO' LABEL4 ., A .= 1 ., LABEL2 .. A .= 1 ., LABEL3 .. A .= 1 ., LABEL4 .. A .= 1 ., 'GOTO' LABEL1 ., 'GOTO' EXIT ., 'GOTO' EXIT ., 'SKIP' 'END' /* // EXEC ALGOL722 MAINPG .. 'BEGIN' 'INT' A ., LABEL1 .. 'SKIP' ., 'BEGIN' 'PROC' DCR1 = (.. 'BEGIN' 'GOTO' LABEL1 ., A .= 1 ., 'GOTO' LABEL2 ., A .= 1 ., 'GOTO' LABEL2 ., A .= 1 ., 'SKIP' 'END' ) ., LABEL2 .. A .= 1 ., 'SKIP' 'END' ., LABEL3 .. A .= 1 'END' /* // EXEC ALGOL722 'PROC' DCR1 = ( .. 'BEGIN' 'INT' A ., 'PROC' DCR2 = ( .. 'BEGIN' 'PROC' DCR3 = ( .. 'BEGIN' 'GOTO' LABEL1 ., 'GOTO' LABEL2 ., 'GOTO' LABEL2 'END' ) ., A .= 1 'END' ) ., LABEL1 .. 'SKIP' ., LABEL2 .. A .= 1 ., 'SKIP' 'END' ) /* // EXEC ALGOL722 MAIN .. 'BEGIN' 'PROC' DCR1 = ( .. 'BEGIN' 'PROC' DCR2 = ( .. 'BEGIN' 'GOTO' LABEL2 ., 'GOTO' LABEL3 ., 'GOTO' LABEL3 ., 'SKIP' 'END' ) ., LABEL2 .. 'GOTO' LABEL1 ., LABEL3 .. 'GOTO' LABEL1 ., 'SKIP' 'END' ) ., LABEL1 .. 'GOTO' EXIT 'END' /* /& ************************************************************************ * * * TESTS ON CALL OF ROUTINES AND PROCEDURES * * * ************************************************************************ // JOB AL001 **TEST LOUIS // OPTION XREF,LINK,DUMP // EXEC ALGOL722 # TESTS ON CALL OF ROUTINES # 'PR' 'PROC' ROUTIN , 'PROC' DUMP 'PR' MAINPG .. 'BEGIN' 'PROC' DCR = ( .. ROUTIN ) ., PAGE ., DCR ., PAGE ., DCR ., PAGE ., DUMP ., PAGE 'END' /* // EXEC ALGOL722 'PR' 'PROC' ALGOLR 'PR' 'PROC' ROUTIN = ( .. 'BEGIN' 'INT' A ., 'PROC' DCR = ( .. 'BEGIN' ALGOLR ., ALGOLR 'END' ) ., 'GOTO' LABEL1 ., LABEL2 .. A .= 1 ., A .= 1 ., A .= 1 ., 'GOTO' LABEL3 ., LABEL1 .. DCR ., DCR ., 'GOTO' LABEL2 ., LABEL3 .. DCR 'END' ) /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS // OPTION XREF,LINK,DUMP // UPSI 10000000 // EXEC ALGOL722 # TO TEST CALL OF PROCEDURES OF DIFF. LEVELS # 'PR' 'PROC' ALGOLR 'PR' MAINPG .. 'BEGIN' 'PROC' DCRRRR = ( .. ALGOLR ) ., 'PROC' DCR111 = ( .. 'BEGIN' 'PROC' DCR222 = ( .. ALGOLR ) ., DCR222 ., DCRRRR ., DCR111 'END' ) ., DCRRRR ., DCR111 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS // UPSI 10000000 // EXEC ALGOL722 # TO TEST STATEMENTS DIFFERENT FROM CALLS # MAIN .. 'BEGIN' 'INT' A ., 'PROC' DCR ., 'PROC' DCR1 = ( .. 'SKIP' ) ., 'REF''PROC' DCR2 ., 'REF''REF''PROC' DCR3 = DCR2 ., 'REF''PROC' DCR4 = DCR ., 'PROC'('INT') DCR5 = ( ('INT'A)..'SKIP') ., 'PROC'('INT','INT') DCR6 = ( ('INT'A,B)..'SKIP') ., LABEL1 .. 'GOTO' LABEL1 ., 'GOTO' MAIN ., 'GOTO' LABEL2 ., LABEL2 .. 'SKIP' ., 'IF' 'TRUE''THEN' 'SKIP' 'FI' ., 'IF' 'TRUE' 'THEN' 'GOTO' MAIN ., 'GOTO' MAIN 'FI' ., 'IF' 'TRUE' 'THEN' 'SKIP' 'ELSE' 'SKIP' 'FI' ., 'IF' 'TRUE' 'THEN' 'SKIP' 'ELSE' 'GOTO' MAIN ., 'GOTO' MAIN 'FI' ., 'FOR' I 'FROM' 1 'BY' 1 'TO' 1 'DO' ( 'SKIP' ) ., 'FOR'I'FROM'0'BY'0'TO'0'DO'('GOTO'MAIN.,'GOTO'MAIN)., A .= 1 ., DCR.,DCR1.,DCR2.,DCR3.,DCR4.,DCR5(1).,DCR6(1,0)., 'BEGIN''SKIP''END' 'END' /* // EXEC ALGOL722 # TO TEST CALLS OF PROCEDURES # # BE SURE THAT ALGOLP IS CATALOGUED # 'PR' 'PROC' ( 'INT' ) ALGOLP 'PR' MAINPG .. 'BEGIN' 'INT' A =1 ; 'INT' B ; 'PROC' DCR = ( .. ALGOLP ( A ) ) ., 'PROC'('PROC'('INT'),'PROC','PROC'('INT')) DCR1=(('PROC'('INT')A1,'PROC'A2,'PROC'('INT ')A3):'BEGIN' A1(A);A2;A3(A)'END'); 'PROC'('PROC'('INT'))D1=(('PROC'('INT')D2).. 'BEGIN' D2 ( A ) ., B .= A ., D1(D2)., DCR ., ALGOLP(A) ., PAGE ., DCR1(D2,DCR,ALGOLP) 'END' ) ., B .= 0 ., DCR1(ALGOLP,DCR,ALGOLP) 'END' /* // EXEC ALGOL722 # TO TEST CALL OF ROUTINES # 'PR' 'PROC' ALGOLR , DUMP 'PR' MAIN .. 'BEGIN' 'PROC' DCR = ( .. 'BEGIN' ALGOLR ., PAGE 'END' ) ., 'PROC'('PROC') DCR1 = ( ( 'PROC' DDD) .. 'BEGIN' DDD ., ALGOLR 'END' ) ., DCR1 ( DCR ) ., DUMP 'END' /* /& ************************************************************************ * * * TESTS ON " NO MORE PLACE IN CENTRAL MEMORY " * * * ************************************************************************ // JOB AL001 **TEST LOUIS // OPTION XREF,LINK,DUMP // EXEC ALGOL722 MAINPG .. 'BEGIN' 'PROC' DDDDDD = ( .. DDDDDD) ., DDDDDD 'END' /* // EXEC LNKEDT // UPSI 00000001 // EXEC /& ************************************************************************ * * * TESTS ON DENOTATIONS * * * ************************************************************************ // JOB AL001 **TEST LOUIS 2' // OPTION DUMP // OPTION LINK // EXEC ALGOL72 'PR' 'PROC'('INT','INT','REF''INT') PLUS 'PR' TEST : 'BEGIN' <1:120> 'CHAR' BUFFER ; <1:2>'REAL' A1,A2 ; <1:2,1:2>'INT' B1,B2 ; A1<1>:=1.999 ; A1<2>:=2.999 ; B1<1,1>:=1;B1<1,2>:=2;B1<2,1>:=3;B1<2,2>:=4; A2<2>:=A1<1>;A2<1>:=A1<2>; B2<2,2>:=B1<1,1>;B2<1,2>:=B1<2,1>;B2<2,1>:=B1<1,2>;B2<1,1>:= B1<2,2> ; 'BEGIN' <1:10>'CHAR' A ; 'INT' PTR ; 'REAL' A1,A2; 'LONG''REAL' A3,A4 ; 'INT' A5 ; 'LONG''INT' A6 ; 'BOOL' A7 ; 'CHAR' A8 ; A := "1234567890" ; A1:=13.994E-3 ; A2 := 139 ; A3 := 'LONG'0.9976E+12 ; A4 := 'LONG' 9999 ; A5 := 179 ; A6 := 'LONG'19777 ; A7 := 'TRUE' ; A8 := "?" ; OUTFR(BUFFER,1,20,6,A1) ; OUTFR(BUFFER,21,20,1,A2) ; OUTFLR(BUFFER,41,20,3,A3) ; OUTFLR(BUFFER,61,20,0,A4) ; OUTI(BUFFER,81,5,A5) ; OUTLI(BUFFER,86,10,A6) ; OUTB(BUFFER,97,2,A7) ;BUFFER<100> := A8 ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 10 'DO' ( PLUS(I,101,PTR) ; BUFFER := A ) ; LINE(1,BUFFER,1,120) 'END' ; FILL(BUFFER,1,120,"") ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 2 'DO' ( OUTR(BUFFER,1,20,5,A1) ; OUTR(BUFFER,21,20,5,A2) ; LINE(1,BUFFER,1,40) ) ; FILL(BUFFER,1,120,"") ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 2 'DO' ( 'FOR' J 'FROM' 1 'BY' 1 'TO' 2 'DO' ( OUTI(BUFFER,1,10,B1) ; OUTI(BUFFER,21,10,B2) ; LINE(1,BUFFER,1,40) ) ) ; 'SKIP' 'END' /* INCLUDE RUNTEST // ASSGN SYSRLB,X'192' // EXEC LNKEDT // UPSI 11111111 // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK // OPTION DUMP // EXEC ALGOL72 'PR' 'PROC'('INT','INT','REF''INT') PLUS 'PR' TEST : 'BEGIN' # TEST ON DENOTATIONS # 'INT' PTR ; <1:120>'CHAR' BUFFER ; <1:10,1:10>'CHAR' BUFF ; 'BOOL' A1 = 'TRUE' ; 'BOOL' A11 = 'FALSE' ; 'CHAR' A2 = "+" ; 'INT' A3 = 7777 ; 'LONG''INT' A4 = 'LONG' 13; 'REAL' A5 = 0.888 ; 'LONG''REAL' A6 = 'LONG' 0.033 ; 'REAL' A7 = 999 ; 'LONG''REAL' A8 = 'LONG' 444 ; <>'CHAR' A9 = "ROW OF CHAR" ; OUTB(BUFFER,1,10,A1) ; OUTB(BUFFER,11,10,A11) ; BUFFER<30> := A2 ; OUTI(BUFFER,31,10,A3) ; OUTLI(BUFFER,41,10,A4) ; OUTR(BUFFER,51,10,3,A5) ; OUTLR(BUFFER,61,10,2,A6) ; OUTFR(BUFFER,71,10,0,A7) ; OUTFLR(BUFFER,81,10,1,A8) ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 11 'DO' ( PLUS(90,I,PTR) ; BUFFER := A9 ) ; LINE(1,BUFFER,1,120) ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 120 'DO' ( BUFFER := " " ) ; OUTB(BUFFER,1,10,'TRUE') ; OUTB(BUFFER,11,10,'FALSE') ; BUFFER<30> := """" ; OUTI(BUFFER,31,10,34) ; OUTLI(BUFFER,41,10,'LONG' 22) ; OUTR(BUFFER,51,10,3,2.22) ; OUTLR(BUFFER,61,10,2,'LONG' 1.1) ; OUTFR(BUFFER,71,10,1,1.7) ; OUTFLR(BUFFER,81,10,2,'LONG' 0.9) ; FILL(BUFFER,91,11,"ROW OF CHAR") ; OUTFR(BUFFER,105,5,1,1) ; OUTFLR(BUFFER,110,5,1,'LONG' 2) ; LINE(1,BUFFER,1,120) 'END' /* INCLUDE RUNTEST // ASSGN SYSRLB,X'192' // EXEC LNKEDT // UPSI 11111111 // EXEC /& // JOB AL001 **TEST LOUIS // EXEC ALGOL72 TEST : 'BEGIN' <>'CHAR' A = "0123456789" ; <>'CHAR' B = "1234567890" ; <>'CHAR' C = "2345678901" ; <1:10>'CHAR' D ; 'PROC'(<>'CHAR',<>'CHAR',<>'CHAR') AA = ( ( <>'CHAR' A1,A2,A3) : 'BEGIN' <1:10>'CHAR' BUFFER ; BUFFER := A1 ; LINE(1,BUFFER,1,10) ; BUFFER := A2 ; LINE(1,BUFFER,1,10) ; BUFFER := A3 ; LINE(1,BUFFER,1,10) ; BUFFER := A ; LINE(1,BUFFER,1,10) ; BUFFER := D ; LINE(1,BUFFER,1,10) ; 'SKIP' 'END' ) ; D := "3456789012" ; AA(A,B,C) ; AA(D,"4567890123","5678901234") ; AA("+_)[\!>:;^","?""=](#,$$K",".-@%*'CHAR' BUFFER ; # NO COERCIONS # 'INT' A1=1 ; 'INT' A2 = A1 ; 'REAL' A3 ; 'REF''REAL' A4 = A3 ; 'REF''REAL' A5 = A4 ; A3 := 677.89E-2 ; OUTI(BUFFER,1,10,A1) ; OUTI(BUFFER,11,10,A2) ; OUTR(BUFFER,21,20,5,A3) ; OUTR(BUFFER,41,20,5,A4) ; OUTR(BUFFER,61,20,5,A5) ; LINE(1,BUFFER,1,80) ; FILL(BUFFER,1,120,"") ; 'BEGIN' <1:5>'LONG''REAL' A ; <>'LONG''REAL' B = A ; <>'LONG''REAL' C = B ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 5 'DO' ( A := 'LONG'0.699E+4 ; OUTLR(BUFFER,1,20,3,A) ; LINE(1,BUFFER,1,20) ) ., 'BEGIN' <>'LONG''REAL' B = A ; <>'LONG''REAL' C = B ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 5 'DO' (OUTLR(BUFFER,1,20,3,B); OUTLR(BUFFER,21,20,3,C); LINE(1,BUFFER,1,40) ) 'END' ; 'SKIP' 'END' ; # DEREF # 'BEGIN' 'CHAR' A = "?" ; 'CHAR' B ; B := "#" ; 'BEGIN' 'REF''CHAR' C = B ; 'CHAR' D = B ; 'CHAR' E = C ; 'REF''CHAR' F ; 'REF''REF''CHAR'G=F; F := B ; 'BEGIN' 'CHAR' T = F ; 'CHAR' U = G ; PUTC(A);PUTC(B);PUTC(C);PUTC(D);PUTC(E);PUTC(F); PUTC(G);PUTC(T);PUTC(U) 'END' 'END' 'END' ; FILL(BUFFER,1,120,"") ; # DEREF AND/OR WIDEN # 'BEGIN' 'INT' A1=999;'REAL' A2=A1;'LONG''INT' A3 = 'LONG'9999; 'LONG''REAL' A4 = A3 ; 'INT' B ; 'REF''INT' C ; B := 9 ; C := B ; 'BEGIN' 'REF''INT' D = B ; 'REF''REF''INT' E = C ; 'REAL' F = B ; 'REAL' G = C ; 'REAL' H = D ; 'REAL' I = E ; OUTR(BUFFER,1,10,1,F) ; OUTR(BUFFER,11,10,1,G) ; OUTR(BUFFER,21,10,1,H);OUTR(BUFFER,31,10,1,I) ; OUTR(BUFFER,41,10,1,A2) ; OUTLR(BUFFER,51,10,1,A4) ; LINE(1,BUFFER,1,60) 'END' 'END' 'END' /* // EXEC ALGOL72 'PROC'('CHAR') PUTC = (('CHAR' A ) : 'BEGIN' <1:10>'CHAR' BUFFER ; FILL(BUFFER,1,10,"ZZZZZZZZZZ") ; BUFFER<1>:=A ; LINE(1,BUFFER,1,10) 'END' ) /* INCLUDE RUNTEST // ASSGN SYSRLB,X'192' // EXEC LNKEDT // UPSI 11111111 // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION DUMP // OPTION LINK // EXEC ALGOL72 # IDENTIFIERS IN DCC # # NOT THE SAME LEVEL # TEST : 'BEGIN' 'REAL' A1 ; <1:120>'CHAR' BUFFER ; 'PROC' A = ( : 'BEGIN' 'REAL' A2 = A1 ; 'PROC' B = ( : 'BEGIN' 'REAL' A3 = A1 ; 'REAL' A4 = A2 ; 'REAL' A5 = A4 ; OUTR(BUFFER,1,20,5,A1) ; OUTR(BUFFER,21,20,5,A2) ; OUTR(BUFFER,41,20,5,A3) ; OUTR(BUFFER,61,20,5,A4) ; OUTR(BUFFER,81,20,5,A5) ; LINE(1,BUFFER,1,100) 'END' ) ; B ; FILL(BUFFER,1,120,"") ; OUTR(BUFFER,1,20,5,A1) ; OUTR(BUFFER,21,20,5,A2) ; LINE(1,BUFFER,1,40) 'END' ) ; A1 := 97483E-4 ; A ; FILL(BUFFER,1,120,"") ; OUTR(BUFFER,1,20,5,A1) ; LINE(1,BUFFER,1,20) 'END' /* INCLUDE RUNTEST // ASSGN SYSRLB,X'192' // EXEC LNKEDT // UPSI 11111111 // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION DUMP // OPTION LINK // EXEC ALGOL72 # IDENTIFIERS IN CALLS,IF,FOR # 'PR' 'PROC' DUMP 'PR' TEST : 'BEGIN' 'INT' A = 1 ; 'INT' B ; 'REF''INT' C ; <1:120>'CHAR' BUFFER ; 'INT' T1 ; 'REAL' K1=873 ; 'REAL' K2 , K3 ; 'REF''REAL' K4 ; 'PROC'('INT','INT','INT','REAL','REAL','REAL') AA = (('INT' A1,A2,A3,'REAL' B1,B2,B3) : 'BEGIN' 'FOR' I 'FROM' A 'BY' B 'TO' C 'DO' ( OUTI(BUFFER,1,10,I) ; OUTI(BUFFER,11,10,A) ; OUTI(BUFFER,21,10,B) ; OUTI(BUFFER,31,10,C) ; LINE(1,BUFFER,1,40) ) ; OUTI(BUFFER,1,10,A1) ; OUTI(BUFFER,11,10,A2) ; OUTI(BUFFER,21,10,A3) ; OUTFR(BUFFER,31,20,5,B1) ; OUTFR(BUFFER,51,20,5,B2) ; OUTFR(BUFFER,71,20,5,B3) ; FILL(BUFFER,100,20,"THE PARAMETERS") ; LINE(1,BUFFER,1,120) 'END' ) ; 'BOOL' D = 'TRUE' ; 'BOOL' E ; 'REF''BOOL' F ; B := 2 ; T1 := 7 ; C := T1 ; K2 := 279.47E-2 ; K3 := 21E+3 ; K4 := K3 ; AA(A,B,C,K1,K2,K4) ; E := 'FALSE' ; F .= E ., 'IF' D 'THEN' AA(1,1,2,4E0,50,39.27E2) 'ELSE' DUMP 'FI' ; 'IF' E 'THEN' DUMP 'ELSE' AA(A,B,C,K3,K2,K1) ; E := 'TRUE' 'FI' ; 'IF' E 'THEN' 'SKIP' 'ELSE' DUMP 'FI' ; 'IF' F 'THEN' 'SKIP' 'ELSE' DUMP 'FI' 'END' /* INCLUDE RUNTEST // ASSGN SYSRLB,X'192' // EXEC LNKEDT // UPSI 11111111 // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL72 # IDENTIFIERS IN DCM AND IN SLICES # 'PR' 'PROC'('INT','INT','REF''INT') PLUS 'PR' TEST : 'BEGIN' <1:120>'CHAR' BUFFER ; 'INT' A1 = 193 ; 'INT' A2 = 201 ; 'CHAR' A3 ; 'INT' A4,A5 ; 'REF''INT' A6,A7 ; 'INT' PTR,PTR1,PTR2 ; 'FOR' I 'FROM' A1 'BY' 1 'TO' A2 'DO' ( A3 := """" ) ; A4 := 5 ; A5 := 10 ; A6 := A4 ; A7 := A5 ; 'BEGIN' 'INT' A , B ; 'FOR' I 'FROM' A4 'BY' 1 'TO' A5 'DO' ('FOR' J 'FROM' A6 'BY' 1 'TO' A7 'DO' ( PLUS(I,J,PTR) ; PTR1 := I ; PTR2 := J ; A:=PTR; OUTI(BUFFER,1,10,A) ; LINE(1,BUFFER, 1,10) ; FILL(BUFFER,1,10,"") ; B:=A ; OUTI(BUFFER,1,10,B) ; LINE(1,BUFFER,1,10) ; FILL(BUFFER,1,10,"") )) ; 'SKIP' 'END' ; LINE(1,A3,A1,9) 'END' /* INCLUDE RUNTEST // ASSGN SYSRLB,X'192' // EXEC LNKEDT // UPSI 11111111 // EXEC /& ************************************************************************ * * * TESTS ON ASSIGNATIONS * * * ************************************************************************ // JOB AL001 **TEST LOUIS 3' // OPTION LINK // EXEC ALGOL72 'PR' 'PROC'('REAL','REAL','REAL','REAL') PR4 , 'PROC'('REAL','REAL','REAL') PR3 , 'PROC'('REAL','REAL') PR2 'PR' # TESTS ON ASSIGNATIONS LEVELS # TEST : 'BEGIN' 'REAL' X1L0=6.74 ; 'REAL' X2L0 ; <1:20>'CHAR' BUFFER ; 'PROC' L1 = ( : 'BEGIN' 'REAL' X1L1 = 7.99 ; 'REAL' X2L1 ; 'PROC' L2 = ( : 'BEGIN' 'REAL' X1L2 = 4.97 ; 'REAL' X2L2 ; 'PROC' L3 = ( : 'BEGIN' 'REAL' X1L3 = 4.33 ; 'REAL' X2L3 ; X2L3:=X1L0; X2L2:=X1L0; X2L1:=X1L0; X2L0:=X1L0; PR4(X2L3,X2L2,X2L1,X2L0); X2L3:=X1L1; X2L2:=X1L1; X2L1:=X1L1; X2L0:=X1L1; PR4(X2L3,X2L2,X2L1,X2L0); X2L3:=X1L2; X2L2:=X1L2; X2L1:=X1L2; X2L0:=X1L2; PR4(X2L3,X2L2,X2L1,X2L0); X2L3:=X1L3; X2L2:=X1L3; X2L1:=X1L3; X2L0:=X1L3; PR4(X2L3,X2L2,X2L1,X2L0) 'END' ) ; L3 ; X2L2:=X1L0; X2L1:=X1L0; X2L0:=X1L0; PR3(X2L2,X2L1,X2L0) ; X2L2:=X1L1; X2L1:=X1L1; X2L0:=X1L1; PR3(X2L2,X2L1,X2L0) ; X2L2:=X1L2; X2L1:=X1L2; X2L0:=X1L2; PR3(X2L2,X2L1,X2L0) 'END' ) ; L2 ; X2L1:=X1L0; X2L0:=X1L0; PR2(X2L1,X2L0) ; X2L1:=X1L1; X2L0:=X1L1; PR2(X2L1,X2L0) 'END' ) ; L1 ; X2L0:=X1L0 ; OUTFR(BUFFER,1,20,2,X2L0) ; LINE(1,BUFFER,1,20) 'END' /* // EXEC ALGOL72 'PROC'('REAL','REAL') PR2 = (('REAL' X , Y ) : 'BEGIN' <1:40>'CHAR' BUFFER ; OUTFR(BUFFER,1,20,2,X) ; OUTFR(BUFFER,21,20,3,Y) ; LINE(1,BUFFER,1,40) 'END' ) /* // EXEC ALGOL72 'PROC'('REAL','REAL','REAL') PR3 = (('REAL' X , Y , Z ) : 'BEGIN' <1:60>'CHAR' BUFFER ; OUTR(BUFFER,1,20,2,X) ; OUTR(BUFFER,21,20,3,Y) ; OUTR(BUFFER,41,20,4,Z) ; LINE(1,BUFFER,1,60) 'END' ) /* // EXEC ALGOL72 'PROC'('REAL','REAL','REAL','REAL') PR4 = (('REAL' X , Y , Z , T ) : 'BEGIN' <1:80>'CHAR' BUFFER ; OUTFR(BUFFER,1,20,2,X) ; OUTFR(BUFFER,21,20,3,Y) ; OUTFR(BUFFER,41,20,3,Z) ; OUTFR(BUFFER,61,20,5,T) ; LINE(1,BUFFER,1,80) 'END' ) /* INCLUDE RUNTEST // ASSGN SYSRLB,X'192' // EXEC LNKEDT // UPSI 11111111 // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK // EXEC ALGOL72 # IDENTIFIERS ASSIGNATIONS OF MATRICES # 'PR' 'PROC'('INT','INT','REF''INT') PLUS,MINUS 'PR' TEST:'BEGIN' <1:120>'CHAR' BUFFER ; <1:10>'REAL' A , B , C , D ;'REF' <>'REAL' E = A ; 'INT' I1= 100 ; 'INT' I2=102;'INT'I3=93;'INT'I4=95; 'INT' PTR; 'FOR' I 'FROM' 'LWB' A 'BY' 1 'TO' 'UPB' A 'DO' ( A:=I;C:=-A ) ; B := E ; D := C ; 'BEGIN' 'CHAR' Z1,Z2 ;'REF' <,>'CHAR' Z3=Z2 ; 'FOR' I 'FROM' 1'LWB'Z1'BY' 1 'TO' 'UPB'Z2 'DO' ('FOR' J 'FROM' 2'LWB'Z1 'BY' 1 'TO' 2'UPB'Z2 'DO' ( PLUS(I,J,PTR) ; Z1:='REPR'PTR) ) ; Z2:=Z1 ; 'FOR' I 'FROM' 100 'BY' 1 'TO' 102 'DO' ( 'FOR' J 'FROM' 93 'BY' 1 'TO' 95 'DO' ( BUFFER<1>:=Z1;BUFFER<2>:=Z2 ; BUFFER<3>:=Z3 ; LINE(1,BUFFER,1,3) )) 'END' ; 'BEGIN' <1:3>'REF'<>'CHAR' T ; <1:2>'CHAR' T1 ; <1:3>'CHAR' T2 ; <1:4>'CHAR' T3 ; T1:="AB" ; T2:="CDE" ; T3:="1234" ; T<1>:=T1 ; T<2>:=T2 ; T<3>:=T3 ; 'FOR' I 'FROM' 2 'BY' 1 'TO' 4 'DO' ( 'BEGIN' <1:I>'CHAR' BUFFER ; MINUS(I,1,PTR) ; BUFFER := T ; LINE(1,BUFFER,1,I) 'END' ) 'END' ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 10 'DO' ( OUTFR(BUFFER,1,20,0,A ) ; OUTFR(BUFFER,21,20,0,B) ; OUTFR(BUFFER,41,20,0,C ) ; OUTFR(BUFFER,61,20,0,D) ; OUTFR(BUFFER,81,20,0,E) ; LINE(1,BUFFER,1,100) ) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL72 # IDENTIFIERS ASSIGNATIONS COERCIONS # ALALAL:'BEGIN' <1:120>'CHAR' BUFFER ; 'PROC'('REAL','REAL','REAL','REAL') PRINT = (('REAL' X1,X2,X3,X4) : 'BEGIN' OUTR(BUFFER,1,20,5,X1) ; OUTR(BUFFER,21,20,5,X2) ; OUTR(BUFFER,41,20,5,X3) ; OUTR(BUFFER,61,20,5,X4) ; LINE(1,BUFFER,1,80) 'END' ) ; #NO COERCIONS# 'BEGIN' 'REAL' X1 = 3 ; 'REAL' Y1,Y2 ; 'LONG''REAL'X2='LONG'3.7 ; 'LONG''REAL' Y3,Y4 ; 'LONG''REAL'X3='LONG'9 ; 'LONG''INT' X ; 'LONG''INT' Y = -'LONG'4 ; 'CHAR' A = 'REPR'240 ; 'INT' B ; 'INT' B1 ; Y1 := -X1 ; Y2 := X1 ; Y3 := -X3 ; Y4 := X2 ; X := Y ; B := 'ABS' A ; B1:=32000 ; OUTI(BUFFER,1,10,B) ; OUTFR(BUFFER,11,20,5,Y1) ; OUTFR(BUFFER,31,20,5,Y2) ; OUTFLR(BUFFER,51,20,5,Y3) ; OUTFLR(BUFFER,71,20,5,Y4) ; OUTI(BUFFER,91,10,B1) ; OUTLI(BUFFER,101,10,X) ; LINE(1,BUFFER,1,120) 'END' ., # DEREF # 'BEGIN' 'REAL' A1 = 1.0 ; 'REAL' A2 ; 'REF''REAL' A3 ; 'REF''REF''REAL' A4 ; 'REAL' X1,Y1,Z1,T1 ; A2 := A1 ; A3 := A2 ; A4 := A3 ; X1 := A1 ; Y1 := A2 ; Z1 := A3 ; T1 := A4 ; PRINT(X1,Y1,Z1,T1) ; 'SKIP' 'END' ; #WIDEN# 'BEGIN' 'INT' X = 0000000000000000000000000000000000000000 1; 'LONG''INT' Y = ##'LONG'##000##000##2## ; 'REAL' Z ; 'LONG''REAL' T ; Z := X ; T := Y ; PRINT(X,Z,X,Z) ; OUTLI(BUFFER,1,20,Y);OUTLR(BUFFER,21,20,5,T);LINE(1,BUFFER,1,40 ); 'SKIP' 'END' ; #WIDEN AND DEREF# 'BEGIN' 'INT' X1 ; 'REF''INT' X2 ; 'REF''REF''INT' X3 ; 'REAL' Y1,Y2,Y3 ; 'INT' X = 10 ; X1 := X ; X2 := X1 ; X3 := X2 ; Y1 := X1 ; Y2 :=X2;Y3:=X3; PRINT(Y1,Y2,Y3,X3) 'END' 'END' /* // EXEC LNKEDT // EXEC /& ************************************************************************ * * * TESTS ON PROCEDURES * * * ************************************************************************ // JOB AL001 **TEST LOUIS 1' // OPTION LINK // EXEC ALGOL73 'PR' 'PROC' DCS 'PR' TEST : 'BEGIN' DCS 'END' /* // EXEC ALGOL73 'PR' 'PROC' DUMP 'PR' 'PROC' ALGOLR = ( : DUMP ) /* // EXEC ALGOL73 'PR' 'PROC' ALGOLR, 'PROC' DUMP 'PR' 'PROC' DCS = ( .. 'BEGIN' 'PROC' A = ( : 'BEGIN' <1:80>'CHAR' BUFFER ; OUTI(BUFFER,1,1,1) ; WRITE(1,BUFFER,1,1) 'END'); 'PROC' D ., D := DCS ; DUMP ; D := ALGOLR ; D ; D := PAGE ; D ; D := A ; D 'END' ) /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // OPTION DUMP // EXEC /& // JOB AL001 **TEST LOUIS 1' // OPTION LINK // EXEC ALGOL73 'PR' 'PROC'('REF''INT','PROC') DCR1 'PR' MAIN:'BEGIN' 'INT' I ; 'PROC'B=(:'BEGIN'<1:20>'CHAR' BUFFER ; OUTI(BUFFER,1,5,I) ; WRITE(1,BUFFER,1,5) 'END' ); I:=0 ; DCR1(I,B) ; DCR1(I,PAGE) 'END' /* // EXEC ALGOL73 'PROC'('REF''INT','PROC') DCR1 = (('REF''INT' A ,'PROC'B) : 'IF' A 'EQ' 0 'THEN' B ; A :=1; DCR1(A,B) 'ELSE' B 'FI' ) /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // OPTION DUMP // EXEC /& // JOB AL001 **TEST LOUIS 1' // OPTION LINK // EXEC ALGOL73 'PR' 'PROC'('REF''INT','PROC') DCR1 'PR' MAIN:'BEGIN' 'INT' I ; 'PROC'B=(:'BEGIN'<1:20>'CHAR' BUFFER ; OUTI(BUFFER,1,5,I) ; WRITE(1,BUFFER,1,5) 'END' ); I := 0 ; DCR1(I,B) ; DCR1(I,PAGE) 'END' /* // EXEC ALGOL73 'PROC'('REF''INT','PROC') DCR1 = ( ('REF''INT' Z,'PROC' AA ) : 'BEGIN' 'PROC'('REF''INT','PROC') A = DCR1 ; 'PROC' C = PAGE ; 'PROC' D = A A ; 'IF' Z 'EQ' 0 'THEN' Z := 1 ; A(Z,AA) 'ELSE' AA 'FI' ; 'IF' Z 'EQ' 1 'THEN' Z := 2 ; DCR1(Z,D) 'ELSE' D 'FI' 'END' ) /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // OPTION DUMP // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK // OPTION DUMP // EXEC ALGOL72 # EXPRESSIONS WITH ROUTINES IN DCC # 'PR' 'PROC' ALGOLR 'PR' MAIN:'BEGIN' <-100:-+90>'CHAR' BUFFER ; 'INT' I ; 'PROC' A = ( : 'BEGIN' OUTI(BUFFER,-100,5,I); LINE(1,BUFFER,-100,------5------------0) ; I := I+1 'END' ) ; 'PROC' B = A ., 'PROC' C = ALGOLR ., 'PROC' D = PAGE ., 'PROC'('PROC') E = ( ( 'PROC' F ) : 'BEGIN' 'PROC' A1 = A ., 'PROC' AA = ( : A ) ; 'PROC' A2 = ALGOLR ., 'PROC' A4 = PAGE ., 'PROC' A6 = F ., 'PROC' A5 = AA ., A1;AA;A2;A4;A6;A5;ALGOLR;A;B;C;D 'END' ) ; I := 193 ; A;B;C;D;ALGOLR;PAGE;E(C);E(A);E(B);E(ALGOLR) 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUOS 2' // OPTION LINK // EXEC ALGOL73 # ASSIGNATIONS OF ROUTINES # 'PR' 'PROC' ALGOLR 'PR' MAIN .. 'BEGIN' <1:80>'CHAR' BUFFER ; 'INT' I ; 'PROC' A ., 'PROC' B =(: 'BEGIN' OUTI(BUFFER,5*(I-1)+1,5,I) ; WRITE(1,BUFFER,5*(I-1)+1,5) ; I := I+1 'END' ) ; 'PROC'('REF''PROC','PROC') C = (('REF''PROC'D,'PROC'E).. 'BEGIN' D .= E .,D ; D .= ALGOLR ., D ; D .= PAGE .,D; A .= B .,A; A .= E ;A 'END' ) ., I := 193 ; I := 1 ; A:=B;A;A:=ALGOLR;A;A:=PAGE;A; C(A,B);A; C(A,ALGOLR) ; A;C(A,PAGE);A 'END' /* // EXEC ALGOL73 'PROC' ALGOLR=(:SKIP(3) ) /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // OPTION DUMP // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK // EXEC ALGOL73 # EXPRESSIONS OF PROCEDURES AS PARAMETERS # MAIN : 'BEGIN' 'INT' I ; (/1:80/)'CHAR'BUFFER ., <1:10>'REF'<>'CHAR' A ; <1:13>'CHAR' B1,B2,B3,B4,B5,B6,B7,B8,B9,B10; 'REF'<>'CHAR' A1,A2,A3,A4,A5,A6,A7,A8,A9,A10; 'PROC' DCR = ( : 'BEGIN' TIME(A) ; I:=I+1'END' ) ; 'PROC' ( 'PROC' ) DCR1 = (( 'PROC' A1 ) : A1) ; A1:=B1;A2:=B2;A3:=B3;A4:=B4;A5:=B5;A6:=B6;A7:=B7;A8:=B8; A9:=B9;A10:=B10; A<1>:=A1;A<2>:=A2;A<3>:=A3;A<4>:=A4;A<5>:=A5;A<6>:=A6; A<7>:=A7;A<8>:=A8;A<9>:=A9;A<10>:=A10; I:=1 ; DCR1(DCR) ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 3 'DO' ( DCR1(DCR) ) ; TAKE(BUFFER,1,1,PAGE) ., TAKE(BUFFER,1,1,DCR) ., TAKE(BUFFER,1,1,PAGE) ., TAKE(BUFFER,1,1,PAGE) ., 'FOR' J 'FROM' 1 'BY' 1 'TO' I-1 'DO' ( FILL(BUFFER,(J-1)*13+1,13,A) ; I:=J) ; WRITE(1,BUFFER,1,I*13) 'END' /* // EXEC ALGOL73 'PROC'('REF'<>'CHAR','INT','INT','PROC') TAKE = (('REF'<>'CHAR' BUFFER , 'INT' I,J,'PROC' EOF ) : 'BEGIN' READ(BUFFER,1,2) ; 'IF' 'ABS'BUFFER<1>'EQ' 'ABS'"/" 'AND' 'ABS'BUFFER<2>'EQ' 'ABS'"*" 'THEN' EOF 'FI' 'END' ) /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // OPTION DUMP // EXEC // TUTUUUUUUT /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION DUMP // OPTION LINK // EXEC ALGOL73 # EXPRESSIONS OF PROCEDURES WITH DEREFERENCING # MAIN:'BEGIN' 'PROC' A ; <1:2>'CHAR' BUFFER ; 'PROC' DCR0 = ( : WRITE(1,BUFFER,1,1) ); 'PROC' DCR00 = ( : WRITE(1,BUFFER,2,1) ) ; 'PROC' DCR ; 'REF''PROC' DCR1 ; 'REF''REF''PROC' DCR2 ; 'PROC' DCR3 = DCR0 ; DCR := DCR0 ; 'BEGIN' 'REF''PROC' DCR4 = DCR ; 'REF''REF''PROC' DCR5 = DCR1 ; DCR1 := DCR ; DCR2 := DCR1 ; 'BEGIN' 'REF''REF''REF''PROC' DCR6 = DCR2 ., 'PROC' DCR7 = DCR0 ; 'PROC' DCR71= DCR ; 'PROC' DCR72= DCR1 ; 'PROC' DCR73= DCR2 ; 'PROC' DCR74= DCR3 ; 'PROC' DCR75= DCR4 ; 'PROC' DCR76= DCR5 ; 'PROC' DCR77= DCR6 ; BUFFER<1>:="?" ; DCR0;DCR;DCR1;DCR2;DCR3;DCR4;DCR5;DCR6; DCR7;DCR71;DCR72;DCR73;DCR74;DCR75;DCR76;DCR77;PAGE; BUFFER<2>:="#"; DCR .= DCR00; DCR; DCR .= DCR ; DCR; DCR .= DCR1 ; DCR; DCR .= DCR2 ; DCR; DCR .= DCR3 ; DCR; DCR .= DCR4 ; DCR; DCR .= DCR5 ; DCR; DCR .= DCR6 ; DCR; DCR .= DCR7 ; DCR; PAGE ; A := DCR00 ; A ; DCR := DCR00 ; A := DCR ; A ; A := DCR1 ; A ; A := DCR2 ; A ; A := DCR3 ; A ; A := DCR4 ; A ; A := DCR5 ; A ; A := DCR6 ; A ; A := DCR7 ; A ; PAGE ; 'SKIP' 'END' 'END' 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& ************************************************************************ * * * TESTS ON OPERATORS * * * ************************************************************************ // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL72 # MONADIC MINUS # 'PR' 'PROC'('INT') PUTI,'PROC'('LONG''INT') PUTLI , 'PROC'('REAL') PUTR , 'PROC'('LONG''REAL') PUTLR 'PR' TEST : 'BEGIN' <1:120>'CHAR' BUFFER ; 'INT' X0,X1,X2,X3; 'LONG''INT' Z0,Z1,Z2,Z3 ; 'REAL' Y0,Y1,Y2,Y3 ; 'LONG''REAL' T0,T1,T2,T3 ; 'INT' X4 = 10 ; 'LONG''INT' Z4 = 'LONG'10 ; 'REAL' Y4 = X4 ; 'LONG''REAL' T4 = Z4 ; Z0 := --'LONG'38 ; Z1 := -'LONG'65536 ; Z2 := -Z1 ; X0:=--79 ; X1 := -1 ; X2 := -X1 ; X3 := -'SHORT'Z2 #0# ; T0 := --'LONG'8.7 ; T1 := -'LONG'79.99E-2 ; T2 := -T1 ; Y0 := --6.7E-4 ; Y1 := -39.47E-2 ; Y2 := -Y1 ;Y3 := -'SHORT'T2; PUTI(X0) ; PUTI(X1) ; PUTI(X2) ; PUTI(X3) ; PUTI(X4) ; PUTLI(Z0) ; PUTLI(Z1) ; PUTLI(Z2) ; PUTLI(Z4) ; PUTR(Y0) ; PUTR(Y1) ; PUTR(Y2) ; PUTR(Y3) ; PUTR(Y4) ; PUTLR(T0) ; PUTLR(T1) ; PUTLR(T2) ; PUTLR(T4) 'END' /* INCLUDE RUNTEST // ASSGN SYSRLB,X'192' // EXEC LNKEDT // UPSI 11111111 // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL72 # REPR # TEST: 'BEGIN' <1:5>'CHAR' BUFFER ; 'INT' B1 ; 'LONG''INT' B2 ; 'INT' B0 = 194 ; BUFFER<1>:='REPR'193 ; BUFFER<2>:='REPR'B0 ; B1:=195 ; BUFFER<3>:='REPR'B1 ; BUFFER<4>:='REPR'(196+0) ; B2:='LONG'65733 ; BUFFER<5>:='REPR''SHORT'B2 ; LINE(1,BUFFER,1,5) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL72 # LENG # 'PR' 'PROC'( 'LONG''INT') PUTLI,'PROC'('LONG''REAL') PUTLR 'PR' TEST : 'BEGIN' PUTLI('LENG'179) ; PUTLR('LENG'139.0) ; PUTLR('LENG'-179.82) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL72 # ABS # 'PR' 'PROC'('REAL') PUTR 'PR' TEST : 'BEGIN' <1:10>'CHAR' BUFFER ; 'LONG''INT' B ; <1:2>'CHAR' A ; B := 'LONG'197; A<2>:="A" ; BUFFER<1>:='REPR''ABS''REPR'198 ; BUFFER<2>:='REPR''ABS'"A" ; BUFFER<3>:='REPR''ABS'A<2> ; BUFFER<4>:='REPR''ABS''REPR''SHORT ' B ; BUFFER<5>:='REPR''ABS''REPR''SHORT'-'LONG'6 ; LINE(1,BUFFER,1,5) ; PUTR('ABS'19) ; PUTR('ABS'-19) ; PUTR('ABS'0) ; PUTR('SHORT''ABS''LONG'32) ; PUTR('SHORT''ABS'-'LONG'43) ; PUTR('SHORT''ABS''LONG'0) ; PUTR('ABS'197.0) ; PUTR('ABS'-49.7) ; PUTR('ABS'.0) ; PUTR('SHORT''ABS''LONG'1.0) ; PUTR('SHORT''ABS''LONG'0.0E+7) ; PUTR('SHORT''ABS'-'LONG'1.9) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 1' // OPTION LINK,DUMP // EXEC ALGOL72 TEST : 'BEGIN' <1:120>'CHAR' BUFFER ; 'REF'<>'CHAR' B ; <-5:-3,-1:3>'REF'<,>'REAL' A ; B := BUFFER ; FILL(B,1,120,"") ; FILL(B,1,17," 1 LWB A = *** ") ; FILL(B,18,17," LWB A = *** ") ; FILL(B,35,17," 2 LWB A = *** ") ; FILL(B,52,17," 1 UPB A = *** ") ; FILL(B,69,17," UPB A = *** ") ; FILL(B,86,17," 2 UPB A = *** ") ; OUTI(B,13,3,1'LWB'A) ; OUTI(B,30,3,'LWB'A) ; OUTI(B,47,3,2'LWB'A) ; OUTI(B,64,3,1'UPB'A) ; OUTI(B,81,3,'UPB'A) ; OUTI(B,98,3,2'UPB'A) ; LINE(1,B,1,120) ; SKIP(3) ; FILL(B,1,120," LWB B = ***") ; OUTI(B,11,3,'LWB'B) ; LINE(1,B,1,20) ; SKIP(3) ; FILL(B,3,2,"UP") ; OUTI(B,11,3,1'UPB'B) ; LINE(1,B,1,20) ; SKIP(3) ; FILL(BUFFER,1,120," I = *** J = *** 1 LWB A = *** 1 UPB A = *** 2 LWB A = *** 2 UPB A = *** ") ; 'FOR' I 'FROM' 'LWB'A 'BY' 1 'TO' 'UPB' A 'DO' ( 'FOR' J 'FROM' 2'LWB'A 'BY' 1 'TO' 2'UPB'A 'DO' ( 'BEGIN' 'REAL' B ; A := B ; OUTI(BUFFER,7,3,I) ; OUTI(BUFFER,18,3,J) ; OUTI(BUFFER,40,3,1'LWB'A) ; OUTI(BUFFER,62,3,'UPB'A) ; OUTI(BUFFER,84,3,2'LWB'A) ; OUTI(BUFFER,106,3,2'UPB'A) ; LINE(1,BUFFER,1,120) ; SKIP(3) 'END' ) ) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 1' // OPTION LINK,DUMP // EXEC ALGOL72 # LWB UPB # 'PR' 'PROC' ('INT') PUTI 'PR' TEST : 'BEGIN' <1:2,2:4,3:5>'INT' A AAAAA; 'INT'JJJJJJ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 3 'DO' ( PUTI(I'LWB'AAAAAA) ; PUTI(I'UPB'AAAAAA) ) ; 'FOR' I 'FROM'-3'BY'1 'TO'-1'DO' (PUTI(-I'LWB'AAAAAA) ; PUTI(-I'UPB'AAAAAA) ) ; JJJJJJ:=2 ; PUTI(JJJJJJ'LWB'AAAAAA) ; PUTI(JJJJJJ'UPB'AAAAAA) ; PUTI('LWB'"ABC") ; PUTI('UPB'"CDE") ; PUTI((1+0)'LWB'"ABC") ; PUTI(1 'UPB'"EFG") 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL73 # ROUND - ENTIER # TEST : 'BEGIN' 'REAL' A1 = 1.7 ; 'LONG''REAL' A2 = 'LONG'27.7 ; 'REAL' A3 ; 'LONG''REAL' A4 ; PUTLI('LENG''ROUND'-27.7) ; PUTLI('LENG''ENTIER'-27.7) ; PUTLI('LENG''ROUND'A1) ; PUTLI('LENG''ENTIER'A1) ; PUTLI('LENG''ROUND'12.9) ; PUTLI('LENG''ENTIER'12.994) ; A3:=134E+2 ; A4:='LONG'135.1E-1 ; PUTLI('LENG''ROUND'A3) ; PUTLI('LENG''ENTIER'A3) ; PUTLI('LENG''ROUND''SHORT'A4) ; PUTLI('LENG''ENTIER''SHORT'A4); PUTLI('ROUND'-'LENG'127E-2) ; PUTLI('ENTIER'--'LONG'127E-2) ; PUTLI('ROUND'A2) ; PUTLI('ENTIER'A2) ; PUTLI('ROUND''LONG'12.87) ; PUTLI('ENTIER''LONG'12.87) ; PUTLI('ROUND'A4) ; PUTLI('ENTIER'A4) ; PUTLI('ROUND'-'LONG'1.5001) ; PUTLI('ENTIER'-'LENG'1.5001) ; PUTLI('LENG''ROUND'6.499) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL73 # OVER - MOD # TEST : 'BEGIN' PUTI(12'MOD'6) ; PUTI(-20'MOD'4) ; PUTI(100'MOD'-4) ; PUTI(-10'MOD'-1) ; PUTI(7'MOD'3) ; PUTI(-8'MOD'3) ; PUTI(10'MOD'-7) ; PUTI(-49'MOD'-27) ; PUTI('SHORT'('LONG'10'MOD''LONG'3)) ; PUTI('SHORT'(-'LONG'50'MOD''LONG'50)) ; PUTI(-12'OVER'7) ; PUTI(12'OVER'-7) ; PUTI('SHORT'(-'LONG'50'OVER''LONG'50)) ; PUTI('SHORT'('LONG'0'OVER'-'LONG'25)) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL73 # ** # TEST : 'BEGIN' 'INT' A ; A := 0 ; PUTI(1**0) ; PUTI(10**0) ; PUTI(-20**0) ; PUTI(1**1) ; PUTI(10**1) ; PUTI(-10**1) ; PUTI(0**1) ; PUTI(0**30000) ; PUTI(0**0) ; PUTI(7**2) ; PUTI(1**2) ; PUTI(-3**2) ; PUTI(-3**3) ; PUTI(2**5) ; PUTI('SHORT'('LONG'9**2)) ; PUTI('SHORT'(-'LONG'27**3)) ; PUTR(3.0**3) ; PUTR(2.0**16) ; PUTR(-2.0**15) ; PUTR(-6.0**2) ; PUTR(2.0**-2) ; PUTR(-10.0**-3) ; PUTR(3.0**-0) ; PUTR(3.0**-0) ; PUTR('SHORT'('LONG'7.0**2)) ; PUTR('SHORT'(-'LONG'6.3**2)); PUTR('SHORT'('LONG'37.3**-5)) ., 'FOR' I 'FROM' 1 'BY' 1 'TO' 100 'DO' ( PUTI((-1)**(I-1)) ; PUTR(0.5**I) ) ; PAGE ., 'FOR' I 'FROM' 1 'BY' 1 'TO' 10 'DO' ( A := A + 1**30000) ; PUTI(A) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL73 # SHORT # TEST : 'BEGIN' <1:120>'CHAR' BUFFER ; 'LONG''INT' A1 = 'LONG'128 ; 'LONG''INT' A2 ; 'LONG''REAL' A3 = 'LONG'1.9999999999 ; 'LONG''REAL' A4 ; 'REAL' A6 ; 'INT' A5 ; A5 := 32767 ; A6 := 2/3 ; PUTI('SHORT''LONG'19) ; PUTI('SHORT''LONG'65537) ; PUTI('SHORT'-'LONG'27) ; PUTI('SHORT'-'LONG'65537) ; PUTI('SHORT'A1) ; A2:='LONG'0 ; PUTI('SHORT'A2) ; PUTI('SHORT''LENG'A5) ; OUTR(BUFFER,1,20,10,'SHORT''LONG'.1234566666) ; OUTR(BUFFER,21,20,10,'SHORT'A3) ; A4:='LONG'.1111111111 ; OUTR(BUFFER,41,20,10,'SHORT'A4) ; OUTR(BUFFER,61,20,10,'SHORT'-'LENG'(1/3)) ; OUTR(BUFFER,81,20,10,'SHORT''LENG'A6) ; WRITE(1,BUFFER,1,120) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL73 # * FOR INTEGERS # TEST : 'BEGIN' PUTI(2*3) ; PUTI(-2*3) ; PUTI(2*-3) ; PUTI(-2*-3) ; PUTI('SHORT'(-'LONG'2*-'LONG'3)) ; PUTI('SHORT'('LONG'2*-'LONG'3) ) ; PUTI('SHORT'(-'LONG'2*'LONG'3)) ; PUTI('SHORT'('LONG'2*'LONG'3)) ; PUTI(0*10) ; PUTLI('LONG'0*-'LONG'10) ; PUTI(10*0) ; PUTLI(-'LONG'10*'LENG'0) ; PUTI(1*3) ; PUTLI('LONG'3*'LONG'1) ; PUT I(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2*(2 )))))))))))))))) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL72 # ODD # 'PR' 'PROC' DUMP 'PR' TEST : 'BEGIN' 'IF' 'ODD'-1 'THEN' PUTB('ODD'2) 'FI' ; 'IF' 'NOT''ODD'-'LONG'2 'THEN' PUTB('ODD''LONG'1) 'FI' ; 'BOOL' A1 , A2 ; A1:='ODD'-3 ; A2:='ODD'-'LONG'0 ; 'BOOL' B1 = 'NOT' 'ODD' -13 ; 'BOOL' B2 = 'NOT''NOT''ODD' -'LONG'16 ; 'FOR' I 'FROM' -10 'BY' 1 'TO' 10 'DO' ( PUTB('ODD'I)) ; PUTB(A1);PUTB(A2) ; PUTB(B1) ; PUTB(B2) ; PUTB('NOT''NOT''NOT''ODD'55) ; PUTB('NOT''NOT''NOT''ODD''LONG'1 ) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK // EXEC ALGOL73 # * MIXED # TEST : 'BEGIN' 'REAL' A1=1.0 ; 'LONG''REAL' A2=-'LONG'1.0 ; 'REAL' A3 ; 'LONG''REAL' A4 ; PUTR(6.0*7.0) ; PUTLR('LONG'13.0*'LONG'2.0) ; PUTR(-6.0*7.0) ; PUTLR(-'LONG'2.0*'LONG'3.0) ; PUTR(7.0*-8.0) ; PUTLR('LONG'16.0*-'LENG'3.0) ; PUTR(-8.0*-7.0) ; PUTLR(-'LENG'5.0*-'LONG'5.0) ; PUTR(7*6.0) ; PUTLR('LONG'3*'LONG'7.0) ; PUTR(6.0*7) ; PUTLR('LONG'6.0*'LONG'6) ; PUTR(-7*-6.0) ; PUTLR(-'LONG'15*-'LONG'15.0) ; PUTR(-6.0*-7) ; PUTLR(-'LONG'19.0*-'LONG'1) ; A3:=14.0 ; A4:='LENG'-13.0 ; PUTR(A3*A1) ; PUTLR(A2*A4) ; PUTR(1.0E-50*1.0E-52) ; PUTLR('LONG'1.0E+50*'LONG'1.0E+50) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL73 # DYADIC + # TEST : 'BEGIN' PUTI(1+3) ; PUTLI('LONG'7+'LONG'3) ; PUTI(-1+3) ; PUTLI(-'LONG'8+'LONG'5) ; PUTI(1+-3) ; PUTLI('LONG'4+-'LONG'3) ; PUTI(-1+-3) ; PUTLI(-'LONG'5+-'LENG'-5) ; PUTR(1+7.4) ; PUTLR('LONG'4+'LENG'-4.0) ; PUTR(7.4+1) ; PUTLR(-'LONG'6.0+'LONG'6) ; PUTR(6.1+-6.1) ; PUTLR('LONG'4.3+-'LONG'4.3) ; PUTI(32767+1) ; PUTLI('LONG'2147483647+'LONG'2) ; PUTR(-1.0+(-1.0+(-1.0+(-1.0+1)))) ; PUTLR(-'LONG'1.0+(-'LONG'1.0+(-'LONG'1.0+(-'LONG'1.0 +('LONG'1+'LONG'1.0))))) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL73 # DYADIC - # TEST : 'BEGIN' PUTI(1-3) ; PUTLI('LONG'7-'LONG'3) ; PUTI(-1-3) ; PUTLI(-'LONG'8-'LONG'5) ; PUTI(1--3) ; PUTLI('LONG'4--'LONG'3) ; PUTI(-1--3) ; PUTLI(-'LONG'5--'LENG'-5) ; PUTR(1-7.4) ; PUTLR('LONG'4-'LENG'-4.0) ; PUTR(7.4-1) ; PUTLR(-'LONG'6.0-'LONG'6) ; PUTR(6.1--6.1) ; PUTLR('LONG'4.3--'LONG'4.3) ; PUTI(32767-1) ; PUTLI('LONG'2147483647-'LONG'2) ; PUTR(-1.0-(-1.0-(-1.0-(-1.0-1)))) ; PUTLR(-'LONG'1.0-(-'LONG'1.0-(-'LONG'1.0-(-'LONG'1.0 -('LONG'1-'LONG'1.0))))) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP # SIGN # 'PR' 'PROC' DUMP 'PR' TEST : 'BEGIN' <1:12>'INT' A ; A<1>:='SIGN'7 ; A<2>:='SIGN'0 ; A<3>:='SIGN'-7 ; A<4>:='SIGN''LONG'79000 ; A<5>:='SIGN''LONG'0 ; A<6>:='SIGN'-'LONG'8 ; A<7>:='SIGN'1.9 ; A<8>:='SIGN'0.0 ; A<9>:='SIGN'-3.6 ; A<10>:='SIGN''LONG'67.0 ; A<11>:='SIGN''LONG'0.0 ; A<12>:='SIGN'-'LONG'37.0 ; DUMP., 'FOR' I 'FROM' 1 'BY' 1 'TO' 12 'DO' ( PUTI(A) ) ., DUMP 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // JOB AL001 **TEST // OPTION LINK,DUMP # OR AND # TEST : 'BEGIN' 'BOOL' T = 'TRUE' ; 'BOOL' F = 'FALSE' ; 'IF' (T'OR'T)'AND'(T'OR'T) 'THEN' PUTI(1) 'FI' ; 'IF' (T'OR'T)'OR'(T'OR'T) 'THEN' PUTI(2) 'FI' ; 'IF'(T'OR'T)'OR'F 'THEN' PUTI(3) 'FI' ; 'IF' (T'OR'T)'AND'T 'THEN' PUTI(4) 'FI' ; 'IF' T'OR'(T'OR'T) 'THEN' PUTI(5) 'FI' ; 'IF' T'AND'(T'OR'F) 'THEN' PUTI(6) 'FI' ; PUTB((T'OR'T)'OR'(F'OR'F)) ; PUTB((T'OR'T)'AND'(F'OR'F)) ; PUTB(T'OR'(F'OR'F)) ; PUTB('NOT'(T'AND'(F'OR'F))) ; PUTB('NOT''NOT'((F'OR'F)'OR'F)) ; PUTB('NOT''NOT''NOT'((F'OR'F)'AND'F)) ; 'BEGIN' 'BOOL' T ; T := 'TRUE' ; 'BOOL' F ; F:='FALSE' ; 'IF' ('NOT'('NOT'((T'OR'T)'AND'(T'OR'T))'OR' ((F'OR'F)'OR'F)'AND'(T'OR'(F'AND'F)))'AND'F) 'OR''NOT'T 'THEN' PUTR(1) 'ELSE' PUTR(2) 'FI' ; 'BOOL' X ; X:= ('NOT'('NOT'((T'OR'T)'AND'(T'OR'T))'OR' ((F'OR'F)'OR'F)'AND'(T'OR'(F'AND'F)))'AND'F) 'OR''NOT'T ; PUTB(X) ; 'BOOL' Y = ('NOT'('NOT'((T'OR'T)'AND'(T'OR'T))'OR' ((F'OR'F)'OR'F)'AND'(T'OR'(F'AND'F)))'AND'F) 'OR''NOT'T ; PUTB(Y) ; 'SKIP' 'END' 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS # EQ NE LT LE GT GE # TEST : 'BEGIN' 'IF' -1'EQ'-1 'THEN' PUTB(-'LONG'1'EQ'-'LONG'1) 'ELSE' PUTI(1 ) 'FI' ; 'IF' -1'NE'1 'THEN' PUTB(-'LONG'1'NE''LONG'1) 'ELSE' PUTI(2 ) 'FI' ; 'IF' 1 'NE' -1 'THEN' PUTB('LONG'1'NE'-'LONG'1) 'ELSE' PUTI(3 ) 'FI' ; 'IF' 1 'EQ'1 'THEN' PUTB('LONG'1'EQ''LONG'1) 'ELSE' PUTI(4 ) 'FI' ; 'IF'0'EQ'0.0'THEN' PUTB('LONG'0'EQ''LONG'0.0) 'ELSE' PUTI(5 ) 'FI' ; 'IF'1.0'EQ'1 'THEN' PUTB('LONG'1.0'EQ''LONG'1) 'ELSE' PUTI(6 ) 'FI' ; 'IF' -1.0'EQ'-1.0'THEN'PUTB(-'LONG'1.0'EQ'-'LONG'1.0) 'ELSE' PUTI(7 ) 'FI' ; 'IF'-1.0'NE'1.0'THEN' PUTB('LENG'-1.0'NE''LONG'1.0) 'ELSE' PUTI(8 ) 'FI' ; 'IF' 1.0'NE' -1.0 'THEN' PUTB('LONG'1.0'NE''LENG'-1.0) 'ELSE' PUTI(9 ) 'FI' ; <1:20>'BOOL' A ; A<1>:=1'EQ'1 ; A<2>:=1'NE'1 ; A<3>:=1'GT'1 ; A<4>:=1'LT'1 ; A<5>:=1'LE' 1 ; A<6>:=1'GE'0 ; A<7>:=1.0'EQ'2.0 ; A<8>:=1.0'NE'2.0 ; A<9>:=1.0'LT'2.0 ; A<10>:=1.0'GT'0.0 ; A<11>:=1.0'LE'1.0 ; A<12>:=1.0'GE'-1.0 ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 12 'DO' ( PUTB(A)); 'IF' 1 'EQ' 1 'THEN' PUTB(1'EQ'1) 'ELSE' PUTI(10) 'FI' ; 'IF''NOT'(1'NE'1)'THEN' PUTB('NOT''NOT''NOT'(1'NE'1)) 'ELSE' PUTI(11) 'FI' ; 'IF' 1'NE'2 'AND' 2'NE'3 'AND' 4'NE'5 'THEN' PUTS("END OF TESTS ON COMPILER") 'ELSE' PUTS("THIS IS NOT THE END") 'FI' ; PUTI(1-(-1)) ; PUTR(1.0-(-1.0)) 'END' /* // ASSGN SYSRLB,X'192' // EXEC // EXEC LNKEDT /& // JOB AL001 **TEST LOUIS // OPTION LINK,DUMP # OR AND # TEST:'BEGIN' 'BOOL' T = 'TRUE' ; 'BOOL' F = 'FALSE' ; 'IF' T'OR'F 'THEN' PUTB(T'OR'F) 'FI' ; 'IF' T'OR'T 'THEN' PUTB(T'OR'T) 'FI' ; 'IF' F'OR'T 'THEN' PUTB(F'OR'T) 'FI' ; 'IF' F'OR'F 'THEN' 'SKIP' 'ELSE' PUTB(F'OR'F) 'FI' ; 'IF' 'NOT'(F'OR'F) 'THEN' PUTB('NOT'(F'OR'F)) 'FI' ; 'IF' 'NOT'(F'AND'F) 'THEN' PUTB('NOT'(F'AND'F)) 'FI' ; 'IF' T'AND'T 'THEN' PUTB(T'AND'T) 'FI' ; 'IF' T'AND'F 'THEN' 'SKIP' 'ELSE' PUTB(T'AND'F) 'FI' ; 'IF' F'AND'T 'THEN' 'SKIP' 'ELSE' PUTB(F'AND'T) 'FI' ; 'IF' F'AND'F 'THEN' 'SKIP' 'ELSE' PUTB(F'AND'F) 'FI' ; 'BOOL'A1 ; A1:=T'AND'F ; PUTB(A1) ; 'BOOL' A2 ; A2:='NOT'(T'OR'F) ; PUTB(A2) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP # NOT # TEST:'BEGIN' 'BOOL'A1,A2,A3 ,B1,B2,B3 ; 'BOOL'A4='NOT''FALSE' ; 'BOOL'A5='NOT''NOT''FALSE' ; 'BOOL'A6='NOT''NOT''NOT''FALSE' ; 'BOOL'A7='NOT'A6 ; 'BOOL'A8='NOT'A8 ; 'BOOL'A9='NOT''NOT'A9; 'BOOL'A10='NOT''NOT''NOT'A10 ; 'IF' 'NOT''TRUE''THEN''SKIP''ELSE'PUTI(1)'FI' ; 'IF''NOT''NOT''TRUE''THEN'PUTI(2)'FI' ; 'IF''NOT''NOT''NOT''TRUE''THEN''SKIP''ELSE'PUTI(3)'FI' ; A1:='NOT''TRUE' ; A2:='NOT''NOT''FALSE' ; A3:='NOT''NOT''NOT''TRUE' ; B1:='NOT''TRUE''AND''FALSE' ; B2:='NOT''NOT''TRUE''AND''FALSE' ; B3:='TRUE' 'OR' 'NOT''NOT''NOT''TRUE''OR''FALSE' ; PUTB(A1);PUTB(A2);PUTB(A3);PUTB(A4);PUTB(A5);PUTB(A6); PUTB(A7);PUTB(A8);PUTB(A9);PUTB(A10);PUTB(B1);PUTB(B2); PUTB(B3);DUMP 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP # EQ NE GT GE LT LE # TEST : 'BEGIN' <1:120>'CHAR' BUFFER ; 'REAL' J ; 'FOR' I 'FROM' -3 'BY' 1 'TO' 3 'DO' ( OUTB(BUFFER,1,1,I'EQ'0) ; OUTB(BUFFER,11,1,I'NE'0) ; OUTB(BUFFER,21,1,I'GT'0) ; OUTB(BUFFER,31,1,I'GE'0) ; OUTB(BUFFER,41,1,I'LT'0) ; OUTB(BUFFER,51,1,I'LE'0) ; J:=I ; OUTB(BUFFER,61,1,J'EQ'0) ; OUTB(BUFFER,71,1,J'NE'0) ; OUTB(BUFFER,81,1,J'GT'0) ; OUTB(BUFFER,91,1,J'GE'0) ; OUTB(BUFFER,101,1,J'LT'0) ; OUTB(BUFFER,111,1,J'LE'0) ; WRITE(1,BUFFER,1,120) ) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL73 # / # TEST : 'BEGIN' 'REAL' A , B ; 'LONG''REAL' C , D ; 'REAL' X = 127.0 ; 'FOR' I 'FROM' -10 'BY' 1 'TO' 10 'DO' ( 'FOR' J 'FROM' -10 'BY' 1 'TO' 10 'DO' ( 'IF' J 'NE' 0 'THEN' A:=I/J ; PUTR(A) ; A:=I ; A:=A/J ; PUTR(A) ; A:=J ; A :=I/A ; PUTR(A) ; A := I ; B := J ; A := A/B ; PUTR(A) ; C := 'LENG'I/'LENG'J ; PUTLR(C) ; C := 'LENG'I ; C := C/'LENG' J ; PUTLR(C) ; C := 'LENG'J ; C :='LENG'I/C ; PUTLR(C) ; C := 'LENG'I;D:='LENG'J ; C:=C/D;PUTLR(C) 'FI' ) ) ; PUTR(1.9E-7/-1.9E-7) ; A:=19.74E+2 ; PUTR(19.74E+2/A) ; PUTR(19.74E-2/19.74E+2) ; PUTR(127000.0/X) ;PUTR(X/1.27) ; PUTR(X/-12.7) ; PUTR(X/X) ; A:=1270.0 ; PUTR(X/A) ; A:=0.0149 ; PUTR(A/149E-4) ; PUTR(A/A) ; PUTR(A/X) ; PUTR(A/-1.49) ; PUTR(-X/-1.0) ; PUTR(-X/X) ; PUTR(-X/A) ; PUTR(-X/-X) 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP TEST : 'BEGIN' 'CHAR' A = "1" ; 'CHAR' B = "2" ; 'CHAR' C ; C := "0" ; <1:1>'CHAR' D ; D<1>:="$" ; PUTB('REPR'240'EQ''REPR'240) ; PUTB('REPR'240'NE''REPR'240) ; PUTB('REPR'240'LE''REPR'240) ; PUTB('REPR'240'LT''REPR'240) ; PUTB('REPR'240'GE''REPR'240) ; PUTB('REPR'240'GT''REPR'240) ; PUTB('REPR'240'EQ''REPR'241) ; PUTB('REPR'240'NE''REPR'241) ; PUTB('REPR'240'LE''REPR'241) ; PUTB('REPR'240'LT''REPR'241) ; PUTB('REPR'240'GE''REPR'241) ; PUTB('REPR'240'GT''REPR'241) ; PUTB('REPR'241'EQ''REPR'240) ; PUTB('REPR'241'NE''REPR'240) ; PUTB('REPR'241'LE''REPR'240) ; PUTB('REPR'241'LT''REPR'240) ; PUTB('REPR'241'GE''REPR'240) ; PUTB('REPR'241'GT''REPR'240) ; PUTB(A'EQ'A) ; PUTB(A'NE'A) ; PUTB(A'LE'A) ; PUTB(A'LT'A) ; PUTB(A'GE'A) ; PUTB(A'GT'A) ; PUTB(A'EQ'B) ; PUTB(A'NE'B) ; PUTB(A'LE'B) ; PUTB(A'LT'B) ; PUTB(A'GE'B) ; PUTB(A'GT'B) ; PUTB(B'EQ'A) ; PUTB(B'NE'A) ; PUTB(B'LE'A) ; PUTB(B'LT'A) ; PUTB(B'GE'A) ; PUTB(B'GT'A) ; 'SKIP' 'END' /* // EXEC LNKEDT // ASSGN SYSRLB,X'192' // EXEC /& // JOB AL001 **TEST LOUIS // OPTION LINK,DUMP TEST : 'BEGIN' 'CHAR' A = "1" ; 'CHAR' B = "2" ; 'CHAR' C ; C := "0" ; <1:1>'CHAR' D ; D<1>:="$" ; PUTB('REPR'240'EQ'C) ; PUTB('REPR'240'NE'C) ; PUTB('REPR'240'LE'C) ; PUTB('REPR'240'LT'C) ; PUTB('REPR'240'GE'C) ; PUTB('REPR'240'GT'C) ; PUTB('REPR'239'EQ'C) ; PUTB('REPR'239'NE'C) ; PUTB('REPR'239'LE'C) ; PUTB('REPR'239'LT'C) ; PUTB('REPR'239'GE'C) ; PUTB('REPR'239'GT'C) ; PUTB('REPR'241'EQ'C) ; PUTB('REPR'241'NE'C) ; PUTB('REPR'241'LE'C) ; PUTB('REPR'241'LT'C) ; PUTB('REPR'241'GE'C) ; PUTB('REPR'241'GT'C) ; PUTB(C'EQ''REPR'240) ; PUTB(C'NE''REPR'240) ; PUTB(C'LE''REPR'240) ; PUTB(C'LT''REPR'240) ; PUTB(C'GE''REPR'240) ; PUTB(C'GT''REPR'240) ; PUTB(C'EQ''REPR'239) ; PUTB(C'NE''REPR'239) ; PUTB(C'LE''REPR'239) ; PUTB(C'LT''REPR'239) ; PUTB(C'GE''REPR'239) ; PUTB(C'GT''REPR'239) ; PUTB(C'EQ''REPR'241) ; PUTB(C'NE''REPR'241) ; PUTB(C'LE''REPR'241) ; PUTB(C'LT''REPR'241) ; PUTB(C'GE''REPR'241) ; PUTB(C'GT''REPR'241) ; PUTB("$"'EQ'D<1>) 'END' /* // ASSGN SYSRLB,X'192' /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL<4K TEST : 'BEGIN' 'BOOL' T = 'TRUE' ; 'BOOL' F = 'FALSE' ; 'BOOL' A ; A:=T'OR'T ; PUTB(A); A:=T'OR'F ; PUTB(A); A:=F'OR'T ; PUTB(A); A:=F'OR'F ; PUTB(A); A:=T'AND'T ; PUTB(A); A:=T'AND'F ; PUTB(A); A:=F'AND'T ; PUTB(A); A:=F'AND'F ; PUTB(A); A:='NOT'T'AND'T ; PUTB(A); A:='NOT'F'AND'T ; PUTB(A); A:='NOT'T'AND'F ; PUTB(A); A:='NOT'F'AND'F ; PUTB(A); A:='NOT'T'OR'T ; PUTB(A); A:='NOT'F'OR'T ; PUTB(A); A:='NOT'T'OR'F ; PUTB(A); A:='NOT'F'OR'F ; PUTB(A); A:=T'AND''NOT'T ; PUTB(A); A:=T'AND''NOT'F ; PUTB(A); A:=F'AND''NOT'T ; PUTB(A); A:=F'AND''NOT'F ; PUTB(A); A:=T'OR''NOT'T ; PUTB(A); A:=T'OR''NOT'F ; PUTB(A); A:=F'OR''NOT'T ; PUTB(A); A:=F'OR''NOT'F ; PUTB(A); A:='NOT'T'AND''NOT'T ; PUTB(A); A:='NOT'T'AND''NOT'F ; PUTB(A); A:='NOT'F'AND''NOT'T ; PUTB(A); A:='NOT'F'AND''NOT'F ; PUTB(A); A:='NOT'T'OR''NOT'T ; PUTB(A); A:='NOT'T'OR''NOT'F ; PUTB(A); A:='NOT'F'OR''NOT'T ; PUTB(A); A:='NOT'F'OR''NOT'F ; PUTB(A); PUTB(A); A:=T ; PUTB(A); A:=A'AND'T ; PUTB(A); A:=A'OR'T ; PUTB(A); A:=A'OR'F ; PUTB(A); A:=A'AND'F ; PUTB(A); A:=A'AND'F ; PUTB(A); A:=A'AND'T ; PUTB(A); A:=A'OR'F ; PUTB(A); A:=A'OR'T ; PUTB(A); A:=T ; PUTB(A); A:=T'AND'A ; PUTB(A); A:=T'OR'A ; PUTB(A); A:=F'OR'A ; PUTB(A); A:=F'AND'A ; PUTB(A); A:=F'AND'A ; PUTB(A); A:=T'AND'A ; PUTB(A); A:=F'OR'A ; PUTB(A); A:=T'OR' A ; PUTB(A); 'SKIP' 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& ************************************************************************ * * * OPTIMISATION OF REGISTERS * * * ************************************************************************ // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL72 # OPTIMISATION OF REGISTERS # TEST : 'BEGIN' <1:3>'INT' A ; A<1>:=2 ; A<2>:=3 ; A<3>:=1 ; PUTR( (-1.0+(-2.0+(-3.0+(-4.0+2)))) +( (-5.0+(-2.0-(-5.0+(-2.0-7)))) -( A>>>> +( A>>>> -( A>>>> + ( (-1.0*(-2.0*(-3.0*(-4.0*2)))) - ( (-5.0*(-2.0*(-5.0*(-2.0*7)))) * ( 128*(-1.0/(-2.0/(-4.0/(-4.0/2)))) / ( (-10.0/(-5.0/(-5.0/(-2.0/2)))) ** A>>>> ** A>>>> ** A>>>> )))))))) ) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK // EXEC ALGOL72 TEST:'BEGIN' 'REAL' X ; <1:20>'REAL' A ; <1:20>'CHAR' BUFFER ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 20 'DO' ( A := I-10 ) ; X := A<1>+(A<2>+(A<3>+(A<4>+(A<5>+(A<6>+(A<7>+(A<8>+(A<9>+ (A<10>+(A<11>+(A<12>+(A<13>+(A<14>+(A<15>+(A<16>+ (A<17>+(A<18>+(A<19>+(A<20>)))))))))))))))))))-9.0 ; # A = 1.0 # OUTFR(BUFFER,1,20,1,X) ; LINE(1,BUFFER,1,20) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // OPTION DUMP // EXEC /& // JOB AL001 **TEST LOUIS // OPTION LINK,DUMP // EXEC ALGOL73 # OPTIMISATION OF REGISTERS # TEST : 'BEGIN' <1:10>'INT' A ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 9 'DO' ( A:=I+1 ) ; A<10>:=1 ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 10 'DO' ( PUTI( A>>>>>>>>>>>>>>>>>>> ) ) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC // EXEC LNKEDT /* /& ************************************************************************ * * * TESTS ON DECLARATIONS * * * ************************************************************************ // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP ASSGN SYSRLB,UA // OPTION XREF,LINK,DUMP // UPSI 10000000 // EXEC ALGOL722 # TESTS ON DCC ( CONSTANT DECLARATIONS ) # MAIN .. 'BEGIN' 'INT' A1 = 1 ., 'LONG''REAL' A20 ., 'REF''LONG''REAL' A2 = A20 ., 'REF''INT' A30 ., 'REF''REF''INT' A3 = A30 ., 'BEGIN' 'PROC' A40 ., 'REF''PROC' A4 = A40 ., 'PROC'('INT') A50 ., 'REF''PROC'('INT') A5 = A50 ., 'SKIP' 'END' ., 'BEGIN' (//)'CHAR' B1 = "ABC" ., 'SKIP' 'END' 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS // OPTION LINK,XREF,DUMP // UPSI 10000000 // EXEC ALGOL722 # TESTS ON DCV ( VARIABLE DECLARATION ) # MAINPG .. 'BEGIN' # ATTENTION ALIGNMENT # 'BOOL' A1 ., 'BOOL' A2 , AA ., 'CHAR' A21,A22,A23 ., 'INT' A4 ., 'BOOL' A5 ., 'INT' A6 ., 'BEGIN' (/0:0/)'CHAR' A1,A11 ., (/0:0,0:0/)'LONG''REAL' A2,A21,A22 ., (/0:0,0:0,0:0/)'INT' A3 ., (/0:0/)'BOOL' A4 ., (/0:0/)'LONG''INT' A5 ., (/0:0/)'REAL' A6 ., (/0:0/)'REF''INT' A7 ., (/0:0/)'PROC'('INT','REF''REAL',(//)'CHAR') A8 ., 'SKIP' 'END' ., 'BEGIN' 'REAL' A7 ., 'BOOL' A8 ., 'REAL' A88 .,'INT' A9 ., 'REAL' A10 ., 'LONG''REAL' A11 ., 'BOOL' A12 ., 'LONG''REAL' A1212 ., 'REAL' A13 ., 'LONG''REAL' A14 ., 'PROC' B ., 'REF''INT' B1 ., 'LONG''INT' B2 ., 'SKIP' 'END' 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS // OPTION LINK,XREF,DUMP // UPSI 10000000 // EXEC ALGOL722 MAIN..'BEGIN' 'PROC' DCR1 = ( .. 'SKIP' ) ., 'PROC'('PROC') DCR2 = (('PROC'A) .. 'SKIP' ) ., 'PROC' DCR3 = ( .. 'BEGIN' 'PROC'('PROC','INT') A = (('PROC' A1,'INT' A2) .. 'SKIP') ., 'SKIP' 'END' ) ., 'SKIP' 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS // OPTION LINK // EXEC ALGOL722 # TESTS ON DCR AND DCS ( ROUTINES DECLARATIONS ) # 'PROC' DCR = ( .. 'SKIP' ) /* // EXEC ALGOL722 'PROC'('INT','PROC')DCR = (('INT'A,'PROC'B)..'SKIP') /* // EXEC ALGOL722 'PROC'('INT','PROC'('INT'),'PROC'('PROC'('INT')))DCR = (('INT'A,'PROC'('INT') B,'PROC'('PROC'('INT'))C)..'SKIP') /* // EXEC LNKEDT // EXEC /* /& ************************************************************************ * * * TESTS ON SLICES * * * ************************************************************************ // JOB AL001 **TEST LOUIS // EXEC ALGOL72 // OPTION LINK # TO TEST "ENDARRAY" # # OTHER TESTS ON SLICES ARE SCATTERED TROUGHOUT OTHER PROGRAMS # TEST : 'BEGIN' 'INT' T1,T2 ; 'REF''INT' X1,X2 ; 'REAL' Y1,Y2 ; 'REF''REAL' Z1,Z2 ; <1:12>'REAL' M ; <1:20>'CHAR' BUFFER ; <1:2>'INT' TEMP1 ; <1:2>'REF''INT' TEMP2 ; <1:2>'REF''REF''INT' TEMP3 ; T1:=27 ; T2:=-27 ; X1:=T1 ; X2:=T2 ; TEMP1<1>:=79 ; TEMP1<2>:=-79 ; TEMP2<1>:=T1 ; TEMP2<2>:=T2 ; TEMP3<1>:=X1 ; TEMP3<2>:=X2 ; Y1:=1.9E-8 ; Y2:=6.74E+2 ; Z1:=Y1 ; Z2:=Y2 ; 'BEGIN' <>'INT' A7 = TEMP1 ; <>'REF''INT' A8 = TEMP2 ; 'REF''INT' M13 = A8<1> ; <>'REF''REF''INT' A9 = TEMP3 ; <1:2>'INT' A10 ; 'REF'<>'REF''INT' A11 ; 'REF'<>'REF''REF''INT' A12 = TEMP3 ; A10<1>:=1 ; A10<2>:=-1 ; A11 := TEMP2 ; M<7>:=A 7<2> ; M<8>:=A 8<2> ; M<9>:=A 9<2> ; M<10>:=A10<2> ; M<11>:=A11<2> ; M<12>:=A12<2> ; 'FOR' I 'FROM' 7 'BY' 1 'TO' 12 'DO' ( OUTR(BUFFER,1,20,5,M) ; LINE(1,BUFFER,1,20) ) ; OUTR(BUFFER,1,20,5,M13) ; LINE(1,BUFFER,1,20) 'END' 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS // EXEC ALGOL72 // OPTION LINK # TO TEST "ENDARRAY" # # OTHER TESTS ON SLICES ARE SCATTERED TROUGHOUT OTHER PROGRAMS # TEST : 'BEGIN' 'INT' T1,T2 ; 'REF''INT' X1,X2 ; 'REAL' Y1,Y2 ; 'REF''REAL' Z1,Z2 ; <1:12>'REAL' M ; <1:20>'CHAR' BUFFER ; <1:2>'REF''REAL' A1 ; 'REF'<>'REF''REAL' A2 ; 'REF'<>'REF''REAL' A3 = A2 ; <1:2>'REF''REF''REAL' A5 ; <1:2>'INT' TEMP1 ; <1:2>'REF''INT' TEMP2 ; <1:2>'REF''REF''INT' TEMP3 ; T1:=27 ; T2:=-27 ; X1:=T1 ; X2:=T2 ; TEMP1<1>:=79 ; TEMP1<2>:=-79 ; TEMP2<1>:=T1 ; TEMP2<2>:=T2 ; TEMP3<1>:=X1 ; TEMP3<2>:=X2 ; Y1:=1.9E-8 ; Y2:=6.74E+2 ; A1<1>:=Y1 ; A1<2>:=Y2 ; A2:= A1 ; Z1:=Y1 ; Z2:=Y2 ; A5<1>:=Z1 ; A5<2>:=Z2 ; 'BEGIN' <>'REF''REAL' A4 = A1 ; <>'REF''REF''REAL' A6 = A5 ; M<1>:=A 1<2> ; M<2>:=A 2<2> ; M<3>:=A 3<2> ; M<4>:=A 4<2> ; M<5>:=A 5<2> ; M<6>:=A 6<2> ; 'FOR' I 'FROM' 1 'BY' 1 'TO' 6 'DO' ( OUTR(BUFFER,1,20,5,M) ; LINE(1,BUFFER,1,20) ) ; 'SKIP' 'END' 'END' /* // EXEC LNKEDT // EXEC /& ************************************************************************ *** *** *** 4. TESTS GLOBAL OF COMPILER *** *** *** ************************************************************************ // JOB AL001 **TEST LOUIS 30" // EXEC FALGOL TEST : 'BEGIN' <1:53>'CHAR' BUFFER ; BUFFER := "NUMBER OF KM = ****.*** NUMBER OF ITERATIONS = ***" ; 'REAL' DIST , VA , VB , VC , KMA , KMB , KMC , EA , EB , EC ; 'CHAR' A OR B ; A OR B := "A" ; GETR(DIST) ; GETR(VA) ; GETR(VB) ; GETR(VC) ; 'IF' VC'LE'VA 'OR' VC'LE'VB 'THEN' PAGE ; PUTS("ERROR") ; 'GOTO' TEST 'FI' ; KMA := 0 ; KMB := 0 ; KMC := 0 ; 'PROC' NEW = ( : 'BEGIN' 'IF' A OR B 'EQ' "A" 'THEN' A OR B :="B" ; EC := (DIST-KMA-KMB)*VC/(VB+VC) ; EB := (DIST-KMA-KMB)*VB/(VB+VC) ; EA := EB*VA/VB 'ELSE' A OR B := "A" ; EC := (DIST-KMA-KMB)*VC/(VA+VC) ; EA := (DIST-KMA-KMB)*VA/(VA+VC) ; EB := EA*VB/VA 'FI' ; KMA := KMA+EA ; KMB := KMB+EB ; KMC := KMC+EC 'END' ) ; 'FOR' I 'DO' ( NEW ; 'IF' DIST-KMA-KMB 'LE' 1.0E-4 'THEN' OUTFR(BUFFER,15,9,3,'ROUND'KMC) ; OUTI(BUFFER,51,3,I) ; WRITE(1,BUFFER,1,53) ; 'GOTO' TEST 'FI' ) 'END' /* // EXEC LNKEDT // EXEC 100.0 50.0 50.0 200.0 100.0 60.0 40.0 200.0 500.0 50.0 50.0 200.0 /* /& // JOB AL001 **TEST LOUIS 5' // EXEC FALGOL # WE ALL KNOW THAT FACTORIAL(N) = N*FACTORIAL(N-1) WITH FACTORIAL(1) = 1 THIS IS A TYPICAL RECURSIVE PROBLEM WE'LL SOLVE IN ALGOL-72 WITH RECURSIVE PROCEDURES # ############################################################ FACTOR : 'BEGIN' # FIRST , WE DECLARE THE COMPUTING ROUTINE # 'PROC'('INT','REF''INT') FACT = (('INT' N , 'REF''INT' RESULT) : 'IF' N 'EQ' 1 'THEN' RESULT .= 1 'ELSE' FACT(N-1,RESULT) ; # RESULT = FACTORIAL(N-1) # RESULT .= N*RESULT 'FI' ) ; (/1:22/)'CHAR' BUFFER ; # I/O BUFFER # 'INT' N , FACTN ; BUFFER .= "FACTORIAL( ) = " ; # INIT OF BUFFER # PAGE ; LOOP : TAKE(BUFFER,11,3,EOF) ; # READ A CARD IN BUFFER # INI(BUFFER,11,3,N) ; # INPUT N IN BUFFER # FACT(N,FACTN) ; # FACTN = FACTORIAL(N) # OUTI(BUFFER,19,4,FACTN) ; # OUTPUT FACTN IN BUFFER # WRITE(1,BUFFER,1,22) ; # WRITE BUFFER ON PRINTER # SKIP(1) ; 'GOTO' LOOP 'END' /* // EXEC LNKEDT // EXEC 1 2 3 5 6 7 /* /& // JOB AL001 **TEST LOUIS 1' // EXEC FALGOL # PGCD OF TWO INTEGERS # MAIN : 'BEGIN' (/1:80/)'CHAR' BUFFER ; 'INT' I , J ; 'PROC'('INT','INT') PGCD = (('INT' A , B ) : 'IF' B 'EQ' 0 'THEN' OUTI(BUFFER,21,10,'ABS' A) 'ELSE' PGCD(B,A'MOD'B) 'FI' ) ; L : TAKE(BUFFER,1,80,EOF) ; INI(BUFFER,1,10,I) ; INI(BUFFER,11,10,J) ; PGCD(I,J) ; WRITE(1,BUFFER,1,30) ; 'GOTO' L 'END' /* // EXEC LNKEDT // EXEC 1 10 7 49 -000000007 -49 7 -0 000000000000000000000000 2 4 4 2 -2 4 4 -2 -4 2 2 -4 -2 -4 /& // JOB AL001 **TEST LOUIS 1' MODIF // EXEC ALGOL72 MODIF : 'BEGIN' <1:86>'CHAR' BUF,BUF1; <1:8>'CHAR' DAT; 'INT' A, L, NBR; 'BOOL' BOOL; L:=1; 'PROC' BLAN = ( : 'BEGIN' A:=0; 'FOR' J 'TO' 80 'WHILE' BUF1'EQ'" " 'DO' ( A:=A+1 ) ; 'IF' A'EQ'80 'THEN' BOOL:='TRUE' 'ELSE' BOOL:='FALSE' 'FI' 'END' ) ; 'PROC' IMPR = ( : 'BEGIN' PAGE; DISKR(5,1,BUF,1,80); INI(BUF,1,0,NBR); 'FOR' L 'TO' NBR 'DO' ( BLANK(BUF); OUTI(BUF,1,2,L); DISKR(5,L+1,BUF,6,80); WRITE(1,BUF,1,86) ) 'END' ) ; OPEN(5,"MODIFICATION FILE"); <>'CHAR' MSG = "MODIFICATIONS ? REPLY ""EOB"""; FILL(BUF1,1,80,MSG); DISPLY(BUF1,1,'UPB'MSG); 'DO' ( ACCEPT(BUF1,1,80); BLAN; 'IF' BOOL 'THEN' IMPR; STOP 'FI' ; L:=1; 'IF' BUF1<1>'EQ'"?" 'THEN' IMPR; 'GOTO' CONT 'FI'; 'IF' BUF1<1>'EQ'"#" 'THEN' BUF1<1>:=" "; BLAN; 'IF' BOOL 'THEN' A:=0 'ELSE' INI(BUF1,2,70,A) 'FI' ; 'IF' A'EQ'0 'THEN' OUTI(BUF,1,0,0); DISKW(5,1,BUF,1,80) 'ELSE' DISKR(5,A+1,BUF,1,80); BLANK(BUF); FILL(BUF,70,8,"DELETED"); DISKW(5,A+1,BUF,1,80) 'FI' ; 'GOTO' CONT 'FI'; DISKR(5,1,BUF,1,80); INI(BUF,1,0,NBR); L:=NBR+2; OUTI(BUF,1,0,L-1); DISKW(5,1,BUF,1,80); 'FOR' I 'TO' 80 'DO' ( 'IF' 'ABS'BUF1'GE'129 'AND' 'ABS'BUF1'LE'169 'THEN' BUF1:='REPR'('ABS'BUF1+64) 'FI' ); DATE(DAT); TRC(DAT,1,BUF1,70,8); DISKW(5,L,BUF1,1,80) ; CONT : 'SKIP' ) 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' STEVENS GAME // EXEC ALGOL72 'PR' 'PROC'('REF''INT','REF''INT') EXPL 'PR' GAME : 'BEGIN' <1:80>'CHAR' BUFFER ; <1:1>'CHAR' RESP ; <1:50>'CHAR' BUF1 , BUF2 ; 'INT' STEP , LIMIT , START ; <>'CHAR' MSG = "DO YOU WANT TO PLAY AGAIN ? ( Y OR N )" ; <>'CHAR' M1 = "I PLAY ** SITUATION : **" ; <>'CHAR' M2 = "YOU PLAY" ; <>'CHAR' M3 = "I HAVE WON" ; FILL(BUF1,1,50,M1) ; FILL(BUF2,1,50,M2) ; L : EXPL(STEP,LIMIT) ; START := LIMIT 'MOD' (STEP+1) ; 'IF' START'NE'0 'THEN' OUTI(BUF1,8,2,START) ; OUTI(BUF1,24,2,START) ; DISPLY(BUF1,1,'UPB'M1) 'FI' ; 'WHILE' START'NE'LIMIT 'DO' ( 'BEGIN' L : DISPLY(BUF2,1,'UPB'M2) ; ACCEPT(RESP,1,1) ; 'IF' 'ABS'RESP<1>'LT'241 'OR' 'ABS'RESP<1>'GT'240+STEP 'THEN' 'GOTO' L 'FI' ; START:=START+STEP+1 ; OUTI(BUF1,8,2,STEP+1-('ABS'RESP<1>-240)) ; OUTI(BUF1,24,2,START) ; DISPLY(BUF1,1,'UPB'M1) 'END' ) ; FILL(BUFFER,1,80,M3) ; DISPLY(BUFFER,1,'UPB'M3) ; FILL(BUFFER,1,80,MSG) ; RESP<1>:='REPR'0 ; 'WHILE' 'ABS'RESP<1>'NE'149'AND''ABS'RESP<1>'NE'168'AND' 'ABS'RESP<1>'NE'213'AND''ABS'RESP<1>'NE'232 'DO' ( DISPLY(BUFFER,1,'UPB'MSG) ; ACCEPT(RESP,1,1) ) ; 'IF' 'ABS'RESP<1>'NE'168'AND''ABS'RESP<1>'NE'232 'THEN' STOP 'FI' ; 'GOTO' L 'END' /* // EXEC ALGOL72 'PR' 'PROC'(<>'CHAR',<>'CHAR','REF''BOOL') LE , GE 'PR' 'PROC'('REF''INT','REF''INT') EXPL = (('REF''INT' STEP , LIMIT ) : 'BEGIN' <>'CHAR' M1 = "CHOOSE A NUMBER BETWEEN 5 AND 9 ( IT'S THE MAXIMAL STEP )" ; <>'CHAR' M2 = "CHOOSE A NUMBER BETWEEN ** AND ** ( IT'S THE LIMIT )" ; <>'CHAR' M3 = "WE PLAY EACH AFTER THE OTHER NUMBERS BETWEEN 1 AND **" ; <>'CHAR' M4 = "AND WE ADD THESE NUMBERS" ; <>'CHAR' M5 = "THE WINNER IS THE FIRST GUY WHO REACHES **" ; <1:80>'CHAR' M ; <1:2>'CHAR' RESP , COMP ; 'BOOL' B ; FILL(M,1,80,M1) ; L1 : DISPLY(M,1,'UPB'M1) ; ACCEPT(RESP,1,1) ; 'IF' 'ABS'RESP<1>'LT'245 'OR' 'ABS'RESP<1>'GT'249 'THEN' 'GOTO' L1 'FI' ; INI(RESP,1,1,STEP) ; FILL(M,1,80,M2) ; OUTI(M,25,2,5*STEP) ; OUTI(M,32,2,10*STEP) ; L2 : DISPLY(M,1,'UPB'M2) ; ACCEPT(RESP,1,2) ; OUTI(COMP,1,2,5*STEP) ; GE(RESP,COMP,B) ; 'IF' 'NOT' B 'THEN' 'GOTO' L2 'FI' ; OUTI(COMP,1,2,10*STEP) ; LE(RESP,COMP,B) ; 'IF' 'NOT' B 'THEN' 'GOTO' L2 'FI' ; INI(RESP,1,2,LIMIT) ; FILL(M,1,80,M3) ; OUTI(M,52,2,STEP) ; DISPLY(M,1,'UPB'M3) ; FILL(M,1,80,M4) ; DISPLY(M,1,'UPB'M4) ; FILL(M,1,80,M5) ; OUTI(M,41,2,LIMIT) ; DISPLY(M,1,'UPB'M5) ; FILL(M,1,80,"") ; DISPLY(M,1,1) 'END' ) /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' NIM GAME // EXEC ALGOL72 'PR' 'PROC' EXPL , GAME 'PR' NIM : 'BEGIN' <1:80>'CHAR' BUFFER ; <1:1>'CHAR' RESP ; RESP<1>:='REPR' 0 ; <>'CHAR' M = "DO YOU WANT TO PLAY AGAIN ? ( Y OR N )" ; <>'CHAR' MSG = "DO YOU WANT MORE EXPLANATIONS ABOUT THIS GAME ? ( Y OR N )" ; FILL(BUFFER,1,80,MSG) ; 'WHILE' ('ABS'RESP<1>'NE'149) 'AND' ('ABS'RESP<1>'NE'168) 'AND' ('ABS'RESP<1>'NE'213) 'AND' ('ABS'RESP<1>'NE'232) 'DO' ( DISPLY(BUFFER,1,'UPB'MSG) ; ACCEPT(RESP,1,1) ) ; 'IF' ('ABS'RESP<1>'EQ'168) 'OR' ('ABS'RESP<1>'EQ'232) 'THEN' EXPL 'FI' ; 'DO' ( GAME ; FILL(BUFFER,1,80,M) ; RESP<1>:='REPR' 0 ; 'WHILE' 'ABS'RESP<1>'NE'149'AND''ABS'RESP<1>'NE'168'AND' 'ABS'RESP<1>'NE'213'AND''ABS'RESP<1>'NE'232 'DO' ( DISPLY(BUFFER,1,'UPB'M) ; ACCEPT(RESP,1,1) ) ; 'IF' 'ABS'RESP<1>'NE'168'AND''ABS'RESP<1>'NE'232 'THEN' STOP 'FI' ) 'END' /* // EXEC ALGOL72 'PR' 'PROC'('REF'<>'INT') PRINT , 'PROC'('REF'<>'INT','REF''BOOL') NEWSIT 'PR' 'PROC' GAME = ( : 'BEGIN' <1:4>'INT' P ; P<1>:=7 ; P<2>:=5 ; P<3>:=3 ; P<4>:=1 ; <>'CHAR' MSG = "PLAY PEG,NUMBER" ; <1:30>'CHAR' BUFFER ; <1:3>'CHAR' RESP ; 'BOOL' B ; <>'CHAR' M = "I HAVE WON " ; 'INT' N1 , N2 ; FILL(BUFFER,1,30,MSG) ; L1 : PRINT(P) ; L2 : DISPLY(BUFFER,1,'UPB'MSG) ; ACCEPT(RESP,1,3) ; 'IF' ('ABS'RESP<1>'LT'241 'OR' 'ABS'RESP<1>'GT'244) 'OR' ('ABS'RESP<2>'NE'107) 'OR' ('ABS'RESP<3>'LT'241 'OR' 'ABS'RESP<3>'GT'247) 'THEN' 'GOTO' L2 'FI' ; INI(RESP,1,1,N1) ; INI(RESP,3,1,N2) ; 'IF' P'EQ'0 'OR' P-N2'LT'0 'THEN' 'GOTO' L2 'FI' ; P:=P-N2 ; NEWSIT(P,B) ; 'IF' 'NOT' B 'THEN' 'GOTO' L1 'FI' ; FILL(BUFFER,1,30,M) ; DISPLY(BUFFER,1,'UPB'M) 'END' ) /* // EXEC ALGOL72 'PROC'('REF'<>'INT','REF''BOOL') NEWSIT = (('REF'<>'INT' P , 'REF''BOOL' B) : 'BEGIN' <1:'UPB'P>'INT' PP , PPP ; PP:=P ; 'INT' MAX ; # MAXIMAL NUMBER OF BINARY DIGITS IN P # MAX := 0 ; 'INT' K ; K:=0 ; 'FOR' I 'TO' 'UPB'P 'DO' ( 'IF' MAX'LT'P 'THEN' MAX := P 'FI' ) ; 'WHILE' MAX 'NE' 0 'DO' ( K:=K+1 ; MAX:=MAX'OVER'2 ) ; MAX := K ; 'PROC' TRY = ( : 'BEGIN' PPP := PP ; 'INT' Z ; 'TO' MAX 'DO' ( Z:=0 ; 'FOR' I 'TO' 'UPB'P 'DO' ( K := PPP'MOD'2 ; PPP:=PPP'OVER'2 ; Z := Z+K ) ; 'IF' Z'MOD'2 'NE' 0 'THEN' B := 'FALSE' ; 'GOTO' END 'FI' ) ; B := 'TRUE' ; END : 'SKIP' 'END' ) ; 'FOR' I 'TO' 'UPB' P 'DO' ( 'TO' P 'DO' ( PP := PP-1 ; TRY ; 'IF' B 'THEN' 'GOTO' OUT 'FI' ) ; PP:=P ) ; OUT : P:=PP ; 'FOR' I 'TO' 'UPB' P 'DO' ( 'IF' P'NE'0 'THEN' B:='FALSE' ; 'GOTO' END 'FI' ) ; B:='TRUE' ., END : 'SKIP' 'END' ) /* // EXEC ALGOL72 'PROC' EXPL = ( : 'BEGIN' <1:80>'CHAR' BUFFER ; <>'CHAR' MSG1 = "WE HAVE 4 PEGS WITH RESPECTIVELY 7 , 5 , 3 , 1 RINGS" ; FILL(BUFFER,1,80,MSG1) ; DISPLY(BUFFER,1,'UPB'MSG1) ; <>'CHAR' MSG2 = "WE PLAY EACH AFTER THE OTHER" ; FILL(BUFFER,1,80,MSG2) ; DISPLY(BUFFER,1,'UPB'MSG2) ; <>'CHAR' MSG3 = "THE GAME CONSISTS OF REMOVING THE RINGS FROM ONLY ONE PEG AT T HE SAME TIME" ; FILL(BUFFER,1,80,MSG3) ; DISPLY(BUFFER,1,'UPB'MSG3) ; <>'CHAR' MSG31 = "THE WINNER IS THE GUY WHO REMOVES THE LAST RING" ; FILL(BUFFER,1,80,MSG31) ; DISPLY(BUFFER,1,'UPB'MSG31) ; <>'CHAR' MSG4 = "QUESTIONS ARE PEG,NUMBER ( YOU REMOVE FROM PEG ""PEG"" , ""NUM BER"" RINGS )" ; FILL(BUFFER,1,80,MSG4) ; DISPLY(BUFFER,1,'UPB'MSG4) ; FILL(BUFFER,1,80,"") ; DISPLY(BUFFER,1,1) 'END' ) /* // EXEC ALGOL72 'PROC'('REF'<>'INT') PRINT = (('REF'<>'INT' P) : 'BEGIN' <1:30>'CHAR' BUFFER ; <>'CHAR' MSG = "SITUATION :" ; FILL(BUFFER,1,30,MSG) ; DISPLY(BUFFER,1,'UPB'MSG) ; FILL(BUFFER,1,30,"") ; DISPLY(BUFFER,1,1) ; FILL(BUFFER,1,30,"PEG * : *") ; 'FOR' I 'TO' 'UPB'P 'DO' ( OUTI(BUFFER,5,1,I) ; OUTI(BUFFER,12,1,P) ; DISPLY(BUFFER,1,12) ) 'END' ) /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS DUPLIC // EXEC ALGOL72 'PR' 'PROC'('REF'<>'CHAR','INT','INT','INT') PUNCH2 'PR' DUPLIC : 'BEGIN' <1:80>'CHAR' BUF ; <1:1>'CHAR' RESP ; 'INT' STACK#ER# ; 'INT' KIND , NUMBER ; <>'CHAR' MSG1 = " REPLY 1 TO LIST , 2 TO PUNCH , 3 TO PUNCH AND LIST" ; <>'CHAR' MSG2 = " GIVE THE NUMBER OF DUPLICATES IN A ONE DIGIT NUMBER" ; <>'CHAR' MSG4 = " WHAT STACKER DO YOU WANT ? ( 1 OR 2 )" ; PAGE ; FILL(BUF,1,80,MSG1) ; L2 : DISPLY(BUF,1,'UPB'MSG1) ; ACCEPT(RESP,1,1) ; 'IF' 'ABS'RESP<1> 'LT' 241 'OR' 'ABS'RESP<1> 'GT' 243 'THEN' 'GOTO' L2 'FI' ; INI(RESP,1,1,KIND) ; 'IF' KIND 'NE' 1 'THEN' FILL(BUF,1,80,MSG4) ; RESP<1>:='REPR'255 ; 'WHILE' 'ABS'RESP<1>'NE'241'AND''ABS'RESP<1>'NE'242 'DO' ( DISPLY(BUF,1,'UPB'MSG4) ; ACCEPT(RESP,1,1) ) ; 'IF' 'ABS'RESP<1>'EQ'241 'THEN' STACK#ER# := 1 'ELSE' STACK#ER# := 2 'FI' 'FI' ; FILL(BUF,1,80,MSG2) ; L3 : DISPLY(BUF,1,'UPB'MSG2) ; ACCEPT(RESP,1,1) ; 'IF' 'ABS'RESP<1> 'LT' 240 'OR' 'ABS'RESP<1> 'GT' 250 'THEN' 'GOTO' L3 'FI' ; INI(RESP,1,1,NUMBER) ; 'BEGIN' <1:80>'CHAR' BUFFER ; 'INT' COUNT ; 'INT' SW ; SW := 0 ; 'PROC' EOF1 = ( : 'GOTO' L1 ) ; 'FOR' I 'DO' ( COUNT := I ; TAKE(BUFFER,1,80,EOF1) ; 'IF' KIND'NE'2 'THEN' WRITE(1,BUFFER,1,80) 'FI' ; 'IF' KIND'NE'1 'OR' NUMBER'GT'1 'THEN' TAPEW(7,BUFFER,1,80) 'FI' ) ; L1 : 'IF' KIND'EQ'1 'THEN' 'GOTO' L2 'FI' ; 'TO' NUMBER 'DO' ( 'PROC' EOF2 = ( : 'GOTO' L2 ) ; 'PROC' EOF3 = ( : 'GOTO' L3 ) ; WTM(7) ; REW(7) ; 'DO' ( TAPER(7,BUFFER,1,80,EOF2) ; 'IF' STACK#ER# 'EQ' 1 'THEN' PUNCH(BUFFER,1,80) 'ELSE' PUNCH2(BUFFER,1,80,SW) ; SW:=1 'FI' ) ; L2 : 'FOR' I 'TO' 80 'DO' ( BUFFER:='REPR'255) ; 'IF' STACK#ER# 'EQ' 1 'THEN' PUNCH(BUFFER,1,80) 'ELSE' PUNCH2(BUFFER,1,80,SW) 'FI' ; 'DO' ( TAKE(BUFFER,1,80,EOF3) ) ; L3 : 'SKIP' ) ; 'GOTO' L3 ; L2 : PAGE ; 'TO' NUMBER-1 'DO' ( 'PROC' EOF = ( : 'GOTO' L ) ; WTM(7) ; REW(7) ; 'DO' ( TAPER(7,BUFFER,1,80,EOF) ; WRITE(1,BUFFER,1,80) ) ; L : PAGE ) ; L3 : PAGE ; FILL(BUFFER,5,20," CARDS PROCESSED") ; OUTI(BUFFER,1,4,COUNT-1) ; WRITE(1,BUFFER,1,24) 'END' 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 1' ALLAH // EXEC ALGOL72 'PROC' LAH = ( : 'BEGIN' <1:80>'CHAR' A ; <>'CHAR' B = "OP100 EQUIP CHK SYSXXX=190" ; <>'CHAR' C = "CCSW=0210002AD00E000000 SNS=580000000000 CCB=002AB0"; <>'CHAR' D = "OP811I JOB AL001 CANCELED DUE TO CPU FAILURE" ; PAGE ; PUTS(B) ; PUTS(C) ; PAGE ; PUTS(D) ; FILL(A,1,80,B) ; DISPLY(A,1,'UPB'B) ; FILL(A,1,80,C) ; DISPLY(A,1,'UPB'C) ; FILL(A,1,80,D) ; DISPLY(A,1,'UPB'D) ; PAGE ; STOP 'END' ) /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 60 CHARACTER SET // EXEC FALGOL TEST : 'BEGIN' PUTS("60 CHARACTER SET") ; SKIP(2) ; FORMAT(3,"130,*(I3,X2,S1,X4)"); 'FOR' I 'FROM' 0 'TO' 255 'DO'( PUT(I,'REPR'I) ) 'END' /* // EXEC LNKEDT // EXEC /& // PAUSE BANDE PILOTE 2" 8LIGNES // JOB AL001 **TEST LOUIS 2'' // EXEC FALGOL # THIS IS NOT AN EFFICIENT MAIN PROGRAM BUT A DIDACTIC ONE # TEST:'BEGIN' ###################################################################### # THE SUM FOR I FROM 1 TO INFINITY OF G(I) , COMPUTED BY MEANS OF A # # SUITABLY REFINED EULER TRANSFORMATION . THE SUMMATION IS TERMINA- # # -TED WHEN THE ABSOLUTE VALUES OF THE TERMS OF THE TRANSFORMED # # SERIES ARE FOUND TO BE LES THAN "EPS" , "TIM" TIMES IN SUCCESSION. # # THIS TRANSFORMATION IS PARTICULARLY EFFICIENT IN THE CASE OF A # # SLOWLY CONVERGENT OR DIVERGENT ALTERNATING SERIES . # ###################################################################### # REMARK : ;X:=G(I); IS EQUIVALENT IN ALGOL-72 TO ;F(I,X); # 'PROC'('PROC'('INT','REF''REAL'),'REAL','INT','REF''REAL') EULER = ( ( 'PROC'('INT','REF''REAL') F , 'REAL' EPS , 'INT' TIM , 'REF''REAL' RES # RESULT OF EVALUATION # ) : 'BEGIN' 'INT' N , T ; 'REAL' MN , DS ; (/1:16/)'REAL' M ; 'REAL' SUM ; 'INT' I ; 'PROC' WHILE = ( : 'IF' 'ABS' DS 'LT' EPS 'THEN' T := T+1 'ELSE' T := 1 'FI' ) ; N .= 1 ; DS .= EPS ; F(1,SUM) ; M(/1/) .= SUM ; SUM .= SUM/2 ; WHILE ; 'FOR' I 'FROM' 2 'WHILE' T'LE'TIM 'DO' ( F(I,MN) ; 'FOR' K 'TO' N 'DO' ( DS .= MN ; MN .= ( DS + M(/K/) )/2 ; M(/K/) .= DS ) ; 'IF' 'ABS' MN 'LT' 'ABS' M(/N/) 'AND' N 'LT' 16 'THEN' N .= N+1 ; M(/N/) .= MN ; DS .= MN/2 'ELSE' DS .= MN 'FI' ; SUM .= SUM+DS ; WHILE ) ; RES := SUM 'END' ) ; #################################### # CALLS USING EULER SUMMATION # #################################### 'REAL' XX = 1 ; 'REAL' YY = 0 ; 'REAL' ZZ = 0.5 ; (/1:20/)'CHAR' TIMER ; <1:120>'CHAR' BUFFER ; <1:10>'PROC'('INT','REF''REAL') PROC ; 'INT' NUMBER = 5 ; 'REAL' RES , Z ; 'REAL' PI = 4*ARTAN(1) ; 'PROC'('INT','REF''REAL') F1 = (('INT' I , 'REF''REAL' F1I) : F1I:=(-1)**I/I ) ; 'PROC'('INT','REF''REAL') F2 = ( ('INT' I , 'REF''REAL' F2I ) : F2I:=((-1)**(I-1))*((ZZ**I)/I) ) ; 'PROC'('INT','REF''REAL') F3 = ( ('INT' I , 'REF''REAL' F3I ) : F3I:=(-1)**I/(2*I+COS(PI*I)) ) ; 'PROC'('INT','REF''REAL') F4 = ( ('INT' I , 'REF''REAL' F4I ) : F4I:=1/((I-1)*XX+1)-1/(I*XX+1) ) ; 'PROC'('INT','REF''REAL') F5 = ( ('INT' I , 'REF''REAL' F5I ) : F5I:=1/((I-1)*YY+1)-1/(I*YY+1) ) ; PROC<1>:=F1 ; PROC(/2/) := F2 ; PROC<3>:=F3 ; PROC<4>:=F4 ; PROC<5>:=F5 ; TIME(TIMER) ; WRITE(2,TIMER,1,20) ; 'FOR' I 'TO' NUMBER 'DO' ( EULER(PROC,1.0E-5,3,RES) ; TIME(TIMER) ; FILL(BUFFER,1,120,TIMER) ; OUTR(BUFFER,80,20,5,RES) ; WRITE(3,BUFFER,1,120) ) 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 1' RUNTIME ERRORS // OPTION LINK // EXEC ALGOL72 'PR' 'PROC'(<>'REAL','REF''REAL') EXT 'PR' MAIN : 'BEGIN' 'INT' N ; GETI(N) ; 'REAL' RES ; <1:N>'REAL' VECT ; 'FOR' I 'WHILE' I'LE'N 'DO' ( VECT:=-I ) ; EXT(VECT,RES) ; 'REAL' XX = 1 'OVER' 0 ; 'SKIP' 'END' /* // EXEC ALGOL72 'PR' 'PROC' BIDON 'PR' 'PROC'(<>'REAL','REF''REAL') EXT = ((<>'REAL' A , 'REF''REAL' C) : 'BEGIN' C:=0 ; BIDON ; PAGE ; 'FOR' I 'TO' 'UPB' A 'DO' ( C := C+A ) ; C := SQRT(C) 'END' ) /* // EXEC ALGOL72 'PROC' BIDON = ( : SKIP(5) ) /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // UPSI 11111111 // EXEC 10 /& // JOB AL001 **TEST LOUIS 1' CRASH // EXEC FALGOL CRASH : 'BEGIN' 'INT' I = 3 ; 'PROC' B ; 'PROC' C = ( : 'BEGIN' 'PROC' A = ( : PUTI(I) ) ; B:=A 'END' ) ; C ; <1:100>'REAL' D ; 'FOR' J 'TO' 100 'DO' ( D:=39 ) ; B # WHAT'S THE PRINTED VALUE ? # 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 1' // EXEC FALGOL TEST : 'BEGIN' 'PROC'('INT','REF''INT') F = (('INT' A , 'REF''INT' B) : 'IF' A 'GT' 100 'THEN' B:=A-1 'ELSE' F(A+2,B) ; F(B,B) 'FI' ) ; 'INT' RES ; 'FOR' I 'TO' 200 'DO' ( F(I,RES) ; PUTI(RES) ) 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 1' // EXEC FALGOL # SCOPE CONDITION NOT SATISFIED # SCOPE : 'BEGIN' 'REF''INT' XX ; (/1:10/)'CHAR' BUFFER ; 'BEGIN' 'INT' X ; X .= 1 ; XX .= X 'END' ; 'BEGIN' 'INT' Y ; Y .= 2 'END' ; BUFFER .= " XX = ** " ; OUTI(BUFFER,8,2,XX) ; # PRINT XX # SKIP(3) ; WRITE(1,BUFFER,1,10) 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK,DUMP // EXEC ALGOL72 # VERY DANGEROUS PROGRAM ( SCOPE CONDITION WITH PROCEDURES ) # 'PR' 'PROC'('PROC','REF''PROC') EXT 'PR' INT : 'BEGIN' 'INT' A = 1 ; 'INT' B ; (/1:80/)'CHAR' BUFFER ; 'PROC' PROC1 = ( : 'BEGIN' B:=B+1; OUTI(BUFFER,1,80,B) ; WRITE(1,BUFFER,1,80) 'END' ) ; 'PROC' PROC2 ; PROC2 .= PAGE ; B .= A ; EXT(PROC1,PROC2) ; SKIP(3) ; PROC2 'END' /* // EXEC ALGOL72 'PROC'('PROC','REF''PROC') EXT = (('PROC' A , 'REF''PROC' B ) : 'BEGIN' 'INT' C ; (/1:80/)'CHAR' BUFFER ; 'PROC' D = ( : 'BEGIN' OUTI(BUFFER,1,80,C) ; WRITE(1,BUFFER,1,80) 'END' ) ; A ; B ; A ; B .= D ; C .= 999 'END' ) /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 1' ALGOL : MAISON // OPTION LINK // EXEC ALGOL72 # PROBLEME DE LA PETITE MAISON # TZ : 'BEGIN' 'INT' VBD, KNP; GETI(VBD); GETI(KNP); <1:VBD>'BOOL'V; 'FOR'I'TO'VBD'DO'(V:='TRUE'); <1:VBD,1:KNP>'BOOL'K; 'FOR'I'TO'VBD'DO'('FOR'J'TO'KNP'DO'(K:='FALSE')); FORMAT(1,"*(3(I2),X2)"); <1:VBD>'INT'B, E, W; 'INT'J1; 'TO'VBD'DO'(GET(J1,B,E)); 'FOR'J1'TO'VBD'DO'(K>:='TRUE'; K>:='TRUE'); 'PROC' WEG = ( ('INT'M, I): 'IF' M'LE'VBD 'THEN' 'FOR'J'TO'VBD'DO' ( 'IF' K'AND'V 'THEN' W:=J; V:='FALSE'; 'IF' I'EQ'B'THEN' WEG(M+1,E) 'ELSE' WEG(M+1,B) 'FI'; V:='TRUE' 'FI' ) 'ELSE' FORMAT(3,"100,*(I5)"); 'FOR'J'TO'VBD'DO'(PUT(W)) 'FI' ); 'FOR'J'TO'KNP'DO'(WEG(1,J)) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC 7 4 1 1 2 2 1 3 3 2 3 4 1 4 5 2 3 6 2 4 7 3 4 /* /& // JOB AL001 **TEST LOUIS 1' // EXEC ALGOL72 # FICHIER BANDE TRIE SUR COL 1-5 COL 1-5 : NUMERO COL 11-50 : IDENTIFICATION COL 71-80 : SOLDE DU COMPTE FICHIER CARTE TRIE SUR COL 1-5 COL 1-5 : NUMERO COL 21-60 : IDENTIFICATION COL 61-70 : TRANSACTION SUR LE COMPTE ON DESIRE MODIFIER LE FICHIER EN FONCTION DES TRANSACTIONS DONNEES SUR CARTES ET LE RECOPIER SUR UNE NOUVELLE BANDE # 'PR' 'PROC'(<>'CHAR',<>'CHAR','REF''BOOL') EQ 'PR' TEST : 'BEGIN' <1:70>'CHAR' BUFC; # BUFFER CARTE # 'INT' NUMC ; # NUMERO CARTE # <21:60>'CHAR' IDC; # IDENTIFICATION CARTE # 'INT' TRANS; # TRANSACTION # <1:80>'CHAR' BUFT; # BUFFER BANDE # 'INT' NUMT; # NUMERO BANDE # <11:50>'CHAR' IDT; # IDENTIFICATION BANDE # 'INT' SOLDE ; # SOLDE SUR BANDE # 'INT' SYSIN=7 ; 'INT' SYSOUT=8 ; # NUMEROS DES BANDES # 'PROC' ERROR = ((<>'CHAR' MSG,'INT' NUM) : 'BEGIN' PAGE; PUTS(MSG); PUTI(NUM); STOP 'END' ) ; 'PROC' EOF1 = ( : # EOF ON CARDS # 'BEGIN' 'PROC' EOF = ( : 'BEGIN' WTM(SYSOUT); STOP 'END' ) ; 'DO' ( TAPER(SYSIN,BUFT,1,80,EOF); TAPEW(SYSOUT,BUFT,1,80) ) 'END' ) ; 'PROC' EOF2 = ( : # EOF ON TAPE # ERROR("END OF FILE ON INPUT TAPE",NUMC) ) ; 'PROC' INCARD = ( : # LECTURE D'UNE CARTE # 'BEGIN' TAKE(BUFC,1,70,EOF1) ; INI(BUFC,1,5,NUMC); TRC(BUFC,21,IDC,21,40); INI(BUFC,61,10,TRANS) 'END' ) ; 'PROC' INTAPE = ( : # LECTURE BANDE # 'BEGIN' TAPER(SYSIN,BUFT,1,80,EOF2); INI(BUFT,1,5,NUMT); TRC(BUFT,11,IDT,11,40) ; INI(BUFT,71,10,SOLDE) 'END' ) ; 'PROC' OUTAPE = ( : # ECRITURE BANDE # TAPEW(SYSOUT,BUFT,1,80) ) ; 'PROC' VERIF = ( : # VERIFICATION DES IDENTIFICATIONS # 'BEGIN' 'BOOL' A; EQ(IDC,IDT,A); 'IF' 'NOT'A 'THEN' ERROR("NO CORRESPONDANCE BETWEEN ID'S",NUMC) 'FI' 'END' ) ; # BEGINNING OF THE PROGRAM # 'DO' ( INCARD; NEW : INTAPE; 'IF' NUMT 'LT' NUMC 'THEN' OUTAPE; 'GOTO' NEW 'FI' ; 'IF' NUMT 'GT' NUMC 'THEN' ERROR("NO RECORD FOUND",NUMC)'FI'; VERIF; SOLDE := SOLDE+TRANS; 'IF' SOLDE 'LE' 0 'THEN' ERROR("SOLDE NEGATIF",NUMC) 'FI' ; OUTI(BUFT,71,10,SOLDE); OUTAPE ) 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 1' // OPTION LINK // EXEC ALGOL72 MAGIC : 'BEGIN' 'PROC'(<,>'INT') EDIT = ((<,>'INT' TAB) : 'BEGIN' 'INT' UPB = 'UPB' TAB ; <1:120>'CHAR' BUFFER ; <>'CHAR' MSG1 = "MAGIC ARRAY OF ORDER **" ; <>'CHAR' MSG2 = "SUM OF ELEMENTS OF LINES , COLUMNS AND DIAGONALS IS *****" ; PAGE ; SKIP(3) ; FILL(BUFFER,1,120,MSG1) ; OUTI(BUFFER,22,2,UPB) ; WRITE(1,BUFFER,1,'UPB'MSG1) ; 'FOR' I 'TO' 'UPB'MSG1 'DO' ( BUFFER:="-") ; WRITE(1,BUFFER,1,'UPB'MSG1) ; SKIP(2) ; 'FOR' I 'TO' UPB 'DO' ( 'FOR' J 'TO' UPB 'DO' ( OUTI(BUFFER,(J-1)*4+1,4,TAB) ) ; WRITE(1,BUFFER,1,UPB*4) ) ; SKIP(2) ; FILL(BUFFER,1,120,MSG2) ; OUTI(BUFFER,53,5,UPB*(UPB**2+1)'OVER'2) ; WRITE(1,BUFFER,1,'UPB'MSG2) 'END' ) ; 'FOR' N 'FROM' 3 'TO' 30 'DO' ( <1:N,1:N>'INT' A ; 'IF' 'ODD' N 'THEN' 'BEGIN' 'FOR' I 'TO' N 'DO' ( 'FOR' J 'TO' N 'DO' (A:=0 ) ) ; 'INT' NLIGNE ; NLIGNE:=1 ; 'INT' NCOL ; NCOL:=(N+1)'OVER'2 ; 'PROC' ENDLC = ( : 'BEGIN' 'IF' NLIGNE'EQ'0 'THEN' NLIGNE:=N 'FI' ; 'IF' NCOL'GT'N 'THEN' NCOL:=1 'FI' 'END' ) ; A:=1 ; 'FOR' I 'FROM' 2 'WHILE' I'LE'N**2 'DO' ( 'INT' N1 = NLIGNE ; 'INT' N2 = NCOL ; NLIGNE := NLIGNE-1 ; NCOL := NCOL+1 ; ENDLC ; 'DO' ( 'IF' A'NE'0 'THEN' NLIGNE := N1+1 ; NCOL:=N2 ; ENDLC 'ELSE' A:=I ; 'GOTO' SUITE 'FI' ) ; SUITE : 'SKIP' ) ; EDIT(A) 'END' 'ELSE' 'IF' N'MOD'4 'EQ'0 'THEN' 'FOR' I 'TO' N 'DO' ( 'FOR' J 'TO' N 'DO' ( 'IF' ((I'MOD'4'EQ'0 'OR' I'MOD'4'EQ'1) 'AND' (J'MOD'4'EQ'0 'OR' J'MOD'4'EQ'1)) 'OR' ((I'MOD'4'EQ'2 'OR' I'MOD'4'EQ'3) 'AND' (J'MOD'4'EQ'2 'OR' J'MOD'4'EQ'3)) 'THEN' A:=(I-1)*N+J 'ELSE' A:=N**2-((I-1)*N+J)+1 'FI' ) ) ; EDIT(A) 'FI' 'FI' ) 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS TOWERS OF HANOI 1' // OPTION LINK // EXEC ALGOL72 'PR' 'PROC'('INT','INT','INT') PRINT 'PR' TEST : 'BEGIN' 'PROC' HANOI = ( ('INT' N, P1, P2, P3) : 'IF' N 'GT' 0 'THEN' HANOI(N-1,P1,P3,P2); PRINT(N,P1,P3); HANOI(N-1,P2,P1,P3) 'FI' ) ; 'FOR' I 'TO' 5 'DO' ( PAGE; PUTI(I); SKIP(2); HANOI(I,1,2,3) ) 'END' /* // EXEC ALGOL72 'PROC' PRINT = ( ('INT' N, I, O) : 'BEGIN' FORMAT(3,"S10,I2,X2,S8,I2,X2,S6,I2"); PUT("MOVE PIECE",N,"FROM PEG",I,"TO PEG",O) 'END' ) /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST MICHAUX 5' // OPTION LINK,DUMP // EXEC ALGOL72 QUEENS : 'BEGIN' 'INT' N ; <1:10>'CHAR' BUFFER ; BUFFER := "NUMBER = *" ; 'INT' NSOL ; <1:13>'CHAR' BUF ; BUF := "*** SOLUTIONS" ; <1:118>'CHAR' B1 , B2 , B ; BLANK(B1) ; 'DO' ( GETI(N) ; PAGE ; OUTI(BUFFER,10,1,N) ; PUTS(BUFFER) ; <-(N-1):(N-1)>'BOOL' DM ; 'FOR' I 'FROM' -(N-1) 'TO' (N-1) 'DO' ( DM:='TRUE' ) ; <2:2*N>'BOOL' DD ; 'FOR' I 'FROM' 2 'TO' 2*N 'DO' ( DD:='TRUE' ) ; <1:N>'BOOL' LI ; 'FOR' I 'TO' N 'DO' ( LI:='TRUE' ) ; <1:N>'INT' ILIS ; 'FOR' I 'TO' N*3+1 'DO' ( B1:="." ) ; BLANK(B2) ; B2<1>:=":" ; 'FOR' I 'TO' N 'DO' ( B2:=":" ) ; 'PROC' OUT = ( : 'BEGIN' NSOL := NSOL+1 ; # NUMBER OF SOLUTIONS # SKIP(3) ; PUTS(B1) ; 'FOR' I 'TO' N 'DO' ( B := B2 ; 'INT' U = ILIS*3 ; B:="W" ; B:="W" ; PUTS(B) ; PUTS(B1) ) 'END' ) ; 'PROC'('INT') QUEEN = ( ( 'INT' X ) : 'BEGIN' 'REF''INT' I = ILIS ; 'FOR' Y 'TO' N 'DO' ( 'REF''BOOL' M = DM ; 'REF''BOOL' D = DD ; 'REF''BOOL' L = LI ; 'IF' L'AND'D'AND'M 'THEN' I:=Y ; 'IF' X 'EQ' N 'THEN' OUT 'ELSE' L:='FALSE' ; M:='FALSE' ; D:='FALSE' ; QUEEN(X+1) ; L:='TRUE' ; M:='TRUE' ; D:='TRUE' 'FI' 'FI' ) 'END' ) ; NSOL := 0 ; QUEEN(1) ; OUTI(BUF,1,3,NSOL) ; SKIP(3) ; SKIP(3) ; PUTS(BUF) ); DUMP 'END' /* INCLUDE AL$SPERR INCLUDE ALSPDUMP // EXEC LNKEDT // EXEC 1 2 3 4 5 6 7 8 /* /& // JOB AL001 **TEST LOUIS 1' // OPTION LINK // EXEC ALGOL72 # ERROR RECUPERATION IN ALGOL72 # TEST : 'BEGIN' FORMAT(3,"*(4(I4),L)"); 'REAL' Z; 'INT'I1=11; 'INT'ER4=36#OPEN#; 'PROC' E = ( : PUT(I1,-11,-12,-13) ); 'PROC' A = ( : 'BEGIN' 'INT'I2=22; 'INT'ER3=35#TAPE#; 'PROC' E = ( : 'BEGIN' PUT(I1,I2,-3,-4); 'GOTO' L 'END' ); 'PROC' B = ( : 'BEGIN' 'INT'I3=33; 'INT'ER1=51#LN#; 'INT'ER2=52#SQRT#; 'PROC' E1 = ( : 'BEGIN' 'INT'I4=44; PUT(I1,I2,I3,I4) 'END' ); 'PROC' E2 = ( : 'BEGIN' 'INT'I5=55; PUT(I1,I2,I3,I5); 'GOTO'L2 'END' ); 'PROC'E3=(:'BEGIN' PUT(I1,I2,I3,-1); 'GOTO'L3 'END' ) ; ON(ER1,E1); ON(ER2,E2); 'REAL'X=LN(-1.0); PUT(I1,I2,I3,-2); 'REAL'Y=SQRT(-1.0); PUTS("AA"); L2 : PUT(I1,I2,I3,-5); ON(ER1,E3); Z:=LN(-1.0) ; PUTS("FF") 'END' ); B; PUTS("BB"); L3 : PUT(I1,I2,-6,-7); ON(ER3,E); WTM(5); PUTS("CC") 'END' ); A; PUTS("DD"); L : PUT(I1,-8,-9,-10); ON(ER4,E); OPEN(5,"ABCDEF"); PUT(I1,-14,-15,-16) 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST // OPTION LINK // EXEC ALGOL72 L:'BEGIN' PAGE 'END' /* // EXEC LNKEDT // EXEC /& // JOB CC022 ***TEST // OPTION LINK // EXEC ALGOL72 TEST : 'BEGIN' <1:80>'CHAR' FORM, FORM1, FORM2, FORM3 ; GETS(FORM) ; # *(S80) # FORMAT(1,FORM) ; GET(FORM1,FORM2,FORM3) ; # 2(I4),C20,F7.2 # # 80,*(20(I4)) # # 120,2(X5,I4),L,F7.2,L,*(I4,X4) # 'INT' I1, I2 ; 'REAL' X ; FORMAT(1,FORM1) ; GET(I1,I2,X) ; <1:100>'INT' II ; FORMAT(1,FORM2) ; GET(II) ; FORMAT(3,FORM3) ; PUT(I1,I2,X,II) 'END' /* // ASSGN SYSRLB,X'192' // EXEC LNKEDT // EXEC *(S80) 2(I4),C20,F7.2 80,*(20(I4)) 120 , 2(X5,I4) , L , F7.2 , L , *(I4,X4) 11112222 33.99 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 /* /& // JOB AL001 **TEST LOUIS 2' // OPTION LINK // EXEC ALGOL72 # TO COMPACT AN ALGOL-72 PROGRAM ON THE PRINTER # TRUC : 'BEGIN' <1:80>'CHAR' BUFIN ; <1:132>'CHAR' BUFOUT ; 'INT' UPB IN = 'UPB'BUFIN ; 'INT' UPB OUT = 'UPB'BUFOUT ; 'INT' IN , OUT ; IN := 0 ; OUT := 1 ; 'PROC' EOF = ( : 'BEGIN' WRITE(1,BUFOUT,1,OUT-1) ; STOP 'END' ) ; 'PROC' GET = ( : 'IF' IN'EQ'0 'OR' IN'EQ'UPB IN 'THEN' TAKE(BUFIN,1,UPB IN,EOF) ; IN:=1 'ELSE' IN:=IN+1 'FI' ) ; 'PROC' PUT = ( : 'BEGIN' 'IF' OUT'EQ'UPB OUT+1 'THEN' WRITE(1,BUFOUT,1,UPB OUT) ; OUT:=1 'FI' ; BUFOUT:=BUFIN ; OUT:=OUT+1 'END' ) ; BEGIN : GET ; 'IF' BUFIN'EQ'" " 'THEN' 'GOTO' BEGIN 'FI' ; 'IF' BUFIN'EQ'"#" 'THEN' 'BEGIN' L : GET ; 'IF' BUFIN'EQ'"#" 'THEN' 'GOTO' BEGIN 'ELSE' 'GOTO' L 'FI' 'END' 'FI' ; 'IF' BUFIN'EQ'"""" 'THEN' 'BEGIN' L : PUT ; GET ; 'IF' BUFIN'EQ'"""" 'THEN' PUT ; 'GOTO' BEGIN 'ELSE' 'GOTO' L 'FI' 'END' 'ELSE' PUT ; 'GOTO' BEGIN 'FI' 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS TOWERS OF HANOI <1' // OPTION LINK,DUMP // EXEC ALGOL72 # THIS IS THE WELL KNOWN PROBLEM OF THE TOWERS OF HANOI WE HAVE THREE PEGS P1 , P2 , P3 AND N RINGS OF DIFFERENT DIAMETER AND WHICH ARE STRINGED IN CRESCENT ORDER ON PEG P1 . THE PROBLEM IS TO PUT THE N RINGS ON PEG P3 WITH THE AID OF PEG P2 AS WORKPEG , KNOWING A RING CAN ONLY TAKE PLACE ON A RING WHICH HAS A GREATER DIAMETER # HANOI : 'BEGIN' <>'CHAR' FORM#AT#1 = "X2,S8,I2"; <>'CHAR' FORM#AT#2 = "*(S13,I2,X1,S6,I2,X1,S5,I2,L)"; 'PROC' HANOI = ( ( 'INT' I, O, N ) : 'IF' N 'GT' 0 'THEN' HANOI(I,6-I-O,N-1) ; PUT("MOVE FROM PEG",I,"TO PEG",O,"PIECE",N); HANOI(6-I-O,O,N-1) 'FI' ) ; 'FOR' I 'TO' 6 'DO' ( PAGE ; FORMAT(3,FORM1) ; PUT("NUMBER =",I) ; SKIP(3) ; FORMAT(3,FORM2) ; HANOI(1,3,I) ) 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 120 CHARACTER SET UCS SYSLST,TN120,BLOCK // EXEC FALGOL TEST : 'BEGIN' PUTS("120 CHARACTER SET") ; SKIP(2) ; FORMAT(3,"130,*(I3,X2,S1,X4)"); 'FOR' I 'FROM' 0 'TO' 255 'DO'( PUT(I,'REPR'I) ) 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS // OPTION NOXREF # TO COMPACT AN ALGOL-72 PROGRAM ON THE PRINTER # TRUC : 'BEGIN' <1:80>'CHAR' BUFIN ; <1:132>'CHAR' BUFOUT ; 'INT' UPB IN = 'UPB'BUFIN ; 'INT' UPB OUT = 'UPB'BUFOUT ; 'INT' IN , OUT ; IN := 0 ; OUT := 1 ; 'PROC' EOF = ( : 'BEGIN' WRITE(1,BUFOUT,1,OUT-1) ; STOP 'END' ) ; 'PROC' GET = ( : 'IF' IN'EQ'0 'OR' IN'EQ'UPB IN 'THEN' TAKE(BUFIN,1,UPB IN,EOF) ; IN:=1 'ELSE' IN:=IN+1 'FI' ) ; 'PROC' PUT = ( : 'BEGIN' 'IF' OUT'EQ'UPB OUT+1 'THEN' WRITE(1,BUFOUT,1,UPB OUT) ; OUT:=1 'FI' ; BUFOUT:=BUFIN ; OUT:=OUT+1 'END' ) ; BEGIN : GET ; 'IF' BUFIN'EQ'" " 'THEN' 'GOTO' BEGIN 'FI' ; 'IF' BUFIN'EQ'"#" 'THEN' 'BEGIN' L : GET ; 'IF' BUFIN'EQ'"#" 'THEN' 'GOTO' BEGIN 'ELSE' 'GOTO' L 'FI' 'END' 'FI' ; 'IF' BUFIN'EQ'"""" 'THEN' 'BEGIN' L : PUT ; GET ; 'IF' BUFIN'EQ'"""" 'THEN' PUT ; 'GOTO' BEGIN 'ELSE' 'GOTO' L 'FI' 'END' 'ELSE' PUT ; 'GOTO' BEGIN 'FI' 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 ***TEST // OPTION LINK // EXEC ALGOL72 MAIN : 'BEGIN' 'PROC'('BOOL','BOOL') TRACE = (('BOOL' P , Q ) : 'IF' P 'THEN' 'IF' Q 'THEN' PUTS("N ") 'ELSE' PUTS("E ") 'FI' 'ELSE' 'IF' Q 'THEN' PUTS("O ") 'ELSE' PUTS("S ") 'FI' 'FI' ) ; 'PROC'('BOOL','BOOL','INT') SQUARE = (('BOOL' P , Q , 'INT' I): 'IF' I 'GT' 0 'THEN' SQUARE('NOT'P,Q,I-1) ; TRACE('NOT'P,Q) ; SQUARE(P,Q,I-1) ; TRACE(P,Q) ; SQUARE(P,Q,I-1) ; TRACE(P,'NOT'Q) ; SQUARE(P,'NOT'Q,I-1) 'FI' ) ; 'FOR' I 'TO' 3 'DO' ( PAGE ; SQUARE('TRUE','TRUE',I) ) 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS 5' * DO NOT CANCEL DURATION 5' // ASSGN SYSSLB,X'192' // EXEC FALGOL ############################ # CALCULATING DETERMINANTS # ############################ MAINPG : 'BEGIN' $MINOR$ $DETER$ ###################################################### <1:120>'CHAR' BUF1,BUF2 ; 'REAL' RES ; 'LONG''INT' TEMP ; ###################### # FIRST COMPUTATION # ###################### # IF A = (K-X)**(J-1) , 1 'LE'(I,J)'LE' N THEN DET(A) = + 'OR' - PRODUCT(X-X) , 1 'LE'(I 'LT' J)'LE' N # 'FOR' K 'TO' 5 'DO' ( 'FOR' N 'TO' 6 'DO' ( <1:N,1:N>'REAL' MAT ; <1:N>'INT' X ; TEMP:='LONG'1 ; 'FOR' I 'TO' N 'DO' ( X:=I ; RES:=K-X ; 'FOR' J 'TO' N 'DO' ( MAT:=RES**(J-1) ; 'IF' I 'GT' J 'THEN' TEMP:=TEMP*'LENG'(X-X) 'FI' ) ) ; ###################### ## DETER(MAT,RES) ; ## ###################### OUTLI(BUF1,(N-1)*20+1,20,TEMP) ; OUTFR(BUF2,(N-1)*20+1,20,1,RES) ) ; WRITE(1,BUF1,1,120) ; WRITE(3,BUF2,1,120) ) ; ###################### # SECOND COMPUTATION # ###################### # IDENTITY MATRICES # 'FOR' N 'TO' 7 'DO' ( <1:N,1:N>'REAL' MAT ; 'FOR' I 'TO' N 'DO' ( 'FOR' J 'TO' N 'DO' ( MAT:=1-'ABS''SIGN'(I-J)) ) ; ###################### ## DETER(MAT,RES) ; ## ###################### OUTFR(BUF1,(N-1)*10+1,10,1,RES) ) ; SKIP(3) ; WRITE(1,BUF1,1,70) 'END' /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS // OPTION LINK // EXEC ALGOL72 ########################################################## # PROCEDURE WICH CALCULATES A DETERMINANT BY RECURSIVITY # ########################################################## 'PROC'('REF'(/,/)'REAL','REF''REAL') DETER = (('REF'(/,/)'REAL' MAT , # MATRIX # 'REF''REAL' DET # DETERMINANT # ) : 'IF' 'UPB' MAT 'EQ' 1 'THEN' DET .= MAT(/1,1/) 'ELSE' 'BEGIN' 'INT' LWB = 'LWB'MAT ; 'INT' UPB = 'UPB'MAT ; 'INT' UPBM1 = UPB-1 ; (/LWB:UPBM1,LWB:UPBM1/)'REAL' MIN ; 'REAL' DET1 ; DET .= 0.0 ; 'FOR' I 'FROM' LWB 'TO' UPB 'DO' ( MINOR(MAT,1,I,MIN) ; DETER(MIN,DET1) ; DET .= DET+MAT(/1,I/)*(-1)**(1+I)*DET1 ) 'END' 'FI' ) ; /* // EXEC LNKEDT // EXEC /& // JOB AL001 **TEST LOUIS // OPTION LINK // EXEC ALGOL72 ###################################################### # PROCEDURE WICH CALCULATES A "MINOR" FROM A MATRIX # ###################################################### 'PROC'('REF'(/,/)'REAL','INT','INT','REF'(/,/)'REAL') MINOR = (('REF'(/,/)'REAL' MAT , # MATRIX # 'INT' I , # INDEX OF LINE TO SUPPRESS # 'INT' J , # INDEX OF COLUMN TO SUPPRESS # 'REF'(/,/)'REAL' MIN # MINOR # ) : 'BEGIN' 'FOR' K 'TO' I-1 'DO' ( 'FOR' L 'TO' J-1 'DO' ( MIN(/K,L/) .= MAT(/K,L/) ) ; 'FOR' L 'FROM' J+1 'TO' 'UPB' MAT 'DO' ( MIN(/K,L-1/) .= MAT(/K,L/) ) ) ; 'FOR' K 'FROM' I+1 'TO' 'UPB' MAT 'DO' ( 'FOR' L 'FROM' 1 'TO' J-1 'DO' ( MIN(/K-1,L/) .= MAT(/K,L/) ) ; 'FOR' L 'FROM' J+1 'TO' 'UPB' MAT 'DO' ( MIN(/K-1,L-1/) .= MAT(/K,L/) ) ) 'END' ) ; /* // EXEC LNKEDT // EXEC /&