friscjs
Version:
FRISC processor simulator in JavaScript
1,642 lines (1,544 loc) • 168 kB
JavaScript
frisc_asm = (function(){
/*
* Generated by PEG.js 0.7.0.
*
* http://pegjs.majda.cz/
*/
function quote(s) {
/*
* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a
* string literal except for the closing quote character, backslash,
* carriage return, line separator, paragraph separator, and line feed.
* Any character may appear in the form of an escape sequence.
*
* For portability, we also escape escape all control and non-ASCII
* characters. Note that "\0" and "\v" escape sequences are not used
* because JSHint does not like the first and IE the second.
*/
return '"' + s
.replace(/\\/g, '\\\\') // backslash
.replace(/"/g, '\\"') // closing quote character
.replace(/\x08/g, '\\b') // backspace
.replace(/\t/g, '\\t') // horizontal tab
.replace(/\n/g, '\\n') // line feed
.replace(/\f/g, '\\f') // form feed
.replace(/\r/g, '\\r') // carriage return
.replace(/[\x00-\x07\x0B\x0E-\x1F\x80-\uFFFF]/g, escape)
+ '"';
}
var result = {
/*
* Parses the input with a generated parser. If the parsing is successfull,
* returns a value explicitly or implicitly specified by the grammar from
* which the parser was generated (see |PEG.buildParser|). If the parsing is
* unsuccessful, throws |PEG.parser.SyntaxError| describing the error.
*/
parse: function(input, startRule) {
var parseFunctions = {
"instructions_main": parse_instructions_main,
"instructions": parse_instructions,
"newline": parse_newline,
"instruction_or_end": parse_instruction_or_end,
"instruction_end": parse_instruction_end,
"instruction": parse_instruction,
"label": parse_label,
"operationPart": parse_operationPart,
"operation": parse_operation,
"regaddr": parse_regaddr,
"sraddr": parse_sraddr,
"immaddr": parse_immaddr,
"absaddr_mem": parse_absaddr_mem,
"rinaddr": parse_rinaddr,
"rinaddroff": parse_rinaddroff,
"delimiter": parse_delimiter,
"moveop_name": parse_moveop_name,
"aluop_name": parse_aluop_name,
"cmpop_name": parse_cmpop_name,
"nonjmpop_name": parse_nonjmpop_name,
"jmpop_name": parse_jmpop_name,
"memop_name": parse_memop_name,
"stackop_name": parse_stackop_name,
"orgop_name": parse_orgop_name,
"dwop_name": parse_dwop_name,
"equop_name": parse_equop_name,
"dsop_name": parse_dsop_name,
"endop_name": parse_endop_name,
"baseop_name": parse_baseop_name,
"dwhbop_name": parse_dwhbop_name,
"flag_name": parse_flag_name,
"aluop": parse_aluop,
"cmpop": parse_cmpop,
"moveop": parse_moveop,
"uprop": parse_uprop,
"flag": parse_flag,
"memop": parse_memop,
"stackop": parse_stackop,
"orgop": parse_orgop,
"dwop": parse_dwop,
"equop": parse_equop,
"dsop": parse_dsop,
"endop": parse_endop,
"baseop": parse_baseop,
"dwhbop": parse_dwhbop,
"commentPart": parse_commentPart,
"whitespace": parse_whitespace,
"register": parse_register,
"number": parse_number,
"base": parse_base,
"numberWithoutBase": parse_numberWithoutBase
};
if (startRule !== undefined) {
if (parseFunctions[startRule] === undefined) {
throw new Error("Invalid rule name: " + quote(startRule) + ".");
}
} else {
startRule = "instructions_main";
}
var pos = 0;
var reportFailures = 0;
var rightmostFailuresPos = 0;
var rightmostFailuresExpected = [];
function padLeft(input, padding, length) {
var result = input;
var padLength = length - input.length;
for (var i = 0; i < padLength; i++) {
result = padding + result;
}
return result;
}
function escape(ch) {
var charCode = ch.charCodeAt(0);
var escapeChar;
var length;
if (charCode <= 0xFF) {
escapeChar = 'x';
length = 2;
} else {
escapeChar = 'u';
length = 4;
}
return '\\' + escapeChar + padLeft(charCode.toString(16).toUpperCase(), '0', length);
}
function matchFailed(failure) {
if (pos < rightmostFailuresPos) {
return;
}
if (pos > rightmostFailuresPos) {
rightmostFailuresPos = pos;
rightmostFailuresExpected = [];
}
rightmostFailuresExpected.push(failure);
}
function parse_instructions_main() {
var result0;
var pos0;
pos0 = pos;
result0 = parse_instructions();
if (result0 !== null) {
result0 = (function(offset, ins) {
var instrs = [];
var machinecode = [];
var unknownlabels = [];
for (var i=0; i<ins.length; i++) {
if (typeof ins[i][0].op !== "undefined" && ins[i][0].op !== "") {
instrs.push(ins[i][0]);
}
}
function replaceLabel(element, baseValueForDiff) {
if (element.type === "label") {
var labelValue = labels[element.value];
if (typeof labelValue !== "undefined") {
element.type = "num";
element.value = (typeof baseValueForDiff === 'undefined') ?
labelValue : (labelValue - baseValueForDiff);
} else {
unknownlabels.push(element.value);
element.value = null;
}
}
}
// replace labels
for (var i=0; i<instrs.length; i++) {
if (instrs[i].op in aluops || instrs[i].op in cmpops || instrs[i].op in moveops) {
replaceLabel(instrs[i].alusrc2);
} else if (instrs[i].op in jmpops) {
if (instrs[i].op === "JR") {
replaceLabel(instrs[i].addr, instrs[i].curloc);
} else {
replaceLabel(instrs[i].addr);
}
} else if (instrs[i].op in memops) {
replaceLabel(instrs[i].mem);
} else if (instrs[i].op in dwhbops) {
var vals = [];
for (var j=0; j<instrs[i].values.length; j++) {
replaceLabel(instrs[i].values[j]);
vals.push(instrs[i].values[j].value);
}
instrs[i].values = vals;
}
}
// check if all labels are defined
if (unknownlabels.length > 0) {
throw new Error("Unknown labels: " + unknownlabels.toString());
}
// generate machine code
for (var i=0; i<instrs.length; i++) {
generateMachineCode(instrs[i]);
machinecode.push(instrs[i]);
}
// generate memory model
var mem = [];
var writeToMemory = function(bitString, startPosition, memoryArray) {
if (bitString.length % 8 !== 0) {
throw new Error("Memory string has wrong length");
}
var elems = bitString.match(/.{8}/g);
for (var i=0; i<elems.length; i++) {
memoryArray[startPosition+i] = elems[elems.length - i - 1];
}
return startPosition + elems.length;
};
for (var opCount=0, memCount=0; opCount<machinecode.length; ) {
if (typeof machinecode[opCount].curloc === "undefined") {
opCount++;
} else {
if (machinecode[opCount].curloc > memCount) {
memCount = writeToMemory("00000000", memCount, mem);
} else {
if (typeof machinecode[opCount].machineCode === "string") {
memCount = writeToMemory(machinecode[opCount].machineCode, memCount, mem);
} else {
for (var j=0; j<machinecode[opCount].machineCode.length; j++) {
memCount = writeToMemory(machinecode[opCount].machineCode[j], memCount, mem);
}
}
opCount += 1;
}
}
}
return { ast : machinecode, mem : mem};
})(pos0, result0);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_instructions() {
var result0, result1, result2;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
pos2 = pos;
result1 = parse_instruction_or_end();
if (result1 !== null) {
result2 = (function(offset) { linecounter++; return true;})(pos) ? "" : null;
if (result2 !== null) {
result1 = [result1, result2];
} else {
result1 = null;
pos = pos2;
}
} else {
result1 = null;
pos = pos2;
}
if (result1 !== null) {
result0 = [];
while (result1 !== null) {
result0.push(result1);
pos2 = pos;
result1 = parse_instruction_or_end();
if (result1 !== null) {
result2 = (function(offset) { linecounter++; return true;})(pos) ? "" : null;
if (result2 !== null) {
result1 = [result1, result2];
} else {
result1 = null;
pos = pos2;
}
} else {
result1 = null;
pos = pos2;
}
}
} else {
result0 = null;
}
if (result0 !== null) {
pos2 = pos;
reportFailures++;
if (input.length > pos) {
result2 = input.charAt(pos);
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("any character");
}
}
if (result2 !== null) {
result1 = [];
while (result2 !== null) {
result1.push(result2);
if (input.length > pos) {
result2 = input.charAt(pos);
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("any character");
}
}
}
} else {
result1 = null;
}
reportFailures--;
if (result1 === null) {
result1 = "";
} else {
result1 = null;
pos = pos2;
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(offset, ins) {
return ins;
})(pos0, result0[0]);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_newline() {
var result0;
if (input.charCodeAt(pos) === 10) {
result0 = "\n";
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\n\"");
}
}
if (result0 === null) {
if (input.substr(pos, 2) === "\r\n") {
result0 = "\r\n";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\r\\n\"");
}
}
if (result0 === null) {
if (input.charCodeAt(pos) === 13) {
result0 = "\r";
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\r\"");
}
}
if (result0 === null) {
if (input.substr(pos, 2) === "\n\r") {
result0 = "\n\r";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"\\n\\r\"");
}
}
}
}
}
return result0;
}
function parse_instruction_or_end() {
var result0, result1;
var pos0, pos1;
pos0 = pos;
result0 = parse_instruction_end();
if (result0 !== null) {
result0 = (function(offset, i) { var ins = i; ins.line = linecounter-1; return {}})(pos0, result0);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
result0 = parse_instruction();
if (result0 !== null) {
result1 = parse_newline();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(offset, i) { var ins = i; ins.line = linecounter; return ins;})(pos0, result0[0]);
}
if (result0 === null) {
pos = pos0;
}
}
return result0;
}
function parse_instruction_end() {
var result0, result1, result2, result3, result4, result5, result6;
var pos0, pos1, pos2;
pos0 = pos;
pos1 = pos;
result0 = parse_label();
result0 = result0 !== null ? result0 : "";
if (result0 !== null) {
result2 = parse_whitespace();
if (result2 !== null) {
result1 = [];
while (result2 !== null) {
result1.push(result2);
result2 = parse_whitespace();
}
} else {
result1 = null;
}
if (result1 !== null) {
result2 = parse_endop();
if (result2 !== null) {
result3 = parse_commentPart();
result3 = result3 !== null ? result3 : "";
if (result3 !== null) {
pos2 = pos;
result4 = parse_newline();
if (result4 !== null) {
result5 = [];
if (input.length > pos) {
result6 = input.charAt(pos);
pos++;
} else {
result6 = null;
if (reportFailures === 0) {
matchFailed("any character");
}
}
while (result6 !== null) {
result5.push(result6);
if (input.length > pos) {
result6 = input.charAt(pos);
pos++;
} else {
result6 = null;
if (reportFailures === 0) {
matchFailed("any character");
}
}
}
if (result5 !== null) {
result4 = [result4, result5];
} else {
result4 = null;
pos = pos2;
}
} else {
result4 = null;
pos = pos2;
}
result4 = result4 !== null ? result4 : "";
if (result4 !== null) {
result0 = [result0, result1, result2, result3, result4];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(offset, l, o, c) {
return o;
})(pos0, result0[0], result0[2], result0[3]);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_instruction() {
var result0, result1, result2;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
result0 = parse_label();
result0 = result0 !== null ? result0 : "";
if (result0 !== null) {
result1 = parse_operationPart();
result1 = result1 !== null ? result1 : "";
if (result1 !== null) {
result2 = parse_commentPart();
result2 = result2 !== null ? result2 : "";
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(offset, l, o, c) {
if (o === null || o === "") {
if (l !== null && l !== "") {
addLabel(l, curloc);
}
return {};
}
if (!(o.op in dwops || o.op in equops || o.op in endops)) {
curloc = curloc % 4 === 0 ? curloc : curloc + (4-curloc%4);
}
if (l !== null && l !== "") {
if (!(o.op in baseops || o.op in endops || o.op in orgops || o.op in equops)) {
addLabel(l, curloc);
} else if (o.op in equops) {
addLabel(l, o.value);
}
}
o.curloc = curloc;
if (o.op in aluops || o.op in cmpops || o.op in moveops || o.op in jmpops || o.op in rethaltops || o.op in memops || o.op in stackops) {
curloc += 4;
} else if (o.op in orgops) {
if (o.value < curloc) {
var err = new Error("ORG op must not point to previous addresses.");
err.line = linecounter;
err.column = 1;
throw err;
}
curloc = o.value;
} else if (o.op in dwops) {
curloc += o.values.length;
} else if (o.op in equops) {
curloc = curloc;
} else if (o.op in endops) {
curloc = curloc;
} else if (o.op in dsops) {
curloc += o.value;
} else if (o.op in dwhbops) {
curloc += o.size*o.values.length;
}
if (o.op in baseops) {
defaultBase = o.value;
}
if (o.op in endops || o.op in equops || o.op in orgops || o.op in baseops) {
return {};
} else {
return o;
}
})(pos0, result0[0], result0[1], result0[2]);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_label() {
var result0, result1, result2;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
if (/^[a-zA-Z]/.test(input.charAt(pos))) {
result0 = input.charAt(pos);
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("[a-zA-Z]");
}
}
if (result0 !== null) {
result1 = [];
if (/^[0-9a-zA-Z_]/.test(input.charAt(pos))) {
result2 = input.charAt(pos);
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("[0-9a-zA-Z_]");
}
}
while (result2 !== null) {
result1.push(result2);
if (/^[0-9a-zA-Z_]/.test(input.charAt(pos))) {
result2 = input.charAt(pos);
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("[0-9a-zA-Z_]");
}
}
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(offset, first, rest) {
return first + rest.join("");
})(pos0, result0[0], result0[1]);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_operationPart() {
var result0, result1;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
result1 = parse_whitespace();
if (result1 !== null) {
result0 = [];
while (result1 !== null) {
result0.push(result1);
result1 = parse_whitespace();
}
} else {
result0 = null;
}
if (result0 !== null) {
result1 = parse_operation();
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(offset, o) {return o;})(pos0, result0[1]);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_operation() {
var result0;
result0 = parse_dwhbop();
if (result0 === null) {
result0 = parse_baseop();
if (result0 === null) {
result0 = parse_dsop();
if (result0 === null) {
result0 = parse_equop();
if (result0 === null) {
result0 = parse_dwop();
if (result0 === null) {
result0 = parse_orgop();
if (result0 === null) {
result0 = parse_stackop();
if (result0 === null) {
result0 = parse_memop();
if (result0 === null) {
result0 = parse_uprop();
if (result0 === null) {
result0 = parse_moveop();
if (result0 === null) {
result0 = parse_cmpop();
if (result0 === null) {
result0 = parse_aluop();
}
}
}
}
}
}
}
}
}
}
}
return result0;
}
function parse_regaddr() {
var result0;
var pos0;
pos0 = pos;
result0 = parse_register();
if (result0 !== null) {
result0 = (function(offset, value) { return {type : "reg", value : value}; })(pos0, result0);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_sraddr() {
var result0, result1;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
if (/^[sS]/.test(input.charAt(pos))) {
result0 = input.charAt(pos);
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("[sS]");
}
}
if (result0 !== null) {
if (/^[rR]/.test(input.charAt(pos))) {
result1 = input.charAt(pos);
pos++;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("[rR]");
}
}
if (result1 !== null) {
result0 = [result0, result1];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(offset, value) { return {type : "sr", value : "sr"}; })(pos0, result0);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_immaddr() {
var result0;
var pos0;
pos0 = pos;
result0 = parse_label();
if (result0 !== null) {
result0 = (function(offset, value) { return {type : "label", value : value}; })(pos0, result0);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
result0 = parse_number();
if (result0 !== null) {
result0 = (function(offset, value) { return {type : "num", value : value}; })(pos0, result0);
}
if (result0 === null) {
pos = pos0;
}
}
return result0;
}
function parse_absaddr_mem() {
var result0, result1, result2;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 40) {
result0 = "(";
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"(\"");
}
}
if (result0 !== null) {
result1 = parse_label();
if (result1 !== null) {
if (input.charCodeAt(pos) === 41) {
result2 = ")";
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\")\"");
}
}
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(offset, value) { return {type : "label", value : value}; })(pos0, result0[1]);
}
if (result0 === null) {
pos = pos0;
}
if (result0 === null) {
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 40) {
result0 = "(";
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"(\"");
}
}
if (result0 !== null) {
result1 = parse_number();
if (result1 !== null) {
if (input.charCodeAt(pos) === 41) {
result2 = ")";
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\")\"");
}
}
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(offset, value) { return {type : "num", value : value}; })(pos0, result0[1]);
}
if (result0 === null) {
pos = pos0;
}
}
return result0;
}
function parse_rinaddr() {
var result0, result1, result2;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 40) {
result0 = "(";
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"(\"");
}
}
if (result0 !== null) {
result1 = parse_regaddr();
if (result1 !== null) {
if (input.charCodeAt(pos) === 41) {
result2 = ")";
pos++;
} else {
result2 = null;
if (reportFailures === 0) {
matchFailed("\")\"");
}
}
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(offset, value) { return value; })(pos0, result0[1]);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_rinaddroff() {
var result0, result1, result2, result3;
var pos0, pos1;
pos0 = pos;
pos1 = pos;
if (input.charCodeAt(pos) === 40) {
result0 = "(";
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"(\"");
}
}
if (result0 !== null) {
result1 = parse_register();
if (result1 !== null) {
result2 = parse_numberWithoutBase();
if (result2 === null) {
result2 = "";
}
if (result2 !== null) {
if (input.charCodeAt(pos) === 41) {
result3 = ")";
pos++;
} else {
result3 = null;
if (reportFailures === 0) {
matchFailed("\")\"");
}
}
if (result3 !== null) {
result0 = [result0, result1, result2, result3];
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
} else {
result0 = null;
pos = pos1;
}
if (result0 !== null) {
result0 = (function(offset, reg, val) {
return {type : "regoff", value : reg, offset : val === "" ? 0 : val };
})(pos0, result0[1], result0[2]);
}
if (result0 === null) {
pos = pos0;
}
return result0;
}
function parse_delimiter() {
var result0, result1, result2, result3;
var pos0;
pos0 = pos;
result0 = [];
result1 = parse_whitespace();
while (result1 !== null) {
result0.push(result1);
result1 = parse_whitespace();
}
if (result0 !== null) {
if (input.charCodeAt(pos) === 44) {
result1 = ",";
pos++;
} else {
result1 = null;
if (reportFailures === 0) {
matchFailed("\",\"");
}
}
if (result1 !== null) {
result2 = [];
result3 = parse_whitespace();
while (result3 !== null) {
result2.push(result3);
result3 = parse_whitespace();
}
if (result2 !== null) {
result0 = [result0, result1, result2];
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
} else {
result0 = null;
pos = pos0;
}
return result0;
}
function parse_moveop_name() {
var result0;
if (input.substr(pos, 4) === "MOVE") {
result0 = "MOVE";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"MOVE\"");
}
}
return result0;
}
function parse_aluop_name() {
var result0;
if (input.substr(pos, 2) === "OR") {
result0 = "OR";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"OR\"");
}
}
if (result0 === null) {
if (input.substr(pos, 3) === "AND") {
result0 = "AND";
pos += 3;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"AND\"");
}
}
if (result0 === null) {
if (input.substr(pos, 3) === "XOR") {
result0 = "XOR";
pos += 3;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"XOR\"");
}
}
if (result0 === null) {
if (input.substr(pos, 3) === "ADD") {
result0 = "ADD";
pos += 3;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"ADD\"");
}
}
if (result0 === null) {
if (input.substr(pos, 3) === "ADC") {
result0 = "ADC";
pos += 3;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"ADC\"");
}
}
if (result0 === null) {
if (input.substr(pos, 3) === "SUB") {
result0 = "SUB";
pos += 3;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"SUB\"");
}
}
if (result0 === null) {
if (input.substr(pos, 3) === "SBC") {
result0 = "SBC";
pos += 3;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"SBC\"");
}
}
if (result0 === null) {
if (input.substr(pos, 4) === "ROTL") {
result0 = "ROTL";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"ROTL\"");
}
}
if (result0 === null) {
if (input.substr(pos, 4) === "ROTR") {
result0 = "ROTR";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"ROTR\"");
}
}
if (result0 === null) {
if (input.substr(pos, 3) === "SHL") {
result0 = "SHL";
pos += 3;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"SHL\"");
}
}
if (result0 === null) {
if (input.substr(pos, 3) === "SHR") {
result0 = "SHR";
pos += 3;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"SHR\"");
}
}
if (result0 === null) {
if (input.substr(pos, 4) === "ASHR") {
result0 = "ASHR";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"ASHR\"");
}
}
}
}
}
}
}
}
}
}
}
}
}
return result0;
}
function parse_cmpop_name() {
var result0;
if (input.substr(pos, 3) === "CMP") {
result0 = "CMP";
pos += 3;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"CMP\"");
}
}
return result0;
}
function parse_nonjmpop_name() {
var result0;
if (input.substr(pos, 4) === "RETI") {
result0 = "RETI";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"RETI\"");
}
}
if (result0 === null) {
if (input.substr(pos, 4) === "RETN") {
result0 = "RETN";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"RETN\"");
}
}
if (result0 === null) {
if (input.substr(pos, 3) === "RET") {
result0 = "RET";
pos += 3;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"RET\"");
}
}
if (result0 === null) {
if (input.substr(pos, 4) === "HALT") {
result0 = "HALT";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"HALT\"");
}
}
}
}
}
return result0;
}
function parse_jmpop_name() {
var result0;
if (input.substr(pos, 2) === "JP") {
result0 = "JP";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"JP\"");
}
}
if (result0 === null) {
if (input.substr(pos, 4) === "CALL") {
result0 = "CALL";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"CALL\"");
}
}
if (result0 === null) {
if (input.substr(pos, 2) === "JR") {
result0 = "JR";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"JR\"");
}
}
}
}
return result0;
}
function parse_memop_name() {
var result0;
if (input.substr(pos, 5) === "LOADB") {
result0 = "LOADB";
pos += 5;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"LOADB\"");
}
}
if (result0 === null) {
if (input.substr(pos, 6) === "STOREB") {
result0 = "STOREB";
pos += 6;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"STOREB\"");
}
}
if (result0 === null) {
if (input.substr(pos, 5) === "LOADH") {
result0 = "LOADH";
pos += 5;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"LOADH\"");
}
}
if (result0 === null) {
if (input.substr(pos, 6) === "STOREH") {
result0 = "STOREH";
pos += 6;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"STOREH\"");
}
}
if (result0 === null) {
if (input.substr(pos, 4) === "LOAD") {
result0 = "LOAD";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"LOAD\"");
}
}
if (result0 === null) {
if (input.substr(pos, 5) === "STORE") {
result0 = "STORE";
pos += 5;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"STORE\"");
}
}
}
}
}
}
}
return result0;
}
function parse_stackop_name() {
var result0;
if (input.substr(pos, 3) === "POP") {
result0 = "POP";
pos += 3;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"POP\"");
}
}
if (result0 === null) {
if (input.substr(pos, 4) === "PUSH") {
result0 = "PUSH";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"PUSH\"");
}
}
}
return result0;
}
function parse_orgop_name() {
var result0;
if (input.substr(pos, 4) === "`ORG") {
result0 = "`ORG";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"`ORG\"");
}
}
return result0;
}
function parse_dwop_name() {
var result0;
if (input.substr(pos, 3) === "`DW") {
result0 = "`DW";
pos += 3;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"`DW\"");
}
}
return result0;
}
function parse_equop_name() {
var result0;
if (input.substr(pos, 4) === "`EQU") {
result0 = "`EQU";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"`EQU\"");
}
}
return result0;
}
function parse_dsop_name() {
var result0;
if (input.substr(pos, 3) === "`DS") {
result0 = "`DS";
pos += 3;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"`DS\"");
}
}
return result0;
}
function parse_endop_name() {
var result0;
if (input.substr(pos, 4) === "`END") {
result0 = "`END";
pos += 4;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"`END\"");
}
}
return result0;
}
function parse_baseop_name() {
var result0;
if (input.substr(pos, 5) === "`BASE") {
result0 = "`BASE";
pos += 5;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"`BASE\"");
}
}
return result0;
}
function parse_dwhbop_name() {
var result0;
if (input.substr(pos, 2) === "DW") {
result0 = "DW";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"DW\"");
}
}
if (result0 === null) {
if (input.substr(pos, 2) === "DH") {
result0 = "DH";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"DH\"");
}
}
if (result0 === null) {
if (input.substr(pos, 2) === "DB") {
result0 = "DB";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"DB\"");
}
}
}
}
return result0;
}
function parse_flag_name() {
var result0;
if (input.charCodeAt(pos) === 77) {
result0 = "M";
pos++;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"M\"");
}
}
if (result0 === null) {
if (input.substr(pos, 2) === "NN") {
result0 = "NN";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"NN\"");
}
}
if (result0 === null) {
if (input.substr(pos, 2) === "NV") {
result0 = "NV";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"NV\"");
}
}
if (result0 === null) {
if (input.substr(pos, 2) === "NZ") {
result0 = "NZ";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"NZ\"");
}
}
if (result0 === null) {
if (input.substr(pos, 2) === "NE") {
result0 = "NE";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"NE\"");
}
}
if (result0 === null) {
if (input.substr(pos, 2) === "NC") {
result0 = "NC";
pos += 2;
} else {
result0 = null;
if (reportFailures === 0) {
matchFailed("\"NC\"");
}
}
if (result0 === null) {
if (input.charCodeAt(pos) === 78) {
result0 = "N";
pos++;
} else {
result0 = null;