SNOBOL4 (VERSION 3.4.3, JAN. 16, 1971) DIGITAL EQUIPMENT CORP., PDP-10 * This program is a syntatic recognizer for snobol4 * statements. The syntax used is for Version 3 with * the PDP-10 graphics. * * L.P. Wade at TYMSHARE 5-9-70 1 * A series of patterns is built, culminating * a pattern that matches SNOBOL4 statements. 2 3 * Card images are then read in and processed. 4 5 DEFINE('opt(pattern)') 6 7 OPSYN('^','opt',1) 8 OPSYN('%','SPAN',1) 9 OPSYN('@','ANY',1) 10 leftbr _ @'<[' 11 rightbr _ @'>]' 12 lower _ 'abcdefghijklmnopqrstuvwxyz' 13 UPPER _ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 14 letters _ UPPER lower 15 digits _ '0123456789' 16 alphanumerics _ letters digits 17 blanks _ %' ' 18 integer _ %digits 19 real _ integer '.' ^integer 20 identifier _ @letters ^%(alphanumerics '.') 21 opsyms _ '+-/*$%#@^\!' 22 unary _ @opsyms 23 binary _ unary ! '**' 24 binaryop _ blanks ^(binary blanks) 25 unqalpha _ &ALPHABET 26 unqalpha '"' _ 27 unqalpha "'" _ 28 dliteral _ '"' ^%(unqalpha "'") '"' 29 sliteral _ "'" ^%(unqalpha '"') "'" 30 literal _ sliteral ! dliteral ! integer ! real 31 element _ ^unary (identifier ! literal ! *function.call 31 + ! '(' *expression ')' ! *array.ref) 32 operation _ *element binaryop (*element 32 + ! *expression) 33 expression _ ^blanks (*element ! *operation 33 + ! null) ^blanks 34 arglist _ *expression ^(',' *arglist) 35 function.call _ identifier '(' *arglist ')' 36 array.ref _ identifier leftbr *arglist rightbr 37 label _ @alphanumerics (BREAK(' ;') 37 + ! REM) 38 label.field _ ^label 39 goto _ '(' expression ')' ! leftbr expression 39 + rightbr 40 goto.field _ ^(blanks ':' 40 + FENCE ^blanks (goto ! 'S' goto 40 + ! 'F' goto ! 'S' goto ^blanks 'F' 40 + goto ! 'F' goto ^blanks 'S' goto) 40 + ^blanks) 41 eql _ @'=_' 42 rule _ ^(blanks element (blanks eql ^(blanks 42 + expression) ! ^(blanks expression ^(blanks eql 42 + ^(blanks expression)) ))) 43 eos _ RPOS(0) ! ';' 44 statement _ label.field rule goto.field eos 45 46 * The recognizing program follows. Comment and continue * cards are not processed. If an erroneous statement * is encountered in a string of statemtns separated by * semicolons, subsequent statements in that string are * not processed. * 47 48 INPUT(.input,5,72) 49 &ANCHOR _ 1 50 &TRIM _ 1 51 &FULLSCAN _ 1 52 eof _ 53 space _ DUPL(' ',5) 54 line _ 55 comment _ @'*-' 56 continue _ @'+.' . cc 57 readi image _ input :F(END) 58 OUTPUT _ space line 59 image comment :F(readc)S(readi) 60 nextst IDENT(eof) :F(END) 61 OUTPUT _ space line 62 image _ line 63 readc line _ input :F(endgam) 64 line comment :S(print) 65 line continue _ :F(anlyz) 66 OUTPUT _ space cc line 67 image _ image line :(readc) 68 anlyz image statement _ :F(error) 69 DIFFER(image) :S(anlyz)F(nextst) 70 error OUTPUT _ '<<< syntatic error >>>' :(nextst) 71 print OUTPUT _ space line :(readc) 72 endgam eof _ 1 :(anlyz) 73 * 74 opt opt _ null ! pattern :(RETURN) 75 END NO ERRORS DETECTED IN SOURCE PROGRAM X _ Y+Z <<< syntatic error >>> ELEMENT_ ELEMENT + ELEMENT<-I,J> <<< syntatic error >>> A _ F(X,STRUCTURE.BUILD(TYPE,LENGHT + 1)) SETUP PAT1 _ (BREAK(',:') $ FIRST ! SPAN(' .) $ SECOND . . VALUE ARBNO(BAL ! LEN(1)) :($SWITCH) DEFINE('F(X,Y)) <<< syntatic error >>> L _ LT(N,B L + 1 <<< syntatic error >>> NEWONE.TRIAL X _ \COORD<1,K> X * X TRIM(INPUT) PAT1 :S(OK) :F(BAD) <<< syntatic error >>> X _ 3.01; Y = 2. ; Z = X * -Y RANDOM _ (RAN.VAR * N) / 10000 OUTPUT = '' F('',"",) = F('',"",) = "' <<< syntatic error >>> NORMAL TERMINATION AT LEVEL 0 LAST STATEMENT EXECUTED WAS 60 SNOBOL4 STATISTICS SUMMARY- 1614 MS. COMPILATION TIME 2232 MS. EXECUTION TIME 197 STATEMENTS EXECUTED, 47 FAILED 0 ARITHMETIC OPERATIONS PERFORMED 50 PATTERN MATCHES PERFORMED 11 REGENERATIONS OF DYNAMIC STORAGE 17 READS PERFORMED 22 WRITES PERFORMED 42 K CORE USED, 1061 FREE WORDS LEFT 11.33 MS. AVERAGE PER STATEMENT EXECUTED