-
Notifications
You must be signed in to change notification settings - Fork 0
/
symbols.js
65 lines (57 loc) · 1.24 KB
/
symbols.js
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
var Instructions = require('./instructions')
function Table() {
this.symbols = predefined
this.nextFreeAddress = 16
}
module.exports = Table
var predefined = {
"R0": 0,
"R1": 1,
"R2": 2,
"R3": 3,
"R4": 4,
"R5": 5,
"R6": 6,
"R7": 7,
"R8": 8,
"R9": 9,
"R10": 10,
"R11": 11,
"R12": 12,
"R13": 13,
"R14": 14,
"R15": 15,
"SCREEN": 16384,
"KBD": 24576,
"SP": 0,
"LCL": 1,
"ARG": 2,
"THIS": 3,
"THAT": 4,
}
Table.prototype.addLabels = function (lables) {
lables.forEach(function (label) {
this.symbols[label.text.slice(1, label.text.length - 1)] = label.index
}, this)
}
Table.prototype.translate = function (program) {
program.AInstructions = program.AInstructions.map(function(line) {
if (/^@\d+$/.test(line.text)) return line
else {
var variable = line.text.slice(1)
if (this.symbols[variable] === undefined) {
this.symbols[variable] = this.nextFreeAddress++
}
return {text: '@' + this.symbols[variable], index: line.index}
}
}, this)
var src = program.Labels.concat(program.AInstructions)
.concat(program.CInstructions)
.sort(function(a, b) {
return a.index > b.index ? 1 : -1
})
.map(function(line) {
return line.text
})
return src
}