Last active
December 3, 2023 09:30
-
-
Save frostburn/db885d294564a78531727dae009aeeec to your computer and use it in GitHub Desktop.
Scale Workshop 2 grammar with error generating examples
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Generated by Peggy 3.0.2. | |
// | |
// https://peggyjs.org/ | |
"use strict"; | |
function PlainLiteral(value) { | |
return { | |
type: 'PlainLiteral', | |
value | |
} | |
} | |
function CentsLiteral(whole, fractional) { | |
return { | |
type: 'CentsLiteral', | |
whole, | |
fractional | |
} | |
} | |
function NumericLiteral(whole, fractional) { | |
return { | |
type: 'NumericLiteral', | |
whole, | |
fractional | |
} | |
} | |
function FractionLiteral(numerator, denominator) { | |
return { | |
type: 'FractionLiteral', | |
numerator, | |
denominator | |
} | |
} | |
function EdjiFraction(numerator, denominator, equave) { | |
return { | |
type: 'EdjiFraction', | |
numerator, | |
denominator, | |
equave | |
} | |
} | |
function Monzo(components) { | |
return { | |
type: 'Monzo', | |
components | |
} | |
} | |
function BinaryExpression(operator, left, right) { | |
return { | |
type: 'BinaryExpression', | |
operator, | |
left, | |
right | |
} | |
} | |
function UnaryExpression(operator, operand) { | |
return { | |
type: 'UnaryExpression', | |
operator, | |
operand | |
} | |
} | |
function operatorReducer (result, element) { | |
const left = result; | |
const [op, right] = element; | |
return BinaryExpression(op, left, right); | |
} | |
function peg$subclass(child, parent) { | |
function C() { this.constructor = child; } | |
C.prototype = parent.prototype; | |
child.prototype = new C(); | |
} | |
function peg$SyntaxError(message, expected, found, location, translations) { | |
var self = Error.call(this, message); | |
// istanbul ignore next Check is a necessary evil to support older environments | |
if (Object.setPrototypeOf) { | |
Object.setPrototypeOf(self, peg$SyntaxError.prototype); | |
} | |
self.expected = expected; | |
self.found = found; | |
self.location = location; | |
self.translations = translations; | |
self.name = "SyntaxError"; | |
return self; | |
} | |
peg$subclass(peg$SyntaxError, Error); | |
function peg$padEnd(str, targetLength, padString) { | |
padString = padString || " "; | |
if (str.length > targetLength) { return str; } | |
targetLength -= str.length; | |
padString += padString.repeat(targetLength); | |
return str + padString.slice(0, targetLength); | |
} | |
peg$SyntaxError.prototype.format = function(sources) { | |
var translations = this.translations; | |
var str = translations["syntax.error"] + ": " + this.message; | |
if (this.location) { | |
var src = null; | |
var k; | |
for (k = 0; k < sources.length; k++) { | |
if (sources[k].source === this.location.source) { | |
src = sources[k].text.split(/\r\n|\n|\r/g); | |
break; | |
} | |
} | |
var s = this.location.start; | |
var offset_s = (this.location.source && (typeof this.location.source.offset === "function")) | |
? this.location.source.offset(s) | |
: s; | |
var loc = this.location.source + ":" + offset_s.line + ":" + offset_s.column; | |
if (src) { | |
var e = this.location.end; | |
var filler = peg$padEnd("", offset_s.line.toString().length, ' '); | |
var line = src[s.line - 1]; | |
var last = s.line === e.line ? e.column : line.length + 1; | |
var hatLen = (last - s.column) || 1; | |
str += "\n --> " + loc + "\n" | |
+ filler + " |\n" | |
+ offset_s.line + " | " + line + "\n" | |
+ filler + " | " + peg$padEnd("", s.column - 1, ' ') | |
+ peg$padEnd("", hatLen, "^"); | |
} else { | |
str += "\n " + translations["syntax.at"] + " " + loc; | |
} | |
} | |
return str; | |
}; | |
peg$SyntaxError.buildMessage = function(expected, found, translations) { | |
var DESCRIBE_EXPECTATION_FNS = { | |
literal: function(expectation) { | |
return "\"" + literalEscape(expectation.text) + "\""; | |
}, | |
class: function(expectation) { | |
var escapedParts = expectation.parts.map(function(part) { | |
return Array.isArray(part) | |
? classEscape(part[0]) + "-" + classEscape(part[1]) | |
: classEscape(part); | |
}); | |
return "[" + (expectation.inverted ? "^" : "") + escapedParts.join("") + "]"; | |
}, | |
any: function() { | |
return translations["syntax.any"]; | |
}, | |
end: function() { | |
return translations["syntax.end"]; | |
}, | |
other: function(expectation) { | |
return expectation.description; | |
} | |
}; | |
function hex(ch) { | |
return ch.charCodeAt(0).toString(16).toUpperCase(); | |
} | |
function literalEscape(s) { | |
return 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, function(ch) { return "\\x0" + hex(ch); }) | |
.replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); }); | |
} | |
function classEscape(s) { | |
return 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, function(ch) { return "\\x0" + hex(ch); }) | |
.replace(/[\x10-\x1F\x7F-\x9F]/g, function(ch) { return "\\x" + hex(ch); }); | |
} | |
function describeExpectation(expectation) { | |
return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation); | |
} | |
function describeExpected(expected) { | |
var descriptions = expected.map(describeExpectation); | |
var i, j; | |
descriptions.sort(); | |
if (descriptions.length > 0) { | |
for (i = 1, j = 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] + " " + translations["syntax.or"] + " " + descriptions[1]; | |
default: | |
return descriptions.slice(0, -1).join(", ") | |
+ ", " + translations["syntax.or"] + " " | |
+ descriptions[descriptions.length - 1]; | |
} | |
} | |
function describeFound(found) { | |
return found ? "\"" + literalEscape(found) + "\"" : translations["syntax.end"]; | |
} | |
return translations["syntax.expected"] + " " + describeExpected(expected) + " " + translations["syntax.but"] + " " + describeFound(found) + " " + translations["syntax.found"] + "."; | |
}; | |
function peg$parse(input, options) { | |
options = options !== undefined ? options : {}; | |
var peg$translations = { | |
// Standard English translations | |
"syntax.error": "Error", | |
"syntax.at": "at", | |
"syntax.any": "any character", | |
"syntax.end": "end of input", | |
"syntax.or": "or", | |
"syntax.expected": "expected", | |
"syntax.but": "but", | |
"syntax.found": "found", | |
// Auto-generated translations for display names | |
"display.name.whitespace": "whitespace", | |
...(options.translations ?? {})}; | |
var peg$FAILED = {}; | |
var peg$source = options.grammarSource; | |
var peg$startRuleFunctions = { Start: peg$parseStart }; | |
var peg$startRuleFunction = peg$parseStart; | |
var peg$c0 = "\t"; | |
var peg$c1 = "\v"; | |
var peg$c2 = "\f"; | |
var peg$c3 = " "; | |
var peg$c4 = "\xA0"; | |
var peg$c5 = "\uFEFF"; | |
var peg$c6 = "+"; | |
var peg$c7 = "-"; | |
var peg$c8 = "."; | |
var peg$c9 = ","; | |
var peg$c10 = "/"; | |
var peg$c11 = "<"; | |
var peg$c12 = ">"; | |
var peg$c13 = "\\"; | |
var peg$c14 = "["; | |
var peg$r0 = /^[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/; | |
var peg$r1 = /^[\n\r\u2028\u2029]/; | |
var peg$r2 = /^[0-9]/; | |
var peg$r3 = /^[+\-]/; | |
var peg$e0 = peg$anyExpectation(); | |
var peg$e1 = peg$otherExpectation(peg$translations["display.name.whitespace"]); | |
var peg$e2 = peg$literalExpectation("\t", false); | |
var peg$e3 = peg$literalExpectation("\v", false); | |
var peg$e4 = peg$literalExpectation("\f", false); | |
var peg$e5 = peg$literalExpectation(" ", false); | |
var peg$e6 = peg$literalExpectation("\xA0", false); | |
var peg$e7 = peg$literalExpectation("\uFEFF", false); | |
var peg$e8 = peg$classExpectation([" ", "\xA0", "\u1680", ["\u2000", "\u200A"], "\u202F", "\u205F", "\u3000"], false, false); | |
var peg$e9 = peg$classExpectation(["\n", "\r", "\u2028", "\u2029"], false, false); | |
var peg$e10 = peg$literalExpectation("+", false); | |
var peg$e11 = peg$literalExpectation("-", false); | |
var peg$e12 = peg$classExpectation([["0", "9"]], false, false); | |
var peg$e13 = peg$literalExpectation(".", false); | |
var peg$e14 = peg$literalExpectation(",", false); | |
var peg$e15 = peg$literalExpectation("/", false); | |
var peg$e16 = peg$literalExpectation("<", false); | |
var peg$e17 = peg$literalExpectation(">", false); | |
var peg$e18 = peg$literalExpectation("\\", false); | |
var peg$e19 = peg$classExpectation(["+", "-"], false, false); | |
var peg$e20 = peg$literalExpectation("[", false); | |
var peg$f0 = function(head, tail) { | |
return tail.reduce(operatorReducer, head); | |
}; | |
var peg$f1 = function(num) { return parseInt(num, 10) }; | |
var peg$f2 = function(sign, value) { return sign ? -value : value }; | |
var peg$f3 = function(whole, fractional) { return CentsLiteral(whole, fractional) }; | |
var peg$f4 = function(whole, fractional) { return NumericLiteral(whole, fractional) }; | |
var peg$f5 = function(numerator, denominator) { return FractionLiteral(numerator, denominator) }; | |
var peg$f6 = function(value) { return PlainLiteral(value) }; | |
var peg$f7 = function(numerator, denominator, equave) { return EdjiFraction(numerator, denominator, equave) }; | |
var peg$f8 = function(components) { return Monzo(components) }; | |
var peg$f9 = function(operator, operand) { return UnaryExpression(operator, operand) }; | |
var peg$currPos = 0; | |
var peg$savedPos = 0; | |
var peg$posDetailsCache = [{ line: 1, column: 1 }]; | |
var peg$maxFailPos = 0; | |
var peg$maxFailExpected = []; | |
var peg$silentFails = 0; | |
var peg$result; | |
if ("startRule" in options) { | |
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$literalExpectation(text, ignoreCase) { | |
return { type: "literal", text: text, ignoreCase: ignoreCase }; | |
} | |
function peg$classExpectation(parts, inverted, ignoreCase) { | |
return { type: "class", parts: parts, inverted: inverted, ignoreCase: ignoreCase }; | |
} | |
function peg$anyExpectation() { | |
return { type: "any" }; | |
} | |
function peg$endExpectation() { | |
return { type: "end" }; | |
} | |
function peg$otherExpectation(description) { | |
return { type: "other", description: description }; | |
} | |
function peg$computePosDetails(pos) { | |
var details = peg$posDetailsCache[pos]; | |
var p; | |
if (details) { | |
return details; | |
} else { | |
p = pos - 1; | |
while (!peg$posDetailsCache[p]) { | |
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) { | |
var startPosDetails = peg$computePosDetails(startPos); | |
var endPosDetails = peg$computePosDetails(endPos); | |
var 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, peg$translations); | |
} | |
function peg$buildStructuredError(expected, found, location) { | |
return new peg$SyntaxError( | |
peg$SyntaxError.buildMessage(expected, found, peg$translations), | |
expected, | |
found, | |
location, | |
peg$translations | |
); | |
} | |
function peg$parseStart() { | |
var s0; | |
s0 = peg$parseExpression(); | |
return s0; | |
} | |
function peg$parseSourceCharacter() { | |
var s0; | |
if (input.length > peg$currPos) { | |
s0 = input.charAt(peg$currPos); | |
peg$currPos++; | |
} else { | |
s0 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e0); } | |
} | |
return s0; | |
} | |
function peg$parseWhitespace() { | |
var s0, s1; | |
peg$silentFails++; | |
if (input.charCodeAt(peg$currPos) === 9) { | |
s0 = peg$c0; | |
peg$currPos++; | |
} else { | |
s0 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e2); } | |
} | |
if (s0 === peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 11) { | |
s0 = peg$c1; | |
peg$currPos++; | |
} else { | |
s0 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e3); } | |
} | |
if (s0 === peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 12) { | |
s0 = peg$c2; | |
peg$currPos++; | |
} else { | |
s0 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e4); } | |
} | |
if (s0 === peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 32) { | |
s0 = peg$c3; | |
peg$currPos++; | |
} else { | |
s0 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e5); } | |
} | |
if (s0 === peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 160) { | |
s0 = peg$c4; | |
peg$currPos++; | |
} else { | |
s0 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e6); } | |
} | |
if (s0 === peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 65279) { | |
s0 = peg$c5; | |
peg$currPos++; | |
} else { | |
s0 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e7); } | |
} | |
if (s0 === peg$FAILED) { | |
s0 = peg$parseZs(); | |
if (s0 === peg$FAILED) { | |
s0 = peg$parseLineTerminator(); | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
peg$silentFails--; | |
if (s0 === peg$FAILED) { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e1); } | |
} | |
return s0; | |
} | |
function peg$parseZs() { | |
var s0; | |
if (peg$r0.test(input.charAt(peg$currPos))) { | |
s0 = input.charAt(peg$currPos); | |
peg$currPos++; | |
} else { | |
s0 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e8); } | |
} | |
return s0; | |
} | |
function peg$parseLineTerminator() { | |
var s0; | |
if (peg$r1.test(input.charAt(peg$currPos))) { | |
s0 = input.charAt(peg$currPos); | |
peg$currPos++; | |
} else { | |
s0 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e9); } | |
} | |
return s0; | |
} | |
function peg$parse_() { | |
var s0, s1; | |
s0 = []; | |
s1 = peg$parseWhitespace(); | |
while (s1 !== peg$FAILED) { | |
s0.push(s1); | |
s1 = peg$parseWhitespace(); | |
} | |
return s0; | |
} | |
function peg$parseExpression() { | |
var s0, s1, s2, s3, s4, s5, s6, s7; | |
s0 = peg$currPos; | |
s1 = peg$parseTerm(); | |
if (s1 !== peg$FAILED) { | |
s2 = []; | |
s3 = peg$currPos; | |
s4 = peg$parse_(); | |
if (input.charCodeAt(peg$currPos) === 43) { | |
s5 = peg$c6; | |
peg$currPos++; | |
} else { | |
s5 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e10); } | |
} | |
if (s5 === peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 45) { | |
s5 = peg$c7; | |
peg$currPos++; | |
} else { | |
s5 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e11); } | |
} | |
} | |
if (s5 !== peg$FAILED) { | |
s6 = peg$parse_(); | |
s7 = peg$parseTerm(); | |
if (s7 !== peg$FAILED) { | |
s3 = [ s5, s7 ]; | |
} else { | |
peg$currPos = s3; | |
s3 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s3; | |
s3 = peg$FAILED; | |
} | |
while (s3 !== peg$FAILED) { | |
s2.push(s3); | |
s3 = peg$currPos; | |
s4 = peg$parse_(); | |
if (input.charCodeAt(peg$currPos) === 43) { | |
s5 = peg$c6; | |
peg$currPos++; | |
} else { | |
s5 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e10); } | |
} | |
if (s5 === peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 45) { | |
s5 = peg$c7; | |
peg$currPos++; | |
} else { | |
s5 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e11); } | |
} | |
} | |
if (s5 !== peg$FAILED) { | |
s6 = peg$parse_(); | |
s7 = peg$parseTerm(); | |
if (s7 !== peg$FAILED) { | |
s3 = [ s5, s7 ]; | |
} else { | |
peg$currPos = s3; | |
s3 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s3; | |
s3 = peg$FAILED; | |
} | |
} | |
peg$savedPos = s0; | |
s0 = peg$f0(s1, s2); | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
return s0; | |
} | |
function peg$parseTerm() { | |
var s0, s1, s2, s3; | |
s0 = peg$currPos; | |
s1 = peg$parse_(); | |
s2 = peg$parseUnaryExpression(); | |
if (s2 === peg$FAILED) { | |
s2 = peg$parsePrimary(); | |
} | |
if (s2 !== peg$FAILED) { | |
s3 = peg$parse_(); | |
s0 = s2; | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
return s0; | |
} | |
function peg$parsePrimary() { | |
var s0; | |
s0 = peg$parseDotDecimal(); | |
if (s0 === peg$FAILED) { | |
s0 = peg$parseCommaDecimal(); | |
if (s0 === peg$FAILED) { | |
s0 = peg$parseSlashFraction(); | |
if (s0 === peg$FAILED) { | |
s0 = peg$parseBackslashFraction(); | |
if (s0 === peg$FAILED) { | |
s0 = peg$parseMonzo(); | |
if (s0 === peg$FAILED) { | |
s0 = peg$parsePlainNumber(); | |
} | |
} | |
} | |
} | |
} | |
return s0; | |
} | |
function peg$parseInteger() { | |
var s0, s1, s2, s3; | |
s0 = peg$currPos; | |
s1 = peg$currPos; | |
s2 = []; | |
if (peg$r2.test(input.charAt(peg$currPos))) { | |
s3 = input.charAt(peg$currPos); | |
peg$currPos++; | |
} else { | |
s3 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e12); } | |
} | |
if (s3 !== peg$FAILED) { | |
while (s3 !== peg$FAILED) { | |
s2.push(s3); | |
if (peg$r2.test(input.charAt(peg$currPos))) { | |
s3 = input.charAt(peg$currPos); | |
peg$currPos++; | |
} else { | |
s3 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e12); } | |
} | |
} | |
} else { | |
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$f1(s1); | |
} | |
s0 = s1; | |
return s0; | |
} | |
function peg$parseSignedInteger() { | |
var s0, s1, s2; | |
s0 = peg$currPos; | |
if (input.charCodeAt(peg$currPos) === 45) { | |
s1 = peg$c7; | |
peg$currPos++; | |
} else { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e11); } | |
} | |
if (s1 === peg$FAILED) { | |
s1 = null; | |
} | |
s2 = peg$parseInteger(); | |
if (s2 !== peg$FAILED) { | |
peg$savedPos = s0; | |
s0 = peg$f2(s1, s2); | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
return s0; | |
} | |
function peg$parseDotDecimal() { | |
var s0, s1, s2, s3, s4, s5; | |
s0 = peg$currPos; | |
s1 = peg$parseInteger(); | |
if (s1 === peg$FAILED) { | |
s1 = null; | |
} | |
if (input.charCodeAt(peg$currPos) === 46) { | |
s2 = peg$c8; | |
peg$currPos++; | |
} else { | |
s2 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e13); } | |
} | |
if (s2 !== peg$FAILED) { | |
s3 = peg$currPos; | |
s4 = []; | |
if (peg$r2.test(input.charAt(peg$currPos))) { | |
s5 = input.charAt(peg$currPos); | |
peg$currPos++; | |
} else { | |
s5 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e12); } | |
} | |
while (s5 !== peg$FAILED) { | |
s4.push(s5); | |
if (peg$r2.test(input.charAt(peg$currPos))) { | |
s5 = input.charAt(peg$currPos); | |
peg$currPos++; | |
} else { | |
s5 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e12); } | |
} | |
} | |
s3 = input.substring(s3, peg$currPos); | |
peg$savedPos = s0; | |
s0 = peg$f3(s1, s3); | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
return s0; | |
} | |
function peg$parseCommaDecimal() { | |
var s0, s1, s2, s3, s4, s5; | |
s0 = peg$currPos; | |
s1 = peg$parseInteger(); | |
if (s1 === peg$FAILED) { | |
s1 = null; | |
} | |
if (input.charCodeAt(peg$currPos) === 44) { | |
s2 = peg$c9; | |
peg$currPos++; | |
} else { | |
s2 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e14); } | |
} | |
if (s2 !== peg$FAILED) { | |
s3 = peg$currPos; | |
s4 = []; | |
if (peg$r2.test(input.charAt(peg$currPos))) { | |
s5 = input.charAt(peg$currPos); | |
peg$currPos++; | |
} else { | |
s5 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e12); } | |
} | |
while (s5 !== peg$FAILED) { | |
s4.push(s5); | |
if (peg$r2.test(input.charAt(peg$currPos))) { | |
s5 = input.charAt(peg$currPos); | |
peg$currPos++; | |
} else { | |
s5 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e12); } | |
} | |
} | |
s3 = input.substring(s3, peg$currPos); | |
peg$savedPos = s0; | |
s0 = peg$f4(s1, s3); | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
return s0; | |
} | |
function peg$parseSlashFraction() { | |
var s0, s1, s2, s3; | |
s0 = peg$currPos; | |
s1 = peg$parseInteger(); | |
if (s1 !== peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 47) { | |
s2 = peg$c10; | |
peg$currPos++; | |
} else { | |
s2 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e15); } | |
} | |
if (s2 !== peg$FAILED) { | |
s3 = peg$parseInteger(); | |
if (s3 !== peg$FAILED) { | |
peg$savedPos = s0; | |
s0 = peg$f5(s1, 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$parsePlainNumber() { | |
var s0, s1; | |
s0 = peg$currPos; | |
s1 = peg$parseInteger(); | |
if (s1 !== peg$FAILED) { | |
peg$savedPos = s0; | |
s1 = peg$f6(s1); | |
} | |
s0 = s1; | |
return s0; | |
} | |
function peg$parseEquaveExpression() { | |
var s0, s1, s2, s3, s4, s5; | |
s0 = peg$currPos; | |
if (input.charCodeAt(peg$currPos) === 60) { | |
s1 = peg$c11; | |
peg$currPos++; | |
} else { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e16); } | |
} | |
if (s1 !== peg$FAILED) { | |
s2 = peg$parse_(); | |
s3 = peg$parseSlashFraction(); | |
if (s3 === peg$FAILED) { | |
s3 = peg$parsePlainNumber(); | |
} | |
if (s3 !== peg$FAILED) { | |
s4 = peg$parse_(); | |
if (input.charCodeAt(peg$currPos) === 62) { | |
s5 = peg$c12; | |
peg$currPos++; | |
} else { | |
s5 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e17); } | |
} | |
if (s5 !== peg$FAILED) { | |
s0 = 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$parseBackslashFraction() { | |
var s0, s1, s2, s3, s4; | |
s0 = peg$currPos; | |
s1 = peg$parseInteger(); | |
if (s1 !== peg$FAILED) { | |
if (input.charCodeAt(peg$currPos) === 92) { | |
s2 = peg$c13; | |
peg$currPos++; | |
} else { | |
s2 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e18); } | |
} | |
if (s2 !== peg$FAILED) { | |
s3 = peg$parseSignedInteger(); | |
if (s3 !== peg$FAILED) { | |
s4 = peg$parseEquaveExpression(); | |
if (s4 === peg$FAILED) { | |
s4 = null; | |
} | |
peg$savedPos = s0; | |
s0 = peg$f7(s1, s3, s4); | |
} 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$parseComponent() { | |
var s0, s1, s2, s3; | |
s0 = peg$currPos; | |
s1 = peg$currPos; | |
if (peg$r3.test(input.charAt(peg$currPos))) { | |
s2 = input.charAt(peg$currPos); | |
peg$currPos++; | |
} else { | |
s2 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e19); } | |
} | |
if (s2 === peg$FAILED) { | |
s2 = null; | |
} | |
s3 = peg$parseSlashFraction(); | |
if (s3 === peg$FAILED) { | |
s3 = peg$parsePlainNumber(); | |
} | |
if (s3 !== peg$FAILED) { | |
s2 = [s2, s3]; | |
s1 = s2; | |
} else { | |
peg$currPos = s1; | |
s1 = peg$FAILED; | |
} | |
if (s1 !== peg$FAILED) { | |
s0 = input.substring(s0, peg$currPos); | |
} else { | |
s0 = s1; | |
} | |
return s0; | |
} | |
function peg$parseMonzo() { | |
var s0, s1, s2, s3, s4, s5, s6, s7; | |
s0 = peg$currPos; | |
if (input.charCodeAt(peg$currPos) === 91) { | |
s1 = peg$c14; | |
peg$currPos++; | |
} else { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e20); } | |
} | |
if (s1 !== peg$FAILED) { | |
s2 = []; | |
s3 = peg$parseComponent(); | |
while (s3 !== peg$FAILED) { | |
s2.push(s3); | |
s3 = peg$currPos; | |
s4 = peg$currPos; | |
s5 = peg$parse_(); | |
if (input.charCodeAt(peg$currPos) === 44) { | |
s6 = peg$c9; | |
peg$currPos++; | |
} else { | |
s6 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e14); } | |
} | |
if (s6 === peg$FAILED) { | |
s6 = null; | |
} | |
s7 = peg$parse_(); | |
s5 = [s5, s6, s7]; | |
s4 = s5; | |
s4 = peg$parseComponent(); | |
if (s4 === peg$FAILED) { | |
peg$currPos = s3; | |
s3 = peg$FAILED; | |
} else { | |
s3 = s4; | |
} | |
} | |
if (input.charCodeAt(peg$currPos) === 62) { | |
s3 = peg$c12; | |
peg$currPos++; | |
} else { | |
s3 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e17); } | |
} | |
if (s3 !== peg$FAILED) { | |
peg$savedPos = s0; | |
s0 = peg$f8(s2); | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
return s0; | |
} | |
function peg$parseUnaryExpression() { | |
var s0, s1, s2; | |
s0 = peg$currPos; | |
if (input.charCodeAt(peg$currPos) === 45) { | |
s1 = peg$c7; | |
peg$currPos++; | |
} else { | |
s1 = peg$FAILED; | |
if (peg$silentFails === 0) { peg$fail(peg$e11); } | |
} | |
if (s1 !== peg$FAILED) { | |
s2 = peg$parsePrimary(); | |
if (s2 !== peg$FAILED) { | |
peg$savedPos = s0; | |
s0 = peg$f9(s1, s2); | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
} else { | |
peg$currPos = s0; | |
s0 = peg$FAILED; | |
} | |
return s0; | |
} | |
peg$result = peg$startRuleFunction(); | |
if (peg$result !== peg$FAILED && peg$currPos === input.length) { | |
return peg$result; | |
} else { | |
if (peg$result !== peg$FAILED && peg$currPos < input.length) { | |
peg$fail(peg$endExpectation()); | |
} | |
throw peg$buildStructuredError( | |
peg$maxFailExpected, | |
peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, | |
peg$maxFailPos < input.length | |
? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) | |
: peg$computeLocation(peg$maxFailPos, peg$maxFailPos) | |
); | |
} | |
} | |
module.exports = { | |
SyntaxError: peg$SyntaxError, | |
parse: peg$parse | |
}; | |
// Manually added error-generating calls: | |
const translations = { | |
'display.name.whitespace': 'välilyönti', | |
'syntax.error': 'Virhe', | |
'syntax.at': 'sijainnissa', | |
'syntax.or': 'tai', | |
'syntax.any': 'mitä tahansa kirjainta', | |
'syntax.end': 'syötteen loppu', | |
'syntax.expected': 'Odotettiin', | |
'syntax.but': 'mutta', | |
'syntax.found': 'löytyi', | |
} | |
const p = (input) => peg$parse(input, {grammarSource: '(Skaalatietue)', translations}); | |
try { | |
p(''); | |
} catch (e) { | |
console.log(e.format({text: ''})); | |
} | |
try { | |
p('5\\7<3/asdf>'); | |
} catch (e) { | |
console.log(e.format({text: '3/asdf'})); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment