bootstrap

diff genesis/ometa/ometa-interpreter.church @ 754:cbea15e41381

remove more ometa-compiler and parser-generator files
author John Leuner <jewel@subvert-the-dominant-paradigm.net>
date Sun Mar 27 18:19:10 2011 +0200 (13 months ago)
parents 526dd0f072f9
children 42c043932622
line diff
     1.1 --- a/genesis/ometa/ometa-interpreter.church	Sun Mar 27 13:51:45 2011 +0200
     1.2 +++ b/genesis/ometa/ometa-interpreter.church	Sun Mar 27 18:19:10 2011 +0200
     1.3 @@ -8,19 +8,9 @@
     1.4  		variables
     1.5  		action-closures
     1.6  
     1.7 -get-variable-position rule-variables var
     1.8 -	position (intern var) (reverse rule-variables)
     1.9 -
    1.10 -get-variable-position-new rule-variables sym
    1.11 +get-variable-position rule-variables sym
    1.12  	(position sym rule-variables)
    1.13  
    1.14 -global ometa-church-parser = nil
    1.15 -
    1.16 -ometa-parse-array-with-interpreter array
    1.17 -	if (null? ometa-church-parser)
    1.18 -		ometa-church-parser = new 'new-church-parser :church-grammar-file-name "genesis/church/church.g"
    1.19 -	parse-array ometa-church-parser array
    1.20 -
    1.21  replace-variables-with-positions variables form quoting
    1.22  	if (null? form)
    1.23  		form
    1.24 @@ -54,11 +44,442 @@
    1.25  						else
    1.26  							`[quote ,form]
    1.27  					else
    1.28 -						pos = get-variable-position-new variables form
    1.29 +						pos = get-variable-position variables form
    1.30  						if (null? pos)
    1.31  							error "var not found " (list form variables)
    1.32  						`[_ometa_get_variable ,pos]
    1.33  
    1.34  
    1.35 +class ometa-interpreter
    1.36 +	with-slots
    1.37 +		data-stack
    1.38 +		rules
    1.39 +		rules-map
    1.40 +		memo
    1.41 +		actions
    1.42 +	init
    1.43 +		self.memo = new 'native-dictionary
    1.44 +		create self.memo 10000
    1.45 +		self.actions = nil
    1.46 +	reset-memo
    1.47 +		self.memo = new 'native-dictionary
    1.48 +		create self.memo 10000		
    1.49 +	rewrite-instruction rule form
    1.50 +;		print "rewrite-instruction 3"
    1.51 +;		print form
    1.52 +		case (first form)
    1.53 +			and
    1.54 +				new-forms =  [(rewrite-instruction self rule x) for x in (cdr form)]
    1.55 +				`[and |,(remove nil new-forms)]
    1.56 +			or
    1.57 +				new-forms =  [(rewrite-instruction self rule x) for x in (cdr form)]
    1.58 +				`[or |,(remove nil new-forms)]
    1.59 +			set
    1.60 +;				print "set"
    1.61 +;				print form
    1.62 +;				print rule.variables
    1.63 +				rhs = third form
    1.64 +				variable-position = get-variable-position rule.variables (intern (second form))
    1.65 +				`[set ,variable-position ,(rewrite-instruction self rule rhs)]
    1.66 +			app
    1.67 +				rule-name = second form
    1.68 +				if (and (string? rule-name) (string-equal? rule-name "token"))
    1.69 +					return-from rewrite-instruction	`[app-token ,rule-name ,(coerce rule-name 'array)]
    1.70 +				if (eq? rule-name 'token)
    1.71 +					str = (third form)
    1.72 +					`[app-token ,str ,(coerce str 'array)]
    1.73 +				else
    1.74 +					if (eq? rule-name 'exactly)
    1.75 +						args = cddr form
    1.76 +						str = third form
    1.77 +						if (cons? str)
    1.78 +							str = second str
    1.79 +						`[match-char ,(char-at str 0)]
    1.80 +					else
    1.81 +;						print form
    1.82 +						if (== (length form) 3)
    1.83 +							if (and (cons? (third form)) (eq? (first (third form)) 'string))
    1.84 +								`[app-with-string ,(intern (second form)) ,(second (third form))]
    1.85 +							else
    1.86 +								if (or (null? (third form)) (or (null? (third form)) (eq? 'nil (third form)) (string-equal? (third form) "nil")))
    1.87 +									if (symbol? (second form))
    1.88 +										`[app-with-nil ,(second form)]
    1.89 +									else
    1.90 +										`[app-with-nil ,(intern (second form))]
    1.91 +								else
    1.92 +									`[app-with-argument ,(second form) ,(get-variable-position rule.variables (intern (third form)))]
    1.93 +						else
    1.94 +							if (string? (second form))
    1.95 +								`[app ,(intern (second form))]
    1.96 +							else
    1.97 +								form
    1.98 +			act
    1.99 +;				print "*** rewrite act"
   1.100 +;				print rule.variables
   1.101 +;				print form
   1.102 +;				print (coerce (second form) 'array)
   1.103 +				forms = (parse-sexps-from-array (coerce (second form) 'array))
   1.104 +				if (null? forms)
   1.105 +					error "bad sexp" form
   1.106 +				act-form = first forms
   1.107 +				res = `[act ,(replace-variables-with-positions rule.variables act-form nil)]
   1.108 +				res
   1.109 +			many
   1.110 +				`[many ,(rewrite-instruction self rule (second form))]
   1.111 +			many1
   1.112 +				`[many1 ,(rewrite-instruction self rule (second form))]
   1.113 +			not
   1.114 +				`[not ,(rewrite-instruction self rule (second form))]
   1.115 +			lookahead
   1.116 +				`[not [not ,(rewrite-instruction self rule (second form))]]
   1.117 +			loadarg
   1.118 +				`[loadarg]
   1.119 +			else
   1.120 +				error "unhandled form" form
   1.121 +	parse rule-name stream frame-pointer stack-pointer
   1.122 +			memo = self.memo
   1.123 +			inputpos = stream.input-position
   1.124 +			found = has? memo rule-name
   1.125 +			mark stream
   1.126 +;			print "** parse"
   1.127 +;			print rule-name
   1.128 +			if found
   1.129 +				lookup = get memo rule-name nil
   1.130 +				lookup2 = get lookup inputpos nil
   1.131 +				if (null? lookup2)
   1.132 +					result = (actual-parse self rule-name stream  frame-pointer stack-pointer)
   1.133 +					put lookup inputpos (list result stream.input-position)
   1.134 +;					print "put result 1"
   1.135 +;					print (list result stream.input-position)
   1.136 +					pop-mark stream
   1.137 +					result
   1.138 +				else
   1.139 +					if (not (eq? (car lookup2) o-fail))
   1.140 +;						print "got memo "
   1.141 +;						print lookup2
   1.142 +						reset-to stream (second lookup2)
   1.143 +					else
   1.144 +						reset-to-mark stream
   1.145 +					pop-mark stream
   1.146 +					car lookup2
   1.147 +			else
   1.148 +				result = (actual-parse self rule-name stream frame-pointer stack-pointer)
   1.149 +				d = new 'native-dictionary
   1.150 +				create d 100
   1.151 +				put d inputpos (list result stream.input-position)
   1.152 +				put memo rule-name d
   1.153 +;				print "put result 2"
   1.154 +;				print rule-name
   1.155 +;				print result
   1.156 +				pop-mark stream
   1.157 +				result			
   1.158 +	actual-parse rule-name stream frame-pointer stack-pointer
   1.159 +		lookup = get self.rules-map rule-name nil
   1.160 +		if (null? lookup)
   1.161 +;			out "** primitive parse "
   1.162 +;			print rule-name
   1.163 +			prim-result = apply rule-name self stream
   1.164 +;			print prim-result
   1.165 +;			print (remaining stream)
   1.166 +			prim-result
   1.167 +		else
   1.168 +			r = lookup
   1.169 +			frame-pointer = stack-pointer
   1.170 +			stack-pointer = + (+ stack-pointer (length r.variables)) 1
   1.171 +			loop
   1.172 +				for i from frame-pointer to stack-pointer
   1.173 +				do
   1.174 +					self.data-stack[i] = nil
   1.175  
   1.176 +			result = interpret self r.instructions stream frame-pointer stack-pointer
   1.177 +;			print result
   1.178 +;			print (remaining stream)
   1.179 +			result
   1.180 +	parse-with-arg rule-name stream frame-pointer stack-pointer arg
   1.181 +;		print "** parse with arg"
   1.182 +;		print rule-name
   1.183 +;		print arg
   1.184 +		lookup = get self.rules-map rule-name nil
   1.185 +		if (null? lookup)
   1.186 +			apply rule-name self stream arg
   1.187 +		else
   1.188 +			r = lookup
   1.189 +			frame-pointer = stack-pointer
   1.190 +			stack-pointer = + (+ stack-pointer (length r.variables)) 1
   1.191 +			loop
   1.192 +				for i from frame-pointer to stack-pointer
   1.193 +				do
   1.194 +					self.data-stack[i] = nil
   1.195  
   1.196 +			self.data-stack[ frame-pointer ] = arg
   1.197 +			interpret self r.instructions stream frame-pointer stack-pointer
   1.198 +	seq stream arg
   1.199 +		if (o-fail? arg)
   1.200 +			return-from seq o-fail
   1.201 +;		print "in seq"
   1.202 +;		print arg
   1.203 +		mark stream
   1.204 +		loop
   1.205 +			for x in arg
   1.206 +			do
   1.207 +				str = x
   1.208 +;				print "seq str"
   1.209 +;				print str
   1.210 +;				print "next"
   1.211 +				if (string? str)
   1.212 +					print "is string"
   1.213 +					error "not string" str
   1.214 +				else
   1.215 +					if (at-end? stream)
   1.216 +						reset-to-mark stream
   1.217 +						pop-mark stream
   1.218 +						return-from seq o-fail
   1.219 +					c = read-next stream
   1.220 +					if (not (eq? c str))
   1.221 +						reset-to-mark stream
   1.222 +						pop-mark stream
   1.223 +						return-from seq o-fail
   1.224 +
   1.225 +		pop-mark stream
   1.226 +;		print "in seq ret"
   1.227 +		arg
   1.228 +	anything stream
   1.229 +		if (at-end? stream)
   1.230 +			o-fail
   1.231 +		else
   1.232 +			read-next stream
   1.233 +	cnewline stream
   1.234 +		if (at-end? stream)
   1.235 +			o-fail
   1.236 +		else
   1.237 +			c = peek stream
   1.238 +;			assert (== (peek-distance stream) 1) (list "bad peek distance" (peek-distance stream))
   1.239 +			x = nil
   1.240 +			inline (set! |x| (|church-make-character| 10))
   1.241 +			if (eq? c x)
   1.242 +				read-next stream
   1.243 +			else
   1.244 +				unpeek stream
   1.245 +				o-fail
   1.246 +	stringquote stream
   1.247 +		if (at-end? stream)
   1.248 +			o-fail
   1.249 +		else
   1.250 +			c = peek stream
   1.251 +;			assert (== (peek-distance stream) 1) (list "bad peek distance" (peek-distance stream))
   1.252 +			x = nil
   1.253 +			inline (set! |x| (|church-make-character| 34))
   1.254 +			if (eq? c x)
   1.255 +				read-next stream
   1.256 +			else
   1.257 +				unpeek stream
   1.258 +				o-fail
   1.259 +	digit stream
   1.260 +		if (>= (remaining-byte-count stream) 1)
   1.261 +			c = peek stream
   1.262 +;			assert (== (peek-distance stream) 1) (list "bad peek distance" (peek-distance stream))
   1.263 +			if (and (char? c) (digit? c))
   1.264 +				read-next stream
   1.265 +				c
   1.266 +			else
   1.267 +				unpeek stream
   1.268 +				o-fail
   1.269 +		else
   1.270 +			o-fail
   1.271 +	letter stream
   1.272 +		if (>= (remaining-byte-count stream) 1)
   1.273 +			c = peek stream
   1.274 +;			assert (== (peek-distance stream) 1) (list "bad peek distance" (peek-distance stream))
   1.275 +			if (and (char? c) (letter? c))
   1.276 +				read-next stream
   1.277 +			else
   1.278 +				unpeek stream
   1.279 +				o-fail
   1.280 +		else
   1.281 +			o-fail
   1.282 +	interpret-action form frame-pointer stack-pointer quoting
   1.283 +;		print "interpret-action"
   1.284 +;		print form
   1.285 +;		print frame-pointer
   1.286 +		typecase form
   1.287 +			cons
   1.288 +				if (eq? (first form) 'quote)
   1.289 +					second form
   1.290 +				else
   1.291 +					if (eq? (first form) '_ometa_get_variable)
   1.292 +;						print "getting variable"
   1.293 +;						print (second form)
   1.294 +;						print self.data-stack[frame-pointer]
   1.295 +						self.data-stack[+ frame-pointer (second form)]
   1.296 +					else
   1.297 +						collector = nil
   1.298 +						loop
   1.299 +							for x in form
   1.300 +							do
   1.301 +								if (and (cons? x) (eq? (first x) '_ometa_get_variable_splice))
   1.302 +									mylist = self.data-stack[+ frame-pointer (second x)]
   1.303 +									collector = append! (reverse! mylist) collector
   1.304 +								else
   1.305 +									push (interpret-action self x frame-pointer stack-pointer quoting) collector
   1.306 +
   1.307 +;						print collector
   1.308 +						reverse! collector
   1.309 +			else
   1.310 +				error "bad type in interpret-action" form
   1.311 +	interpret ins stream frame-pointer stack-pointer
   1.312 +;						out "<-------- "
   1.313 +;						if (not (at-end? stream))
   1.314 +;							print (remaining stream) 
   1.315 +;						print ins
   1.316 +;						print stream.input-position
   1.317 +;					print "stack-pointer"
   1.318 +;					print stack-pointer
   1.319 +;					print ">"
   1.320 +;					loop
   1.321 +;						for i from 0 to frame-pointer
   1.322 +;						do
   1.323 +;							print self.data-stack[i]
   1.324 +;
   1.325 +;					print ">>"
   1.326 +;					loop
   1.327 +;						for i from frame-pointer to stack-pointer
   1.328 +;						do
   1.329 +;							print self.data-stack[i]
   1.330 +;
   1.331 +					case (first ins)
   1.332 +						app (parse self (second ins) stream frame-pointer stack-pointer)
   1.333 +						and
   1.334 +							args = rest ins
   1.335 +							if (null? args)
   1.336 +								true
   1.337 +							else
   1.338 +								mark stream
   1.339 +								answer = nil
   1.340 +								loop
   1.341 +									for x in args
   1.342 +									do (answer = interpret self x stream frame-pointer stack-pointer)
   1.343 +									when (o-fail? answer)
   1.344 +									do
   1.345 +										reset-to-mark stream
   1.346 +										pop-mark stream
   1.347 +										return-from interpret o-fail
   1.348 +
   1.349 +								pop-mark stream
   1.350 +								answer
   1.351 +						or
   1.352 +							mark stream
   1.353 +							args = rest ins
   1.354 +							if (null? args)
   1.355 +								error "bad or" ins
   1.356 +							loop
   1.357 +								for x in args
   1.358 +								do
   1.359 +									reset-to-mark stream
   1.360 +									answer = interpret self x stream frame-pointer stack-pointer
   1.361 +									if (not (o-fail? answer))
   1.362 +										pop-mark stream
   1.363 +										return-from interpret answer
   1.364 +
   1.365 +							pop-mark stream
   1.366 +							o-fail
   1.367 +						many
   1.368 +							answer = nil
   1.369 +							loop
   1.370 +								do
   1.371 +									mark stream
   1.372 +									v = interpret self (second ins) stream frame-pointer stack-pointer
   1.373 +									if (o-fail? v)
   1.374 +										reset-to-mark stream
   1.375 +										pop-mark stream
   1.376 +										return-from interpret (reverse! answer)
   1.377 +									push v answer
   1.378 +									pop-mark stream
   1.379 +
   1.380 +						many1
   1.381 +							x = second ins
   1.382 +							v = interpret self x stream frame-pointer stack-pointer
   1.383 +							if (o-fail? v)
   1.384 +								o-fail
   1.385 +							else
   1.386 +								answer = list v
   1.387 +								loop
   1.388 +									do
   1.389 +										mark stream
   1.390 +										v = interpret self x stream frame-pointer stack-pointer
   1.391 +										if (o-fail? v)
   1.392 +											reset-to-mark stream
   1.393 +											pop-mark stream
   1.394 +											return-from interpret (reverse! answer)
   1.395 +										push v answer
   1.396 +										pop-mark stream
   1.397 +
   1.398 +						act
   1.399 +;							print "act"
   1.400 +;							print ins
   1.401 +							v = interpret-action self (second ins) frame-pointer stack-pointer nil
   1.402 +;							print "interpret-action "
   1.403 +;							print v
   1.404 +							v
   1.405 +						set
   1.406 +							index = second ins
   1.407 +							x = third ins
   1.408 +							v = interpret self x stream frame-pointer stack-pointer
   1.409 +							self.data-stack[+ frame-pointer index] = v
   1.410 +							v
   1.411 +						not
   1.412 +							mark stream
   1.413 +							if (o-fail? (interpret self (second ins) stream frame-pointer stack-pointer))
   1.414 +								pop-mark stream
   1.415 +								true
   1.416 +							else
   1.417 +								reset-to-mark stream
   1.418 +								pop-mark stream
   1.419 +								o-fail
   1.420 +						app-token
   1.421 +							str = second ins
   1.422 +							char-array = third ins
   1.423 +							len = length char-array
   1.424 +							if (>= (remaining-byte-count stream) len)
   1.425 +								input-position = stream.input-position
   1.426 +								native1 = char-array.native-array
   1.427 +								native2 = stream.input-array.native-array
   1.428 +								result = 0
   1.429 +								inline (set! result (tf (call-c memcmp native1 (+ native2 (* (uf input-position) CHURCH_WORD_SIZE)) (* (uf len) CHURCH_WORD_SIZE))))
   1.430 +								if (== result 0)
   1.431 +									read-ahead stream len 
   1.432 +;									print "app-token returning"
   1.433 +;									print str
   1.434 +									str
   1.435 +								else
   1.436 +									;print "app-token failed"
   1.437 +									;print (remaining stream)
   1.438 +									o-fail
   1.439 +							else
   1.440 +								o-fail
   1.441 +						match-char
   1.442 +							if (>= (remaining-byte-count stream) 1)
   1.443 +								arg = second ins
   1.444 +								c = peek stream
   1.445 +;								assert (== (peek-distance stream) 1) (list "bad peek distance" (peek-distance stream))
   1.446 +								if (eq? c arg)
   1.447 +									read-next stream
   1.448 +								else
   1.449 +									unpeek stream
   1.450 +									o-fail
   1.451 +							else
   1.452 +								o-fail
   1.453 +						app-with-nil
   1.454 +							parse-with-arg self (second ins) stream frame-pointer stack-pointer nil
   1.455 +						app-with-argument
   1.456 +							parse-with-arg self (second ins) stream frame-pointer stack-pointer self.data-stack[ + frame-pointer (third ins)]
   1.457 +						app-with-string
   1.458 +							parse-with-arg self (second ins) stream frame-pointer stack-pointer (third ins)
   1.459 +						loadarg
   1.460 +							self.data-stack[frame-pointer]
   1.461 +						else
   1.462 +							error "invalid ins" ins
   1.463 +
   1.464 +
   1.465 +
   1.466 +
   1.467 +