UNPKG

ton-assembly

Version:

TON assembler and disassembler

3,681 lines 131 kB
"use strict";
// @ts-nocheck
// @generated by Peggy 5.0.3.
//
// https://peggyjs.org/
Object.defineProperty(exports, "__esModule", { value: true });
exports.SyntaxError = exports.StartRules = void 0;
exports.parse = peg$parse;
class peg$SyntaxError extends SyntaxError {
    constructor(message, expected, found, location) {
        super(message);
        this.expected = expected;
        this.found = found;
        this.location = location;
        this.name = "SyntaxError";
    }
    format(sources) {
        let str = "Error: " + this.message;
        if (this.location) {
            let src = null;
            const st = sources.find(s => s.source === this.location.source);
            if (st) {
                src = st.text.split(/\r\n|\n|\r/g);
            }
            const s = this.location.start;
            const offset_s = this.location.source && typeof this.location.source.offset === "function"
                ? this.location.source.offset(s)
                : s;
            const loc = this.location.source + ":" + offset_s.line + ":" + offset_s.column;
            if (src) {
                const e = this.location.end;
                const filler = "".padEnd(offset_s.line.toString().length, " ");
                const line = src[s.line - 1];
                const last = s.line === e.line ? e.column : line.length + 1;
                const hatLen = last - s.column || 1;
                str +=
                    "\n --> " +
                        loc +
                        "\n" +
                        filler +
                        " |\n" +
                        offset_s.line +
                        " | " +
                        line +
                        "\n" +
                        filler +
                        " | " +
                        "".padEnd(s.column - 1, " ") +
                        "".padEnd(hatLen, "^");
            }
            else {
                str += "\n at " + loc;
            }
        }
        return str;
    }
    static buildMessage(expected, found) {
        function hex(ch) {
            return ch.codePointAt(0).toString(16).toUpperCase();
        }
        const nonPrintable = Object.prototype.hasOwnProperty.call(RegExp.prototype, "unicode")
            ? new RegExp("[\\p{C}\\p{Mn}\\p{Mc}]", "gu")
            : null;
        function unicodeEscape(s) {
            if (nonPrintable) {
                return s.replace(nonPrintable, ch => "\\u{" + hex(ch) + "}");
            }
            return s;
        }
        function literalEscape(s) {
            return unicodeEscape(s
                .replace(/\\/g, "\\\\")
                .replace(/"/g, '\\"')
                .replace(/\0/g, "\\0")
                .replace(/\t/g, "\\t")
                .replace(/\n/g, "\\n")
                .replace(/\r/g, "\\r")
                .replace(/[\x00-\x0F]/g, ch => "\\x0" + hex(ch))
                .replace(/[\x10-\x1F\x7F-\x9F]/g, ch => "\\x" + hex(ch)));
        }
        function classEscape(s) {
            return unicodeEscape(s
                .replace(/\\/g, "\\\\")
                .replace(/\]/g, "\\]")
                .replace(/\^/g, "\\^")
                .replace(/-/g, "\\-")
                .replace(/\0/g, "\\0")
                .replace(/\t/g, "\\t")
                .replace(/\n/g, "\\n")
                .replace(/\r/g, "\\r")
                .replace(/[\x00-\x0F]/g, ch => "\\x0" + hex(ch))
                .replace(/[\x10-\x1F\x7F-\x9F]/g, ch => "\\x" + hex(ch)));
        }
        const DESCRIBE_EXPECTATION_FNS = {
            literal(expectation) {
                return '"' + literalEscape(expectation.text) + '"';
            },
            class(expectation) {
                const escapedParts = expectation.parts.map(part => Array.isArray(part)
                    ? classEscape(part[0]) + "-" + classEscape(part[1])
                    : classEscape(part));
                return ("[" +
                    (expectation.inverted ? "^" : "") +
                    escapedParts.join("") +
                    "]" +
                    (expectation.unicode ? "u" : ""));
            },
            any() {
                return "any character";
            },
            end() {
                return "end of input";
            },
            other(expectation) {
                return expectation.description;
            },
        };
        function describeExpectation(expectation) {
            return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);
        }
        function describeExpected(expected) {
            const descriptions = expected.map(describeExpectation);
            descriptions.sort();
            if (descriptions.length > 0) {
                let j = 1;
                for (let i = 1; i < descriptions.length; i++) {
                    if (descriptions[i - 1] !== descriptions[i]) {
                        descriptions[j] = descriptions[i];
                        j++;
                    }
                }
                descriptions.length = j;
            }
            switch (descriptions.length) {
                case 1:
                    return descriptions[0];
                case 2:
                    return descriptions[0] + " or " + descriptions[1];
                default:
                    return (descriptions.slice(0, -1).join(", ") +
                        ", or " +
                        descriptions[descriptions.length - 1]);
            }
        }
        function describeFound(found) {
            return found ? '"' + literalEscape(found) + '"' : "end of input";
        }
        return "Expected " + describeExpected(expected) + " but " + describeFound(found) + " found.";
    }
}
exports.SyntaxError = peg$SyntaxError;
function peg$parse(input, options) {
    options = options !== undefined ? options : {};
    const peg$FAILED = {};
    const peg$source = options.grammarSource;
    const peg$startRuleFunctions = {
        SourceFile: peg$parseSourceFile,
    };
    let peg$startRuleFunction = peg$parseSourceFile;
    const peg$c0 = '"';
    const peg$c1 = "include";
    const peg$c2 = "PROGRAM{";
    const peg$c3 = "}END>c";
    const peg$c4 = "DECLPROC";
    const peg$c5 = "DECLMETHOD";
    const peg$c6 = "DECLGLOBVAR";
    const peg$c7 = "PROC:<{";
    const peg$c8 = "}>";
    const peg$c9 = "PROCINLINE:<{";
    const peg$c10 = "PROCREF:<{";
    const peg$c11 = "METHOD:<{";
    const peg$c12 = "IF:<{";
    const peg$c13 = "IFNOT:<{";
    const peg$c14 = "ELSE<{";
    const peg$c15 = "IFJMP:<{";
    const peg$c16 = "IFNOTJMP:<{";
    const peg$c17 = "WHILE:<{";
    const peg$c18 = "}>DO<{";
    const peg$c19 = "REPEAT:<{";
    const peg$c20 = "UNTIL:<{";
    const peg$c21 = "<{";
    const peg$c22 = "}>c";
    const peg$c23 = "}>s";
    const peg$c24 = "}>CONT";
    const peg$c25 = "x{";
    const peg$c26 = "_";
    const peg$c27 = "}";
    const peg$c28 = "b{";
    const peg$c29 = "B{";
    const peg$c30 = "<b";
    const peg$c31 = "0";
    const peg$c32 = "2";
    const peg$c33 = "u,";
    const peg$c34 = "b>";
    const peg$c35 = "<s";
    const peg$c36 = "-";
    const peg$c37 = "l";
    const peg$c38 = "0b";
    const peg$c39 = "0x";
    const peg$c40 = "s";
    const peg$c41 = "s(";
    const peg$c42 = ")";
    const peg$c43 = "s()";
    const peg$c44 = "c";
    const peg$c45 = "PROGRAM";
    const peg$c46 = "END>c";
    const peg$c47 = "DO<{";
    const peg$c48 = "<b 0 2 u, b>";
    const peg$c49 = "CALLDICT";
    const peg$c50 = "INLINECALLDICT";
    const peg$c51 = "//";
    const peg$r0 = /^[^"]/;
    const peg$r1 = /^[0-9a-fA-F]/;
    const peg$r2 = /^[01]/;
    const peg$r3 = /^[0-9a-fA-F_]/;
    const peg$r4 = /^[a-zA-Z~$_%?.]/;
    const peg$r5 = /^[a-zA-Z0-9$_%?()~.]/;
    const peg$r6 = /^[A-Z]/;
    const peg$r7 = /^[a-z]/;
    const peg$r8 = /^[a-z$_%?~.]/;
    const peg$r9 = /^[A-Z0-9_#:]/;
    const peg$r10 = /^[0-9]/;
    const peg$r11 = /^[a-zA-Z0-9$_%?]/;
    const peg$r12 = /^[ \t\r\n]/;
    const peg$r13 = /^[^\r\n]/;
    const peg$e0 = peg$literalExpectation('"', false);
    const peg$e1 = peg$classExpectation(['"'], true, false, false);
    const peg$e2 = peg$literalExpectation("include", false);
    const peg$e3 = peg$literalExpectation("PROGRAM{", false);
    const peg$e4 = peg$literalExpectation("}END>c", false);
    const peg$e5 = peg$literalExpectation("DECLPROC", false);
    const peg$e6 = peg$literalExpectation("DECLMETHOD", false);
    const peg$e7 = peg$literalExpectation("DECLGLOBVAR", false);
    const peg$e8 = peg$literalExpectation("PROC:<{", false);
    const peg$e9 = peg$literalExpectation("}>", false);
    const peg$e10 = peg$literalExpectation("PROCINLINE:<{", false);
    const peg$e11 = peg$literalExpectation("PROCREF:<{", false);
    const peg$e12 = peg$literalExpectation("METHOD:<{", false);
    const peg$e13 = peg$literalExpectation("IF:<{", false);
    const peg$e14 = peg$literalExpectation("IFNOT:<{", false);
    const peg$e15 = peg$literalExpectation("ELSE<{", false);
    const peg$e16 = peg$literalExpectation("IFJMP:<{", false);
    const peg$e17 = peg$literalExpectation("IFNOTJMP:<{", false);
    const peg$e18 = peg$literalExpectation("WHILE:<{", false);
    const peg$e19 = peg$literalExpectation("}>DO<{", false);
    const peg$e20 = peg$literalExpectation("REPEAT:<{", false);
    const peg$e21 = peg$literalExpectation("UNTIL:<{", false);
    const peg$e22 = peg$literalExpectation("<{", false);
    const peg$e23 = peg$literalExpectation("}>c", false);
    const peg$e24 = peg$literalExpectation("}>s", false);
    const peg$e25 = peg$literalExpectation("}>CONT", false);
    const peg$e26 = peg$literalExpectation("x{", false);
    const peg$e27 = peg$classExpectation([
        ["0", "9"],
        ["a", "f"],
        ["A", "F"],
    ], false, false, false);
    const peg$e28 = peg$literalExpectation("_", false);
    const peg$e29 = peg$literalExpectation("}", false);
    const peg$e30 = peg$literalExpectation("b{", false);
    const peg$e31 = peg$classExpectation(["0", "1"], false, false, false);
    const peg$e32 = peg$literalExpectation("B{", false);
    const peg$e33 = peg$classExpectation([["0", "9"], ["a", "f"], ["A", "F"], "_"], false, false, false);
    const peg$e34 = peg$literalExpectation("<b", false);
    const peg$e35 = peg$literalExpectation("0", false);
    const peg$e36 = peg$literalExpectation("2", false);
    const peg$e37 = peg$literalExpectation("u,", false);
    const peg$e38 = peg$literalExpectation("b>", false);
    const peg$e39 = peg$literalExpectation("<s", false);
    const peg$e40 = peg$classExpectation([["a", "z"], ["A", "Z"], "~", "$", "_", "%", "?", "."], false, false, false);
    const peg$e41 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"], "$", "_", "%", "?", "(", ")", "~", "."], false, false, false);
    const peg$e42 = peg$classExpectation([["A", "Z"]], false, false, false);
    const peg$e43 = peg$classExpectation([["a", "z"]], false, false, false);
    const peg$e44 = peg$classExpectation([["a", "z"], "$", "_", "%", "?", "~", "."], false, false, false);
    const peg$e45 = peg$literalExpectation("-", false);
    const peg$e46 = peg$classExpectation([["A", "Z"], ["0", "9"], "_", "#", ":"], false, false, false);
    const peg$e47 = peg$literalExpectation("l", false);
    const peg$e48 = peg$literalExpectation("0b", false);
    const peg$e49 = peg$literalExpectation("0x", false);
    const peg$e50 = peg$classExpectation([["0", "9"]], false, false, false);
    const peg$e51 = peg$literalExpectation("s", false);
    const peg$e52 = peg$literalExpectation("s(", false);
    const peg$e53 = peg$literalExpectation(")", false);
    const peg$e54 = peg$literalExpectation("s()", false);
    const peg$e55 = peg$literalExpectation("c", false);
    const peg$e56 = peg$literalExpectation("PROGRAM", false);
    const peg$e57 = peg$literalExpectation("END>c", false);
    const peg$e58 = peg$literalExpectation("DO<{", false);
    const peg$e59 = peg$literalExpectation("<b 0 2 u, b>", false);
    const peg$e60 = peg$literalExpectation("CALLDICT", false);
    const peg$e61 = peg$literalExpectation("INLINECALLDICT", false);
    const peg$e62 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"], "$", "_", "%", "?"], false, false, false);
    const peg$e63 = peg$classExpectation([" ", "\t", "\r", "\n"], false, false, false);
    const peg$e64 = peg$literalExpectation("//", false);
    const peg$e65 = peg$classExpectation(["\r", "\n"], true, false, false);
    function peg$f0(include, program) {
        return { $: "SourceFile", include, program };
    }
    function peg$f1(path) {
        return { $: "IncludeDirective", path };
    }
    function peg$f2(declarations, definitions) {
        return { $: "Program", declarations, definitions };
    }
    function peg$f3(decl) {
        return { $: "Declaration", decl };
    }
    function peg$f4(name) {
        return { $: "ProcDeclaration", name };
    }
    function peg$f5(method_id, name) {
        return { $: "MethodDeclaration", method_id, name };
    }
    function peg$f6(name) {
        return { $: "GlobalVar", name };
    }
    function peg$f7(def) {
        return { $: "Definition", def };
    }
    function peg$f8(name, instructions) {
        return { $: "ProcDefinition", name, instructions };
    }
    function peg$f9(name, instructions) {
        return { $: "ProcInlineDefinition", name, instructions };
    }
    function peg$f10(name, instructions) {
        return { $: "ProcRefDefinition", name, instructions };
    }
    function peg$f11(name, instructions) {
        return { $: "MethodDefinition", name, instructions };
    }
    function peg$f12(instr) {
        return { $: "Instruction", instr };
    }
    function peg$f13(args, name) {
        return { $: "AsmExpression", arguments: args, name };
    }
    function peg$f14(primitives) {
        return { $: "AsmArgumentList", primitives };
    }
    function peg$f15(prim) {
        return { $: "AsmPrimitive", prim };
    }
    function peg$f16(kind, instructions, else_instructions) {
        return { instructions: else_instructions };
    }
    function peg$f17(kind, instructions, else_block) {
        return { $: "IfStatement", kind, instructions, else_block: else_block ?? undefined };
    }
    function peg$f18(kind, instructions) {
        return { $: "IfjmpStatement", kind, instructions };
    }
    function peg$f19(condition, body) {
        return { $: "WhileStatement", condition, body };
    }
    function peg$f20(instructions) {
        return { $: "RepeatStatement", instructions };
    }
    function peg$f21(instructions) {
        return { $: "UntilStatement", instructions };
    }
    function peg$f22(instructions) {
        return { $: "InstructionBlock", instructions };
    }
    function peg$f23(content) {
        return { $: "HexBitString", content };
    }
    function peg$f24(content) {
        return { $: "BinBitString", content };
    }
    function peg$f25(content) {
        return { $: "BocHex", content };
    }
    function peg$f26() {
        return { $: "FiftAddressNone" };
    }
    function peg$f27(name) {
        return { $: "Identifier", name };
    }
    function peg$f28(name) {
        return { $: "ArgIdentifier", name };
    }
    function peg$f29(instr) {
        return { $: "TvmInstruction", value: instr };
    }
    function peg$f30(value) {
        return { $: "Integer", value };
    }
    function peg$f31(value) {
        return { $: "Integer", value };
    }
    function peg$f32(value) {
        return { $: "Integer", value };
    }
    function peg$f33(value) {
        return { $: "StackRegister", value };
    }
    function peg$f34(value) {
        return { $: "StackRegister", value };
    }
    function peg$f35(value) {
        return { $: "StackRegister", value };
    }
    function peg$f36(value) {
        return { $: "ControlRegister", value };
    }
    function peg$f37(content) {
        return { $: "String", content };
    }
    let peg$currPos = options.peg$currPos | 0;
    let peg$savedPos = peg$currPos;
    const peg$posDetailsCache = [{ line: 1, column: 1 }];
    let peg$maxFailPos = peg$currPos;
    let peg$maxFailExpected = options.peg$maxFailExpected || [];
    let peg$silentFails = options.peg$silentFails | 0;
    let peg$result;
    if (options.startRule) {
        if (!(options.startRule in peg$startRuleFunctions)) {
            throw new Error("Can't start parsing from rule \"" + options.startRule + '".');
        }
        peg$startRuleFunction = peg$startRuleFunctions[options.startRule];
    }
    function text() {
        return input.substring(peg$savedPos, peg$currPos);
    }
    function offset() {
        return peg$savedPos;
    }
    function range() {
        return {
            source: peg$source,
            start: peg$savedPos,
            end: peg$currPos,
        };
    }
    function location() {
        return peg$computeLocation(peg$savedPos, peg$currPos);
    }
    function expected(description, location) {
        location =
            location !== undefined ? location : peg$computeLocation(peg$savedPos, peg$currPos);
        throw peg$buildStructuredError([peg$otherExpectation(description)], input.substring(peg$savedPos, peg$currPos), location);
    }
    function error(message, location) {
        location =
            location !== undefined ? location : peg$computeLocation(peg$savedPos, peg$currPos);
        throw peg$buildSimpleError(message, location);
    }
    function peg$getUnicode(pos = peg$currPos) {
        const cp = input.codePointAt(pos);
        if (cp === undefined) {
            return "";
        }
        return String.fromCodePoint(cp);
    }
    function peg$literalExpectation(text, ignoreCase) {
        return { type: "literal", text, ignoreCase };
    }
    function peg$classExpectation(parts, inverted, ignoreCase, unicode) {
        return { type: "class", parts, inverted, ignoreCase, unicode };
    }
    function peg$anyExpectation() {
        return { type: "any" };
    }
    function peg$endExpectation() {
        return { type: "end" };
    }
    function peg$otherExpectation(description) {
        return { type: "other", description };
    }
    function peg$computePosDetails(pos) {
        let details = peg$posDetailsCache[pos];
        let p;
        if (details) {
            return details;
        }
        else {
            if (pos >= peg$posDetailsCache.length) {
                p = peg$posDetailsCache.length - 1;
            }
            else {
                p = pos;
                while (!peg$posDetailsCache[--p]) { }
            }
            details = peg$posDetailsCache[p];
            details = {
                line: details.line,
                column: details.column,
            };
            while (p < pos) {
                if (input.charCodeAt(p) === 10) {
                    details.line++;
                    details.column = 1;
                }
                else {
                    details.column++;
                }
                p++;
            }
            peg$posDetailsCache[pos] = details;
            return details;
        }
    }
    function peg$computeLocation(startPos, endPos, offset) {
        const startPosDetails = peg$computePosDetails(startPos);
        const endPosDetails = peg$computePosDetails(endPos);
        const res = {
            source: peg$source,
            start: {
                offset: startPos,
                line: startPosDetails.line,
                column: startPosDetails.column,
            },
            end: {
                offset: endPos,
                line: endPosDetails.line,
                column: endPosDetails.column,
            },
        };
        if (offset && peg$source && typeof peg$source.offset === "function") {
            res.start = peg$source.offset(res.start);
            res.end = peg$source.offset(res.end);
        }
        return res;
    }
    function peg$fail(expected) {
        if (peg$currPos < peg$maxFailPos) {
            return;
        }
        if (peg$currPos > peg$maxFailPos) {
            peg$maxFailPos = peg$currPos;
            peg$maxFailExpected = [];
        }
        peg$maxFailExpected.push(expected);
    }
    function peg$buildSimpleError(message, location) {
        return new peg$SyntaxError(message, null, null, location);
    }
    function peg$buildStructuredError(expected, found, location) {
        return new peg$SyntaxError(peg$SyntaxError.buildMessage(expected, found), expected, found, location);
    }
    function peg$parseSourceFile() {
        let s0, s1, s2, s3, s4, s5, s6;
        s0 = peg$currPos;
        s1 = [];
        s2 = peg$parsespace();
        while (s2 !== peg$FAILED) {
            s1.push(s2);
            s2 = peg$parsespace();
        }
        s2 = peg$parseIncludeDirective();
        if (s2 === peg$FAILED) {
            s2 = null;
        }
        s3 = [];
        s4 = peg$parsespace();
        while (s4 !== peg$FAILED) {
            s3.push(s4);
            s4 = peg$parsespace();
        }
        s4 = peg$parseProgram();
        if (s4 !== peg$FAILED) {
            s5 = [];
            s6 = peg$parsespace();
            while (s6 !== peg$FAILED) {
                s5.push(s6);
                s6 = peg$parsespace();
            }
            peg$savedPos = s0;
            s0 = peg$f0(s2, s4);
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseIncludeDirective() {
        let s0, s1, s2, s3, s4, s5, s6, s7;
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 34) {
            s1 = peg$c0;
            peg$currPos++;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e0);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = peg$currPos;
            s3 = [];
            s4 = input.charAt(peg$currPos);
            if (peg$r0.test(s4)) {
                peg$currPos++;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e1);
                }
            }
            if (s4 !== peg$FAILED) {
                while (s4 !== peg$FAILED) {
                    s3.push(s4);
                    s4 = input.charAt(peg$currPos);
                    if (peg$r0.test(s4)) {
                        peg$currPos++;
                    }
                    else {
                        s4 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e1);
                        }
                    }
                }
            }
            else {
                s3 = peg$FAILED;
            }
            if (s3 !== peg$FAILED) {
                s2 = input.substring(s2, peg$currPos);
            }
            else {
                s2 = s3;
            }
            if (s2 !== peg$FAILED) {
                if (input.charCodeAt(peg$currPos) === 34) {
                    s3 = peg$c0;
                    peg$currPos++;
                }
                else {
                    s3 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e0);
                    }
                }
                if (s3 !== peg$FAILED) {
                    s4 = [];
                    s5 = peg$parsespace();
                    if (s5 !== peg$FAILED) {
                        while (s5 !== peg$FAILED) {
                            s4.push(s5);
                            s5 = peg$parsespace();
                        }
                    }
                    else {
                        s4 = peg$FAILED;
                    }
                    if (s4 !== peg$FAILED) {
                        if (input.substr(peg$currPos, 7) === peg$c1) {
                            s5 = peg$c1;
                            peg$currPos += 7;
                        }
                        else {
                            s5 = peg$FAILED;
                            if (peg$silentFails === 0) {
                                peg$fail(peg$e2);
                            }
                        }
                        if (s5 !== peg$FAILED) {
                            s6 = [];
                            s7 = peg$parsespace();
                            while (s7 !== peg$FAILED) {
                                s6.push(s7);
                                s7 = peg$parsespace();
                            }
                            peg$savedPos = s0;
                            s0 = peg$f1(s2);
                        }
                        else {
                            peg$currPos = s0;
                            s0 = peg$FAILED;
                        }
                    }
                    else {
                        peg$currPos = s0;
                        s0 = peg$FAILED;
                    }
                }
                else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseProgram() {
        let s0, s1, s2, s3, s4, s5, s6, s7;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 8) === peg$c2) {
            s1 = peg$c2;
            peg$currPos += 8;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e3);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = peg$parsespace();
            }
            s3 = [];
            s4 = peg$parseDeclaration();
            while (s4 !== peg$FAILED) {
                s3.push(s4);
                s4 = peg$parseDeclaration();
            }
            s4 = [];
            s5 = peg$parsespace();
            while (s5 !== peg$FAILED) {
                s4.push(s5);
                s5 = peg$parsespace();
            }
            s5 = [];
            s6 = peg$parseDefinition();
            while (s6 !== peg$FAILED) {
                s5.push(s6);
                s6 = peg$parseDefinition();
            }
            s6 = [];
            s7 = peg$parsespace();
            while (s7 !== peg$FAILED) {
                s6.push(s7);
                s7 = peg$parsespace();
            }
            if (input.substr(peg$currPos, 6) === peg$c3) {
                s7 = peg$c3;
                peg$currPos += 6;
            }
            else {
                s7 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e4);
                }
            }
            if (s7 !== peg$FAILED) {
                peg$savedPos = s0;
                s0 = peg$f2(s3, s5);
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseDeclaration() {
        let s0, s1, s2, s3, s4;
        s0 = peg$currPos;
        s1 = [];
        s2 = peg$parsespace();
        while (s2 !== peg$FAILED) {
            s1.push(s2);
            s2 = peg$parsespace();
        }
        s2 = peg$parseProcDeclaration();
        if (s2 === peg$FAILED) {
            s2 = peg$parseMethodDeclaration();
            if (s2 === peg$FAILED) {
                s2 = peg$parseGlobalVar();
            }
        }
        if (s2 !== peg$FAILED) {
            s3 = [];
            s4 = peg$parsespace();
            while (s4 !== peg$FAILED) {
                s3.push(s4);
                s4 = peg$parsespace();
            }
            peg$savedPos = s0;
            s0 = peg$f3(s2);
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseProcDeclaration() {
        let s0, s1, s2, s3;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 8) === peg$c4) {
            s1 = peg$c4;
            peg$currPos += 8;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e5);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            if (s3 !== peg$FAILED) {
                while (s3 !== peg$FAILED) {
                    s2.push(s3);
                    s3 = peg$parsespace();
                }
            }
            else {
                s2 = peg$FAILED;
            }
            if (s2 !== peg$FAILED) {
                s3 = peg$parseIdentifier();
                if (s3 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s0 = peg$f4(s3);
                }
                else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseMethodDeclaration() {
        let s0, s1, s2, s3, s4, s5;
        s0 = peg$currPos;
        s1 = peg$parseInteger();
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            if (s3 !== peg$FAILED) {
                while (s3 !== peg$FAILED) {
                    s2.push(s3);
                    s3 = peg$parsespace();
                }
            }
            else {
                s2 = peg$FAILED;
            }
            if (s2 !== peg$FAILED) {
                if (input.substr(peg$currPos, 10) === peg$c5) {
                    s3 = peg$c5;
                    peg$currPos += 10;
                }
                else {
                    s3 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e6);
                    }
                }
                if (s3 !== peg$FAILED) {
                    s4 = [];
                    s5 = peg$parsespace();
                    if (s5 !== peg$FAILED) {
                        while (s5 !== peg$FAILED) {
                            s4.push(s5);
                            s5 = peg$parsespace();
                        }
                    }
                    else {
                        s4 = peg$FAILED;
                    }
                    if (s4 !== peg$FAILED) {
                        s5 = peg$parseIdentifier();
                        if (s5 !== peg$FAILED) {
                            peg$savedPos = s0;
                            s0 = peg$f5(s1, s5);
                        }
                        else {
                            peg$currPos = s0;
                            s0 = peg$FAILED;
                        }
                    }
                    else {
                        peg$currPos = s0;
                        s0 = peg$FAILED;
                    }
                }
                else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseGlobalVar() {
        let s0, s1, s2, s3;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 11) === peg$c6) {
            s1 = peg$c6;
            peg$currPos += 11;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e7);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            if (s3 !== peg$FAILED) {
                while (s3 !== peg$FAILED) {
                    s2.push(s3);
                    s3 = peg$parsespace();
                }
            }
            else {
                s2 = peg$FAILED;
            }
            if (s2 !== peg$FAILED) {
                s3 = peg$parseIdentifier();
                if (s3 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s0 = peg$f6(s3);
                }
                else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseDefinition() {
        let s0, s1, s2, s3, s4;
        s0 = peg$currPos;
        s1 = [];
        s2 = peg$parsespace();
        while (s2 !== peg$FAILED) {
            s1.push(s2);
            s2 = peg$parsespace();
        }
        s2 = peg$parseProcDefinition();
        if (s2 === peg$FAILED) {
            s2 = peg$parseProcInlineDefinition();
            if (s2 === peg$FAILED) {
                s2 = peg$parseProcRefDefinition();
                if (s2 === peg$FAILED) {
                    s2 = peg$parseMethodDefinition();
                }
            }
        }
        if (s2 !== peg$FAILED) {
            s3 = [];
            s4 = peg$parsespace();
            while (s4 !== peg$FAILED) {
                s3.push(s4);
                s4 = peg$parsespace();
            }
            peg$savedPos = s0;
            s0 = peg$f7(s2);
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseProcDefinition() {
        let s0, s1, s2, s3, s4, s5, s6;
        s0 = peg$currPos;
        s1 = peg$parseIdentifier();
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = peg$parsespace();
            }
            if (input.substr(peg$currPos, 7) === peg$c7) {
                s3 = peg$c7;
                peg$currPos += 7;
            }
            else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e8);
                }
            }
            if (s3 !== peg$FAILED) {
                s4 = [];
                s5 = peg$parsespace();
                while (s5 !== peg$FAILED) {
                    s4.push(s5);
                    s5 = peg$parsespace();
                }
                s5 = [];
                s6 = peg$parseInstruction();
                while (s6 !== peg$FAILED) {
                    s5.push(s6);
                    s6 = peg$parseInstruction();
                }
                if (input.substr(peg$currPos, 2) === peg$c8) {
                    s6 = peg$c8;
                    peg$currPos += 2;
                }
                else {
                    s6 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e9);
                    }
                }
                if (s6 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s0 = peg$f8(s1, s5);
                }
                else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseProcInlineDefinition() {
        let s0, s1, s2, s3, s4, s5, s6;
        s0 = peg$currPos;
        s1 = peg$parseIdentifier();
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = peg$parsespace();
            }
            if (input.substr(peg$currPos, 13) === peg$c9) {
                s3 = peg$c9;
                peg$currPos += 13;
            }
            else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e10);
                }
            }
            if (s3 !== peg$FAILED) {
                s4 = [];
                s5 = peg$parsespace();
                while (s5 !== peg$FAILED) {
                    s4.push(s5);
                    s5 = peg$parsespace();
                }
                s5 = [];
                s6 = peg$parseInstruction();
                while (s6 !== peg$FAILED) {
                    s5.push(s6);
                    s6 = peg$parseInstruction();
                }
                if (input.substr(peg$currPos, 2) === peg$c8) {
                    s6 = peg$c8;
                    peg$currPos += 2;
                }
                else {
                    s6 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e9);
                    }
                }
                if (s6 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s0 = peg$f9(s1, s5);
                }
                else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseProcRefDefinition() {
        let s0, s1, s2, s3, s4, s5, s6;
        s0 = peg$currPos;
        s1 = peg$parseIdentifier();
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = peg$parsespace();
            }
            if (input.substr(peg$currPos, 10) === peg$c10) {
                s3 = peg$c10;
                peg$currPos += 10;
            }
            else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e11);
                }
            }
            if (s3 !== peg$FAILED) {
                s4 = [];
                s5 = peg$parsespace();
                while (s5 !== peg$FAILED) {
                    s4.push(s5);
                    s5 = peg$parsespace();
                }
                s5 = [];
                s6 = peg$parseInstruction();
                while (s6 !== peg$FAILED) {
                    s5.push(s6);
                    s6 = peg$parseInstruction();
                }
                if (input.substr(peg$currPos, 2) === peg$c8) {
                    s6 = peg$c8;
                    peg$currPos += 2;
                }
                else {
                    s6 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e9);
                    }
                }
                if (s6 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s0 = peg$f10(s1, s5);
                }
                else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseMethodDefinition() {
        let s0, s1, s2, s3, s4, s5, s6;
        s0 = peg$currPos;
        s1 = peg$parseIdentifier();
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = peg$parsespace();
            }
            if (input.substr(peg$currPos, 9) === peg$c11) {
                s3 = peg$c11;
                peg$currPos += 9;
            }
            else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e12);
                }
            }
            if (s3 !== peg$FAILED) {
                s4 = [];
                s5 = peg$parsespace();
                while (s5 !== peg$FAILED) {
                    s4.push(s5);
                    s5 = peg$parsespace();
                }
                s5 = [];
                s6 = peg$parseInstruction();
                while (s6 !== peg$FAILED) {
                    s5.push(s6);
                    s6 = peg$parseInstruction();
                }
                if (input.substr(peg$currPos, 2) === peg$c8) {
                    s6 = peg$c8;
                    peg$currPos += 2;
                }
                else {
                    s6 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e9);
                    }
                }
                if (s6 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s0 = peg$f11(s1, s5);
                }
                else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseInstruction() {
        let s0, s1, s2, s3, s4;
        s0 = peg$currPos;
        s1 = [];
        s2 = peg$parsespace();
        while (s2 !== peg$FAILED) {
            s1.push(s2);
            s2 = peg$parsespace();
        }
        s2 = peg$parseIfStatement();
        if (s2 === peg$FAILED) {
            s2 = peg$parseIfjmpStatement();
            if (s2 === peg$FAILED) {
                s2 = peg$parseWhileStatement();
                if (s2 === peg$FAILED) {
                    s2 = peg$parseRepeatStatement();
                    if (s2 === peg$FAILED) {
                        s2 = peg$parseUntilStatement();
                        if (s2 === peg$FAILED) {
                            s2 = peg$parseAsmExpression();
                        }
                    }
                }
            }
        }
        if (s2 !== peg$FAILED) {
            s3 = [];
            s4 = peg$parsespace();
            while (s4 !== peg$FAILED) {
                s3.push(s4);
                s4 = peg$parsespace();
            }
            peg$savedPos = s0;
            s0 = peg$f12(s2);
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseAsmExpression() {
        let s0, s1, s2, s3;
        s0 = peg$currPos;
        s1 = peg$parseAsmArgumentList();
        if (s1 === peg$FAILED) {
            s1 = null;
        }
        s2 = [];
        s3 = peg$parsespace();
        while (s3 !== peg$FAILED) {
            s2.push(s3);
            s3 = peg$parsespace();
        }
        s3 = peg$parseTvmInstruction();
        if (s3 !== peg$FAILED) {
            peg$savedPos = s0;
            s0 = peg$f13(s1, s3);
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseAsmArgumentList() {
        let s0, s1, s2, s3;
        s0 = peg$currPos;
        s1 = [];
        s2 = peg$parsespace();
        while (s2 !== peg$FAILED) {
            s1.push(s2);
            s2 = peg$parsespace();
        }
        s2 = [];
        s3 = peg$parseAsmPrimitive();
        if (s3 !== peg$FAILED) {
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = peg$parseAsmPrimitive();
            }
        }
        else {
            s2 = peg$FAILED;
        }
        if (s2 !== peg$FAILED) {
            peg$savedPos = s0;
            s0 = peg$f14(s2);
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseAsmPrimitive() {
        let s0, s1, s2, s3, s4;
        s0 = peg$currPos;
        s1 = [];
        s2 = peg$parsespace();
        while (s2 !== peg$FAILED) {
            s1.push(s2);
            s2 = peg$parsespace();
        }
        s2 = peg$parseInstructionBlock();
        if (s2 === peg$FAILED) {
            s2 = peg$parseString();
            if (s2 === peg$FAILED) {
                s2 = peg$parseHexBitString();
                if (s2 === peg$FAILED) {
                    s2 = peg$parseBinBitString();
                    if (s2 === peg$FAILED) {
                        s2 = peg$parseBocHex();
                        if (s2 === peg$FAILED) {
                            s2 = peg$parseFiftAddressNone();
                            if (s2 === peg$FAILED) {
                                s2 = peg$parseStackRegister();
                                if (s2 === peg$FAILED) {
                                    s2 = peg$parseControlRegister();
                                    if (s2 === peg$FAILED) {
                                        s2 = peg$parseInteger();
                                        if (s2 === peg$FAILED) {
                                            s2 = peg$parseArgIdentifier();
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        if (s2 !== peg$FAILED) {
            s3 = [];
            s4 = peg$parsespace();
            while (s4 !== peg$FAILED) {
                s3.push(s4);
                s4 = peg$parsespace();
            }
            peg$savedPos = s0;
            s0 = peg$f15(s2);
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseIfStatement() {
        let s0, s1, s2, s3, s4, s5, s6, s7, s8, s9;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 5) === peg$c12) {
            s1 = peg$c12;
            peg$currPos += 5;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e13);
            }
        }
        if (s1 === peg$FAILED) {
            if (input.substr(peg$currPos, 8) === peg$c13) {
                s1 = peg$c13;
                peg$currPos += 8;
            }
            else {
                s1 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e14);
                }
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = peg$parsespace();
            }
            s3 = [];
            s4 = peg$parseInstruction();
            while (s4 !== peg$FAILED) {
                s3.push(s4);
                s4 = peg$parseInstruction();
            }
            if (input.substr(peg$currPos, 2) === peg$c8) {
                s4 = peg$c8;
                peg$currPos += 2;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e9);
                }
            }
            if (s4 !== peg$FAILED) {
                s5 = peg$currPos;
                if (input.substr(peg$currPos, 6) === peg$c14) {
                    s6 = peg$c14;
                    peg$currPos += 6;
                }
                else {
                    s6 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e15);
                    }
                }
                if (s6 !== peg$FAILED) {
                    s7 = [];
                    s8 = peg$parsespace();
                    while (s8 !== peg$FAILED) {
                        s7.push(s8);
                        s8 = peg$parsespace();
                    }
                    s8 = [];
                    s9 = peg$parseInstruction();
                    while (s9 !== peg$FAILED) {
                        s8.push(s9);
                        s9 = peg$parseInstruction();
                    }
                    if (input.substr(peg$currPos, 2) === peg$c8) {
                        s9 = peg$c8;
                        peg$currPos += 2;
                    }
                    else {
                        s9 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e9);
                        }
                    }
                    if (s9 !== peg$FAILED) {
                        peg$savedPos = s5;
                        s5 = peg$f16(s1, s3, s8);
                    }
                    else {
                        peg$currPos = s5;
                        s5 = peg$FAILED;
                    }
                }
                else {
                    peg$currPos = s5;
                    s5 = peg$FAILED;
                }
                if (s5 === peg$FAILED) {
                    s5 = null;
                }
                peg$savedPos = s0;
                s0 = peg$f17(s1, s3, s5);
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseIfjmpStatement() {
        let s0, s1, s2, s3, s4;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 8) === peg$c15) {
            s1 = peg$c15;
            peg$currPos += 8;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e16);
            }
        }
        if (s1 === peg$FAILED) {
            if (input.substr(peg$currPos, 11) === peg$c16) {
                s1 = peg$c16;
                peg$currPos += 11;
            }
            else {
                s1 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e17);
                }
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = peg$parsespace();
            }
            s3 = [];
            s4 = peg$parseInstruction();
            while (s4 !== peg$FAILED) {
                s3.push(s4);
                s4 = peg$parseInstruction();
            }
            if (input.substr(peg$currPos, 2) === peg$c8) {
                s4 = peg$c8;
                peg$currPos += 2;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e9);
                }
            }
            if (s4 !== peg$FAILED) {
                peg$savedPos = s0;
                s0 = peg$f18(s1, s3);
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseWhileStatement() {
        let s0, s1, s2, s3, s4, s5, s6, s7;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 8) === peg$c17) {
            s1 = peg$c17;
            peg$currPos += 8;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e18);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = peg$parsespace();
            }
            s3 = [];
            s4 = peg$parseInstruction();
            while (s4 !== peg$FAILED) {
                s3.push(s4);
                s4 = peg$parseInstruction();
            }
            if (input.substr(peg$currPos, 6) === peg$c18) {
                s4 = peg$c18;
                peg$currPos += 6;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e19);
                }
            }
            if (s4 !== peg$FAILED) {
                s5 = [];
                s6 = peg$parsespace();
                while (s6 !== peg$FAILED) {
                    s5.push(s6);
                    s6 = peg$parsespace();
                }
                s6 = [];
                s7 = peg$parseInstruction();
                while (s7 !== peg$FAILED) {
                    s6.push(s7);
                    s7 = peg$parseInstruction();
                }
                if (input.substr(peg$currPos, 2) === peg$c8) {
                    s7 = peg$c8;
                    peg$currPos += 2;
                }
                else {
                    s7 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e9);
                    }
                }
                if (s7 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s0 = peg$f19(s3, s6);
                }
                else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseRepeatStatement() {
        let s0, s1, s2, s3, s4;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 9) === peg$c19) {
            s1 = peg$c19;
            peg$currPos += 9;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e20);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = peg$parsespace();
            }
            s3 = [];
            s4 = peg$parseInstruction();
            while (s4 !== peg$FAILED) {
                s3.push(s4);
                s4 = peg$parseInstruction();
            }
            if (input.substr(peg$currPos, 2) === peg$c8) {
                s4 = peg$c8;
                peg$currPos += 2;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e9);
                }
            }
            if (s4 !== peg$FAILED) {
                peg$savedPos = s0;
                s0 = peg$f20(s3);
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseUntilStatement() {
        let s0, s1, s2, s3, s4;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 8) === peg$c20) {
            s1 = peg$c20;
            peg$currPos += 8;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e21);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = peg$parsespace();
            }
            s3 = [];
            s4 = peg$parseInstruction();
            while (s4 !== peg$FAILED) {
                s3.push(s4);
                s4 = peg$parseInstruction();
            }
            if (input.substr(peg$currPos, 2) === peg$c8) {
                s4 = peg$c8;
                peg$currPos += 2;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e9);
                }
            }
            if (s4 !== peg$FAILED) {
                peg$savedPos = s0;
                s0 = peg$f21(s3);
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseInstructionBlock() {
        let s0, s1, s2, s3, s4;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c21) {
            s1 = peg$c21;
            peg$currPos += 2;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e22);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = peg$parsespace();
            }
            s3 = [];
            s4 = peg$parseInstruction();
            while (s4 !== peg$FAILED) {
                s3.push(s4);
                s4 = peg$parseInstruction();
            }
            if (input.substr(peg$currPos, 3) === peg$c22) {
                s4 = peg$c22;
                peg$currPos += 3;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e23);
                }
            }
            if (s4 === peg$FAILED) {
                if (input.substr(peg$currPos, 3) === peg$c23) {
                    s4 = peg$c23;
                    peg$currPos += 3;
                }
                else {
                    s4 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e24);
                    }
                }
                if (s4 === peg$FAILED) {
                    if (input.substr(peg$currPos, 6) === peg$c24) {
                        s4 = peg$c24;
                        peg$currPos += 6;
                    }
                    else {
                        s4 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e25);
                        }
                    }
                    if (s4 === peg$FAILED) {
                        if (input.substr(peg$currPos, 2) === peg$c8) {
                            s4 = peg$c8;
                            peg$currPos += 2;
                        }
                        else {
                            s4 = peg$FAILED;
                            if (peg$silentFails === 0) {
                                peg$fail(peg$e9);
                            }
                        }
                    }
                }
            }
            if (s4 !== peg$FAILED) {
                peg$savedPos = s0;
                s0 = peg$f22(s3);
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseHexBitString() {
        let s0, s1, s2, s3, s4, s5;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c25) {
            s1 = peg$c25;
            peg$currPos += 2;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e26);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = peg$currPos;
            s3 = peg$currPos;
            s4 = [];
            s5 = input.charAt(peg$currPos);
            if (peg$r1.test(s5)) {
                peg$currPos++;
            }
            else {
                s5 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e27);
                }
            }
            while (s5 !== peg$FAILED) {
                s4.push(s5);
                s5 = input.charAt(peg$currPos);
                if (peg$r1.test(s5)) {
                    peg$currPos++;
                }
                else {
                    s5 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e27);
                    }
                }
            }
            if (input.charCodeAt(peg$currPos) === 95) {
                s5 = peg$c26;
                peg$currPos++;
            }
            else {
                s5 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e28);
                }
            }
            if (s5 === peg$FAILED) {
                s5 = null;
            }
            s4 = [s4, s5];
            s3 = s4;
            s2 = input.substring(s2, peg$currPos);
            if (input.charCodeAt(peg$currPos) === 125) {
                s3 = peg$c27;
                peg$currPos++;
            }
            else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e29);
                }
            }
            if (s3 !== peg$FAILED) {
                peg$savedPos = s0;
                s0 = peg$f23(s2);
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseBinBitString() {
        let s0, s1, s2, s3, s4;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c28) {
            s1 = peg$c28;
            peg$currPos += 2;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e30);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = peg$currPos;
            s3 = [];
            s4 = input.charAt(peg$currPos);
            if (peg$r2.test(s4)) {
                peg$currPos++;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e31);
                }
            }
            while (s4 !== peg$FAILED) {
                s3.push(s4);
                s4 = input.charAt(peg$currPos);
                if (peg$r2.test(s4)) {
                    peg$currPos++;
                }
                else {
                    s4 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e31);
                    }
                }
            }
            s2 = input.substring(s2, peg$currPos);
            if (input.charCodeAt(peg$currPos) === 125) {
                s3 = peg$c27;
                peg$currPos++;
            }
            else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e29);
                }
            }
            if (s3 !== peg$FAILED) {
                peg$savedPos = s0;
                s0 = peg$f24(s2);
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseBocHex() {
        let s0, s1, s2, s3, s4;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c29) {
            s1 = peg$c29;
            peg$currPos += 2;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e32);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = peg$currPos;
            s3 = [];
            s4 = input.charAt(peg$currPos);
            if (peg$r3.test(s4)) {
                peg$currPos++;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e33);
                }
            }
            if (s4 !== peg$FAILED) {
                while (s4 !== peg$FAILED) {
                    s3.push(s4);
                    s4 = input.charAt(peg$currPos);
                    if (peg$r3.test(s4)) {
                        peg$currPos++;
                    }
                    else {
                        s4 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e33);
                        }
                    }
                }
            }
            else {
                s3 = peg$FAILED;
            }
            if (s3 !== peg$FAILED) {
                s2 = input.substring(s2, peg$currPos);
            }
            else {
                s2 = s3;
            }
            if (s2 !== peg$FAILED) {
                if (input.charCodeAt(peg$currPos) === 125) {
                    s3 = peg$c27;
                    peg$currPos++;
                }
                else {
                    s3 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e29);
                    }
                }
                if (s3 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s0 = peg$f25(s2);
                }
                else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseFiftAddressNone() {
        let s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c30) {
            s1 = peg$c30;
            peg$currPos += 2;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e34);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = peg$parsespace();
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = peg$parsespace();
            }
            if (input.charCodeAt(peg$currPos) === 48) {
                s3 = peg$c31;
                peg$currPos++;
            }
            else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e35);
                }
            }
            if (s3 !== peg$FAILED) {
                s4 = [];
                s5 = peg$parsespace();
                while (s5 !== peg$FAILED) {
                    s4.push(s5);
                    s5 = peg$parsespace();
                }
                if (input.charCodeAt(peg$currPos) === 50) {
                    s5 = peg$c32;
                    peg$currPos++;
                }
                else {
                    s5 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e36);
                    }
                }
                if (s5 !== peg$FAILED) {
                    s6 = [];
                    s7 = peg$parsespace();
                    while (s7 !== peg$FAILED) {
                        s6.push(s7);
                        s7 = peg$parsespace();
                    }
                    if (input.substr(peg$currPos, 2) === peg$c33) {
                        s7 = peg$c33;
                        peg$currPos += 2;
                    }
                    else {
                        s7 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e37);
                        }
                    }
                    if (s7 !== peg$FAILED) {
                        s8 = [];
                        s9 = peg$parsespace();
                        while (s9 !== peg$FAILED) {
                            s8.push(s9);
                            s9 = peg$parsespace();
                        }
                        if (input.substr(peg$currPos, 2) === peg$c34) {
                            s9 = peg$c34;
                            peg$currPos += 2;
                        }
                        else {
                            s9 = peg$FAILED;
                            if (peg$silentFails === 0) {
                                peg$fail(peg$e38);
                            }
                        }
                        if (s9 !== peg$FAILED) {
                            s10 = [];
                            s11 = peg$parsespace();
                            while (s11 !== peg$FAILED) {
                                s10.push(s11);
                                s11 = peg$parsespace();
                            }
                            if (input.substr(peg$currPos, 2) === peg$c35) {
                                s11 = peg$c35;
                                peg$currPos += 2;
                            }
                            else {
                                s11 = peg$FAILED;
                                if (peg$silentFails === 0) {
                                    peg$fail(peg$e39);
                                }
                            }
                            if (s11 !== peg$FAILED) {
                                peg$savedPos = s0;
                                s0 = peg$f26();
                            }
                            else {
                                peg$currPos = s0;
                                s0 = peg$FAILED;
                            }
                        }
                        else {
                            peg$currPos = s0;
                            s0 = peg$FAILED;
                        }
                    }
                    else {
                        peg$currPos = s0;
                        s0 = peg$FAILED;
                    }
                }
                else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parseIdentifier() {
        let s0, s1, s2, s3, s4, s5, s6;
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$currPos;
        s3 = peg$currPos;
        peg$silentFails++;
        s4 = peg$parsereservedWord();
        peg$silentFails--;
        if (s4 === peg$FAILED) {
            s3 = undefined;
        }
        else {
            peg$currPos = s3;
            s3 = peg$FAILED;
        }
        if (s3 !== peg$FAILED) {
            s4 = input.charAt(peg$currPos);
            if (peg$r4.test(s4)) {
                peg$currPos++;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e40);
                }
            }
            if (s4 !== peg$FAILED) {
                s5 = [];
                s6 = input.charAt(peg$currPos);
                if (peg$r5.test(s6)) {
                    peg$currPos++;
                }
                else {
                    s6 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e41);
                    }
                }
                while (s6 !== peg$FAILED) {
                    s5.push(s6);
                    s6 = input.charAt(peg$currPos);
                    if (peg$r5.test(s6)) {
                        peg$currPos++;
                    }
                    else {
                        s6 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e41);
                        }
                    }
                }
                s3 = [s3, s4, s5];
                s2 = s3;
            }
            else {
                peg$currPos = s2;
                s2 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s2;
            s2 = peg$FAILED;
        }
        if (s2 !== peg$FAILED) {
            s1 = input.substring(s1, peg$currPos);
        }
        else {
            s1 = s2;
        }
        if (s1 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$f27(s1);
        }
        s0 = s1;
        return s0;
    }
    function peg$parseArgIdentifier() {
        let s0, s1, s2, s3, s4, s5, s6;
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$currPos;
        s3 = peg$currPos;
        peg$silentFails++;
        s4 = peg$parsereservedWord();
        peg$silentFails--;
        if (s4 === peg$FAILED) {
            s3 = undefined;
        }
        else {
            peg$currPos = s3;
            s3 = peg$FAILED;
        }
        if (s3 !== peg$FAILED) {
            s4 = peg$currPos;
            s5 = input.charAt(peg$currPos);
            if (peg$r6.test(s5)) {
                peg$currPos++;
            }
            else {
                s5 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e42);
                }
            }
            if (s5 !== peg$FAILED) {
                s6 = input.charAt(peg$currPos);
                if (peg$r7.test(s6)) {
                    peg$currPos++;
                }
                else {
                    s6 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e43);
                    }
                }
                if (s6 !== peg$FAILED) {
                    s5 = [s5, s6];
                    s4 = s5;
                }
                else {
                    peg$currPos = s4;
                    s4 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s4;
                s4 = peg$FAILED;
            }
            if (s4 === peg$FAILED) {
                s4 = input.charAt(peg$currPos);
                if (peg$r8.test(s4)) {
                    peg$currPos++;
                }
                else {
                    s4 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e44);
                    }
                }
            }
            if (s4 !== peg$FAILED) {
                s5 = [];
                s6 = input.charAt(peg$currPos);
                if (peg$r5.test(s6)) {
                    peg$currPos++;
                }
                else {
                    s6 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e41);
                    }
                }
                while (s6 !== peg$FAILED) {
                    s5.push(s6);
                    s6 = input.charAt(peg$currPos);
                    if (peg$r5.test(s6)) {
                        peg$currPos++;
                    }
                    else {
                        s6 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e41);
                        }
                    }
                }
                s3 = [s3, s4, s5];
                s2 = s3;
            }
            else {
                peg$currPos = s2;
                s2 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s2;
            s2 = peg$FAILED;
        }
        if (s2 !== peg$FAILED) {
            s1 = input.substring(s1, peg$currPos);
        }
        else {
            s1 = s2;
        }
        if (s1 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$f28(s1);
        }
        s0 = s1;
        return s0;
    }
    function peg$parseTvmInstruction() {
        let s0, s1, s2, s3, s4, s5, s6;
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 45) {
            s3 = peg$c36;
            peg$currPos++;
        }
        else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e45);
            }
        }
        if (s3 === peg$FAILED) {
            s3 = null;
        }
        s4 = input.charAt(peg$currPos);
        if (peg$r9.test(s4)) {
            peg$currPos++;
        }
        else {
            s4 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e46);
            }
        }
        if (s4 !== peg$FAILED) {
            s5 = [];
            s6 = input.charAt(peg$currPos);
            if (peg$r9.test(s6)) {
                peg$currPos++;
            }
            else {
                s6 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e46);
                }
            }
            if (s6 !== peg$FAILED) {
                while (s6 !== peg$FAILED) {
                    s5.push(s6);
                    s6 = input.charAt(peg$currPos);
                    if (peg$r9.test(s6)) {
                        peg$currPos++;
                    }
                    else {
                        s6 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e46);
                        }
                    }
                }
            }
            else {
                s5 = peg$FAILED;
            }
            if (s5 !== peg$FAILED) {
                if (input.charCodeAt(peg$currPos) === 108) {
                    s6 = peg$c37;
                    peg$currPos++;
                }
                else {
                    s6 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e47);
                    }
                }
                if (s6 === peg$FAILED) {
                    s6 = null;
                }
                s3 = [s3, s4, s5, s6];
                s2 = s3;
            }
            else {
                peg$currPos = s2;
                s2 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s2;
            s2 = peg$FAILED;
        }
        if (s2 !== peg$FAILED) {
            s1 = input.substring(s1, peg$currPos);
        }
        else {
            s1 = s2;
        }
        if (s1 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$f29(s1);
        }
        s0 = s1;
        return s0;
    }
    function peg$parseInteger() {
        let s0, s1, s2, s3, s4, s5, s6;
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 45) {
            s3 = peg$c36;
            peg$currPos++;
        }
        else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e45);
            }
        }
        if (s3 === peg$FAILED) {
            s3 = null;
        }
        if (input.substr(peg$currPos, 2) === peg$c38) {
            s4 = peg$c38;
            peg$currPos += 2;
        }
        else {
            s4 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e48);
            }
        }
        if (s4 !== peg$FAILED) {
            s5 = [];
            s6 = input.charAt(peg$currPos);
            if (peg$r2.test(s6)) {
                peg$currPos++;
            }
            else {
                s6 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e31);
                }
            }
            if (s6 !== peg$FAILED) {
                while (s6 !== peg$FAILED) {
                    s5.push(s6);
                    s6 = input.charAt(peg$currPos);
                    if (peg$r2.test(s6)) {
                        peg$currPos++;
                    }
                    else {
                        s6 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e31);
                        }
                    }
                }
            }
            else {
                s5 = peg$FAILED;
            }
            if (s5 !== peg$FAILED) {
                s3 = [s3, s4, s5];
                s2 = s3;
            }
            else {
                peg$currPos = s2;
                s2 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s2;
            s2 = peg$FAILED;
        }
        if (s2 !== peg$FAILED) {
            s1 = input.substring(s1, peg$currPos);
        }
        else {
            s1 = s2;
        }
        if (s1 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$f30(s1);
        }
        s0 = s1;
        if (s0 === peg$FAILED) {
            s0 = peg$currPos;
            s1 = peg$currPos;
            s2 = peg$currPos;
            if (input.charCodeAt(peg$currPos) === 45) {
                s3 = peg$c36;
                peg$currPos++;
            }
            else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e45);
                }
            }
            if (s3 === peg$FAILED) {
                s3 = null;
            }
            if (input.substr(peg$currPos, 2) === peg$c39) {
                s4 = peg$c39;
                peg$currPos += 2;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e49);
                }
            }
            if (s4 !== peg$FAILED) {
                s5 = [];
                s6 = input.charAt(peg$currPos);
                if (peg$r1.test(s6)) {
                    peg$currPos++;
                }
                else {
                    s6 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e27);
                    }
                }
                if (s6 !== peg$FAILED) {
                    while (s6 !== peg$FAILED) {
                        s5.push(s6);
                        s6 = input.charAt(peg$currPos);
                        if (peg$r1.test(s6)) {
                            peg$currPos++;
                        }
                        else {
                            s6 = peg$FAILED;
                            if (peg$silentFails === 0) {
                                peg$fail(peg$e27);
                            }
                        }
                    }
                }
                else {
                    s5 = peg$FAILED;
                }
                if (s5 !== peg$FAILED) {
                    s3 = [s3, s4, s5];
                    s2 = s3;
                }
                else {
                    peg$currPos = s2;
                    s2 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s2;
                s2 = peg$FAILED;
            }
            if (s2 !== peg$FAILED) {
                s1 = input.substring(s1, peg$currPos);
            }
            else {
                s1 = s2;
            }
            if (s1 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$f31(s1);
            }
            s0 = s1;
            if (s0 === peg$FAILED) {
                s0 = peg$currPos;
                s1 = peg$currPos;
                s2 = peg$currPos;
                if (input.charCodeAt(peg$currPos) === 45) {
                    s3 = peg$c36;
                    peg$currPos++;
                }
                else {
                    s3 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e45);
                    }
                }
                if (s3 === peg$FAILED) {
                    s3 = null;
                }
                s4 = [];
                s5 = input.charAt(peg$currPos);
                if (peg$r10.test(s5)) {
                    peg$currPos++;
                }
                else {
                    s5 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e50);
                    }
                }
                if (s5 !== peg$FAILED) {
                    while (s5 !== peg$FAILED) {
                        s4.push(s5);
                        s5 = input.charAt(peg$currPos);
                        if (peg$r10.test(s5)) {
                            peg$currPos++;
                        }
                        else {
                            s5 = peg$FAILED;
                            if (peg$silentFails === 0) {
                                peg$fail(peg$e50);
                            }
                        }
                    }
                }
                else {
                    s4 = peg$FAILED;
                }
                if (s4 !== peg$FAILED) {
                    s3 = [s3, s4];
                    s2 = s3;
                }
                else {
                    peg$currPos = s2;
                    s2 = peg$FAILED;
                }
                if (s2 !== peg$FAILED) {
                    s1 = input.substring(s1, peg$currPos);
                }
                else {
                    s1 = s2;
                }
                if (s1 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s1 = peg$f32(s1);
                }
                s0 = s1;
            }
        }
        return s0;
    }
    function peg$parseStackRegister() {
        let s0, s1, s2, s3, s4, s5, s6, s7;
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 115) {
            s3 = peg$c40;
            peg$currPos++;
        }
        else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e51);
            }
        }
        if (s3 !== peg$FAILED) {
            s4 = input.charAt(peg$currPos);
            if (peg$r10.test(s4)) {
                peg$currPos++;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e50);
                }
            }
            if (s4 !== peg$FAILED) {
                s5 = input.charAt(peg$currPos);
                if (peg$r10.test(s5)) {
                    peg$currPos++;
                }
                else {
                    s5 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e50);
                    }
                }
                if (s5 === peg$FAILED) {
                    s5 = null;
                }
                s3 = [s3, s4, s5];
                s2 = s3;
            }
            else {
                peg$currPos = s2;
                s2 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s2;
            s2 = peg$FAILED;
        }
        if (s2 !== peg$FAILED) {
            s1 = input.substring(s1, peg$currPos);
        }
        else {
            s1 = s2;
        }
        if (s1 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$f33(s1);
        }
        s0 = s1;
        if (s0 === peg$FAILED) {
            s0 = peg$currPos;
            s1 = peg$currPos;
            s2 = peg$currPos;
            if (input.substr(peg$currPos, 2) === peg$c41) {
                s3 = peg$c41;
                peg$currPos += 2;
            }
            else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e52);
                }
            }
            if (s3 !== peg$FAILED) {
                if (input.charCodeAt(peg$currPos) === 45) {
                    s4 = peg$c36;
                    peg$currPos++;
                }
                else {
                    s4 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e45);
                    }
                }
                if (s4 === peg$FAILED) {
                    s4 = null;
                }
                s5 = input.charAt(peg$currPos);
                if (peg$r10.test(s5)) {
                    peg$currPos++;
                }
                else {
                    s5 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e50);
                    }
                }
                if (s5 !== peg$FAILED) {
                    s6 = input.charAt(peg$currPos);
                    if (peg$r10.test(s6)) {
                        peg$currPos++;
                    }
                    else {
                        s6 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e50);
                        }
                    }
                    if (s6 === peg$FAILED) {
                        s6 = null;
                    }
                    if (input.charCodeAt(peg$currPos) === 41) {
                        s7 = peg$c42;
                        peg$currPos++;
                    }
                    else {
                        s7 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e53);
                        }
                    }
                    if (s7 !== peg$FAILED) {
                        s3 = [s3, s4, s5, s6, s7];
                        s2 = s3;
                    }
                    else {
                        peg$currPos = s2;
                        s2 = peg$FAILED;
                    }
                }
                else {
                    peg$currPos = s2;
                    s2 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s2;
                s2 = peg$FAILED;
            }
            if (s2 !== peg$FAILED) {
                s1 = input.substring(s1, peg$currPos);
            }
            else {
                s1 = s2;
            }
            if (s1 !== peg$FAILED) {
                peg$savedPos = s0;
                s1 = peg$f34(s1);
            }
            s0 = s1;
            if (s0 === peg$FAILED) {
                s0 = peg$currPos;
                s1 = peg$currPos;
                s2 = peg$currPos;
                s3 = input.charAt(peg$currPos);
                if (peg$r10.test(s3)) {
                    peg$currPos++;
                }
                else {
                    s3 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e50);
                    }
                }
                if (s3 !== peg$FAILED) {
                    s4 = input.charAt(peg$currPos);
                    if (peg$r10.test(s4)) {
                        peg$currPos++;
                    }
                    else {
                        s4 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e50);
                        }
                    }
                    if (s4 === peg$FAILED) {
                        s4 = null;
                    }
                    s5 = input.charAt(peg$currPos);
                    if (peg$r10.test(s5)) {
                        peg$currPos++;
                    }
                    else {
                        s5 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e50);
                        }
                    }
                    if (s5 === peg$FAILED) {
                        s5 = null;
                    }
                    if (input.substr(peg$currPos, 3) === peg$c43) {
                        s6 = peg$c43;
                        peg$currPos += 3;
                    }
                    else {
                        s6 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e54);
                        }
                    }
                    if (s6 !== peg$FAILED) {
                        s3 = [s3, s4, s5, s6];
                        s2 = s3;
                    }
                    else {
                        peg$currPos = s2;
                        s2 = peg$FAILED;
                    }
                }
                else {
                    peg$currPos = s2;
                    s2 = peg$FAILED;
                }
                if (s2 !== peg$FAILED) {
                    s1 = input.substring(s1, peg$currPos);
                }
                else {
                    s1 = s2;
                }
                if (s1 !== peg$FAILED) {
                    peg$savedPos = s0;
                    s1 = peg$f35(s1);
                }
                s0 = s1;
            }
        }
        return s0;
    }
    function peg$parseControlRegister() {
        let s0, s1, s2, s3, s4, s5;
        s0 = peg$currPos;
        s1 = peg$currPos;
        s2 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 99) {
            s3 = peg$c44;
            peg$currPos++;
        }
        else {
            s3 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e55);
            }
        }
        if (s3 !== peg$FAILED) {
            s4 = input.charAt(peg$currPos);
            if (peg$r10.test(s4)) {
                peg$currPos++;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e50);
                }
            }
            if (s4 !== peg$FAILED) {
                s5 = input.charAt(peg$currPos);
                if (peg$r10.test(s5)) {
                    peg$currPos++;
                }
                else {
                    s5 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e50);
                    }
                }
                if (s5 === peg$FAILED) {
                    s5 = null;
                }
                s3 = [s3, s4, s5];
                s2 = s3;
            }
            else {
                peg$currPos = s2;
                s2 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s2;
            s2 = peg$FAILED;
        }
        if (s2 !== peg$FAILED) {
            s1 = input.substring(s1, peg$currPos);
        }
        else {
            s1 = s2;
        }
        if (s1 !== peg$FAILED) {
            peg$savedPos = s0;
            s1 = peg$f36(s1);
        }
        s0 = s1;
        return s0;
    }
    function peg$parseString() {
        let s0, s1, s2, s3, s4;
        s0 = peg$currPos;
        if (input.charCodeAt(peg$currPos) === 34) {
            s1 = peg$c0;
            peg$currPos++;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e0);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = peg$currPos;
            s3 = [];
            s4 = input.charAt(peg$currPos);
            if (peg$r0.test(s4)) {
                peg$currPos++;
            }
            else {
                s4 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e1);
                }
            }
            while (s4 !== peg$FAILED) {
                s3.push(s4);
                s4 = input.charAt(peg$currPos);
                if (peg$r0.test(s4)) {
                    peg$currPos++;
                }
                else {
                    s4 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e1);
                    }
                }
            }
            s2 = input.substring(s2, peg$currPos);
            if (input.charCodeAt(peg$currPos) === 34) {
                s3 = peg$c0;
                peg$currPos++;
            }
            else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e0);
                }
            }
            if (s3 !== peg$FAILED) {
                peg$savedPos = s0;
                s0 = peg$f37(s2);
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    function peg$parsereservedWord() {
        let s0, s1, s2, s3;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 7) === peg$c45) {
            s1 = peg$c45;
            peg$currPos += 7;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e56);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = peg$currPos;
            peg$silentFails++;
            s3 = peg$parseidChar();
            peg$silentFails--;
            if (s3 === peg$FAILED) {
                s2 = undefined;
            }
            else {
                peg$currPos = s2;
                s2 = peg$FAILED;
            }
            if (s2 !== peg$FAILED) {
                s1 = [s1, s2];
                s0 = s1;
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        if (s0 === peg$FAILED) {
            s0 = peg$currPos;
            if (input.substr(peg$currPos, 5) === peg$c46) {
                s1 = peg$c46;
                peg$currPos += 5;
            }
            else {
                s1 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e57);
                }
            }
            if (s1 !== peg$FAILED) {
                s2 = peg$currPos;
                peg$silentFails++;
                s3 = peg$parseidChar();
                peg$silentFails--;
                if (s3 === peg$FAILED) {
                    s2 = undefined;
                }
                else {
                    peg$currPos = s2;
                    s2 = peg$FAILED;
                }
                if (s2 !== peg$FAILED) {
                    s1 = [s1, s2];
                    s0 = s1;
                }
                else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                }
            }
            else {
                peg$currPos = s0;
                s0 = peg$FAILED;
            }
            if (s0 === peg$FAILED) {
                s0 = peg$currPos;
                if (input.substr(peg$currPos, 8) === peg$c4) {
                    s1 = peg$c4;
                    peg$currPos += 8;
                }
                else {
                    s1 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e5);
                    }
                }
                if (s1 !== peg$FAILED) {
                    s2 = peg$currPos;
                    peg$silentFails++;
                    s3 = peg$parseidChar();
                    peg$silentFails--;
                    if (s3 === peg$FAILED) {
                        s2 = undefined;
                    }
                    else {
                        peg$currPos = s2;
                        s2 = peg$FAILED;
                    }
                    if (s2 !== peg$FAILED) {
                        s1 = [s1, s2];
                        s0 = s1;
                    }
                    else {
                        peg$currPos = s0;
                        s0 = peg$FAILED;
                    }
                }
                else {
                    peg$currPos = s0;
                    s0 = peg$FAILED;
                }
                if (s0 === peg$FAILED) {
                    s0 = peg$currPos;
                    if (input.substr(peg$currPos, 10) === peg$c5) {
                        s1 = peg$c5;
                        peg$currPos += 10;
                    }
                    else {
                        s1 = peg$FAILED;
                        if (peg$silentFails === 0) {
                            peg$fail(peg$e6);
                        }
                    }
                    if (s1 !== peg$FAILED) {
                        s2 = peg$currPos;
                        peg$silentFails++;
                        s3 = peg$parseidChar();
                        peg$silentFails--;
                        if (s3 === peg$FAILED) {
                            s2 = undefined;
                        }
                        else {
                            peg$currPos = s2;
                            s2 = peg$FAILED;
                        }
                        if (s2 !== peg$FAILED) {
                            s1 = [s1, s2];
                            s0 = s1;
                        }
                        else {
                            peg$currPos = s0;
                            s0 = peg$FAILED;
                        }
                    }
                    else {
                        peg$currPos = s0;
                        s0 = peg$FAILED;
                    }
                    if (s0 === peg$FAILED) {
                        s0 = peg$currPos;
                        if (input.substr(peg$currPos, 11) === peg$c6) {
                            s1 = peg$c6;
                            peg$currPos += 11;
                        }
                        else {
                            s1 = peg$FAILED;
                            if (peg$silentFails === 0) {
                                peg$fail(peg$e7);
                            }
                        }
                        if (s1 !== peg$FAILED) {
                            s2 = peg$currPos;
                            peg$silentFails++;
                            s3 = peg$parseidChar();
                            peg$silentFails--;
                            if (s3 === peg$FAILED) {
                                s2 = undefined;
                            }
                            else {
                                peg$currPos = s2;
                                s2 = peg$FAILED;
                            }
                            if (s2 !== peg$FAILED) {
                                s1 = [s1, s2];
                                s0 = s1;
                            }
                            else {
                                peg$currPos = s0;
                                s0 = peg$FAILED;
                            }
                        }
                        else {
                            peg$currPos = s0;
                            s0 = peg$FAILED;
                        }
                        if (s0 === peg$FAILED) {
                            if (input.substr(peg$currPos, 7) === peg$c7) {
                                s0 = peg$c7;
                                peg$currPos += 7;
                            }
                            else {
                                s0 = peg$FAILED;
                                if (peg$silentFails === 0) {
                                    peg$fail(peg$e8);
                                }
                            }
                            if (s0 === peg$FAILED) {
                                if (input.substr(peg$currPos, 13) === peg$c9) {
                                    s0 = peg$c9;
                                    peg$currPos += 13;
                                }
                                else {
                                    s0 = peg$FAILED;
                                    if (peg$silentFails === 0) {
                                        peg$fail(peg$e10);
                                    }
                                }
                                if (s0 === peg$FAILED) {
                                    if (input.substr(peg$currPos, 10) === peg$c10) {
                                        s0 = peg$c10;
                                        peg$currPos += 10;
                                    }
                                    else {
                                        s0 = peg$FAILED;
                                        if (peg$silentFails === 0) {
                                            peg$fail(peg$e11);
                                        }
                                    }
                                    if (s0 === peg$FAILED) {
                                        if (input.substr(peg$currPos, 9) === peg$c11) {
                                            s0 = peg$c11;
                                            peg$currPos += 9;
                                        }
                                        else {
                                            s0 = peg$FAILED;
                                            if (peg$silentFails === 0) {
                                                peg$fail(peg$e12);
                                            }
                                        }
                                        if (s0 === peg$FAILED) {
                                            if (input.substr(peg$currPos, 5) === peg$c12) {
                                                s0 = peg$c12;
                                                peg$currPos += 5;
                                            }
                                            else {
                                                s0 = peg$FAILED;
                                                if (peg$silentFails === 0) {
                                                    peg$fail(peg$e13);
                                                }
                                            }
                                            if (s0 === peg$FAILED) {
                                                if (input.substr(peg$currPos, 8) === peg$c13) {
                                                    s0 = peg$c13;
                                                    peg$currPos += 8;
                                                }
                                                else {
                                                    s0 = peg$FAILED;
                                                    if (peg$silentFails === 0) {
                                                        peg$fail(peg$e14);
                                                    }
                                                }
                                                if (s0 === peg$FAILED) {
                                                    if (input.substr(peg$currPos, 6) === peg$c14) {
                                                        s0 = peg$c14;
                                                        peg$currPos += 6;
                                                    }
                                                    else {
                                                        s0 = peg$FAILED;
                                                        if (peg$silentFails === 0) {
                                                            peg$fail(peg$e15);
                                                        }
                                                    }
                                                    if (s0 === peg$FAILED) {
                                                        if (input.substr(peg$currPos, 8) === peg$c15) {
                                                            s0 = peg$c15;
                                                            peg$currPos += 8;
                                                        }
                                                        else {
                                                            s0 = peg$FAILED;
                                                            if (peg$silentFails === 0) {
                                                                peg$fail(peg$e16);
                                                            }
                                                        }
                                                        if (s0 === peg$FAILED) {
                                                            if (input.substr(peg$currPos, 11) ===
                                                                peg$c16) {
                                                                s0 = peg$c16;
                                                                peg$currPos += 11;
                                                            }
                                                            else {
                                                                s0 = peg$FAILED;
                                                                if (peg$silentFails === 0) {
                                                                    peg$fail(peg$e17);
                                                                }
                                                            }
                                                            if (s0 === peg$FAILED) {
                                                                if (input.substr(peg$currPos, 8) ===
                                                                    peg$c17) {
                                                                    s0 = peg$c17;
                                                                    peg$currPos += 8;
                                                                }
                                                                else {
                                                                    s0 = peg$FAILED;
                                                                    if (peg$silentFails === 0) {
                                                                        peg$fail(peg$e18);
                                                                    }
                                                                }
                                                                if (s0 === peg$FAILED) {
                                                                    if (input.substr(peg$currPos, 4) === peg$c47) {
                                                                        s0 = peg$c47;
                                                                        peg$currPos += 4;
                                                                    }
                                                                    else {
                                                                        s0 = peg$FAILED;
                                                                        if (peg$silentFails === 0) {
                                                                            peg$fail(peg$e58);
                                                                        }
                                                                    }
                                                                    if (s0 === peg$FAILED) {
                                                                        if (input.substr(peg$currPos, 9) === peg$c19) {
                                                                            s0 = peg$c19;
                                                                            peg$currPos += 9;
                                                                        }
                                                                        else {
                                                                            s0 = peg$FAILED;
                                                                            if (peg$silentFails ===
                                                                                0) {
                                                                                peg$fail(peg$e20);
                                                                            }
                                                                        }
                                                                        if (s0 === peg$FAILED) {
                                                                            if (input.substr(peg$currPos, 8) === peg$c20) {
                                                                                s0 = peg$c20;
                                                                                peg$currPos += 8;
                                                                            }
                                                                            else {
                                                                                s0 = peg$FAILED;
                                                                                if (peg$silentFails ===
                                                                                    0) {
                                                                                    peg$fail(peg$e21);
                                                                                }
                                                                            }
                                                                            if (s0 === peg$FAILED) {
                                                                                if (input.substr(peg$currPos, 12) === peg$c48) {
                                                                                    s0 = peg$c48;
                                                                                    peg$currPos += 12;
                                                                                }
                                                                                else {
                                                                                    s0 = peg$FAILED;
                                                                                    if (peg$silentFails ===
                                                                                        0) {
                                                                                        peg$fail(peg$e59);
                                                                                    }
                                                                                }
                                                                                if (s0 ===
                                                                                    peg$FAILED) {
                                                                                    s0 = peg$currPos;
                                                                                    if (input.substr(peg$currPos, 8) ===
                                                                                        peg$c49) {
                                                                                        s1 = peg$c49;
                                                                                        peg$currPos += 8;
                                                                                    }
                                                                                    else {
                                                                                        s1 =
                                                                                            peg$FAILED;
                                                                                        if (peg$silentFails ===
                                                                                            0) {
                                                                                            peg$fail(peg$e60);
                                                                                        }
                                                                                    }
                                                                                    if (s1 !==
                                                                                        peg$FAILED) {
                                                                                        s2 =
                                                                                            peg$currPos;
                                                                                        peg$silentFails++;
                                                                                        s3 =
                                                                                            peg$parseidChar();
                                                                                        peg$silentFails--;
                                                                                        if (s3 ===
                                                                                            peg$FAILED) {
                                                                                            s2 =
                                                                                                undefined;
                                                                                        }
                                                                                        else {
                                                                                            peg$currPos =
                                                                                                s2;
                                                                                            s2 =
                                                                                                peg$FAILED;
                                                                                        }
                                                                                        if (s2 !==
                                                                                            peg$FAILED) {
                                                                                            s1 = [
                                                                                                s1,
                                                                                                s2,
                                                                                            ];
                                                                                            s0 = s1;
                                                                                        }
                                                                                        else {
                                                                                            peg$currPos =
                                                                                                s0;
                                                                                            s0 =
                                                                                                peg$FAILED;
                                                                                        }
                                                                                    }
                                                                                    else {
                                                                                        peg$currPos =
                                                                                            s0;
                                                                                        s0 =
                                                                                            peg$FAILED;
                                                                                    }
                                                                                    if (s0 ===
                                                                                        peg$FAILED) {
                                                                                        s0 =
                                                                                            peg$currPos;
                                                                                        if (input.substr(peg$currPos, 14) ===
                                                                                            peg$c50) {
                                                                                            s1 =
                                                                                                peg$c50;
                                                                                            peg$currPos += 14;
                                                                                        }
                                                                                        else {
                                                                                            s1 =
                                                                                                peg$FAILED;
                                                                                            if (peg$silentFails ===
                                                                                                0) {
                                                                                                peg$fail(peg$e61);
                                                                                            }
                                                                                        }
                                                                                        if (s1 !==
                                                                                            peg$FAILED) {
                                                                                            s2 =
                                                                                                peg$currPos;
                                                                                            peg$silentFails++;
                                                                                            s3 =
                                                                                                peg$parseidChar();
                                                                                            peg$silentFails--;
                                                                                            if (s3 ===
                                                                                                peg$FAILED) {
                                                                                                s2 =
                                                                                                    undefined;
                                                                                            }
                                                                                            else {
                                                                                                peg$currPos =
                                                                                                    s2;
                                                                                                s2 =
                                                                                                    peg$FAILED;
                                                                                            }
                                                                                            if (s2 !==
                                                                                                peg$FAILED) {
                                                                                                s1 =
                                                                                                    [
                                                                                                        s1,
                                                                                                        s2,
                                                                                                    ];
                                                                                                s0 =
                                                                                                    s1;
                                                                                            }
                                                                                            else {
                                                                                                peg$currPos =
                                                                                                    s0;
                                                                                                s0 =
                                                                                                    peg$FAILED;
                                                                                            }
                                                                                        }
                                                                                        else {
                                                                                            peg$currPos =
                                                                                                s0;
                                                                                            s0 =
                                                                                                peg$FAILED;
                                                                                        }
                                                                                    }
                                                                                }
                                                                            }
                                                                        }
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return s0;
    }
    function peg$parseidChar() {
        let s0;
        s0 = input.charAt(peg$currPos);
        if (peg$r11.test(s0)) {
            peg$currPos++;
        }
        else {
            s0 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e62);
            }
        }
        return s0;
    }
    function peg$parsespace() {
        let s0;
        s0 = input.charAt(peg$currPos);
        if (peg$r12.test(s0)) {
            peg$currPos++;
        }
        else {
            s0 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e63);
            }
        }
        if (s0 === peg$FAILED) {
            s0 = peg$parsecomment();
        }
        return s0;
    }
    function peg$parsecomment() {
        let s0, s1, s2, s3;
        s0 = peg$currPos;
        if (input.substr(peg$currPos, 2) === peg$c51) {
            s1 = peg$c51;
            peg$currPos += 2;
        }
        else {
            s1 = peg$FAILED;
            if (peg$silentFails === 0) {
                peg$fail(peg$e64);
            }
        }
        if (s1 !== peg$FAILED) {
            s2 = [];
            s3 = input.charAt(peg$currPos);
            if (peg$r13.test(s3)) {
                peg$currPos++;
            }
            else {
                s3 = peg$FAILED;
                if (peg$silentFails === 0) {
                    peg$fail(peg$e65);
                }
            }
            while (s3 !== peg$FAILED) {
                s2.push(s3);
                s3 = input.charAt(peg$currPos);
                if (peg$r13.test(s3)) {
                    peg$currPos++;
                }
                else {
                    s3 = peg$FAILED;
                    if (peg$silentFails === 0) {
                        peg$fail(peg$e65);
                    }
                }
            }
            s1 = [s1, s2];
            s0 = s1;
        }
        else {
            peg$currPos = s0;
            s0 = peg$FAILED;
        }
        return s0;
    }
    peg$result = peg$startRuleFunction();
    const peg$success = peg$result !== peg$FAILED && peg$currPos === input.length;
    function peg$throw() {
        if (peg$result !== peg$FAILED && peg$currPos < input.length) {
            peg$fail(peg$endExpectation());
        }
        throw peg$buildStructuredError(peg$maxFailExpected, peg$maxFailPos < input.length ? peg$getUnicode(peg$maxFailPos) : null, peg$maxFailPos < input.length
            ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)
            : peg$computeLocation(peg$maxFailPos, peg$maxFailPos));
    }
    if (options.peg$library) {
        return /** @type {any} */ {
            peg$result,
            peg$currPos,
            peg$FAILED,
            peg$maxFailExpected,
            peg$maxFailPos,
            peg$success,
            peg$throw: peg$success ? undefined : peg$throw,
        };
    }
    if (peg$success) {
        return peg$result;
    }
    else {
        peg$throw();
    }
}
const peg$allowedStartRules = ["SourceFile"];
exports.StartRules = peg$allowedStartRules;
//# sourceMappingURL=grammar.gen.pegjs.js.map