spinny-itty/spinny.yarn

1 line
No EOL
15 KiB
Text

{"protected":false,"mode":"f","metadata":{"name":"spinny","author":"Anya Merry :3","version":[0,0,3],"dependencies":[],"paths":{"spinny.js":"%B/spinny.js"}},"content":"{\"spinny.js\":{\"protected\":false,\"metadata\":{},\"mode\":\"f\",\"content\":\"////////////////////////////////////\\n// SPINNY : A Programming Language /\\n////////////////////////////////////\\n\\n// This is the Spinny compiler and\\n// interpreter for itty.\\n// It accepts\\n// - Spinny source files (.spin)\\n// - Spinny compiled json files (.spic)\\n\\nfunction onRun() {\\n\\tlet cliArgs = parseCliArgs();\\n\\n\\ttry { const fileobj = io.open(fs.resolve(cliArgs.filename), \\\"r\\\")\\n\\t} catch (e) {\\n\\t\\tdisplay.print(`Spinny: Error opening file or resolving path \\\\`${cliArgs.filename}'.`);\\n\\t\\tio.error([22, \\\"file open failed\\\"]);\\n\\t}\\n\\ttry { const file = fileobj.read();\\n\\t} catch (e) {\\n\\t\\tdisplay.print(`Spinny: Error reading file \\\\`${cliArgs.filename}'.`);\\n\\t\\tio.error([23, \\\"file read failed\\\"]);\\n\\t}\\n\\tconst fileSpincVersion = file.split(\\\"\\\\n\\\")[1].split(\\\"@\\\");\\n\\tlet isSpincFile = false;\\n\\tif (fileSpincVersion.slice(0,2).join(\\\"\\\\n\\\") === \\\"SPINC\\\\nspinny:itty\\\") {\\n\\t\\t// This is a spinny source file\\n\\t\\tif (fileSpincVersion[2] !== \\\"noversion\\\") {\\n\\t\\t\\tlet niceversion = spileSpincVersion[2].replace(\\n\\t\\t\\t\\t/[\\\\t %]/g , \\\"\\\")\\n\\t\\t\\tdisplay.print(\\\"Spinny: Incorrect or unrecognized compiled spinc file\\\");\\n\\t\\t\\tdisplay.print(`Spinny: version \\\\`${niceversion}'.`);\\n\\t\\t\\tdisplay.print(\\\"Spinny: This version of the spinny interpreter exclusively\\\");\\n\\t\\t\\tdisplay.print(\\\"Spinny: accepts compiled spinc files of version\\\");\\n\\t\\t\\tdisplay.print(\\\"Spinny: `noversion'.\\\");\\n\\t\\t\\tdisplay.print(\\\"Spinny: Use `—version' or `—help' for more information.\\\");\\n\\t\\t\\tio.error([31, \\\"invalid spinc version\\\"]);\\n\\t\\t}\\n\\t\\tisSpincFile = true;\\n\\t}\\n\\tif (cliArgs.compileOnly && isSpincFile) {\\n\\t\\tdisplay.print(\\\"Spinny: Cannot compile a spinc file.\\\");\\n\\t\\tdisplay.print(\\\"Spinny: The file is already compiled.\\\");\\n\\t\\tio.error([32, \\\"spinc already compiled\\\"]);\\n\\t}\\n\\n\\tif (!isSpincFile) {\\n\\t\\t// We must compile the file\\n\\t\\tconst parser = new spinnyParser;\\n\\t\\tconst compiled = parser.compile(file)\\n\\t}\\n\\n\\tdisplay.print(\\\"Spinny: Running and/or saving files is not currently supported.\\\");\\n\\tdisplay.print(\\\"Spinny: Dumping contents instead.\\\");\\n\\tif (isSpincFile)\\n\\t\\tdisplay.print(file.split(\\\"\\\\n\\\").slice(2).join('\\\\n'))\\n\\telse\\n\\t\\tdisplay.print(compiled)\\n}\\n\\nfunction showHelp(){\\n\\tdisplay.print(\\n\\t\\t// . 1 . 2 . 3 . 4 . 5 . 6\\n\\t\\t// ^\\n\\t\\t\\\"This is the Spinny compiler and interpreter for itty.\\\\n\\\" +\\n\\t\\t\\\"It accepts...\\\\n\\\" +\\n\\t\\t\\\" • Spinny source files (.spin)\\\\n\\\" +\\n\\t\\t\\\" • Spinny compiled json files (.spinc)\\\\n\\\" +\\n\\t\\t\\\"\\\\n\\\" +\\n\\t\\t\\\"Syntax:\\\\n\\\" +\\n\\t\\t`\\\\t${program.name} [flags...] [—] <filename>\\\\n` +\\n\\t\\t\\\"Where:\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t[flags...] are any combination of the flags\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t available in the `Flags' section\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t below.\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t[—] Is an emdash (—) or a double dash (--)\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t to mark where the filename is supposed\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t to go. (Note that any time you see an\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t em dash in this help page, you may\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t choose to use a double dash in its\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t place if that is your preference.)\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t<filename> is the `.spin' or `.spinc' file to\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t compile/run\\\\n\\\" +\\n\\t\\t\\\"Flags:\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t—help Print this help page and exit.\\\\n\\\"\\n\\t\\t\\t\\\"\\\\t—version Print version and exit.\\\\n\\\"\\n\\t\\t\\t\\\"\\\\t—compile Compile the code to a .spinc file.\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t The .spinc file must be specified\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t with `—output'.\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t—output <file> Specifies the output file for the\\\\n\\\" +\\n\\t\\t\\t\\\"\\\\t `—compile' flag.\\\\n\\\" +\\n\\t)\\n};\\n\\nfunction showVersion(){\\n\\tdisplay.print(\\n\\t\\t// . 1 . 2 . 3 . 4 . 5 . 6\\n\\t\\t// ^\\n\\t\\t\\\"Spinny for itty\\\\n\\\" +\\n\\t\\t\\\"Version 0.0.3\\\\n\\\" +\\n\\t\\t\\\"Known spinc versions:\\\\n\\\"\\n\\t\\t\\\" • `noversion'\\\\n\\\"\\n\\t)\\n};\\n\\nfunction parseCliArgs() {\\n\\tlet compileOnly = false;\\n\\tlet filename = \\\"\\\";\\n\\tlet noMoreFlags = false;\\n\\tlet nextIsOutput = false\\n\\tlet output = \\\"\\\";\\n\\tlet letterFlag = false\\n\\tlet flag = false\\n\\tfor (let i=0;i<args.length;i++) {\\n\\t\\tlet arg = args[i];a\\n\\n\\t\\tif (nextIsOutput) {\\n\\t\\t\\toutput = arg;\\n\\t\\t\\tnextIsOutput = false;\\n\\t\\t}\\n\\t\\tif (!noMoreFlags) {\\n\\t\\t\\t// Flags\\n\\t\\t\\tflag = false;\\n\\t\\t\\tletterFlag = false;\\n\\t\\t\\tif (arg.slice(0,1) === \\\"—\\\") {\\n\\t\\t\\t\\tflag = true;\\n\\t\\t\\t\\targ = arg.slice(1);\\n\\t\\t\\t} else if (arg.slice(0,2) === \\\"--\\\") {\\n\\t\\t\\t\\tflag = true;\\n\\t\\t\\t\\targ = arg.slice(2);\\n\\t\\t\\t} else if (arg.slice(0,1) === \\\"-\\\") {\\n\\t\\t\\t\\tflag = true;\\n\\t\\t\\t\\tletterFlag = true;\\n\\t\\t\\t\\targ = arg.slice(1);\\n\\t\\t\\t}\\n\\t\\t\\tif (flag) {\\n\\t\\t\\t\\tif (arg === \\\"compile\\\" || arg === \\\"c\\\") {\\n\\t\\t\\t\\t\\tcompileOnly = true;\\n\\t\\t\\t\\t} else if (arg === \\\"help\\\" || arg === \\\"h\\\") {\\n\\t\\t\\t\\t\\tshowHelp();\\n\\t\\t\\t\\t\\tquit();\\n\\t\\t\\t\\t} else if (arg === \\\"version\\\" || arg === \\\"v\\\") {\\n\\t\\t\\t\\t\\tshowVersion();\\n\\t\\t\\t\\t\\tquit();\\n\\t\\t\\t\\t} else if (arg === \\\"output\\\" || arg === \\\"o\\\") {\\n\\t\\t\\t\\t\\tnextIsOutput = true;\\n\\t\\t\\t\\t} else if (arg === \\\"\\\" && !letterFlag) {\\n\\t\\t\\t\\t\\tnoMoreFlags = true;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tif (letterFlag){\\n\\t\\t\\t\\t\\t\\tdisplay.print(`Spinny: Unrecognized flag \\\\`-${arg}'.`);\\n\\t\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\t\\tdisplay.print(`Spinny: Unrecognized flag \\\\`—${arg}'.`);\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tdisplay.print(\\\"Spinny: For allowed flags, use `—help'.\\\");\\n\\t\\t\\t\\t\\tio.error([11, \\\"unknown flag\\\"]);\\n\\t\\t\\t\\t}\\n\\t\\t\\t\\tcontinue;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tfilename = arg;\\n\\t}\\n\\treturn {\\n\\t\\tfilename: filename,\\n\\t\\tcompileOnly: compileOnly,\\n\\t\\toutput: output\\n\\t};\\n}\\n\\n\\nclass spinnyParser {\\n\\tconst INSIDE = {\\n\\t\\tFILE: 0,\\n\\t\\tINTER: 1,\\n\\t\\tLAZY: 2\\n\\t}\\n\\tcompile(sourceFileContents) {\\n\\t\\tthis.file = sourceFileContents;\\n\\t\\tthis.index = 0;\\n\\t\\tthis.debugStack = [];\\n\\t\\treturn this.parseFile()\\n\\t}\\n\\tparseFile() {\\n\\t\\tthis.debugStack.push([\\\"File\\\", this.index]);\\n\\t\\tlet lines = [];\\n\\n\\t\\t// A bunch of lines\\n\\t\\twhile (this.index+1 < this.file.length) {\\n\\t\\t\\tif (this.now() == \\\"\\\\n\\\") {\\n\\t\\t\\t\\tthis.next();\\n\\t\\t\\t\\tcontinue\\n\\t\\t\\t}\\n\\t\\t\\tlines.push(this.parseLine(INSIDE.FILE))\\n\\t\\t}\\n\\t\\tthis.debugStack.pop();\\n\\t\\treturn lines\\n\\t}\\n\\n\\tnow() { return this.file[this.index] }\\n\\tnext() { return this.file[this.index++] }\\n\\tpeek() { return this.file[this.index+1] }\\n\\n\\tparseLine(inside) {\\n\\t\\tthis.debugStack.push([\\\"Line\\\", this.index])\\n\\t\\tlet words = []\\n\\t\\twordLoop:\\n\\t\\twhile (1) {\\n\\t\\t\\tswitch (this.now()) {\\n\\t\\t\\t\\tcase \\\" \\\":\\n\\t\\t\\t\\tcase \\\"\\\\t\\\":\\n\\t\\t\\t\\t\\t// advance past whitespace till\\n\\t\\t\\t\\t\\t// next word\\n\\t\\t\\t\\t\\tthis.next();\\n\\t\\t\\t\\t\\tcontinue\\n\\t\\t\\t\\tcase \\\"#\\\":\\n\\t\\t\\t\\t\\tthis.parseComment();\\n\\t\\t\\t\\t\\tcontinue\\n\\t\\t\\t\\tcase \\\"}\\\":\\n\\t\\t\\t\\t\\tif (inside === INSIDE.LAZY)\\n\\t\\t\\t\\t\\t\\tbreak wordLoop\\n\\t\\t\\t\\t\\tbreak\\n\\t\\t\\t\\tcase \\\">\\\":\\n\\t\\t\\t\\t\\tif (inside === INSIDE.INTER)\\n\\t\\t\\t\\t\\t\\tbreak wordLoop\\n\\t\\t\\t\\t\\tbreak\\n\\t\\t\\t\\tcase \\\"\\\\n\\\":\\n\\t\\t\\t\\t\\tif (inside === INSIDE.FILE\\n\\t\\t\\t\\t\\t\\t|| inside == INSIDE.LAZY)\\n\\t\\t\\t\\t\\t\\tbreak wordLoop\\n\\t\\t\\t\\t\\tbreak\\n\\t\\t\\t\\tcase \\\"\\\\\\\\\\\":\\n\\t\\t\\t\\t\\tif (this.now() == \\\"\\\\\\\\\\\" && this.peek() == \\\"\\\\n\\\") {\\n\\t\\t\\t\\t\\t\\t// Line continuation\\n\\t\\t\\t\\t\\t\\t// Go to next line\\n\\t\\t\\t\\t\\t\\tthis.next(); // skip `\\\\\\\\'\\n\\t\\t\\t\\t\\t\\tthis.next(); // skip `\\\\n'\\n\\t\\t\\t\\t\\t\\tcontinue\\n\\t\\t\\t\\t\\t}\\n\\t\\t\\t\\t\\tbreak\\n\\t\\t\\t}\\n\\t\\t\\twords.push(this.parseWord(inside));\\n\\t\\t}\\n\\t\\tthis.debugStack.pop()\\n\\t\\treturn words\\n\\t}\\n\\n\\tparseComment() {\\n\\t\\tthis.debugStack.push([\\\"Comment\\\", this.index])\\n\\t\\tcommentLoop:\\n\\t\\twhile (1) {\\n\\t\\t\\tswitch (this.now()) {\\n\\t\\t\\t\\tcase \\\"\\\\n\\\":\\n\\t\\t\\t\\t\\tbreak commentLoop\\n\\t\\t\\t\\tcase \\\"\\\\\\\\\\\":\\n\\t\\t\\t\\t\\tif (this.peek() == \\\"\\\\n\\\")\\n\\t\\t\\t\\t\\t\\tbreak commentLoop\\n\\t\\t\\t\\tdefault:\\n\\t\\t\\t\\t\\tthis.next();\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tthis.debugStack.pop()\\n\\t}\\n\\t\\n\\tparseWord(inside) {\\n\\t\\tthis.debugStack.push([\\\"Word\\\", this.index])\\n\\t\\tlet bang = false;\\n\\t\\tif (this.now() === \\\"!\\\") {\\n\\t\\t\\tbang = true;\\n\\t\\t\\tthis.next();\\n\\t\\t}\\n\\t\\tswitch (this.now()) {\\n\\t\\t\\tcase \\\"{\\\":\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\tCMPVER.KEYS.BANG:bang,\\n\\t\\t\\t\\t\\tCMPVER.KEYS.TYPE:CMPVER.TYPE.LAZY,\\n\\t\\t\\t\\t\\tCMPVER.KEYS.LINES:this.parseLazy()\\n\\t\\t\\t\\t}\\n\\t\\t\\tcase \\\"`\\\":\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\tCMPVER.KEYS.BANG:bang,\\n\\t\\t\\t\\t\\tCMPVER.KEYS.TYPE:CMPVER.TYPE.LIT,\\n\\t\\t\\t\\t\\tCMPVER.KEYS.PARTS:this.parseLiteral()\\n\\t\\t\\t\\t}\\n\\t\\t\\tdefault:\\n\\t\\t\\t\\treturn {\\n\\t\\t\\t\\t\\tCMPVER.KEYS.BANG:bang,\\n\\t\\t\\t\\t\\tCMPVER.KEYS.TYPE:CMPVER.TYPE.ID,\\n\\t\\t\\t\\t\\tCMPVER.KEYS.PARTS:this.parseIdentifier(inside)\\n\\t\\t\\t\\t}\\n\\t\\t}\\n\\t\\tthis.debugStack.pop()\\n\\n\\t}\\n\\t\\n\\tparseLazy() {\\n\\t\\tthis.debugStack.push([\\\"Lazy\\\", this.index])\\n\\t\\tthis.next(); // Skip `{'\\n\\t\\tlet lines = []\\n\\t\\twhile (this.now() !== \\\"}\\\") {\\n\\t\\t\\tlines.push(this.parseLine(INSIDE.LAZY))\\n\\t\\t}\\n\\t\\tthis.debugStack.pop()\\n\\t\\treturn lines\\n\\t}\\n\\t\\n\\tparseLiteral() {\\n\\t\\tthis.debugStack.push([\\\"Literal\\\", this.index])\\n\\t\\tthis.next(); // Skip `\\\\`'\\n\\t\\tlet parts = [\\\"\\\"]\\n\\t\\twhile (this.now() !== \\\"\\\\'\\\") {\\n\\t\\t\\tswitch (this.now()) {\\n\\t\\t\\t\\tcase \\\"\\\\\\\\\\\":\\n\\t\\t\\t\\t\\tparts[parts.length-1]+=this.parseEscape();\\n\\t\\t\\t\\t\\tbreak\\n\\t\\t\\t\\tcase \\\"<\\\":\\n\\t\\t\\t\\t\\tparts.push(\\n\\t\\t\\t\\t\\t\\tthis.parseInterpolation()\\n\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\tparts.push(\\\"\\\")\\n\\t\\t\\t\\t\\tbreak\\n\\t\\t\\t\\tdefault:\\n\\t\\t\\t\\t\\tparts[parts.length-1]+=this.now();\\n\\t\\t\\t\\t\\tthis.next();\\n\\t\\t\\t\\t\\tbreak\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tthis.debugStack.pop();\\n\\t\\treturn parts\\n\\t}\\n\\n\\tparseEscape() {\\n\\t\\tthis.debugStack.push([\\\"Literal\\\", this.index])\\n\\t\\tthis.next(); // skip `\\\\\\\\'\\n\\t\\tlet out = \\\"\\\";\\n\\t\\tswitch (this.now()) {\\n\\t\\t\\tcase \\\"<\\\":\\n\\t\\t\\t\\tthis.next(); // skip `\\\\<'\\n\\t\\t\\t\\tout = \\\"<\\\";\\n\\t\\t\\t\\tbreak\\n\\t\\t\\tcase \\\"x\\\":\\n\\t\\t\\t\\tthis.next(); // skip `x'\\n\\t\\t\\t\\tout = String.fromCharCode( parseInt(\\n\\t\\t\\t\\t\\tthis.next()+this.next()\\n\\t\\t\\t\\t\\t,16));\\n\\t\\t\\t\\tbreak\\n\\t\\t\\tcase \\\"u\\\":\\n\\t\\t\\t\\tthis.next(); // skip `u'\\n\\t\\t\\t\\tout = String.fromCharCode( parseInt(\\n\\t\\t\\t\\t\\tthis.next()+this.next()+this.next()+this.next()\\n\\t\\t\\t\\t\\t,16));\\n\\t\\t\\t\\tbreak\\n\\t\\t\\tcase \\\"U\\\":\\n\\t\\t\\t\\tthis.next(); // skip `U'\\n\\t\\t\\t\\tout = String.fromCharCode( parseInt(\\n\\t\\t\\t\\t\\tthis.next()+this.next()+this.next()+this.next()+\\n\\t\\t\\t\\t\\tthis.next()+this.next()+this.next()+this.next()\\n\\t\\t\\t\\t\\t,16));\\n\\t\\t\\t\\tbreak\\n\\t\\t\\tcase \\\"s\\\":\\n\\t\\t\\t\\tthis.next(); // skip `s'\\n\\t\\t\\t\\tout = \\\" \\\";\\n\\t\\t\\t\\tbreak\\n\\t\\t\\tcase \\\"t\\\":\\n\\t\\t\\t\\tthis.next(); // skip `t'\\n\\t\\t\\t\\tout = \\\"\\\\t\\\";\\n\\t\\t\\t\\tbreak\\n\\t\\t\\tcase \\\"n\\\":\\n\\t\\t\\t\\tthis.next(); // skip `n'\\n\\t\\t\\t\\tout = \\\"\\\\n\\\";\\n\\t\\t\\t\\tbreak\\n\\t\\t\\tdefault:\\n\\t\\t\\t\\t// Just send the character:\\n\\t\\t\\t\\tout = this.now(); // record the thing after the `\\\\\\\\'\\n\\t\\t\\t\\tthis.next(); // skip over it\\n\\t\\t\\t\\tbreak\\n\\t\\t\\t\\n\\t\\t}\\n\\t\\tthis.debugStack.pop();\\n\\t\\treturn out;\\n\\t}\\n\\n\\tparseInterpolation() {\\n\\t\\tthis.debugStack.push([\\\"Interpolation\\\", this.index])\\n\\t\\tthis.next(); // skip `\\\\<'\\n\\t\\tlet line\\n\\t\\twhile (this.now() !== \\\">\\\") {\\n\\t\\t\\tline = this.parseLine(INSIDE.INTER)\\n\\t\\t}\\n\\t\\tthis.next(); // skip `>'\\n\\t\\tthis.debugStack.pop()\\n\\t\\treturn line\\n\\t}\\n\\t\\n\\tparseIdentifier(inside) {\\n\\t\\tthis.debugStack.push([\\\"Identifier\\\", this.index])\\n\\t\\tlet parts = [\\\"\\\"]\\n\\t\\tidLoop:\\n\\t\\twhile (1) {\\n\\t\\t\\tswitch (this.now()) {\\n\\t\\t\\t\\tcase \\\"\\\\\\\\\\\":\\n\\t\\t\\t\\t\\tparts[parts.length-1]+=this.parseEscape();\\n\\t\\t\\t\\t\\tcontinue\\n\\t\\t\\t\\tcase \\\"<\\\":\\n\\t\\t\\t\\t\\tparts.push(\\n\\t\\t\\t\\t\\t\\tthis.parseInterpolation()\\n\\t\\t\\t\\t\\t);\\n\\t\\t\\t\\t\\tparts.push(\\\"\\\")\\n\\t\\t\\t\\t\\tcontinue\\n\\t\\t\\t\\tcase \\\"}\\\":\\n\\t\\t\\t\\t\\tif (inside === INSIDE.LAZY)\\n\\t\\t\\t\\t\\t\\tbreak idLoop\\n\\t\\t\\t\\t\\tbreak\\n\\t\\t\\t\\tcase \\\">\\\":\\n\\t\\t\\t\\t\\tif (inside === INSIDE.INTER)\\n\\t\\t\\t\\t\\t\\tbreak idLoop\\n\\t\\t\\t\\t\\tbreak\\n\\t\\t\\t\\tcase \\\"#\\\":\\n\\t\\t\\t\\t\\tbreak idLoop\\n\\t\\t\\t}\\n\\t\\t\\tparts[parts.length-1]+=this.now();\\n\\t\\t\\tthis.next();\\n\\t\\t}\\n\\t\\tthis.debugStack.pop();\\n\\t\\treturn parts\\n\\t}\\n}\\n\\nconst SPIDNEY = {//spinny identifiers\\n\\t\\\"noversion\\\": {\\n\\t\\tNAME: \\\"noversion\\\",\\n\\t\\tKEYS: {\\n\\t\\t\\tTYPE: \\\"t\\\",\\n\\t\\t\\tBANG: \\\"b\\\",\\n\\t\\t\\tPARTS: \\\"p\\\",\\n\\t\\t\\tLINES: \\\"l\\\"\\n\\t\\t},\\n\\t\\tTYPE: {\\n\\t\\t\\tLIT: 0,\\n\\t\\t\\tID: 1,\\n\\t\\t\\tLAZY: 2\\n\\t\\t}\\n\\t}\\n}\\nconst CMPVER = SPIDNEY[\\\"noversion\\\"] //compileversion\\n\\n// When the program starts:\\nonRun();\\nquit();\\n\"}}"}