UNPKG

mercury-lang

Version:

Parser for the mercury live coding language

156 lines (142 loc) 7.67 kB
// Generated automatically by nearley, version 2.20.1 // http://github.com/Hardmath123/nearley (function () { function id(x) { return x[0]; } const moo = require('moo'); const IR = require('./mercuryIR.js'); const lexer = moo.compile({ comment: /(?:\/\/).*?$/, //nl: { match: /[\n|\r\n]+/, lineBreaks: true }, //list: [/ring /, /array /, /list /], //newObject: [/new /, /make /], //setObject: [/set /, /apply /, /give /, /send /], //print: [/print /, /post /, /log /], //global: [/silence/, /mute/, /killAll/], //seperator: /,/, //newLine: /[&;]/, //note: /[a-gA-G](?:[0-9])?(?:#+|b+|x)?/, //number: /[+-]?(?:[0-9]|[0-9]+)(?:\.[0-9]+)?(?:[eE][-+]?[0-9]+)?\b/, number: /[+-]?(?:[0-9]+)(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?/, //hex: /0x[0-9a-f]+/, divider: /[/:]/, //is: '=', //timevalue: /[nm]/, lParam: '(', rParam: ')', lArray: '[', rArray: ']', //lFunc: '{', //rFunc: '}' string: { match: /"[^"\n]*"|'[^'\n]*'|`[^\n]*`/, // match: /["'`](?:\\["\\]|[^\n"'``])*["'`]/, value: x => x.slice(1, x.length-1) }, //identifier: /[a-zA-Z\_\-][a-zA-Z0-9\_\-\.]*/, //identifier: /[a-zA-Z\_\-][^\s]*/, identifier: { match: /[^0-9\s][^\s\(\)\[\]]*/, type: moo.keywords({ list: ['ring', 'array', 'list'], newObject: ['new', 'make'], setObject: ['set', 'apply', 'give'], print: ['print', 'post', 'log'], display: ['display', 'view'] // global: ['silence'] }) }, //signal: /~(?:\\["\\]|[^\n"\\ \t])+/, //osc: /\/(?:\\["\\]|[^\n"\\ \t])*/, ws: /[ \t]+/ }); lexer.next = (next => () => { let tok; while ((tok = next.call(lexer)) && tok.type === "ws") {} return tok; })(lexer.next); var grammar = { Lexer: lexer, ParserRules: [ {"name": "main$ebnf$1", "symbols": [(lexer.has("comment") ? {type: "comment"} : comment)], "postprocess": id}, {"name": "main$ebnf$1", "symbols": [], "postprocess": function(d) {return null;}}, {"name": "main", "symbols": ["globalStatement", "main$ebnf$1"], "postprocess": (d) => { return { "@global" : d[0] }}}, {"name": "main$ebnf$2", "symbols": [(lexer.has("comment") ? {type: "comment"} : comment)], "postprocess": id}, {"name": "main$ebnf$2", "symbols": [], "postprocess": function(d) {return null;}}, {"name": "main", "symbols": ["listStatement", "main$ebnf$2"], "postprocess": (d) => { return { "@list" : d[0] }}}, {"name": "main$ebnf$3", "symbols": [(lexer.has("comment") ? {type: "comment"} : comment)], "postprocess": id}, {"name": "main$ebnf$3", "symbols": [], "postprocess": function(d) {return null;}}, {"name": "main", "symbols": ["objectStatement", "main$ebnf$3"], "postprocess": (d) => { return { "@object" : d[0] }}}, {"name": "objectStatement", "symbols": [(lexer.has("newObject") ? {type: "newObject"} : newObject), (lexer.has("identifier") ? {type: "identifier"} : identifier), "objectIdentifier"], "postprocess": (d) => { return { "@new" : { "@inst" : d[1].value, "@type" : d[2] } } }}, {"name": "objectStatement", "symbols": [(lexer.has("newObject") ? {type: "newObject"} : newObject), (lexer.has("identifier") ? {type: "identifier"} : identifier), "objectIdentifier", "objExpression"], "postprocess": (d) => { return { "@new" : { "@inst" : d[1].value, "@type" : d[2], "@functions" : d[3] } } }}, {"name": "objectStatement", "symbols": [(lexer.has("setObject") ? {type: "setObject"} : setObject), (lexer.has("identifier") ? {type: "identifier"} : identifier), "objExpression"], "postprocess": (d) => { return { "@set" : { "@name" : d[1].value, "@functions" : d[2] } } }}, {"name": "objectIdentifier", "symbols": ["name"], "postprocess": id}, {"name": "objectIdentifier", "symbols": ["array"], "postprocess": id}, {"name": "objectIdentifier", "symbols": ["function"], "postprocess": (d) => d[0]}, {"name": "listStatement", "symbols": [(lexer.has("list") ? {type: "list"} : list), (lexer.has("identifier") ? {type: "identifier"} : identifier), "paramElement"], "postprocess": (d) => { return { "@name" : d[1].value, "@params" : d[2] } } }, {"name": "globalStatement", "symbols": [(lexer.has("comment") ? {type: "comment"} : comment)], "postprocess": (d) => { return { "@comment" : d[0].value }}}, {"name": "globalStatement", "symbols": [(lexer.has("print") ? {type: "print"} : print), "objExpression"], "postprocess": (d) => { return { "@print" : d[1] }}}, {"name": "globalStatement", "symbols": [(lexer.has("display") ? {type: "display"} : display), "objExpression"], "postprocess": (d) => { return { "@display" : d[1] }}}, {"name": "globalStatement", "symbols": ["name"], "postprocess": (d) => { return { "@settings" : d[0] }}}, {"name": "objExpression", "symbols": ["paramElement"], "postprocess": (d) => [d[0]]}, {"name": "objExpression", "symbols": ["paramElement", "objExpression"], "postprocess": (d) => [d[0], d[1]].flat(Infinity)}, {"name": "function", "symbols": [(lexer.has("identifier") ? {type: "identifier"} : identifier), "functionArguments"], "postprocess": (d) => { return { //"@function": IR.bindFunction(d[0].value), "@function": { "@name": IR.keyBind(d[0].value), "@args": d[1] } } }}, {"name": "functionArguments$ebnf$1", "symbols": ["params"], "postprocess": id}, {"name": "functionArguments$ebnf$1", "symbols": [], "postprocess": function(d) {return null;}}, {"name": "functionArguments", "symbols": [(lexer.has("lParam") ? {type: "lParam"} : lParam), "functionArguments$ebnf$1", (lexer.has("rParam") ? {type: "rParam"} : rParam)], "postprocess": (d) => d[1]}, {"name": "array$ebnf$1", "symbols": ["params"], "postprocess": id}, {"name": "array$ebnf$1", "symbols": [], "postprocess": function(d) {return null;}}, {"name": "array", "symbols": [(lexer.has("lArray") ? {type: "lArray"} : lArray), "array$ebnf$1", (lexer.has("rArray") ? {type: "rArray"} : rArray)], "postprocess": (d) => { return { "@array" : d[1] }}}, {"name": "params", "symbols": ["paramElement"], "postprocess": (d) => [d[0]]}, {"name": "params", "symbols": ["paramElement", "params"], "postprocess": (d) => [d[0], d[1]].flat(Infinity)}, {"name": "paramElement", "symbols": [(lexer.has("number") ? {type: "number"} : number)], "postprocess": (d) => { return IR.num(d) }}, {"name": "paramElement", "symbols": ["name"], "postprocess": (d) => d[0]}, {"name": "paramElement", "symbols": ["array"], "postprocess": (d) => d[0]}, {"name": "paramElement", "symbols": ["function"], "postprocess": (d) => d[0]}, {"name": "paramElement", "symbols": ["division"], "postprocess": (d) => d[0]}, {"name": "division", "symbols": [(lexer.has("number") ? {type: "number"} : number), (lexer.has("divider") ? {type: "divider"} : divider), (lexer.has("number") ? {type: "number"} : number)], "postprocess": (d) => { return IR.division(d) }}, {"name": "name", "symbols": [(lexer.has("identifier") ? {type: "identifier"} : identifier)], "postprocess": (d) => { return IR.identifier(d) }}, {"name": "name", "symbols": [(lexer.has("string") ? {type: "string"} : string)], "postprocess": (d) => { return { "@string" : d[0].value }}} ] , ParserStart: "main" } if (typeof module !== 'undefined'&& typeof module.exports !== 'undefined') { module.exports = grammar; } else { window.grammar = grammar; } })();