This is far from beautiful code, but it's getting there.
Chris Pressey
10 years ago
284 | 284 | return s; |
285 | 285 | }; |
286 | 286 | |
287 | this.parse = function(prog, reg, str) { | |
287 | this.parse = function(reg, str) { | |
288 | var prog = (new Program()).init({}); | |
288 | 289 | var lines = str.split("\n"); |
289 | 290 | this.code = []; |
290 | 291 | for (var i = 0; i < lines.length; i++) { |
291 | 292 | if (!lines[i] || lines[i].charAt(0) === ';') continue; |
292 | var instr = (new Instruction()).init({ | |
293 | 'reg': reg | |
294 | }); | |
295 | if (instr.parse(lines[i])) { | |
296 | prog.addInstruction(instr); | |
293 | var progPragma = this.parseProgPragma(lines[i]); | |
294 | if (typeof progPragma === 'number') { | |
295 | alert(progPragma); | |
297 | 296 | } else { |
298 | alert("Syntax error on line " + (i+1)); | |
299 | } | |
300 | } | |
301 | return this; | |
297 | var instr = (new Instruction()).init({ 'reg': reg }); | |
298 | if (instr.parse(lines[i])) { | |
299 | prog.addInstruction(instr); | |
300 | } else { | |
301 | alert("Syntax error on line " + (i+1)); | |
302 | } | |
303 | } | |
304 | } | |
305 | return prog; | |
306 | }; | |
307 | ||
308 | this.parseProgPragma = function(str) { | |
309 | var s = matchboxScanner; | |
310 | s.reset(str); | |
311 | if (s.onType('opcode') && s.token === 'PROG') { | |
312 | s.scan(); | |
313 | if (s.onType('immediate')) { | |
314 | return parseInt(s.token, 10); | |
315 | } | |
316 | } | |
317 | return undefined; | |
302 | 318 | }; |
303 | 319 | |
304 | 320 | this.run = function(progText) { |
305 | 321 | var regs = (new yoob.Tape()).init({ default: 0 }); |
306 | 322 | regs.style = "color: white; background: black;"; |
307 | var prog = (new Program()).init({}); | |
308 | this.parse(prog, regs, progText); | |
323 | var prog = this.parse(regs, progText); | |
309 | 324 | |
310 | 325 | var mem = (new yoob.Tape()).init({ default: 0 }); |
311 | 326 | |
318 | 333 | this.findRaceConditions = function(prog1text, prog2text) { |
319 | 334 | var regs1 = (new yoob.Tape()).init({ default: 0 }); |
320 | 335 | regs1.style = "color: black; background: white;"; |
321 | var prog1 = (new Program()).init({}); | |
322 | this.parse(prog1, regs1, prog1text); | |
336 | var prog1 = this.parse(regs1, prog1text); | |
323 | 337 | |
324 | 338 | var regs2 = (new yoob.Tape()).init({ default: 0 }); |
325 | 339 | regs2.style = "color: white; background: black;"; |
326 | var prog2 = (new Program()).init({}); | |
327 | this.parse(prog2, regs2, prog2text); | |
340 | var prog2 = this.parse(regs2, prog2text); | |
328 | 341 | |
329 | 342 | var mem = (new yoob.Tape()).init({ default: 0 }); |
330 | 343 |