Google
 

Trailing-Edge - PDP-10 Archives - decuslib20-02 - decus/20-0028/syntax.sno
There are 2 other files named syntax.sno in the archive. Click here to see a list.
* 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

* A series of patterns is built, culminating
* a pattern that matches SNOBOL4 statements.


* Card images are then read in and processed.

	DEFINE('opt(pattern)')

	OPSYN('^','opt',1)
	OPSYN('%','SPAN',1)
	OPSYN('@','ANY',1)
	leftbr _ @'<['
	rightbr _ @'>]'
	lower _ 'abcdefghijklmnopqrstuvwxyz'
	UPPER _ 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
	letters _ UPPER lower
	digits _ '0123456789'
	alphanumerics _ letters digits
	blanks _ %'	 '
	integer _ %digits
	real _ integer '.' ^integer
	identifier _ @letters ^%(alphanumerics '.')
	opsyms _ '+-/*$%#@^\!'
	unary _ @opsyms
	binary _ unary ! '**'
	binaryop _ blanks ^(binary blanks)
	unqalpha _ &ALPHABET
	unqalpha '"' _
	unqalpha "'" _
	dliteral _ '"' ^%(unqalpha "'") '"'
	sliteral _ "'" ^%(unqalpha '"') "'"
	literal _ sliteral ! dliteral ! integer ! real
	element _ ^unary (identifier ! literal ! *function.call
+	! '(' *expression ')' ! *array.ref)
	operation _ *element binaryop (*element
+	! *expression)
	expression _ ^blanks (*element ! *operation
+	! null) ^blanks
	arglist _ *expression ^(',' *arglist)
	function.call _ identifier '(' *arglist ')'
	array.ref _ identifier leftbr *arglist rightbr
	label _ @alphanumerics (BREAK(' ;')
+	! REM)
	label.field _ ^label
	goto _ '(' expression ')' ! leftbr expression
+	rightbr
	goto.field _  ^(blanks ':'
+	FENCE ^blanks (goto ! 'S' goto
+	! 'F' goto ! 'S' goto ^blanks 'F'
+	 goto ! 'F' goto ^blanks 'S' goto)
+	^blanks)
	eql _ @'=_'
	rule _ ^(blanks element (blanks eql ^(blanks
+	 expression) ! ^(blanks expression ^(blanks eql
+	^(blanks expression)) )))
	eos _ RPOS(0) ! ';'
	statement _ label.field rule goto.field eos


* 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.
*

	INPUT(.input,5,72)
	&ANCHOR _ 1
	&TRIM _ 1
	&FULLSCAN _ 1
	eof _
	space _ DUPL(' ',5)
	line _
	comment _ @'*-'
	continue _ @'+.' . cc
readi	image _ input	:F(END)
	OUTPUT _ space line
	image comment		:F(readc)S(readi)
nextst	IDENT(eof)		:F(END)
	OUTPUT _ space line
	image _ line
readc	line _ input	:F(endgam)
	line comment		:S(print)
	line continue _ 	:F(anlyz)
	OUTPUT _ space cc line
	image _ image line	:(readc)
anlyz	image statement _ 	:F(error)
	DIFFER(image)	:S(anlyz)F(nextst)
error	OUTPUT _ '<<< syntatic error >>>'	:(nextst)
print	OUTPUT _ space line	:(readc)
endgam	eof _ 1	:(anlyz)

*
opt	opt _ null ! pattern	:(RETURN)
END
    
	X  Y+Z
	ELEMENT<I,J>_ ELEMENT<I,-J> + ELEMENT<-I,J>
	A<X,Y,Z + 1> _ F(X,STRUCTURE.BUILD(TYPE,LENGHT + 1))
SETUP	PAT1 _ (BREAK(',:') $ FIRST ! SPAN(' .) $ SECOND
.	. VALUE ARBNO(BAL ! LEN(1)) :($SWITCH)
	DEFINE('F(X,Y))
	L _ LT(N,B<J> L + 1
NEWONE.TRIAL	X _ \COORD<1,K> X * X
	TRIM(INPUT) PAT1 :S(OK) :F(BAD)
	X _ 3.01; Y = 2.   ; Z = X * -Y
	RANDOM _ (RAN.VAR * N) / 10000
	OUTPUT = ''
	F('',"",)	=
	F('',"",) = "'