still fixing issues
This commit is contained in:
parent
a9586c97d5
commit
d192d1cacb
15
assemble.rkt
15
assemble.rkt
|
@ -192,12 +192,16 @@
|
|||
(let: loop : String ([val : Any (Const-const stmt)])
|
||||
(cond [(symbol? val)
|
||||
(format "~s" (symbol->string val))]
|
||||
[(list? val)
|
||||
(format "_list(~a)" (string-join (map loop val)
|
||||
","))]
|
||||
[(pair? val)
|
||||
(format "[~a, ~a]"
|
||||
(loop (car val))
|
||||
(loop (cdr val)))]
|
||||
[(empty? val)
|
||||
(format "undefined")]
|
||||
[else
|
||||
(format "~s" val)])))
|
||||
|
||||
|
||||
(: assemble-op-expression ((U PrimitiveOperator TestOperator) (Listof OpArg) -> String))
|
||||
(define (assemble-op-expression op-name inputs)
|
||||
(let ([assembled-inputs (map assemble-input inputs)])
|
||||
|
@ -250,13 +254,10 @@
|
|||
(first assembled-inputs))]
|
||||
[(extend-environment/prefix)
|
||||
(format "new ExtendedPrefixEnvironment(~a, ~a)"
|
||||
(second assembled-inputs)
|
||||
(first assembled-inputs))]
|
||||
#;[(lookup-variable-value)
|
||||
(format "((~a).globalBindings[~a])"
|
||||
(second assembled-inputs)
|
||||
(first assembled-inputs))])))
|
||||
|
||||
|
||||
(: assemble-op-statement (PerformOperator (Listof OpArg) -> String))
|
||||
(define (assemble-op-statement op-name inputs)
|
||||
(let ([assembled-inputs (map assemble-input inputs)])
|
||||
|
|
|
@ -80,7 +80,7 @@
|
|||
(make-instruction-sequence
|
||||
'()
|
||||
(list target)
|
||||
`(,(make-AssignImmediateStatement target (make-Const exp))))))
|
||||
`(,(make-AssignImmediateStatement target (make-Const (Constant-v exp)))))))
|
||||
|
||||
(: compile-quoted (Quote CompileTimeEnvironment Target Linkage -> InstructionSequence))
|
||||
(define (compile-quoted exp cenv target linkage)
|
||||
|
|
62
runtime.js
62
runtime.js
|
@ -7,44 +7,59 @@
|
|||
// function closures are Closures
|
||||
// primitive procedures are regular functions.
|
||||
|
||||
var TopEnvironment = function() {
|
||||
this.globalBindings = {
|
||||
'=': function(argl) {
|
||||
return argl[0] === argl[1][0];
|
||||
},
|
||||
var Primitives = {
|
||||
'=': function(argl) {
|
||||
return argl[0] === argl[1][0];
|
||||
},
|
||||
|
||||
'+': function(argl) {
|
||||
return argl[0] + argl[1][0];
|
||||
},
|
||||
|
||||
'*': function(argl) {
|
||||
return argl[0] * argl[1][0];
|
||||
},
|
||||
|
||||
'-': function(argl) {
|
||||
return argl[0] - argl[1][0];
|
||||
},
|
||||
|
||||
'/': function(argl) {
|
||||
return argl[0] / argl[1][0];
|
||||
}
|
||||
};
|
||||
|
||||
'+': function(argl) {
|
||||
return argl[0] + argl[1][0];
|
||||
},
|
||||
|
||||
'*': function(argl) {
|
||||
return argl[0] * argl[1][0];
|
||||
},
|
||||
|
||||
'-': function(argl) {
|
||||
return argl[0] - argl[1][0];
|
||||
},
|
||||
|
||||
'/': function(argl) {
|
||||
return argl[0] / argl[1][0];
|
||||
}
|
||||
};
|
||||
var TopEnvironment = function() {
|
||||
this.valss = [];
|
||||
};
|
||||
|
||||
|
||||
var ExtendedPrefixEnvironment = function(parent, vs) {
|
||||
var vals = [];
|
||||
this.names = [];
|
||||
while(vs) {
|
||||
if (parent.globalBindings[vs[0]]) {
|
||||
vals.push(parent.globalBindings[vs[0]]);
|
||||
this.names.push(vs[0]);
|
||||
if (Primitives[vs[0]]) {
|
||||
vals.push(Primitives[vs[0]]);
|
||||
} else {
|
||||
vals.push(undefined);
|
||||
}
|
||||
vs = vs[1];
|
||||
}
|
||||
|
||||
this.valss = parent.valss.slice();
|
||||
this.valss.unshift(vals);
|
||||
this.globalBindings = parent.globalBindings;
|
||||
};
|
||||
|
||||
ExtendedPrefixEnvironment.prototype.lookup = function(name) {
|
||||
var i;
|
||||
for (i = 0; i < this.names.length; i++) {
|
||||
if (this.names[i] === name) {
|
||||
return this.valss[0][i];
|
||||
}
|
||||
}
|
||||
return undefined;
|
||||
};
|
||||
|
||||
var ExtendedEnvironment = function(parent, vs) {
|
||||
|
@ -55,7 +70,6 @@ var ExtendedEnvironment = function(parent, vs) {
|
|||
}
|
||||
this.valss = parent.valss.slice();
|
||||
this.valss.unshift(vals);
|
||||
this.globalBindings = parent.globalBindings;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -63,9 +63,12 @@
|
|||
(define-struct: SaveStatement ([reg : Symbol]) #:transparent)
|
||||
(define-struct: RestoreStatement ([reg : Symbol]) #:transparent)
|
||||
|
||||
(define-struct: Label ([name : Symbol]))
|
||||
(define-struct: Reg ([name : Symbol]))
|
||||
(define-struct: Const ([const : Any]))
|
||||
(define-struct: Label ([name : Symbol])
|
||||
#:transparent)
|
||||
(define-struct: Reg ([name : Symbol])
|
||||
#:transparent)
|
||||
(define-struct: Const ([const : Any])
|
||||
#:transparent)
|
||||
|
||||
(define-type OpArg (U Const Label Reg))
|
||||
|
||||
|
@ -144,7 +147,8 @@
|
|||
;; Lexical environments
|
||||
|
||||
;; A toplevel prefix contains a list of toplevel variables.
|
||||
(define-struct: Prefix ([names : (Listof Symbol)]))
|
||||
(define-struct: Prefix ([names : (Listof Symbol)])
|
||||
#:transparent)
|
||||
|
||||
;; A compile-time environment is a (listof (listof symbol)).
|
||||
;; A lexical address is either a 2-tuple (depth pos), or 'not-found.
|
||||
|
@ -153,7 +157,9 @@
|
|||
(define-type LexicalAddress (U LocalAddress PrefixAddress))
|
||||
|
||||
(define-struct: LocalAddress ([depth : Natural]
|
||||
[pos : Natural]))
|
||||
[pos : Natural])
|
||||
#:transparent)
|
||||
(define-struct: PrefixAddress ([depth : Natural]
|
||||
[pos : Natural]
|
||||
[name : Symbol]))
|
||||
[name : Symbol])
|
||||
#:transparent)
|
Loading…
Reference in New Issue
Block a user