diff options
author | sanine-a <sanine.not@pm.me> | 2023-05-22 14:58:52 -0500 |
---|---|---|
committer | sanine-a <sanine.not@pm.me> | 2023-05-22 14:58:52 -0500 |
commit | 9e8703d07e2e49d14e3d2092d77f8f7e75ee7e04 (patch) | |
tree | 548572958e4f368d7d1dbe0144c9e27a160c2ec3 | |
parent | f2a515a940ea5e66c9fbc9669e6293ae32b7041a (diff) |
fix line labels ordering
-rw-r--r-- | src/parser/grammar.jison | 4 | ||||
-rw-r--r-- | src/parser/grammar.js | 4 | ||||
-rw-r--r-- | src/parser/parser.js | 20 | ||||
-rw-r--r-- | src/parser/stone.js | 6 |
4 files changed, 27 insertions, 7 deletions
diff --git a/src/parser/grammar.jison b/src/parser/grammar.jison index 2f5b30a..83255e0 100644 --- a/src/parser/grammar.jison +++ b/src/parser/grammar.jison @@ -51,8 +51,8 @@ %% program - : lines END coda { yy.start = 0; return $lines; } - | lines END label coda { yy.start = yy.getLabel($label); return $lines; } + : lines END coda { return { start: 0, program: $lines }; } + | lines END label coda { return { start: yy.getLabel($label), program: $lines }; } ; coda diff --git a/src/parser/grammar.js b/src/parser/grammar.js index 21f6b89..f51d7f6 100644 --- a/src/parser/grammar.js +++ b/src/parser/grammar.js @@ -84,10 +84,10 @@ performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* actio var $0 = $$.length - 1; switch (yystate) { case 1: - yy.start = 0; return $$[$0-2]; + return { start: 0, program: $$[$0-2] }; break; case 2: - yy.start = yy.getLabel($$[$0-1]); return $$[$0-3]; + return { start: yy.getLabel($$[$0-1]), program: $$[$0-3] }; break; case 7: diff --git a/src/parser/parser.js b/src/parser/parser.js index ef84be3..7d3dd95 100644 --- a/src/parser/parser.js +++ b/src/parser/parser.js @@ -22,15 +22,29 @@ parser.yy = { return this.equ[l]; } - return this.line[l] - this.pc; + return l; + }, + + tidyAddress: function(pc, addr) { + if (typeof(addr.value) === "string") { + addr.value = this.line[addr.value] - pc; + } }, }; + //if (process.argv[1] === 'parser.js' && process.argv.length >= 3) { fs.readFile(process.argv[2], 'utf8', (err, data) => { if (err) throw err; - let result = parser.parse(data.toUpperCase()); - console.log(result); + let program = parser.parse(data.toUpperCase()); + if (typeof(program.start) === "string") { + program.start = parser.yy.line[program.start]; + } + for (let pc=0; pc<program.program.length; pc += 1) { + parser.yy.tidyAddress(pc, program.program[pc].a); + parser.yy.tidyAddress(pc, program.program[pc].b); + } + console.log(program); console.log(parser.yy); }); //} diff --git a/src/parser/stone.js b/src/parser/stone.js new file mode 100644 index 0000000..fe2a864 --- /dev/null +++ b/src/parser/stone.js @@ -0,0 +1,6 @@ +start mov <2, 3 + add d1, start + jmp start + dat #0 +d1 dat #-5084, #5084 +end start |