diff --git a/lib/parser.js b/lib/parser.js index 564f71a3..a802fe05 100644 --- a/lib/parser.js +++ b/lib/parser.js @@ -207,45 +207,46 @@ function peg$parse(input, options) { var peg$c10 = "*"; var peg$c11 = "+"; var peg$c12 = "|"; - var peg$c13 = ".."; - var peg$c14 = "("; - var peg$c15 = ")"; - var peg$c16 = "\t"; - var peg$c17 = "\v"; - var peg$c18 = "\f"; - var peg$c19 = " "; - var peg$c20 = "\xA0"; - var peg$c21 = "\uFEFF"; - var peg$c22 = "\n"; - var peg$c23 = "\r\n"; - var peg$c24 = "\r"; - var peg$c25 = "\u2028"; - var peg$c26 = "\u2029"; - var peg$c27 = "/*"; - var peg$c28 = "*/"; - var peg$c29 = "//"; - var peg$c30 = "_"; - var peg$c31 = "\\"; - var peg$c32 = "\u200C"; - var peg$c33 = "\u200D"; - var peg$c34 = "i"; - var peg$c35 = "\""; - var peg$c36 = "'"; - var peg$c37 = "["; - var peg$c38 = "^"; - var peg$c39 = "]"; - var peg$c40 = "-"; - var peg$c41 = "0"; - var peg$c42 = "b"; - var peg$c43 = "f"; - var peg$c44 = "n"; - var peg$c45 = "r"; - var peg$c46 = "t"; - var peg$c47 = "v"; - var peg$c48 = "x"; - var peg$c49 = "u"; - var peg$c50 = "."; - var peg$c51 = ";"; + var peg$c13 = ","; + var peg$c14 = ".."; + var peg$c15 = "("; + var peg$c16 = ")"; + var peg$c17 = "\t"; + var peg$c18 = "\v"; + var peg$c19 = "\f"; + var peg$c20 = " "; + var peg$c21 = "\xA0"; + var peg$c22 = "\uFEFF"; + var peg$c23 = "\n"; + var peg$c24 = "\r\n"; + var peg$c25 = "\r"; + var peg$c26 = "\u2028"; + var peg$c27 = "\u2029"; + var peg$c28 = "/*"; + var peg$c29 = "*/"; + var peg$c30 = "//"; + var peg$c31 = "_"; + var peg$c32 = "\\"; + var peg$c33 = "\u200C"; + var peg$c34 = "\u200D"; + var peg$c35 = "i"; + var peg$c36 = "\""; + var peg$c37 = "'"; + var peg$c38 = "["; + var peg$c39 = "^"; + var peg$c40 = "]"; + var peg$c41 = "-"; + var peg$c42 = "0"; + var peg$c43 = "b"; + var peg$c44 = "f"; + var peg$c45 = "n"; + var peg$c46 = "r"; + var peg$c47 = "t"; + var peg$c48 = "v"; + var peg$c49 = "x"; + var peg$c50 = "u"; + var peg$c51 = "."; + var peg$c52 = ";"; var peg$r0 = /^[\n\r\u2028\u2029]/; var peg$r1 = /^[0-9]/; @@ -276,69 +277,70 @@ function peg$parse(input, options) { var peg$e10 = peg$literalExpectation("*", false); var peg$e11 = peg$literalExpectation("+", false); var peg$e12 = peg$literalExpectation("|", false); - var peg$e13 = peg$literalExpectation("..", false); - var peg$e14 = peg$literalExpectation("(", false); - var peg$e15 = peg$literalExpectation(")", false); - var peg$e16 = peg$anyExpectation(); - var peg$e17 = peg$otherExpectation("whitespace"); - var peg$e18 = peg$literalExpectation("\t", false); - var peg$e19 = peg$literalExpectation("\v", false); - var peg$e20 = peg$literalExpectation("\f", false); - var peg$e21 = peg$literalExpectation(" ", false); - var peg$e22 = peg$literalExpectation("\xA0", false); - var peg$e23 = peg$literalExpectation("\uFEFF", false); - var peg$e24 = peg$classExpectation(["\n", "\r", "\u2028", "\u2029"], false, false); - var peg$e25 = peg$otherExpectation("end of line"); - var peg$e26 = peg$literalExpectation("\n", false); - var peg$e27 = peg$literalExpectation("\r\n", false); - var peg$e28 = peg$literalExpectation("\r", false); - var peg$e29 = peg$literalExpectation("\u2028", false); - var peg$e30 = peg$literalExpectation("\u2029", false); - var peg$e31 = peg$otherExpectation("comment"); - var peg$e32 = peg$literalExpectation("/*", false); - var peg$e33 = peg$literalExpectation("*/", false); - var peg$e34 = peg$literalExpectation("//", false); - var peg$e35 = peg$otherExpectation("identifier"); - var peg$e36 = peg$literalExpectation("_", false); - var peg$e37 = peg$literalExpectation("\\", false); - var peg$e38 = peg$literalExpectation("\u200C", false); - var peg$e39 = peg$literalExpectation("\u200D", false); - var peg$e40 = peg$otherExpectation("literal"); - var peg$e41 = peg$literalExpectation("i", false); - var peg$e42 = peg$otherExpectation("string"); - var peg$e43 = peg$literalExpectation("\"", false); - var peg$e44 = peg$literalExpectation("'", false); - var peg$e45 = peg$otherExpectation("character class"); - var peg$e46 = peg$literalExpectation("[", false); - var peg$e47 = peg$literalExpectation("^", false); - var peg$e48 = peg$literalExpectation("]", false); - var peg$e49 = peg$literalExpectation("-", false); - var peg$e50 = peg$literalExpectation("0", false); - var peg$e51 = peg$literalExpectation("b", false); - var peg$e52 = peg$literalExpectation("f", false); - var peg$e53 = peg$literalExpectation("n", false); - var peg$e54 = peg$literalExpectation("r", false); - var peg$e55 = peg$literalExpectation("t", false); - var peg$e56 = peg$literalExpectation("v", false); - var peg$e57 = peg$literalExpectation("x", false); - var peg$e58 = peg$literalExpectation("u", false); - var peg$e59 = peg$classExpectation([["0", "9"]], false, false); - var peg$e60 = peg$classExpectation([["0", "9"], ["a", "f"]], false, true); - var peg$e61 = peg$literalExpectation(".", false); - var peg$e62 = peg$otherExpectation("code block"); - var peg$e63 = peg$classExpectation(["{", "}"], false, false); - var peg$e64 = peg$classExpectation([["a", "z"], "\xB5", ["\xDF", "\xF6"], ["\xF8", "\xFF"], "\u0101", "\u0103", "\u0105", "\u0107", "\u0109", "\u010B", "\u010D", "\u010F", "\u0111", "\u0113", "\u0115", "\u0117", "\u0119", "\u011B", "\u011D", "\u011F", "\u0121", "\u0123", "\u0125", "\u0127", "\u0129", "\u012B", "\u012D", "\u012F", "\u0131", "\u0133", "\u0135", ["\u0137", "\u0138"], "\u013A", "\u013C", "\u013E", "\u0140", "\u0142", "\u0144", "\u0146", ["\u0148", "\u0149"], "\u014B", "\u014D", "\u014F", "\u0151", "\u0153", "\u0155", "\u0157", "\u0159", "\u015B", "\u015D", "\u015F", "\u0161", "\u0163", "\u0165", "\u0167", "\u0169", "\u016B", "\u016D", "\u016F", "\u0171", "\u0173", "\u0175", "\u0177", "\u017A", "\u017C", ["\u017E", "\u0180"], "\u0183", "\u0185", "\u0188", ["\u018C", "\u018D"], "\u0192", "\u0195", ["\u0199", "\u019B"], "\u019E", "\u01A1", "\u01A3", "\u01A5", "\u01A8", ["\u01AA", "\u01AB"], "\u01AD", "\u01B0", "\u01B4", "\u01B6", ["\u01B9", "\u01BA"], ["\u01BD", "\u01BF"], "\u01C6", "\u01C9", "\u01CC", "\u01CE", "\u01D0", "\u01D2", "\u01D4", "\u01D6", "\u01D8", "\u01DA", ["\u01DC", "\u01DD"], "\u01DF", "\u01E1", "\u01E3", "\u01E5", "\u01E7", "\u01E9", "\u01EB", "\u01ED", ["\u01EF", "\u01F0"], "\u01F3", "\u01F5", "\u01F9", "\u01FB", "\u01FD", "\u01FF", "\u0201", "\u0203", "\u0205", "\u0207", "\u0209", "\u020B", "\u020D", "\u020F", "\u0211", "\u0213", "\u0215", "\u0217", "\u0219", "\u021B", "\u021D", "\u021F", "\u0221", "\u0223", "\u0225", "\u0227", "\u0229", "\u022B", "\u022D", "\u022F", "\u0231", ["\u0233", "\u0239"], "\u023C", ["\u023F", "\u0240"], "\u0242", "\u0247", "\u0249", "\u024B", "\u024D", ["\u024F", "\u0293"], ["\u0295", "\u02AF"], "\u0371", "\u0373", "\u0377", ["\u037B", "\u037D"], "\u0390", ["\u03AC", "\u03CE"], ["\u03D0", "\u03D1"], ["\u03D5", "\u03D7"], "\u03D9", "\u03DB", "\u03DD", "\u03DF", "\u03E1", "\u03E3", "\u03E5", "\u03E7", "\u03E9", "\u03EB", "\u03ED", ["\u03EF", "\u03F3"], "\u03F5", "\u03F8", ["\u03FB", "\u03FC"], ["\u0430", "\u045F"], "\u0461", "\u0463", "\u0465", "\u0467", "\u0469", "\u046B", "\u046D", "\u046F", "\u0471", "\u0473", "\u0475", "\u0477", "\u0479", "\u047B", "\u047D", "\u047F", "\u0481", "\u048B", "\u048D", "\u048F", "\u0491", "\u0493", "\u0495", "\u0497", "\u0499", "\u049B", "\u049D", "\u049F", "\u04A1", "\u04A3", "\u04A5", "\u04A7", "\u04A9", "\u04AB", "\u04AD", "\u04AF", "\u04B1", "\u04B3", "\u04B5", "\u04B7", "\u04B9", "\u04BB", "\u04BD", "\u04BF", "\u04C2", "\u04C4", "\u04C6", "\u04C8", "\u04CA", "\u04CC", ["\u04CE", "\u04CF"], "\u04D1", "\u04D3", "\u04D5", "\u04D7", "\u04D9", "\u04DB", "\u04DD", "\u04DF", "\u04E1", "\u04E3", "\u04E5", "\u04E7", "\u04E9", "\u04EB", "\u04ED", "\u04EF", "\u04F1", "\u04F3", "\u04F5", "\u04F7", "\u04F9", "\u04FB", "\u04FD", "\u04FF", "\u0501", "\u0503", "\u0505", "\u0507", "\u0509", "\u050B", "\u050D", "\u050F", "\u0511", "\u0513", "\u0515", "\u0517", "\u0519", "\u051B", "\u051D", "\u051F", "\u0521", "\u0523", "\u0525", "\u0527", "\u0529", "\u052B", "\u052D", "\u052F", ["\u0561", "\u0587"], ["\u13F8", "\u13FD"], ["\u1D00", "\u1D2B"], ["\u1D6B", "\u1D77"], ["\u1D79", "\u1D9A"], "\u1E01", "\u1E03", "\u1E05", "\u1E07", "\u1E09", "\u1E0B", "\u1E0D", "\u1E0F", "\u1E11", "\u1E13", "\u1E15", "\u1E17", "\u1E19", "\u1E1B", "\u1E1D", "\u1E1F", "\u1E21", "\u1E23", "\u1E25", "\u1E27", "\u1E29", "\u1E2B", "\u1E2D", "\u1E2F", "\u1E31", "\u1E33", "\u1E35", "\u1E37", "\u1E39", "\u1E3B", "\u1E3D", "\u1E3F", "\u1E41", "\u1E43", "\u1E45", "\u1E47", "\u1E49", "\u1E4B", "\u1E4D", "\u1E4F", "\u1E51", "\u1E53", "\u1E55", "\u1E57", "\u1E59", "\u1E5B", "\u1E5D", "\u1E5F", "\u1E61", "\u1E63", "\u1E65", "\u1E67", "\u1E69", "\u1E6B", "\u1E6D", "\u1E6F", "\u1E71", "\u1E73", "\u1E75", "\u1E77", "\u1E79", "\u1E7B", "\u1E7D", "\u1E7F", "\u1E81", "\u1E83", "\u1E85", "\u1E87", "\u1E89", "\u1E8B", "\u1E8D", "\u1E8F", "\u1E91", "\u1E93", ["\u1E95", "\u1E9D"], "\u1E9F", "\u1EA1", "\u1EA3", "\u1EA5", "\u1EA7", "\u1EA9", "\u1EAB", "\u1EAD", "\u1EAF", "\u1EB1", "\u1EB3", "\u1EB5", "\u1EB7", "\u1EB9", "\u1EBB", "\u1EBD", "\u1EBF", "\u1EC1", "\u1EC3", "\u1EC5", "\u1EC7", "\u1EC9", "\u1ECB", "\u1ECD", "\u1ECF", "\u1ED1", "\u1ED3", "\u1ED5", "\u1ED7", "\u1ED9", "\u1EDB", "\u1EDD", "\u1EDF", "\u1EE1", "\u1EE3", "\u1EE5", "\u1EE7", "\u1EE9", "\u1EEB", "\u1EED", "\u1EEF", "\u1EF1", "\u1EF3", "\u1EF5", "\u1EF7", "\u1EF9", "\u1EFB", "\u1EFD", ["\u1EFF", "\u1F07"], ["\u1F10", "\u1F15"], ["\u1F20", "\u1F27"], ["\u1F30", "\u1F37"], ["\u1F40", "\u1F45"], ["\u1F50", "\u1F57"], ["\u1F60", "\u1F67"], ["\u1F70", "\u1F7D"], ["\u1F80", "\u1F87"], ["\u1F90", "\u1F97"], ["\u1FA0", "\u1FA7"], ["\u1FB0", "\u1FB4"], ["\u1FB6", "\u1FB7"], "\u1FBE", ["\u1FC2", "\u1FC4"], ["\u1FC6", "\u1FC7"], ["\u1FD0", "\u1FD3"], ["\u1FD6", "\u1FD7"], ["\u1FE0", "\u1FE7"], ["\u1FF2", "\u1FF4"], ["\u1FF6", "\u1FF7"], "\u210A", ["\u210E", "\u210F"], "\u2113", "\u212F", "\u2134", "\u2139", ["\u213C", "\u213D"], ["\u2146", "\u2149"], "\u214E", "\u2184", ["\u2C30", "\u2C5E"], "\u2C61", ["\u2C65", "\u2C66"], "\u2C68", "\u2C6A", "\u2C6C", "\u2C71", ["\u2C73", "\u2C74"], ["\u2C76", "\u2C7B"], "\u2C81", "\u2C83", "\u2C85", "\u2C87", "\u2C89", "\u2C8B", "\u2C8D", "\u2C8F", "\u2C91", "\u2C93", "\u2C95", "\u2C97", "\u2C99", "\u2C9B", "\u2C9D", "\u2C9F", "\u2CA1", "\u2CA3", "\u2CA5", "\u2CA7", "\u2CA9", "\u2CAB", "\u2CAD", "\u2CAF", "\u2CB1", "\u2CB3", "\u2CB5", "\u2CB7", "\u2CB9", "\u2CBB", "\u2CBD", "\u2CBF", "\u2CC1", "\u2CC3", "\u2CC5", "\u2CC7", "\u2CC9", "\u2CCB", "\u2CCD", "\u2CCF", "\u2CD1", "\u2CD3", "\u2CD5", "\u2CD7", "\u2CD9", "\u2CDB", "\u2CDD", "\u2CDF", "\u2CE1", ["\u2CE3", "\u2CE4"], "\u2CEC", "\u2CEE", "\u2CF3", ["\u2D00", "\u2D25"], "\u2D27", "\u2D2D", "\uA641", "\uA643", "\uA645", "\uA647", "\uA649", "\uA64B", "\uA64D", "\uA64F", "\uA651", "\uA653", "\uA655", "\uA657", "\uA659", "\uA65B", "\uA65D", "\uA65F", "\uA661", "\uA663", "\uA665", "\uA667", "\uA669", "\uA66B", "\uA66D", "\uA681", "\uA683", "\uA685", "\uA687", "\uA689", "\uA68B", "\uA68D", "\uA68F", "\uA691", "\uA693", "\uA695", "\uA697", "\uA699", "\uA69B", "\uA723", "\uA725", "\uA727", "\uA729", "\uA72B", "\uA72D", ["\uA72F", "\uA731"], "\uA733", "\uA735", "\uA737", "\uA739", "\uA73B", "\uA73D", "\uA73F", "\uA741", "\uA743", "\uA745", "\uA747", "\uA749", "\uA74B", "\uA74D", "\uA74F", "\uA751", "\uA753", "\uA755", "\uA757", "\uA759", "\uA75B", "\uA75D", "\uA75F", "\uA761", "\uA763", "\uA765", "\uA767", "\uA769", "\uA76B", "\uA76D", "\uA76F", ["\uA771", "\uA778"], "\uA77A", "\uA77C", "\uA77F", "\uA781", "\uA783", "\uA785", "\uA787", "\uA78C", "\uA78E", "\uA791", ["\uA793", "\uA795"], "\uA797", "\uA799", "\uA79B", "\uA79D", "\uA79F", "\uA7A1", "\uA7A3", "\uA7A5", "\uA7A7", "\uA7A9", "\uA7B5", "\uA7B7", "\uA7FA", ["\uAB30", "\uAB5A"], ["\uAB60", "\uAB65"], ["\uAB70", "\uABBF"], ["\uFB00", "\uFB06"], ["\uFB13", "\uFB17"], ["\uFF41", "\uFF5A"]], false, false); - var peg$e65 = peg$classExpectation([["\u02B0", "\u02C1"], ["\u02C6", "\u02D1"], ["\u02E0", "\u02E4"], "\u02EC", "\u02EE", "\u0374", "\u037A", "\u0559", "\u0640", ["\u06E5", "\u06E6"], ["\u07F4", "\u07F5"], "\u07FA", "\u081A", "\u0824", "\u0828", "\u0971", "\u0E46", "\u0EC6", "\u10FC", "\u17D7", "\u1843", "\u1AA7", ["\u1C78", "\u1C7D"], ["\u1D2C", "\u1D6A"], "\u1D78", ["\u1D9B", "\u1DBF"], "\u2071", "\u207F", ["\u2090", "\u209C"], ["\u2C7C", "\u2C7D"], "\u2D6F", "\u2E2F", "\u3005", ["\u3031", "\u3035"], "\u303B", ["\u309D", "\u309E"], ["\u30FC", "\u30FE"], "\uA015", ["\uA4F8", "\uA4FD"], "\uA60C", "\uA67F", ["\uA69C", "\uA69D"], ["\uA717", "\uA71F"], "\uA770", "\uA788", ["\uA7F8", "\uA7F9"], "\uA9CF", "\uA9E6", "\uAA70", "\uAADD", ["\uAAF3", "\uAAF4"], ["\uAB5C", "\uAB5F"], "\uFF70", ["\uFF9E", "\uFF9F"]], false, false); - var peg$e66 = peg$classExpectation(["\xAA", "\xBA", "\u01BB", ["\u01C0", "\u01C3"], "\u0294", ["\u05D0", "\u05EA"], ["\u05F0", "\u05F2"], ["\u0620", "\u063F"], ["\u0641", "\u064A"], ["\u066E", "\u066F"], ["\u0671", "\u06D3"], "\u06D5", ["\u06EE", "\u06EF"], ["\u06FA", "\u06FC"], "\u06FF", "\u0710", ["\u0712", "\u072F"], ["\u074D", "\u07A5"], "\u07B1", ["\u07CA", "\u07EA"], ["\u0800", "\u0815"], ["\u0840", "\u0858"], ["\u08A0", "\u08B4"], ["\u0904", "\u0939"], "\u093D", "\u0950", ["\u0958", "\u0961"], ["\u0972", "\u0980"], ["\u0985", "\u098C"], ["\u098F", "\u0990"], ["\u0993", "\u09A8"], ["\u09AA", "\u09B0"], "\u09B2", ["\u09B6", "\u09B9"], "\u09BD", "\u09CE", ["\u09DC", "\u09DD"], ["\u09DF", "\u09E1"], ["\u09F0", "\u09F1"], ["\u0A05", "\u0A0A"], ["\u0A0F", "\u0A10"], ["\u0A13", "\u0A28"], ["\u0A2A", "\u0A30"], ["\u0A32", "\u0A33"], ["\u0A35", "\u0A36"], ["\u0A38", "\u0A39"], ["\u0A59", "\u0A5C"], "\u0A5E", ["\u0A72", "\u0A74"], ["\u0A85", "\u0A8D"], ["\u0A8F", "\u0A91"], ["\u0A93", "\u0AA8"], ["\u0AAA", "\u0AB0"], ["\u0AB2", "\u0AB3"], ["\u0AB5", "\u0AB9"], "\u0ABD", "\u0AD0", ["\u0AE0", "\u0AE1"], "\u0AF9", ["\u0B05", "\u0B0C"], ["\u0B0F", "\u0B10"], ["\u0B13", "\u0B28"], ["\u0B2A", "\u0B30"], ["\u0B32", "\u0B33"], ["\u0B35", "\u0B39"], "\u0B3D", ["\u0B5C", "\u0B5D"], ["\u0B5F", "\u0B61"], "\u0B71", "\u0B83", ["\u0B85", "\u0B8A"], ["\u0B8E", "\u0B90"], ["\u0B92", "\u0B95"], ["\u0B99", "\u0B9A"], "\u0B9C", ["\u0B9E", "\u0B9F"], ["\u0BA3", "\u0BA4"], ["\u0BA8", "\u0BAA"], ["\u0BAE", "\u0BB9"], "\u0BD0", ["\u0C05", "\u0C0C"], ["\u0C0E", "\u0C10"], ["\u0C12", "\u0C28"], ["\u0C2A", "\u0C39"], "\u0C3D", ["\u0C58", "\u0C5A"], ["\u0C60", "\u0C61"], ["\u0C85", "\u0C8C"], ["\u0C8E", "\u0C90"], ["\u0C92", "\u0CA8"], ["\u0CAA", "\u0CB3"], ["\u0CB5", "\u0CB9"], "\u0CBD", "\u0CDE", ["\u0CE0", "\u0CE1"], ["\u0CF1", "\u0CF2"], ["\u0D05", "\u0D0C"], ["\u0D0E", "\u0D10"], ["\u0D12", "\u0D3A"], "\u0D3D", "\u0D4E", ["\u0D5F", "\u0D61"], ["\u0D7A", "\u0D7F"], ["\u0D85", "\u0D96"], ["\u0D9A", "\u0DB1"], ["\u0DB3", "\u0DBB"], "\u0DBD", ["\u0DC0", "\u0DC6"], ["\u0E01", "\u0E30"], ["\u0E32", "\u0E33"], ["\u0E40", "\u0E45"], ["\u0E81", "\u0E82"], "\u0E84", ["\u0E87", "\u0E88"], "\u0E8A", "\u0E8D", ["\u0E94", "\u0E97"], ["\u0E99", "\u0E9F"], ["\u0EA1", "\u0EA3"], "\u0EA5", "\u0EA7", ["\u0EAA", "\u0EAB"], ["\u0EAD", "\u0EB0"], ["\u0EB2", "\u0EB3"], "\u0EBD", ["\u0EC0", "\u0EC4"], ["\u0EDC", "\u0EDF"], "\u0F00", ["\u0F40", "\u0F47"], ["\u0F49", "\u0F6C"], ["\u0F88", "\u0F8C"], ["\u1000", "\u102A"], "\u103F", ["\u1050", "\u1055"], ["\u105A", "\u105D"], "\u1061", ["\u1065", "\u1066"], ["\u106E", "\u1070"], ["\u1075", "\u1081"], "\u108E", ["\u10D0", "\u10FA"], ["\u10FD", "\u1248"], ["\u124A", "\u124D"], ["\u1250", "\u1256"], "\u1258", ["\u125A", "\u125D"], ["\u1260", "\u1288"], ["\u128A", "\u128D"], ["\u1290", "\u12B0"], ["\u12B2", "\u12B5"], ["\u12B8", "\u12BE"], "\u12C0", ["\u12C2", "\u12C5"], ["\u12C8", "\u12D6"], ["\u12D8", "\u1310"], ["\u1312", "\u1315"], ["\u1318", "\u135A"], ["\u1380", "\u138F"], ["\u1401", "\u166C"], ["\u166F", "\u167F"], ["\u1681", "\u169A"], ["\u16A0", "\u16EA"], ["\u16F1", "\u16F8"], ["\u1700", "\u170C"], ["\u170E", "\u1711"], ["\u1720", "\u1731"], ["\u1740", "\u1751"], ["\u1760", "\u176C"], ["\u176E", "\u1770"], ["\u1780", "\u17B3"], "\u17DC", ["\u1820", "\u1842"], ["\u1844", "\u1877"], ["\u1880", "\u18A8"], "\u18AA", ["\u18B0", "\u18F5"], ["\u1900", "\u191E"], ["\u1950", "\u196D"], ["\u1970", "\u1974"], ["\u1980", "\u19AB"], ["\u19B0", "\u19C9"], ["\u1A00", "\u1A16"], ["\u1A20", "\u1A54"], ["\u1B05", "\u1B33"], ["\u1B45", "\u1B4B"], ["\u1B83", "\u1BA0"], ["\u1BAE", "\u1BAF"], ["\u1BBA", "\u1BE5"], ["\u1C00", "\u1C23"], ["\u1C4D", "\u1C4F"], ["\u1C5A", "\u1C77"], ["\u1CE9", "\u1CEC"], ["\u1CEE", "\u1CF1"], ["\u1CF5", "\u1CF6"], ["\u2135", "\u2138"], ["\u2D30", "\u2D67"], ["\u2D80", "\u2D96"], ["\u2DA0", "\u2DA6"], ["\u2DA8", "\u2DAE"], ["\u2DB0", "\u2DB6"], ["\u2DB8", "\u2DBE"], ["\u2DC0", "\u2DC6"], ["\u2DC8", "\u2DCE"], ["\u2DD0", "\u2DD6"], ["\u2DD8", "\u2DDE"], "\u3006", "\u303C", ["\u3041", "\u3096"], "\u309F", ["\u30A1", "\u30FA"], "\u30FF", ["\u3105", "\u312D"], ["\u3131", "\u318E"], ["\u31A0", "\u31BA"], ["\u31F0", "\u31FF"], ["\u3400", "\u4DB5"], ["\u4E00", "\u9FD5"], ["\uA000", "\uA014"], ["\uA016", "\uA48C"], ["\uA4D0", "\uA4F7"], ["\uA500", "\uA60B"], ["\uA610", "\uA61F"], ["\uA62A", "\uA62B"], "\uA66E", ["\uA6A0", "\uA6E5"], "\uA78F", "\uA7F7", ["\uA7FB", "\uA801"], ["\uA803", "\uA805"], ["\uA807", "\uA80A"], ["\uA80C", "\uA822"], ["\uA840", "\uA873"], ["\uA882", "\uA8B3"], ["\uA8F2", "\uA8F7"], "\uA8FB", "\uA8FD", ["\uA90A", "\uA925"], ["\uA930", "\uA946"], ["\uA960", "\uA97C"], ["\uA984", "\uA9B2"], ["\uA9E0", "\uA9E4"], ["\uA9E7", "\uA9EF"], ["\uA9FA", "\uA9FE"], ["\uAA00", "\uAA28"], ["\uAA40", "\uAA42"], ["\uAA44", "\uAA4B"], ["\uAA60", "\uAA6F"], ["\uAA71", "\uAA76"], "\uAA7A", ["\uAA7E", "\uAAAF"], "\uAAB1", ["\uAAB5", "\uAAB6"], ["\uAAB9", "\uAABD"], "\uAAC0", "\uAAC2", ["\uAADB", "\uAADC"], ["\uAAE0", "\uAAEA"], "\uAAF2", ["\uAB01", "\uAB06"], ["\uAB09", "\uAB0E"], ["\uAB11", "\uAB16"], ["\uAB20", "\uAB26"], ["\uAB28", "\uAB2E"], ["\uABC0", "\uABE2"], ["\uAC00", "\uD7A3"], ["\uD7B0", "\uD7C6"], ["\uD7CB", "\uD7FB"], ["\uF900", "\uFA6D"], ["\uFA70", "\uFAD9"], "\uFB1D", ["\uFB1F", "\uFB28"], ["\uFB2A", "\uFB36"], ["\uFB38", "\uFB3C"], "\uFB3E", ["\uFB40", "\uFB41"], ["\uFB43", "\uFB44"], ["\uFB46", "\uFBB1"], ["\uFBD3", "\uFD3D"], ["\uFD50", "\uFD8F"], ["\uFD92", "\uFDC7"], ["\uFDF0", "\uFDFB"], ["\uFE70", "\uFE74"], ["\uFE76", "\uFEFC"], ["\uFF66", "\uFF6F"], ["\uFF71", "\uFF9D"], ["\uFFA0", "\uFFBE"], ["\uFFC2", "\uFFC7"], ["\uFFCA", "\uFFCF"], ["\uFFD2", "\uFFD7"], ["\uFFDA", "\uFFDC"]], false, false); - var peg$e67 = peg$classExpectation(["\u01C5", "\u01C8", "\u01CB", "\u01F2", ["\u1F88", "\u1F8F"], ["\u1F98", "\u1F9F"], ["\u1FA8", "\u1FAF"], "\u1FBC", "\u1FCC", "\u1FFC"], false, false); - var peg$e68 = peg$classExpectation([["A", "Z"], ["\xC0", "\xD6"], ["\xD8", "\xDE"], "\u0100", "\u0102", "\u0104", "\u0106", "\u0108", "\u010A", "\u010C", "\u010E", "\u0110", "\u0112", "\u0114", "\u0116", "\u0118", "\u011A", "\u011C", "\u011E", "\u0120", "\u0122", "\u0124", "\u0126", "\u0128", "\u012A", "\u012C", "\u012E", "\u0130", "\u0132", "\u0134", "\u0136", "\u0139", "\u013B", "\u013D", "\u013F", "\u0141", "\u0143", "\u0145", "\u0147", "\u014A", "\u014C", "\u014E", "\u0150", "\u0152", "\u0154", "\u0156", "\u0158", "\u015A", "\u015C", "\u015E", "\u0160", "\u0162", "\u0164", "\u0166", "\u0168", "\u016A", "\u016C", "\u016E", "\u0170", "\u0172", "\u0174", "\u0176", ["\u0178", "\u0179"], "\u017B", "\u017D", ["\u0181", "\u0182"], "\u0184", ["\u0186", "\u0187"], ["\u0189", "\u018B"], ["\u018E", "\u0191"], ["\u0193", "\u0194"], ["\u0196", "\u0198"], ["\u019C", "\u019D"], ["\u019F", "\u01A0"], "\u01A2", "\u01A4", ["\u01A6", "\u01A7"], "\u01A9", "\u01AC", ["\u01AE", "\u01AF"], ["\u01B1", "\u01B3"], "\u01B5", ["\u01B7", "\u01B8"], "\u01BC", "\u01C4", "\u01C7", "\u01CA", "\u01CD", "\u01CF", "\u01D1", "\u01D3", "\u01D5", "\u01D7", "\u01D9", "\u01DB", "\u01DE", "\u01E0", "\u01E2", "\u01E4", "\u01E6", "\u01E8", "\u01EA", "\u01EC", "\u01EE", "\u01F1", "\u01F4", ["\u01F6", "\u01F8"], "\u01FA", "\u01FC", "\u01FE", "\u0200", "\u0202", "\u0204", "\u0206", "\u0208", "\u020A", "\u020C", "\u020E", "\u0210", "\u0212", "\u0214", "\u0216", "\u0218", "\u021A", "\u021C", "\u021E", "\u0220", "\u0222", "\u0224", "\u0226", "\u0228", "\u022A", "\u022C", "\u022E", "\u0230", "\u0232", ["\u023A", "\u023B"], ["\u023D", "\u023E"], "\u0241", ["\u0243", "\u0246"], "\u0248", "\u024A", "\u024C", "\u024E", "\u0370", "\u0372", "\u0376", "\u037F", "\u0386", ["\u0388", "\u038A"], "\u038C", ["\u038E", "\u038F"], ["\u0391", "\u03A1"], ["\u03A3", "\u03AB"], "\u03CF", ["\u03D2", "\u03D4"], "\u03D8", "\u03DA", "\u03DC", "\u03DE", "\u03E0", "\u03E2", "\u03E4", "\u03E6", "\u03E8", "\u03EA", "\u03EC", "\u03EE", "\u03F4", "\u03F7", ["\u03F9", "\u03FA"], ["\u03FD", "\u042F"], "\u0460", "\u0462", "\u0464", "\u0466", "\u0468", "\u046A", "\u046C", "\u046E", "\u0470", "\u0472", "\u0474", "\u0476", "\u0478", "\u047A", "\u047C", "\u047E", "\u0480", "\u048A", "\u048C", "\u048E", "\u0490", "\u0492", "\u0494", "\u0496", "\u0498", "\u049A", "\u049C", "\u049E", "\u04A0", "\u04A2", "\u04A4", "\u04A6", "\u04A8", "\u04AA", "\u04AC", "\u04AE", "\u04B0", "\u04B2", "\u04B4", "\u04B6", "\u04B8", "\u04BA", "\u04BC", "\u04BE", ["\u04C0", "\u04C1"], "\u04C3", "\u04C5", "\u04C7", "\u04C9", "\u04CB", "\u04CD", "\u04D0", "\u04D2", "\u04D4", "\u04D6", "\u04D8", "\u04DA", "\u04DC", "\u04DE", "\u04E0", "\u04E2", "\u04E4", "\u04E6", "\u04E8", "\u04EA", "\u04EC", "\u04EE", "\u04F0", "\u04F2", "\u04F4", "\u04F6", "\u04F8", "\u04FA", "\u04FC", "\u04FE", "\u0500", "\u0502", "\u0504", "\u0506", "\u0508", "\u050A", "\u050C", "\u050E", "\u0510", "\u0512", "\u0514", "\u0516", "\u0518", "\u051A", "\u051C", "\u051E", "\u0520", "\u0522", "\u0524", "\u0526", "\u0528", "\u052A", "\u052C", "\u052E", ["\u0531", "\u0556"], ["\u10A0", "\u10C5"], "\u10C7", "\u10CD", ["\u13A0", "\u13F5"], "\u1E00", "\u1E02", "\u1E04", "\u1E06", "\u1E08", "\u1E0A", "\u1E0C", "\u1E0E", "\u1E10", "\u1E12", "\u1E14", "\u1E16", "\u1E18", "\u1E1A", "\u1E1C", "\u1E1E", "\u1E20", "\u1E22", "\u1E24", "\u1E26", "\u1E28", "\u1E2A", "\u1E2C", "\u1E2E", "\u1E30", "\u1E32", "\u1E34", "\u1E36", "\u1E38", "\u1E3A", "\u1E3C", "\u1E3E", "\u1E40", "\u1E42", "\u1E44", "\u1E46", "\u1E48", "\u1E4A", "\u1E4C", "\u1E4E", "\u1E50", "\u1E52", "\u1E54", "\u1E56", "\u1E58", "\u1E5A", "\u1E5C", "\u1E5E", "\u1E60", "\u1E62", "\u1E64", "\u1E66", "\u1E68", "\u1E6A", "\u1E6C", "\u1E6E", "\u1E70", "\u1E72", "\u1E74", "\u1E76", "\u1E78", "\u1E7A", "\u1E7C", "\u1E7E", "\u1E80", "\u1E82", "\u1E84", "\u1E86", "\u1E88", "\u1E8A", "\u1E8C", "\u1E8E", "\u1E90", "\u1E92", "\u1E94", "\u1E9E", "\u1EA0", "\u1EA2", "\u1EA4", "\u1EA6", "\u1EA8", "\u1EAA", "\u1EAC", "\u1EAE", "\u1EB0", "\u1EB2", "\u1EB4", "\u1EB6", "\u1EB8", "\u1EBA", "\u1EBC", "\u1EBE", "\u1EC0", "\u1EC2", "\u1EC4", "\u1EC6", "\u1EC8", "\u1ECA", "\u1ECC", "\u1ECE", "\u1ED0", "\u1ED2", "\u1ED4", "\u1ED6", "\u1ED8", "\u1EDA", "\u1EDC", "\u1EDE", "\u1EE0", "\u1EE2", "\u1EE4", "\u1EE6", "\u1EE8", "\u1EEA", "\u1EEC", "\u1EEE", "\u1EF0", "\u1EF2", "\u1EF4", "\u1EF6", "\u1EF8", "\u1EFA", "\u1EFC", "\u1EFE", ["\u1F08", "\u1F0F"], ["\u1F18", "\u1F1D"], ["\u1F28", "\u1F2F"], ["\u1F38", "\u1F3F"], ["\u1F48", "\u1F4D"], "\u1F59", "\u1F5B", "\u1F5D", "\u1F5F", ["\u1F68", "\u1F6F"], ["\u1FB8", "\u1FBB"], ["\u1FC8", "\u1FCB"], ["\u1FD8", "\u1FDB"], ["\u1FE8", "\u1FEC"], ["\u1FF8", "\u1FFB"], "\u2102", "\u2107", ["\u210B", "\u210D"], ["\u2110", "\u2112"], "\u2115", ["\u2119", "\u211D"], "\u2124", "\u2126", "\u2128", ["\u212A", "\u212D"], ["\u2130", "\u2133"], ["\u213E", "\u213F"], "\u2145", "\u2183", ["\u2C00", "\u2C2E"], "\u2C60", ["\u2C62", "\u2C64"], "\u2C67", "\u2C69", "\u2C6B", ["\u2C6D", "\u2C70"], "\u2C72", "\u2C75", ["\u2C7E", "\u2C80"], "\u2C82", "\u2C84", "\u2C86", "\u2C88", "\u2C8A", "\u2C8C", "\u2C8E", "\u2C90", "\u2C92", "\u2C94", "\u2C96", "\u2C98", "\u2C9A", "\u2C9C", "\u2C9E", "\u2CA0", "\u2CA2", "\u2CA4", "\u2CA6", "\u2CA8", "\u2CAA", "\u2CAC", "\u2CAE", "\u2CB0", "\u2CB2", "\u2CB4", "\u2CB6", "\u2CB8", "\u2CBA", "\u2CBC", "\u2CBE", "\u2CC0", "\u2CC2", "\u2CC4", "\u2CC6", "\u2CC8", "\u2CCA", "\u2CCC", "\u2CCE", "\u2CD0", "\u2CD2", "\u2CD4", "\u2CD6", "\u2CD8", "\u2CDA", "\u2CDC", "\u2CDE", "\u2CE0", "\u2CE2", "\u2CEB", "\u2CED", "\u2CF2", "\uA640", "\uA642", "\uA644", "\uA646", "\uA648", "\uA64A", "\uA64C", "\uA64E", "\uA650", "\uA652", "\uA654", "\uA656", "\uA658", "\uA65A", "\uA65C", "\uA65E", "\uA660", "\uA662", "\uA664", "\uA666", "\uA668", "\uA66A", "\uA66C", "\uA680", "\uA682", "\uA684", "\uA686", "\uA688", "\uA68A", "\uA68C", "\uA68E", "\uA690", "\uA692", "\uA694", "\uA696", "\uA698", "\uA69A", "\uA722", "\uA724", "\uA726", "\uA728", "\uA72A", "\uA72C", "\uA72E", "\uA732", "\uA734", "\uA736", "\uA738", "\uA73A", "\uA73C", "\uA73E", "\uA740", "\uA742", "\uA744", "\uA746", "\uA748", "\uA74A", "\uA74C", "\uA74E", "\uA750", "\uA752", "\uA754", "\uA756", "\uA758", "\uA75A", "\uA75C", "\uA75E", "\uA760", "\uA762", "\uA764", "\uA766", "\uA768", "\uA76A", "\uA76C", "\uA76E", "\uA779", "\uA77B", ["\uA77D", "\uA77E"], "\uA780", "\uA782", "\uA784", "\uA786", "\uA78B", "\uA78D", "\uA790", "\uA792", "\uA796", "\uA798", "\uA79A", "\uA79C", "\uA79E", "\uA7A0", "\uA7A2", "\uA7A4", "\uA7A6", "\uA7A8", ["\uA7AA", "\uA7AD"], ["\uA7B0", "\uA7B4"], "\uA7B6", ["\uFF21", "\uFF3A"]], false, false); - var peg$e69 = peg$classExpectation(["\u0903", "\u093B", ["\u093E", "\u0940"], ["\u0949", "\u094C"], ["\u094E", "\u094F"], ["\u0982", "\u0983"], ["\u09BE", "\u09C0"], ["\u09C7", "\u09C8"], ["\u09CB", "\u09CC"], "\u09D7", "\u0A03", ["\u0A3E", "\u0A40"], "\u0A83", ["\u0ABE", "\u0AC0"], "\u0AC9", ["\u0ACB", "\u0ACC"], ["\u0B02", "\u0B03"], "\u0B3E", "\u0B40", ["\u0B47", "\u0B48"], ["\u0B4B", "\u0B4C"], "\u0B57", ["\u0BBE", "\u0BBF"], ["\u0BC1", "\u0BC2"], ["\u0BC6", "\u0BC8"], ["\u0BCA", "\u0BCC"], "\u0BD7", ["\u0C01", "\u0C03"], ["\u0C41", "\u0C44"], ["\u0C82", "\u0C83"], "\u0CBE", ["\u0CC0", "\u0CC4"], ["\u0CC7", "\u0CC8"], ["\u0CCA", "\u0CCB"], ["\u0CD5", "\u0CD6"], ["\u0D02", "\u0D03"], ["\u0D3E", "\u0D40"], ["\u0D46", "\u0D48"], ["\u0D4A", "\u0D4C"], "\u0D57", ["\u0D82", "\u0D83"], ["\u0DCF", "\u0DD1"], ["\u0DD8", "\u0DDF"], ["\u0DF2", "\u0DF3"], ["\u0F3E", "\u0F3F"], "\u0F7F", ["\u102B", "\u102C"], "\u1031", "\u1038", ["\u103B", "\u103C"], ["\u1056", "\u1057"], ["\u1062", "\u1064"], ["\u1067", "\u106D"], ["\u1083", "\u1084"], ["\u1087", "\u108C"], "\u108F", ["\u109A", "\u109C"], "\u17B6", ["\u17BE", "\u17C5"], ["\u17C7", "\u17C8"], ["\u1923", "\u1926"], ["\u1929", "\u192B"], ["\u1930", "\u1931"], ["\u1933", "\u1938"], ["\u1A19", "\u1A1A"], "\u1A55", "\u1A57", "\u1A61", ["\u1A63", "\u1A64"], ["\u1A6D", "\u1A72"], "\u1B04", "\u1B35", "\u1B3B", ["\u1B3D", "\u1B41"], ["\u1B43", "\u1B44"], "\u1B82", "\u1BA1", ["\u1BA6", "\u1BA7"], "\u1BAA", "\u1BE7", ["\u1BEA", "\u1BEC"], "\u1BEE", ["\u1BF2", "\u1BF3"], ["\u1C24", "\u1C2B"], ["\u1C34", "\u1C35"], "\u1CE1", ["\u1CF2", "\u1CF3"], ["\u302E", "\u302F"], ["\uA823", "\uA824"], "\uA827", ["\uA880", "\uA881"], ["\uA8B4", "\uA8C3"], ["\uA952", "\uA953"], "\uA983", ["\uA9B4", "\uA9B5"], ["\uA9BA", "\uA9BB"], ["\uA9BD", "\uA9C0"], ["\uAA2F", "\uAA30"], ["\uAA33", "\uAA34"], "\uAA4D", "\uAA7B", "\uAA7D", "\uAAEB", ["\uAAEE", "\uAAEF"], "\uAAF5", ["\uABE3", "\uABE4"], ["\uABE6", "\uABE7"], ["\uABE9", "\uABEA"], "\uABEC"], false, false); - var peg$e70 = peg$classExpectation([["\u0300", "\u036F"], ["\u0483", "\u0487"], ["\u0591", "\u05BD"], "\u05BF", ["\u05C1", "\u05C2"], ["\u05C4", "\u05C5"], "\u05C7", ["\u0610", "\u061A"], ["\u064B", "\u065F"], "\u0670", ["\u06D6", "\u06DC"], ["\u06DF", "\u06E4"], ["\u06E7", "\u06E8"], ["\u06EA", "\u06ED"], "\u0711", ["\u0730", "\u074A"], ["\u07A6", "\u07B0"], ["\u07EB", "\u07F3"], ["\u0816", "\u0819"], ["\u081B", "\u0823"], ["\u0825", "\u0827"], ["\u0829", "\u082D"], ["\u0859", "\u085B"], ["\u08E3", "\u0902"], "\u093A", "\u093C", ["\u0941", "\u0948"], "\u094D", ["\u0951", "\u0957"], ["\u0962", "\u0963"], "\u0981", "\u09BC", ["\u09C1", "\u09C4"], "\u09CD", ["\u09E2", "\u09E3"], ["\u0A01", "\u0A02"], "\u0A3C", ["\u0A41", "\u0A42"], ["\u0A47", "\u0A48"], ["\u0A4B", "\u0A4D"], "\u0A51", ["\u0A70", "\u0A71"], "\u0A75", ["\u0A81", "\u0A82"], "\u0ABC", ["\u0AC1", "\u0AC5"], ["\u0AC7", "\u0AC8"], "\u0ACD", ["\u0AE2", "\u0AE3"], "\u0B01", "\u0B3C", "\u0B3F", ["\u0B41", "\u0B44"], "\u0B4D", "\u0B56", ["\u0B62", "\u0B63"], "\u0B82", "\u0BC0", "\u0BCD", "\u0C00", ["\u0C3E", "\u0C40"], ["\u0C46", "\u0C48"], ["\u0C4A", "\u0C4D"], ["\u0C55", "\u0C56"], ["\u0C62", "\u0C63"], "\u0C81", "\u0CBC", "\u0CBF", "\u0CC6", ["\u0CCC", "\u0CCD"], ["\u0CE2", "\u0CE3"], "\u0D01", ["\u0D41", "\u0D44"], "\u0D4D", ["\u0D62", "\u0D63"], "\u0DCA", ["\u0DD2", "\u0DD4"], "\u0DD6", "\u0E31", ["\u0E34", "\u0E3A"], ["\u0E47", "\u0E4E"], "\u0EB1", ["\u0EB4", "\u0EB9"], ["\u0EBB", "\u0EBC"], ["\u0EC8", "\u0ECD"], ["\u0F18", "\u0F19"], "\u0F35", "\u0F37", "\u0F39", ["\u0F71", "\u0F7E"], ["\u0F80", "\u0F84"], ["\u0F86", "\u0F87"], ["\u0F8D", "\u0F97"], ["\u0F99", "\u0FBC"], "\u0FC6", ["\u102D", "\u1030"], ["\u1032", "\u1037"], ["\u1039", "\u103A"], ["\u103D", "\u103E"], ["\u1058", "\u1059"], ["\u105E", "\u1060"], ["\u1071", "\u1074"], "\u1082", ["\u1085", "\u1086"], "\u108D", "\u109D", ["\u135D", "\u135F"], ["\u1712", "\u1714"], ["\u1732", "\u1734"], ["\u1752", "\u1753"], ["\u1772", "\u1773"], ["\u17B4", "\u17B5"], ["\u17B7", "\u17BD"], "\u17C6", ["\u17C9", "\u17D3"], "\u17DD", ["\u180B", "\u180D"], "\u18A9", ["\u1920", "\u1922"], ["\u1927", "\u1928"], "\u1932", ["\u1939", "\u193B"], ["\u1A17", "\u1A18"], "\u1A1B", "\u1A56", ["\u1A58", "\u1A5E"], "\u1A60", "\u1A62", ["\u1A65", "\u1A6C"], ["\u1A73", "\u1A7C"], "\u1A7F", ["\u1AB0", "\u1ABD"], ["\u1B00", "\u1B03"], "\u1B34", ["\u1B36", "\u1B3A"], "\u1B3C", "\u1B42", ["\u1B6B", "\u1B73"], ["\u1B80", "\u1B81"], ["\u1BA2", "\u1BA5"], ["\u1BA8", "\u1BA9"], ["\u1BAB", "\u1BAD"], "\u1BE6", ["\u1BE8", "\u1BE9"], "\u1BED", ["\u1BEF", "\u1BF1"], ["\u1C2C", "\u1C33"], ["\u1C36", "\u1C37"], ["\u1CD0", "\u1CD2"], ["\u1CD4", "\u1CE0"], ["\u1CE2", "\u1CE8"], "\u1CED", "\u1CF4", ["\u1CF8", "\u1CF9"], ["\u1DC0", "\u1DF5"], ["\u1DFC", "\u1DFF"], ["\u20D0", "\u20DC"], "\u20E1", ["\u20E5", "\u20F0"], ["\u2CEF", "\u2CF1"], "\u2D7F", ["\u2DE0", "\u2DFF"], ["\u302A", "\u302D"], ["\u3099", "\u309A"], "\uA66F", ["\uA674", "\uA67D"], ["\uA69E", "\uA69F"], ["\uA6F0", "\uA6F1"], "\uA802", "\uA806", "\uA80B", ["\uA825", "\uA826"], "\uA8C4", ["\uA8E0", "\uA8F1"], ["\uA926", "\uA92D"], ["\uA947", "\uA951"], ["\uA980", "\uA982"], "\uA9B3", ["\uA9B6", "\uA9B9"], "\uA9BC", "\uA9E5", ["\uAA29", "\uAA2E"], ["\uAA31", "\uAA32"], ["\uAA35", "\uAA36"], "\uAA43", "\uAA4C", "\uAA7C", "\uAAB0", ["\uAAB2", "\uAAB4"], ["\uAAB7", "\uAAB8"], ["\uAABE", "\uAABF"], "\uAAC1", ["\uAAEC", "\uAAED"], "\uAAF6", "\uABE5", "\uABE8", "\uABED", "\uFB1E", ["\uFE00", "\uFE0F"], ["\uFE20", "\uFE2F"]], false, false); - var peg$e71 = peg$classExpectation([["0", "9"], ["\u0660", "\u0669"], ["\u06F0", "\u06F9"], ["\u07C0", "\u07C9"], ["\u0966", "\u096F"], ["\u09E6", "\u09EF"], ["\u0A66", "\u0A6F"], ["\u0AE6", "\u0AEF"], ["\u0B66", "\u0B6F"], ["\u0BE6", "\u0BEF"], ["\u0C66", "\u0C6F"], ["\u0CE6", "\u0CEF"], ["\u0D66", "\u0D6F"], ["\u0DE6", "\u0DEF"], ["\u0E50", "\u0E59"], ["\u0ED0", "\u0ED9"], ["\u0F20", "\u0F29"], ["\u1040", "\u1049"], ["\u1090", "\u1099"], ["\u17E0", "\u17E9"], ["\u1810", "\u1819"], ["\u1946", "\u194F"], ["\u19D0", "\u19D9"], ["\u1A80", "\u1A89"], ["\u1A90", "\u1A99"], ["\u1B50", "\u1B59"], ["\u1BB0", "\u1BB9"], ["\u1C40", "\u1C49"], ["\u1C50", "\u1C59"], ["\uA620", "\uA629"], ["\uA8D0", "\uA8D9"], ["\uA900", "\uA909"], ["\uA9D0", "\uA9D9"], ["\uA9F0", "\uA9F9"], ["\uAA50", "\uAA59"], ["\uABF0", "\uABF9"], ["\uFF10", "\uFF19"]], false, false); - var peg$e72 = peg$classExpectation([["\u16EE", "\u16F0"], ["\u2160", "\u2182"], ["\u2185", "\u2188"], "\u3007", ["\u3021", "\u3029"], ["\u3038", "\u303A"], ["\uA6E6", "\uA6EF"]], false, false); - var peg$e73 = peg$classExpectation(["_", ["\u203F", "\u2040"], "\u2054", ["\uFE33", "\uFE34"], ["\uFE4D", "\uFE4F"], "\uFF3F"], false, false); - var peg$e74 = peg$classExpectation([" ", "\xA0", "\u1680", ["\u2000", "\u200A"], "\u202F", "\u205F", "\u3000"], false, false); - var peg$e75 = peg$literalExpectation(";", 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$anyExpectation(); + var peg$e18 = peg$otherExpectation("whitespace"); + var peg$e19 = peg$literalExpectation("\t", false); + var peg$e20 = peg$literalExpectation("\v", false); + var peg$e21 = peg$literalExpectation("\f", false); + var peg$e22 = peg$literalExpectation(" ", false); + var peg$e23 = peg$literalExpectation("\xA0", false); + var peg$e24 = peg$literalExpectation("\uFEFF", false); + var peg$e25 = peg$classExpectation(["\n", "\r", "\u2028", "\u2029"], false, false); + var peg$e26 = peg$otherExpectation("end of line"); + var peg$e27 = peg$literalExpectation("\n", false); + var peg$e28 = peg$literalExpectation("\r\n", false); + var peg$e29 = peg$literalExpectation("\r", false); + var peg$e30 = peg$literalExpectation("\u2028", false); + var peg$e31 = peg$literalExpectation("\u2029", false); + var peg$e32 = peg$otherExpectation("comment"); + var peg$e33 = peg$literalExpectation("/*", false); + var peg$e34 = peg$literalExpectation("*/", false); + var peg$e35 = peg$literalExpectation("//", false); + var peg$e36 = peg$otherExpectation("identifier"); + var peg$e37 = peg$literalExpectation("_", false); + var peg$e38 = peg$literalExpectation("\\", false); + var peg$e39 = peg$literalExpectation("\u200C", false); + var peg$e40 = peg$literalExpectation("\u200D", false); + var peg$e41 = peg$otherExpectation("literal"); + var peg$e42 = peg$literalExpectation("i", false); + var peg$e43 = peg$otherExpectation("string"); + var peg$e44 = peg$literalExpectation("\"", false); + var peg$e45 = peg$literalExpectation("'", false); + var peg$e46 = peg$otherExpectation("character class"); + var peg$e47 = peg$literalExpectation("[", false); + var peg$e48 = peg$literalExpectation("^", false); + var peg$e49 = peg$literalExpectation("]", false); + var peg$e50 = peg$literalExpectation("-", false); + var peg$e51 = peg$literalExpectation("0", false); + var peg$e52 = peg$literalExpectation("b", false); + var peg$e53 = peg$literalExpectation("f", false); + var peg$e54 = peg$literalExpectation("n", false); + var peg$e55 = peg$literalExpectation("r", false); + var peg$e56 = peg$literalExpectation("t", false); + var peg$e57 = peg$literalExpectation("v", false); + var peg$e58 = peg$literalExpectation("x", false); + var peg$e59 = peg$literalExpectation("u", false); + var peg$e60 = peg$classExpectation([["0", "9"]], false, false); + var peg$e61 = peg$classExpectation([["0", "9"], ["a", "f"]], false, true); + var peg$e62 = peg$literalExpectation(".", false); + var peg$e63 = peg$otherExpectation("code block"); + var peg$e64 = peg$classExpectation(["{", "}"], false, false); + var peg$e65 = peg$classExpectation([["a", "z"], "\xB5", ["\xDF", "\xF6"], ["\xF8", "\xFF"], "\u0101", "\u0103", "\u0105", "\u0107", "\u0109", "\u010B", "\u010D", "\u010F", "\u0111", "\u0113", "\u0115", "\u0117", "\u0119", "\u011B", "\u011D", "\u011F", "\u0121", "\u0123", "\u0125", "\u0127", "\u0129", "\u012B", "\u012D", "\u012F", "\u0131", "\u0133", "\u0135", ["\u0137", "\u0138"], "\u013A", "\u013C", "\u013E", "\u0140", "\u0142", "\u0144", "\u0146", ["\u0148", "\u0149"], "\u014B", "\u014D", "\u014F", "\u0151", "\u0153", "\u0155", "\u0157", "\u0159", "\u015B", "\u015D", "\u015F", "\u0161", "\u0163", "\u0165", "\u0167", "\u0169", "\u016B", "\u016D", "\u016F", "\u0171", "\u0173", "\u0175", "\u0177", "\u017A", "\u017C", ["\u017E", "\u0180"], "\u0183", "\u0185", "\u0188", ["\u018C", "\u018D"], "\u0192", "\u0195", ["\u0199", "\u019B"], "\u019E", "\u01A1", "\u01A3", "\u01A5", "\u01A8", ["\u01AA", "\u01AB"], "\u01AD", "\u01B0", "\u01B4", "\u01B6", ["\u01B9", "\u01BA"], ["\u01BD", "\u01BF"], "\u01C6", "\u01C9", "\u01CC", "\u01CE", "\u01D0", "\u01D2", "\u01D4", "\u01D6", "\u01D8", "\u01DA", ["\u01DC", "\u01DD"], "\u01DF", "\u01E1", "\u01E3", "\u01E5", "\u01E7", "\u01E9", "\u01EB", "\u01ED", ["\u01EF", "\u01F0"], "\u01F3", "\u01F5", "\u01F9", "\u01FB", "\u01FD", "\u01FF", "\u0201", "\u0203", "\u0205", "\u0207", "\u0209", "\u020B", "\u020D", "\u020F", "\u0211", "\u0213", "\u0215", "\u0217", "\u0219", "\u021B", "\u021D", "\u021F", "\u0221", "\u0223", "\u0225", "\u0227", "\u0229", "\u022B", "\u022D", "\u022F", "\u0231", ["\u0233", "\u0239"], "\u023C", ["\u023F", "\u0240"], "\u0242", "\u0247", "\u0249", "\u024B", "\u024D", ["\u024F", "\u0293"], ["\u0295", "\u02AF"], "\u0371", "\u0373", "\u0377", ["\u037B", "\u037D"], "\u0390", ["\u03AC", "\u03CE"], ["\u03D0", "\u03D1"], ["\u03D5", "\u03D7"], "\u03D9", "\u03DB", "\u03DD", "\u03DF", "\u03E1", "\u03E3", "\u03E5", "\u03E7", "\u03E9", "\u03EB", "\u03ED", ["\u03EF", "\u03F3"], "\u03F5", "\u03F8", ["\u03FB", "\u03FC"], ["\u0430", "\u045F"], "\u0461", "\u0463", "\u0465", "\u0467", "\u0469", "\u046B", "\u046D", "\u046F", "\u0471", "\u0473", "\u0475", "\u0477", "\u0479", "\u047B", "\u047D", "\u047F", "\u0481", "\u048B", "\u048D", "\u048F", "\u0491", "\u0493", "\u0495", "\u0497", "\u0499", "\u049B", "\u049D", "\u049F", "\u04A1", "\u04A3", "\u04A5", "\u04A7", "\u04A9", "\u04AB", "\u04AD", "\u04AF", "\u04B1", "\u04B3", "\u04B5", "\u04B7", "\u04B9", "\u04BB", "\u04BD", "\u04BF", "\u04C2", "\u04C4", "\u04C6", "\u04C8", "\u04CA", "\u04CC", ["\u04CE", "\u04CF"], "\u04D1", "\u04D3", "\u04D5", "\u04D7", "\u04D9", "\u04DB", "\u04DD", "\u04DF", "\u04E1", "\u04E3", "\u04E5", "\u04E7", "\u04E9", "\u04EB", "\u04ED", "\u04EF", "\u04F1", "\u04F3", "\u04F5", "\u04F7", "\u04F9", "\u04FB", "\u04FD", "\u04FF", "\u0501", "\u0503", "\u0505", "\u0507", "\u0509", "\u050B", "\u050D", "\u050F", "\u0511", "\u0513", "\u0515", "\u0517", "\u0519", "\u051B", "\u051D", "\u051F", "\u0521", "\u0523", "\u0525", "\u0527", "\u0529", "\u052B", "\u052D", "\u052F", ["\u0561", "\u0587"], ["\u13F8", "\u13FD"], ["\u1D00", "\u1D2B"], ["\u1D6B", "\u1D77"], ["\u1D79", "\u1D9A"], "\u1E01", "\u1E03", "\u1E05", "\u1E07", "\u1E09", "\u1E0B", "\u1E0D", "\u1E0F", "\u1E11", "\u1E13", "\u1E15", "\u1E17", "\u1E19", "\u1E1B", "\u1E1D", "\u1E1F", "\u1E21", "\u1E23", "\u1E25", "\u1E27", "\u1E29", "\u1E2B", "\u1E2D", "\u1E2F", "\u1E31", "\u1E33", "\u1E35", "\u1E37", "\u1E39", "\u1E3B", "\u1E3D", "\u1E3F", "\u1E41", "\u1E43", "\u1E45", "\u1E47", "\u1E49", "\u1E4B", "\u1E4D", "\u1E4F", "\u1E51", "\u1E53", "\u1E55", "\u1E57", "\u1E59", "\u1E5B", "\u1E5D", "\u1E5F", "\u1E61", "\u1E63", "\u1E65", "\u1E67", "\u1E69", "\u1E6B", "\u1E6D", "\u1E6F", "\u1E71", "\u1E73", "\u1E75", "\u1E77", "\u1E79", "\u1E7B", "\u1E7D", "\u1E7F", "\u1E81", "\u1E83", "\u1E85", "\u1E87", "\u1E89", "\u1E8B", "\u1E8D", "\u1E8F", "\u1E91", "\u1E93", ["\u1E95", "\u1E9D"], "\u1E9F", "\u1EA1", "\u1EA3", "\u1EA5", "\u1EA7", "\u1EA9", "\u1EAB", "\u1EAD", "\u1EAF", "\u1EB1", "\u1EB3", "\u1EB5", "\u1EB7", "\u1EB9", "\u1EBB", "\u1EBD", "\u1EBF", "\u1EC1", "\u1EC3", "\u1EC5", "\u1EC7", "\u1EC9", "\u1ECB", "\u1ECD", "\u1ECF", "\u1ED1", "\u1ED3", "\u1ED5", "\u1ED7", "\u1ED9", "\u1EDB", "\u1EDD", "\u1EDF", "\u1EE1", "\u1EE3", "\u1EE5", "\u1EE7", "\u1EE9", "\u1EEB", "\u1EED", "\u1EEF", "\u1EF1", "\u1EF3", "\u1EF5", "\u1EF7", "\u1EF9", "\u1EFB", "\u1EFD", ["\u1EFF", "\u1F07"], ["\u1F10", "\u1F15"], ["\u1F20", "\u1F27"], ["\u1F30", "\u1F37"], ["\u1F40", "\u1F45"], ["\u1F50", "\u1F57"], ["\u1F60", "\u1F67"], ["\u1F70", "\u1F7D"], ["\u1F80", "\u1F87"], ["\u1F90", "\u1F97"], ["\u1FA0", "\u1FA7"], ["\u1FB0", "\u1FB4"], ["\u1FB6", "\u1FB7"], "\u1FBE", ["\u1FC2", "\u1FC4"], ["\u1FC6", "\u1FC7"], ["\u1FD0", "\u1FD3"], ["\u1FD6", "\u1FD7"], ["\u1FE0", "\u1FE7"], ["\u1FF2", "\u1FF4"], ["\u1FF6", "\u1FF7"], "\u210A", ["\u210E", "\u210F"], "\u2113", "\u212F", "\u2134", "\u2139", ["\u213C", "\u213D"], ["\u2146", "\u2149"], "\u214E", "\u2184", ["\u2C30", "\u2C5E"], "\u2C61", ["\u2C65", "\u2C66"], "\u2C68", "\u2C6A", "\u2C6C", "\u2C71", ["\u2C73", "\u2C74"], ["\u2C76", "\u2C7B"], "\u2C81", "\u2C83", "\u2C85", "\u2C87", "\u2C89", "\u2C8B", "\u2C8D", "\u2C8F", "\u2C91", "\u2C93", "\u2C95", "\u2C97", "\u2C99", "\u2C9B", "\u2C9D", "\u2C9F", "\u2CA1", "\u2CA3", "\u2CA5", "\u2CA7", "\u2CA9", "\u2CAB", "\u2CAD", "\u2CAF", "\u2CB1", "\u2CB3", "\u2CB5", "\u2CB7", "\u2CB9", "\u2CBB", "\u2CBD", "\u2CBF", "\u2CC1", "\u2CC3", "\u2CC5", "\u2CC7", "\u2CC9", "\u2CCB", "\u2CCD", "\u2CCF", "\u2CD1", "\u2CD3", "\u2CD5", "\u2CD7", "\u2CD9", "\u2CDB", "\u2CDD", "\u2CDF", "\u2CE1", ["\u2CE3", "\u2CE4"], "\u2CEC", "\u2CEE", "\u2CF3", ["\u2D00", "\u2D25"], "\u2D27", "\u2D2D", "\uA641", "\uA643", "\uA645", "\uA647", "\uA649", "\uA64B", "\uA64D", "\uA64F", "\uA651", "\uA653", "\uA655", "\uA657", "\uA659", "\uA65B", "\uA65D", "\uA65F", "\uA661", "\uA663", "\uA665", "\uA667", "\uA669", "\uA66B", "\uA66D", "\uA681", "\uA683", "\uA685", "\uA687", "\uA689", "\uA68B", "\uA68D", "\uA68F", "\uA691", "\uA693", "\uA695", "\uA697", "\uA699", "\uA69B", "\uA723", "\uA725", "\uA727", "\uA729", "\uA72B", "\uA72D", ["\uA72F", "\uA731"], "\uA733", "\uA735", "\uA737", "\uA739", "\uA73B", "\uA73D", "\uA73F", "\uA741", "\uA743", "\uA745", "\uA747", "\uA749", "\uA74B", "\uA74D", "\uA74F", "\uA751", "\uA753", "\uA755", "\uA757", "\uA759", "\uA75B", "\uA75D", "\uA75F", "\uA761", "\uA763", "\uA765", "\uA767", "\uA769", "\uA76B", "\uA76D", "\uA76F", ["\uA771", "\uA778"], "\uA77A", "\uA77C", "\uA77F", "\uA781", "\uA783", "\uA785", "\uA787", "\uA78C", "\uA78E", "\uA791", ["\uA793", "\uA795"], "\uA797", "\uA799", "\uA79B", "\uA79D", "\uA79F", "\uA7A1", "\uA7A3", "\uA7A5", "\uA7A7", "\uA7A9", "\uA7B5", "\uA7B7", "\uA7FA", ["\uAB30", "\uAB5A"], ["\uAB60", "\uAB65"], ["\uAB70", "\uABBF"], ["\uFB00", "\uFB06"], ["\uFB13", "\uFB17"], ["\uFF41", "\uFF5A"]], false, false); + var peg$e66 = peg$classExpectation([["\u02B0", "\u02C1"], ["\u02C6", "\u02D1"], ["\u02E0", "\u02E4"], "\u02EC", "\u02EE", "\u0374", "\u037A", "\u0559", "\u0640", ["\u06E5", "\u06E6"], ["\u07F4", "\u07F5"], "\u07FA", "\u081A", "\u0824", "\u0828", "\u0971", "\u0E46", "\u0EC6", "\u10FC", "\u17D7", "\u1843", "\u1AA7", ["\u1C78", "\u1C7D"], ["\u1D2C", "\u1D6A"], "\u1D78", ["\u1D9B", "\u1DBF"], "\u2071", "\u207F", ["\u2090", "\u209C"], ["\u2C7C", "\u2C7D"], "\u2D6F", "\u2E2F", "\u3005", ["\u3031", "\u3035"], "\u303B", ["\u309D", "\u309E"], ["\u30FC", "\u30FE"], "\uA015", ["\uA4F8", "\uA4FD"], "\uA60C", "\uA67F", ["\uA69C", "\uA69D"], ["\uA717", "\uA71F"], "\uA770", "\uA788", ["\uA7F8", "\uA7F9"], "\uA9CF", "\uA9E6", "\uAA70", "\uAADD", ["\uAAF3", "\uAAF4"], ["\uAB5C", "\uAB5F"], "\uFF70", ["\uFF9E", "\uFF9F"]], false, false); + var peg$e67 = peg$classExpectation(["\xAA", "\xBA", "\u01BB", ["\u01C0", "\u01C3"], "\u0294", ["\u05D0", "\u05EA"], ["\u05F0", "\u05F2"], ["\u0620", "\u063F"], ["\u0641", "\u064A"], ["\u066E", "\u066F"], ["\u0671", "\u06D3"], "\u06D5", ["\u06EE", "\u06EF"], ["\u06FA", "\u06FC"], "\u06FF", "\u0710", ["\u0712", "\u072F"], ["\u074D", "\u07A5"], "\u07B1", ["\u07CA", "\u07EA"], ["\u0800", "\u0815"], ["\u0840", "\u0858"], ["\u08A0", "\u08B4"], ["\u0904", "\u0939"], "\u093D", "\u0950", ["\u0958", "\u0961"], ["\u0972", "\u0980"], ["\u0985", "\u098C"], ["\u098F", "\u0990"], ["\u0993", "\u09A8"], ["\u09AA", "\u09B0"], "\u09B2", ["\u09B6", "\u09B9"], "\u09BD", "\u09CE", ["\u09DC", "\u09DD"], ["\u09DF", "\u09E1"], ["\u09F0", "\u09F1"], ["\u0A05", "\u0A0A"], ["\u0A0F", "\u0A10"], ["\u0A13", "\u0A28"], ["\u0A2A", "\u0A30"], ["\u0A32", "\u0A33"], ["\u0A35", "\u0A36"], ["\u0A38", "\u0A39"], ["\u0A59", "\u0A5C"], "\u0A5E", ["\u0A72", "\u0A74"], ["\u0A85", "\u0A8D"], ["\u0A8F", "\u0A91"], ["\u0A93", "\u0AA8"], ["\u0AAA", "\u0AB0"], ["\u0AB2", "\u0AB3"], ["\u0AB5", "\u0AB9"], "\u0ABD", "\u0AD0", ["\u0AE0", "\u0AE1"], "\u0AF9", ["\u0B05", "\u0B0C"], ["\u0B0F", "\u0B10"], ["\u0B13", "\u0B28"], ["\u0B2A", "\u0B30"], ["\u0B32", "\u0B33"], ["\u0B35", "\u0B39"], "\u0B3D", ["\u0B5C", "\u0B5D"], ["\u0B5F", "\u0B61"], "\u0B71", "\u0B83", ["\u0B85", "\u0B8A"], ["\u0B8E", "\u0B90"], ["\u0B92", "\u0B95"], ["\u0B99", "\u0B9A"], "\u0B9C", ["\u0B9E", "\u0B9F"], ["\u0BA3", "\u0BA4"], ["\u0BA8", "\u0BAA"], ["\u0BAE", "\u0BB9"], "\u0BD0", ["\u0C05", "\u0C0C"], ["\u0C0E", "\u0C10"], ["\u0C12", "\u0C28"], ["\u0C2A", "\u0C39"], "\u0C3D", ["\u0C58", "\u0C5A"], ["\u0C60", "\u0C61"], ["\u0C85", "\u0C8C"], ["\u0C8E", "\u0C90"], ["\u0C92", "\u0CA8"], ["\u0CAA", "\u0CB3"], ["\u0CB5", "\u0CB9"], "\u0CBD", "\u0CDE", ["\u0CE0", "\u0CE1"], ["\u0CF1", "\u0CF2"], ["\u0D05", "\u0D0C"], ["\u0D0E", "\u0D10"], ["\u0D12", "\u0D3A"], "\u0D3D", "\u0D4E", ["\u0D5F", "\u0D61"], ["\u0D7A", "\u0D7F"], ["\u0D85", "\u0D96"], ["\u0D9A", "\u0DB1"], ["\u0DB3", "\u0DBB"], "\u0DBD", ["\u0DC0", "\u0DC6"], ["\u0E01", "\u0E30"], ["\u0E32", "\u0E33"], ["\u0E40", "\u0E45"], ["\u0E81", "\u0E82"], "\u0E84", ["\u0E87", "\u0E88"], "\u0E8A", "\u0E8D", ["\u0E94", "\u0E97"], ["\u0E99", "\u0E9F"], ["\u0EA1", "\u0EA3"], "\u0EA5", "\u0EA7", ["\u0EAA", "\u0EAB"], ["\u0EAD", "\u0EB0"], ["\u0EB2", "\u0EB3"], "\u0EBD", ["\u0EC0", "\u0EC4"], ["\u0EDC", "\u0EDF"], "\u0F00", ["\u0F40", "\u0F47"], ["\u0F49", "\u0F6C"], ["\u0F88", "\u0F8C"], ["\u1000", "\u102A"], "\u103F", ["\u1050", "\u1055"], ["\u105A", "\u105D"], "\u1061", ["\u1065", "\u1066"], ["\u106E", "\u1070"], ["\u1075", "\u1081"], "\u108E", ["\u10D0", "\u10FA"], ["\u10FD", "\u1248"], ["\u124A", "\u124D"], ["\u1250", "\u1256"], "\u1258", ["\u125A", "\u125D"], ["\u1260", "\u1288"], ["\u128A", "\u128D"], ["\u1290", "\u12B0"], ["\u12B2", "\u12B5"], ["\u12B8", "\u12BE"], "\u12C0", ["\u12C2", "\u12C5"], ["\u12C8", "\u12D6"], ["\u12D8", "\u1310"], ["\u1312", "\u1315"], ["\u1318", "\u135A"], ["\u1380", "\u138F"], ["\u1401", "\u166C"], ["\u166F", "\u167F"], ["\u1681", "\u169A"], ["\u16A0", "\u16EA"], ["\u16F1", "\u16F8"], ["\u1700", "\u170C"], ["\u170E", "\u1711"], ["\u1720", "\u1731"], ["\u1740", "\u1751"], ["\u1760", "\u176C"], ["\u176E", "\u1770"], ["\u1780", "\u17B3"], "\u17DC", ["\u1820", "\u1842"], ["\u1844", "\u1877"], ["\u1880", "\u18A8"], "\u18AA", ["\u18B0", "\u18F5"], ["\u1900", "\u191E"], ["\u1950", "\u196D"], ["\u1970", "\u1974"], ["\u1980", "\u19AB"], ["\u19B0", "\u19C9"], ["\u1A00", "\u1A16"], ["\u1A20", "\u1A54"], ["\u1B05", "\u1B33"], ["\u1B45", "\u1B4B"], ["\u1B83", "\u1BA0"], ["\u1BAE", "\u1BAF"], ["\u1BBA", "\u1BE5"], ["\u1C00", "\u1C23"], ["\u1C4D", "\u1C4F"], ["\u1C5A", "\u1C77"], ["\u1CE9", "\u1CEC"], ["\u1CEE", "\u1CF1"], ["\u1CF5", "\u1CF6"], ["\u2135", "\u2138"], ["\u2D30", "\u2D67"], ["\u2D80", "\u2D96"], ["\u2DA0", "\u2DA6"], ["\u2DA8", "\u2DAE"], ["\u2DB0", "\u2DB6"], ["\u2DB8", "\u2DBE"], ["\u2DC0", "\u2DC6"], ["\u2DC8", "\u2DCE"], ["\u2DD0", "\u2DD6"], ["\u2DD8", "\u2DDE"], "\u3006", "\u303C", ["\u3041", "\u3096"], "\u309F", ["\u30A1", "\u30FA"], "\u30FF", ["\u3105", "\u312D"], ["\u3131", "\u318E"], ["\u31A0", "\u31BA"], ["\u31F0", "\u31FF"], ["\u3400", "\u4DB5"], ["\u4E00", "\u9FD5"], ["\uA000", "\uA014"], ["\uA016", "\uA48C"], ["\uA4D0", "\uA4F7"], ["\uA500", "\uA60B"], ["\uA610", "\uA61F"], ["\uA62A", "\uA62B"], "\uA66E", ["\uA6A0", "\uA6E5"], "\uA78F", "\uA7F7", ["\uA7FB", "\uA801"], ["\uA803", "\uA805"], ["\uA807", "\uA80A"], ["\uA80C", "\uA822"], ["\uA840", "\uA873"], ["\uA882", "\uA8B3"], ["\uA8F2", "\uA8F7"], "\uA8FB", "\uA8FD", ["\uA90A", "\uA925"], ["\uA930", "\uA946"], ["\uA960", "\uA97C"], ["\uA984", "\uA9B2"], ["\uA9E0", "\uA9E4"], ["\uA9E7", "\uA9EF"], ["\uA9FA", "\uA9FE"], ["\uAA00", "\uAA28"], ["\uAA40", "\uAA42"], ["\uAA44", "\uAA4B"], ["\uAA60", "\uAA6F"], ["\uAA71", "\uAA76"], "\uAA7A", ["\uAA7E", "\uAAAF"], "\uAAB1", ["\uAAB5", "\uAAB6"], ["\uAAB9", "\uAABD"], "\uAAC0", "\uAAC2", ["\uAADB", "\uAADC"], ["\uAAE0", "\uAAEA"], "\uAAF2", ["\uAB01", "\uAB06"], ["\uAB09", "\uAB0E"], ["\uAB11", "\uAB16"], ["\uAB20", "\uAB26"], ["\uAB28", "\uAB2E"], ["\uABC0", "\uABE2"], ["\uAC00", "\uD7A3"], ["\uD7B0", "\uD7C6"], ["\uD7CB", "\uD7FB"], ["\uF900", "\uFA6D"], ["\uFA70", "\uFAD9"], "\uFB1D", ["\uFB1F", "\uFB28"], ["\uFB2A", "\uFB36"], ["\uFB38", "\uFB3C"], "\uFB3E", ["\uFB40", "\uFB41"], ["\uFB43", "\uFB44"], ["\uFB46", "\uFBB1"], ["\uFBD3", "\uFD3D"], ["\uFD50", "\uFD8F"], ["\uFD92", "\uFDC7"], ["\uFDF0", "\uFDFB"], ["\uFE70", "\uFE74"], ["\uFE76", "\uFEFC"], ["\uFF66", "\uFF6F"], ["\uFF71", "\uFF9D"], ["\uFFA0", "\uFFBE"], ["\uFFC2", "\uFFC7"], ["\uFFCA", "\uFFCF"], ["\uFFD2", "\uFFD7"], ["\uFFDA", "\uFFDC"]], false, false); + var peg$e68 = peg$classExpectation(["\u01C5", "\u01C8", "\u01CB", "\u01F2", ["\u1F88", "\u1F8F"], ["\u1F98", "\u1F9F"], ["\u1FA8", "\u1FAF"], "\u1FBC", "\u1FCC", "\u1FFC"], false, false); + var peg$e69 = peg$classExpectation([["A", "Z"], ["\xC0", "\xD6"], ["\xD8", "\xDE"], "\u0100", "\u0102", "\u0104", "\u0106", "\u0108", "\u010A", "\u010C", "\u010E", "\u0110", "\u0112", "\u0114", "\u0116", "\u0118", "\u011A", "\u011C", "\u011E", "\u0120", "\u0122", "\u0124", "\u0126", "\u0128", "\u012A", "\u012C", "\u012E", "\u0130", "\u0132", "\u0134", "\u0136", "\u0139", "\u013B", "\u013D", "\u013F", "\u0141", "\u0143", "\u0145", "\u0147", "\u014A", "\u014C", "\u014E", "\u0150", "\u0152", "\u0154", "\u0156", "\u0158", "\u015A", "\u015C", "\u015E", "\u0160", "\u0162", "\u0164", "\u0166", "\u0168", "\u016A", "\u016C", "\u016E", "\u0170", "\u0172", "\u0174", "\u0176", ["\u0178", "\u0179"], "\u017B", "\u017D", ["\u0181", "\u0182"], "\u0184", ["\u0186", "\u0187"], ["\u0189", "\u018B"], ["\u018E", "\u0191"], ["\u0193", "\u0194"], ["\u0196", "\u0198"], ["\u019C", "\u019D"], ["\u019F", "\u01A0"], "\u01A2", "\u01A4", ["\u01A6", "\u01A7"], "\u01A9", "\u01AC", ["\u01AE", "\u01AF"], ["\u01B1", "\u01B3"], "\u01B5", ["\u01B7", "\u01B8"], "\u01BC", "\u01C4", "\u01C7", "\u01CA", "\u01CD", "\u01CF", "\u01D1", "\u01D3", "\u01D5", "\u01D7", "\u01D9", "\u01DB", "\u01DE", "\u01E0", "\u01E2", "\u01E4", "\u01E6", "\u01E8", "\u01EA", "\u01EC", "\u01EE", "\u01F1", "\u01F4", ["\u01F6", "\u01F8"], "\u01FA", "\u01FC", "\u01FE", "\u0200", "\u0202", "\u0204", "\u0206", "\u0208", "\u020A", "\u020C", "\u020E", "\u0210", "\u0212", "\u0214", "\u0216", "\u0218", "\u021A", "\u021C", "\u021E", "\u0220", "\u0222", "\u0224", "\u0226", "\u0228", "\u022A", "\u022C", "\u022E", "\u0230", "\u0232", ["\u023A", "\u023B"], ["\u023D", "\u023E"], "\u0241", ["\u0243", "\u0246"], "\u0248", "\u024A", "\u024C", "\u024E", "\u0370", "\u0372", "\u0376", "\u037F", "\u0386", ["\u0388", "\u038A"], "\u038C", ["\u038E", "\u038F"], ["\u0391", "\u03A1"], ["\u03A3", "\u03AB"], "\u03CF", ["\u03D2", "\u03D4"], "\u03D8", "\u03DA", "\u03DC", "\u03DE", "\u03E0", "\u03E2", "\u03E4", "\u03E6", "\u03E8", "\u03EA", "\u03EC", "\u03EE", "\u03F4", "\u03F7", ["\u03F9", "\u03FA"], ["\u03FD", "\u042F"], "\u0460", "\u0462", "\u0464", "\u0466", "\u0468", "\u046A", "\u046C", "\u046E", "\u0470", "\u0472", "\u0474", "\u0476", "\u0478", "\u047A", "\u047C", "\u047E", "\u0480", "\u048A", "\u048C", "\u048E", "\u0490", "\u0492", "\u0494", "\u0496", "\u0498", "\u049A", "\u049C", "\u049E", "\u04A0", "\u04A2", "\u04A4", "\u04A6", "\u04A8", "\u04AA", "\u04AC", "\u04AE", "\u04B0", "\u04B2", "\u04B4", "\u04B6", "\u04B8", "\u04BA", "\u04BC", "\u04BE", ["\u04C0", "\u04C1"], "\u04C3", "\u04C5", "\u04C7", "\u04C9", "\u04CB", "\u04CD", "\u04D0", "\u04D2", "\u04D4", "\u04D6", "\u04D8", "\u04DA", "\u04DC", "\u04DE", "\u04E0", "\u04E2", "\u04E4", "\u04E6", "\u04E8", "\u04EA", "\u04EC", "\u04EE", "\u04F0", "\u04F2", "\u04F4", "\u04F6", "\u04F8", "\u04FA", "\u04FC", "\u04FE", "\u0500", "\u0502", "\u0504", "\u0506", "\u0508", "\u050A", "\u050C", "\u050E", "\u0510", "\u0512", "\u0514", "\u0516", "\u0518", "\u051A", "\u051C", "\u051E", "\u0520", "\u0522", "\u0524", "\u0526", "\u0528", "\u052A", "\u052C", "\u052E", ["\u0531", "\u0556"], ["\u10A0", "\u10C5"], "\u10C7", "\u10CD", ["\u13A0", "\u13F5"], "\u1E00", "\u1E02", "\u1E04", "\u1E06", "\u1E08", "\u1E0A", "\u1E0C", "\u1E0E", "\u1E10", "\u1E12", "\u1E14", "\u1E16", "\u1E18", "\u1E1A", "\u1E1C", "\u1E1E", "\u1E20", "\u1E22", "\u1E24", "\u1E26", "\u1E28", "\u1E2A", "\u1E2C", "\u1E2E", "\u1E30", "\u1E32", "\u1E34", "\u1E36", "\u1E38", "\u1E3A", "\u1E3C", "\u1E3E", "\u1E40", "\u1E42", "\u1E44", "\u1E46", "\u1E48", "\u1E4A", "\u1E4C", "\u1E4E", "\u1E50", "\u1E52", "\u1E54", "\u1E56", "\u1E58", "\u1E5A", "\u1E5C", "\u1E5E", "\u1E60", "\u1E62", "\u1E64", "\u1E66", "\u1E68", "\u1E6A", "\u1E6C", "\u1E6E", "\u1E70", "\u1E72", "\u1E74", "\u1E76", "\u1E78", "\u1E7A", "\u1E7C", "\u1E7E", "\u1E80", "\u1E82", "\u1E84", "\u1E86", "\u1E88", "\u1E8A", "\u1E8C", "\u1E8E", "\u1E90", "\u1E92", "\u1E94", "\u1E9E", "\u1EA0", "\u1EA2", "\u1EA4", "\u1EA6", "\u1EA8", "\u1EAA", "\u1EAC", "\u1EAE", "\u1EB0", "\u1EB2", "\u1EB4", "\u1EB6", "\u1EB8", "\u1EBA", "\u1EBC", "\u1EBE", "\u1EC0", "\u1EC2", "\u1EC4", "\u1EC6", "\u1EC8", "\u1ECA", "\u1ECC", "\u1ECE", "\u1ED0", "\u1ED2", "\u1ED4", "\u1ED6", "\u1ED8", "\u1EDA", "\u1EDC", "\u1EDE", "\u1EE0", "\u1EE2", "\u1EE4", "\u1EE6", "\u1EE8", "\u1EEA", "\u1EEC", "\u1EEE", "\u1EF0", "\u1EF2", "\u1EF4", "\u1EF6", "\u1EF8", "\u1EFA", "\u1EFC", "\u1EFE", ["\u1F08", "\u1F0F"], ["\u1F18", "\u1F1D"], ["\u1F28", "\u1F2F"], ["\u1F38", "\u1F3F"], ["\u1F48", "\u1F4D"], "\u1F59", "\u1F5B", "\u1F5D", "\u1F5F", ["\u1F68", "\u1F6F"], ["\u1FB8", "\u1FBB"], ["\u1FC8", "\u1FCB"], ["\u1FD8", "\u1FDB"], ["\u1FE8", "\u1FEC"], ["\u1FF8", "\u1FFB"], "\u2102", "\u2107", ["\u210B", "\u210D"], ["\u2110", "\u2112"], "\u2115", ["\u2119", "\u211D"], "\u2124", "\u2126", "\u2128", ["\u212A", "\u212D"], ["\u2130", "\u2133"], ["\u213E", "\u213F"], "\u2145", "\u2183", ["\u2C00", "\u2C2E"], "\u2C60", ["\u2C62", "\u2C64"], "\u2C67", "\u2C69", "\u2C6B", ["\u2C6D", "\u2C70"], "\u2C72", "\u2C75", ["\u2C7E", "\u2C80"], "\u2C82", "\u2C84", "\u2C86", "\u2C88", "\u2C8A", "\u2C8C", "\u2C8E", "\u2C90", "\u2C92", "\u2C94", "\u2C96", "\u2C98", "\u2C9A", "\u2C9C", "\u2C9E", "\u2CA0", "\u2CA2", "\u2CA4", "\u2CA6", "\u2CA8", "\u2CAA", "\u2CAC", "\u2CAE", "\u2CB0", "\u2CB2", "\u2CB4", "\u2CB6", "\u2CB8", "\u2CBA", "\u2CBC", "\u2CBE", "\u2CC0", "\u2CC2", "\u2CC4", "\u2CC6", "\u2CC8", "\u2CCA", "\u2CCC", "\u2CCE", "\u2CD0", "\u2CD2", "\u2CD4", "\u2CD6", "\u2CD8", "\u2CDA", "\u2CDC", "\u2CDE", "\u2CE0", "\u2CE2", "\u2CEB", "\u2CED", "\u2CF2", "\uA640", "\uA642", "\uA644", "\uA646", "\uA648", "\uA64A", "\uA64C", "\uA64E", "\uA650", "\uA652", "\uA654", "\uA656", "\uA658", "\uA65A", "\uA65C", "\uA65E", "\uA660", "\uA662", "\uA664", "\uA666", "\uA668", "\uA66A", "\uA66C", "\uA680", "\uA682", "\uA684", "\uA686", "\uA688", "\uA68A", "\uA68C", "\uA68E", "\uA690", "\uA692", "\uA694", "\uA696", "\uA698", "\uA69A", "\uA722", "\uA724", "\uA726", "\uA728", "\uA72A", "\uA72C", "\uA72E", "\uA732", "\uA734", "\uA736", "\uA738", "\uA73A", "\uA73C", "\uA73E", "\uA740", "\uA742", "\uA744", "\uA746", "\uA748", "\uA74A", "\uA74C", "\uA74E", "\uA750", "\uA752", "\uA754", "\uA756", "\uA758", "\uA75A", "\uA75C", "\uA75E", "\uA760", "\uA762", "\uA764", "\uA766", "\uA768", "\uA76A", "\uA76C", "\uA76E", "\uA779", "\uA77B", ["\uA77D", "\uA77E"], "\uA780", "\uA782", "\uA784", "\uA786", "\uA78B", "\uA78D", "\uA790", "\uA792", "\uA796", "\uA798", "\uA79A", "\uA79C", "\uA79E", "\uA7A0", "\uA7A2", "\uA7A4", "\uA7A6", "\uA7A8", ["\uA7AA", "\uA7AD"], ["\uA7B0", "\uA7B4"], "\uA7B6", ["\uFF21", "\uFF3A"]], false, false); + var peg$e70 = peg$classExpectation(["\u0903", "\u093B", ["\u093E", "\u0940"], ["\u0949", "\u094C"], ["\u094E", "\u094F"], ["\u0982", "\u0983"], ["\u09BE", "\u09C0"], ["\u09C7", "\u09C8"], ["\u09CB", "\u09CC"], "\u09D7", "\u0A03", ["\u0A3E", "\u0A40"], "\u0A83", ["\u0ABE", "\u0AC0"], "\u0AC9", ["\u0ACB", "\u0ACC"], ["\u0B02", "\u0B03"], "\u0B3E", "\u0B40", ["\u0B47", "\u0B48"], ["\u0B4B", "\u0B4C"], "\u0B57", ["\u0BBE", "\u0BBF"], ["\u0BC1", "\u0BC2"], ["\u0BC6", "\u0BC8"], ["\u0BCA", "\u0BCC"], "\u0BD7", ["\u0C01", "\u0C03"], ["\u0C41", "\u0C44"], ["\u0C82", "\u0C83"], "\u0CBE", ["\u0CC0", "\u0CC4"], ["\u0CC7", "\u0CC8"], ["\u0CCA", "\u0CCB"], ["\u0CD5", "\u0CD6"], ["\u0D02", "\u0D03"], ["\u0D3E", "\u0D40"], ["\u0D46", "\u0D48"], ["\u0D4A", "\u0D4C"], "\u0D57", ["\u0D82", "\u0D83"], ["\u0DCF", "\u0DD1"], ["\u0DD8", "\u0DDF"], ["\u0DF2", "\u0DF3"], ["\u0F3E", "\u0F3F"], "\u0F7F", ["\u102B", "\u102C"], "\u1031", "\u1038", ["\u103B", "\u103C"], ["\u1056", "\u1057"], ["\u1062", "\u1064"], ["\u1067", "\u106D"], ["\u1083", "\u1084"], ["\u1087", "\u108C"], "\u108F", ["\u109A", "\u109C"], "\u17B6", ["\u17BE", "\u17C5"], ["\u17C7", "\u17C8"], ["\u1923", "\u1926"], ["\u1929", "\u192B"], ["\u1930", "\u1931"], ["\u1933", "\u1938"], ["\u1A19", "\u1A1A"], "\u1A55", "\u1A57", "\u1A61", ["\u1A63", "\u1A64"], ["\u1A6D", "\u1A72"], "\u1B04", "\u1B35", "\u1B3B", ["\u1B3D", "\u1B41"], ["\u1B43", "\u1B44"], "\u1B82", "\u1BA1", ["\u1BA6", "\u1BA7"], "\u1BAA", "\u1BE7", ["\u1BEA", "\u1BEC"], "\u1BEE", ["\u1BF2", "\u1BF3"], ["\u1C24", "\u1C2B"], ["\u1C34", "\u1C35"], "\u1CE1", ["\u1CF2", "\u1CF3"], ["\u302E", "\u302F"], ["\uA823", "\uA824"], "\uA827", ["\uA880", "\uA881"], ["\uA8B4", "\uA8C3"], ["\uA952", "\uA953"], "\uA983", ["\uA9B4", "\uA9B5"], ["\uA9BA", "\uA9BB"], ["\uA9BD", "\uA9C0"], ["\uAA2F", "\uAA30"], ["\uAA33", "\uAA34"], "\uAA4D", "\uAA7B", "\uAA7D", "\uAAEB", ["\uAAEE", "\uAAEF"], "\uAAF5", ["\uABE3", "\uABE4"], ["\uABE6", "\uABE7"], ["\uABE9", "\uABEA"], "\uABEC"], false, false); + var peg$e71 = peg$classExpectation([["\u0300", "\u036F"], ["\u0483", "\u0487"], ["\u0591", "\u05BD"], "\u05BF", ["\u05C1", "\u05C2"], ["\u05C4", "\u05C5"], "\u05C7", ["\u0610", "\u061A"], ["\u064B", "\u065F"], "\u0670", ["\u06D6", "\u06DC"], ["\u06DF", "\u06E4"], ["\u06E7", "\u06E8"], ["\u06EA", "\u06ED"], "\u0711", ["\u0730", "\u074A"], ["\u07A6", "\u07B0"], ["\u07EB", "\u07F3"], ["\u0816", "\u0819"], ["\u081B", "\u0823"], ["\u0825", "\u0827"], ["\u0829", "\u082D"], ["\u0859", "\u085B"], ["\u08E3", "\u0902"], "\u093A", "\u093C", ["\u0941", "\u0948"], "\u094D", ["\u0951", "\u0957"], ["\u0962", "\u0963"], "\u0981", "\u09BC", ["\u09C1", "\u09C4"], "\u09CD", ["\u09E2", "\u09E3"], ["\u0A01", "\u0A02"], "\u0A3C", ["\u0A41", "\u0A42"], ["\u0A47", "\u0A48"], ["\u0A4B", "\u0A4D"], "\u0A51", ["\u0A70", "\u0A71"], "\u0A75", ["\u0A81", "\u0A82"], "\u0ABC", ["\u0AC1", "\u0AC5"], ["\u0AC7", "\u0AC8"], "\u0ACD", ["\u0AE2", "\u0AE3"], "\u0B01", "\u0B3C", "\u0B3F", ["\u0B41", "\u0B44"], "\u0B4D", "\u0B56", ["\u0B62", "\u0B63"], "\u0B82", "\u0BC0", "\u0BCD", "\u0C00", ["\u0C3E", "\u0C40"], ["\u0C46", "\u0C48"], ["\u0C4A", "\u0C4D"], ["\u0C55", "\u0C56"], ["\u0C62", "\u0C63"], "\u0C81", "\u0CBC", "\u0CBF", "\u0CC6", ["\u0CCC", "\u0CCD"], ["\u0CE2", "\u0CE3"], "\u0D01", ["\u0D41", "\u0D44"], "\u0D4D", ["\u0D62", "\u0D63"], "\u0DCA", ["\u0DD2", "\u0DD4"], "\u0DD6", "\u0E31", ["\u0E34", "\u0E3A"], ["\u0E47", "\u0E4E"], "\u0EB1", ["\u0EB4", "\u0EB9"], ["\u0EBB", "\u0EBC"], ["\u0EC8", "\u0ECD"], ["\u0F18", "\u0F19"], "\u0F35", "\u0F37", "\u0F39", ["\u0F71", "\u0F7E"], ["\u0F80", "\u0F84"], ["\u0F86", "\u0F87"], ["\u0F8D", "\u0F97"], ["\u0F99", "\u0FBC"], "\u0FC6", ["\u102D", "\u1030"], ["\u1032", "\u1037"], ["\u1039", "\u103A"], ["\u103D", "\u103E"], ["\u1058", "\u1059"], ["\u105E", "\u1060"], ["\u1071", "\u1074"], "\u1082", ["\u1085", "\u1086"], "\u108D", "\u109D", ["\u135D", "\u135F"], ["\u1712", "\u1714"], ["\u1732", "\u1734"], ["\u1752", "\u1753"], ["\u1772", "\u1773"], ["\u17B4", "\u17B5"], ["\u17B7", "\u17BD"], "\u17C6", ["\u17C9", "\u17D3"], "\u17DD", ["\u180B", "\u180D"], "\u18A9", ["\u1920", "\u1922"], ["\u1927", "\u1928"], "\u1932", ["\u1939", "\u193B"], ["\u1A17", "\u1A18"], "\u1A1B", "\u1A56", ["\u1A58", "\u1A5E"], "\u1A60", "\u1A62", ["\u1A65", "\u1A6C"], ["\u1A73", "\u1A7C"], "\u1A7F", ["\u1AB0", "\u1ABD"], ["\u1B00", "\u1B03"], "\u1B34", ["\u1B36", "\u1B3A"], "\u1B3C", "\u1B42", ["\u1B6B", "\u1B73"], ["\u1B80", "\u1B81"], ["\u1BA2", "\u1BA5"], ["\u1BA8", "\u1BA9"], ["\u1BAB", "\u1BAD"], "\u1BE6", ["\u1BE8", "\u1BE9"], "\u1BED", ["\u1BEF", "\u1BF1"], ["\u1C2C", "\u1C33"], ["\u1C36", "\u1C37"], ["\u1CD0", "\u1CD2"], ["\u1CD4", "\u1CE0"], ["\u1CE2", "\u1CE8"], "\u1CED", "\u1CF4", ["\u1CF8", "\u1CF9"], ["\u1DC0", "\u1DF5"], ["\u1DFC", "\u1DFF"], ["\u20D0", "\u20DC"], "\u20E1", ["\u20E5", "\u20F0"], ["\u2CEF", "\u2CF1"], "\u2D7F", ["\u2DE0", "\u2DFF"], ["\u302A", "\u302D"], ["\u3099", "\u309A"], "\uA66F", ["\uA674", "\uA67D"], ["\uA69E", "\uA69F"], ["\uA6F0", "\uA6F1"], "\uA802", "\uA806", "\uA80B", ["\uA825", "\uA826"], "\uA8C4", ["\uA8E0", "\uA8F1"], ["\uA926", "\uA92D"], ["\uA947", "\uA951"], ["\uA980", "\uA982"], "\uA9B3", ["\uA9B6", "\uA9B9"], "\uA9BC", "\uA9E5", ["\uAA29", "\uAA2E"], ["\uAA31", "\uAA32"], ["\uAA35", "\uAA36"], "\uAA43", "\uAA4C", "\uAA7C", "\uAAB0", ["\uAAB2", "\uAAB4"], ["\uAAB7", "\uAAB8"], ["\uAABE", "\uAABF"], "\uAAC1", ["\uAAEC", "\uAAED"], "\uAAF6", "\uABE5", "\uABE8", "\uABED", "\uFB1E", ["\uFE00", "\uFE0F"], ["\uFE20", "\uFE2F"]], false, false); + var peg$e72 = peg$classExpectation([["0", "9"], ["\u0660", "\u0669"], ["\u06F0", "\u06F9"], ["\u07C0", "\u07C9"], ["\u0966", "\u096F"], ["\u09E6", "\u09EF"], ["\u0A66", "\u0A6F"], ["\u0AE6", "\u0AEF"], ["\u0B66", "\u0B6F"], ["\u0BE6", "\u0BEF"], ["\u0C66", "\u0C6F"], ["\u0CE6", "\u0CEF"], ["\u0D66", "\u0D6F"], ["\u0DE6", "\u0DEF"], ["\u0E50", "\u0E59"], ["\u0ED0", "\u0ED9"], ["\u0F20", "\u0F29"], ["\u1040", "\u1049"], ["\u1090", "\u1099"], ["\u17E0", "\u17E9"], ["\u1810", "\u1819"], ["\u1946", "\u194F"], ["\u19D0", "\u19D9"], ["\u1A80", "\u1A89"], ["\u1A90", "\u1A99"], ["\u1B50", "\u1B59"], ["\u1BB0", "\u1BB9"], ["\u1C40", "\u1C49"], ["\u1C50", "\u1C59"], ["\uA620", "\uA629"], ["\uA8D0", "\uA8D9"], ["\uA900", "\uA909"], ["\uA9D0", "\uA9D9"], ["\uA9F0", "\uA9F9"], ["\uAA50", "\uAA59"], ["\uABF0", "\uABF9"], ["\uFF10", "\uFF19"]], false, false); + var peg$e73 = peg$classExpectation([["\u16EE", "\u16F0"], ["\u2160", "\u2182"], ["\u2185", "\u2188"], "\u3007", ["\u3021", "\u3029"], ["\u3038", "\u303A"], ["\uA6E6", "\uA6EF"]], false, false); + var peg$e74 = peg$classExpectation(["_", ["\u203F", "\u2040"], "\u2054", ["\uFE33", "\uFE34"], ["\uFE4D", "\uFE4F"], "\uFF3F"], false, false); + var peg$e75 = peg$classExpectation([" ", "\xA0", "\u1680", ["\u2000", "\u200A"], "\u202F", "\u205F", "\u3000"], false, false); + var peg$e76 = peg$literalExpectation(";", false); var peg$f0 = function(topLevelInitializer, initializer, rules) { return { @@ -455,7 +457,7 @@ function peg$parse(input, options) { location: location() }; }; - var peg$f13 = function(expression, boundaries) { + var peg$f13 = function(expression, boundaries, delimiter) { let min = boundaries[0]; let max = boundaries[1]; if (max.type === "constant" && max.value === 0) { @@ -467,6 +469,7 @@ function peg$parse(input, options) { min, max, expression, + delimiter, location: location(), }; }; @@ -1249,7 +1252,7 @@ function peg$parse(input, options) { } function peg$parseRepeatedExpression() { - var s0, s1, s2, s3, s4, s5, s6, s7; + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11; s0 = peg$currPos; s1 = peg$parsePrimaryExpression(); @@ -1267,16 +1270,41 @@ function peg$parse(input, options) { s5 = peg$parseBoundaries(); if (s5 !== peg$FAILED) { s6 = peg$parse__(); - if (input.charCodeAt(peg$currPos) === 124) { - s7 = peg$c12; + s7 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 44) { + s8 = peg$c13; peg$currPos++; } else { + s8 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e13); } + } + if (s8 !== peg$FAILED) { + s9 = peg$parse__(); + s10 = peg$parseChoiceExpression(); + if (s10 !== peg$FAILED) { + s11 = peg$parse__(); + s7 = s10; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; s7 = peg$FAILED; + } + if (s7 === peg$FAILED) { + s7 = null; + } + if (input.charCodeAt(peg$currPos) === 124) { + s8 = peg$c12; + peg$currPos++; + } else { + s8 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$e12); } } - if (s7 !== peg$FAILED) { + if (s8 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f13(s1, s5); + s0 = peg$f13(s1, s5, s7); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -1306,12 +1334,12 @@ function peg$parse(input, options) { s1 = null; } s2 = peg$parse__(); - if (input.substr(peg$currPos, 2) === peg$c13) { - s3 = peg$c13; + if (input.substr(peg$currPos, 2) === peg$c14) { + s3 = peg$c14; peg$currPos += 2; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e13); } + if (peg$silentFails === 0) { peg$fail(peg$e14); } } if (s3 !== peg$FAILED) { s4 = peg$parse__(); @@ -1385,11 +1413,11 @@ function peg$parse(input, options) { if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 40) { - s1 = peg$c14; + s1 = peg$c15; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e14); } + if (peg$silentFails === 0) { peg$fail(peg$e15); } } if (s1 !== peg$FAILED) { s2 = peg$parse__(); @@ -1397,11 +1425,11 @@ function peg$parse(input, options) { if (s3 !== peg$FAILED) { s4 = peg$parse__(); if (input.charCodeAt(peg$currPos) === 41) { - s5 = peg$c15; + s5 = peg$c16; peg$currPos++; } else { s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e15); } + if (peg$silentFails === 0) { peg$fail(peg$e16); } } if (s5 !== peg$FAILED) { peg$savedPos = s0; @@ -1540,7 +1568,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e16); } + if (peg$silentFails === 0) { peg$fail(peg$e17); } } return s0; @@ -1551,51 +1579,51 @@ function peg$parse(input, options) { peg$silentFails++; if (input.charCodeAt(peg$currPos) === 9) { - s0 = peg$c16; + s0 = peg$c17; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e18); } + if (peg$silentFails === 0) { peg$fail(peg$e19); } } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 11) { - s0 = peg$c17; + s0 = peg$c18; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e19); } + if (peg$silentFails === 0) { peg$fail(peg$e20); } } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 12) { - s0 = peg$c18; + s0 = peg$c19; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e20); } + if (peg$silentFails === 0) { peg$fail(peg$e21); } } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 32) { - s0 = peg$c19; + s0 = peg$c20; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e21); } + if (peg$silentFails === 0) { peg$fail(peg$e22); } } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 160) { - s0 = peg$c20; + s0 = peg$c21; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e22); } + if (peg$silentFails === 0) { peg$fail(peg$e23); } } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 65279) { - s0 = peg$c21; + s0 = peg$c22; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e23); } + if (peg$silentFails === 0) { peg$fail(peg$e24); } } if (s0 === peg$FAILED) { s0 = peg$parseZs(); @@ -1608,7 +1636,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e17); } + if (peg$silentFails === 0) { peg$fail(peg$e18); } } return s0; @@ -1622,7 +1650,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e24); } + if (peg$silentFails === 0) { peg$fail(peg$e25); } } return s0; @@ -1633,43 +1661,43 @@ function peg$parse(input, options) { peg$silentFails++; if (input.charCodeAt(peg$currPos) === 10) { - s0 = peg$c22; + s0 = peg$c23; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e26); } + if (peg$silentFails === 0) { peg$fail(peg$e27); } } if (s0 === peg$FAILED) { - if (input.substr(peg$currPos, 2) === peg$c23) { - s0 = peg$c23; + if (input.substr(peg$currPos, 2) === peg$c24) { + s0 = peg$c24; peg$currPos += 2; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e27); } + if (peg$silentFails === 0) { peg$fail(peg$e28); } } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 13) { - s0 = peg$c24; + s0 = peg$c25; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e28); } + if (peg$silentFails === 0) { peg$fail(peg$e29); } } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8232) { - s0 = peg$c25; + s0 = peg$c26; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e29); } + if (peg$silentFails === 0) { peg$fail(peg$e30); } } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8233) { - s0 = peg$c26; + s0 = peg$c27; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e30); } + if (peg$silentFails === 0) { peg$fail(peg$e31); } } } } @@ -1678,7 +1706,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e25); } + if (peg$silentFails === 0) { peg$fail(peg$e26); } } return s0; @@ -1695,7 +1723,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e31); } + if (peg$silentFails === 0) { peg$fail(peg$e32); } } return s0; @@ -1705,24 +1733,24 @@ function peg$parse(input, options) { var s0, s1, s2, s3, s4, s5; s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c27) { - s1 = peg$c27; + 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$e32); } + if (peg$silentFails === 0) { peg$fail(peg$e33); } } if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$currPos; peg$silentFails++; - if (input.substr(peg$currPos, 2) === peg$c28) { - s5 = peg$c28; + if (input.substr(peg$currPos, 2) === peg$c29) { + s5 = peg$c29; peg$currPos += 2; } else { s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e33); } + if (peg$silentFails === 0) { peg$fail(peg$e34); } } peg$silentFails--; if (s5 === peg$FAILED) { @@ -1749,12 +1777,12 @@ function peg$parse(input, options) { s3 = peg$currPos; s4 = peg$currPos; peg$silentFails++; - if (input.substr(peg$currPos, 2) === peg$c28) { - s5 = peg$c28; + if (input.substr(peg$currPos, 2) === peg$c29) { + s5 = peg$c29; peg$currPos += 2; } else { s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e33); } + if (peg$silentFails === 0) { peg$fail(peg$e34); } } peg$silentFails--; if (s5 === peg$FAILED) { @@ -1777,12 +1805,12 @@ function peg$parse(input, options) { s3 = peg$FAILED; } } - if (input.substr(peg$currPos, 2) === peg$c28) { - s3 = peg$c28; + if (input.substr(peg$currPos, 2) === peg$c29) { + s3 = peg$c29; peg$currPos += 2; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e33); } + if (peg$silentFails === 0) { peg$fail(peg$e34); } } if (s3 !== peg$FAILED) { s1 = [s1, s2, s3]; @@ -1803,24 +1831,24 @@ function peg$parse(input, options) { var s0, s1, s2, s3, s4, s5; s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c27) { - s1 = peg$c27; + 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$e32); } + if (peg$silentFails === 0) { peg$fail(peg$e33); } } if (s1 !== peg$FAILED) { s2 = []; s3 = peg$currPos; s4 = peg$currPos; peg$silentFails++; - if (input.substr(peg$currPos, 2) === peg$c28) { - s5 = peg$c28; + if (input.substr(peg$currPos, 2) === peg$c29) { + s5 = peg$c29; peg$currPos += 2; } else { s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e33); } + if (peg$silentFails === 0) { peg$fail(peg$e34); } } if (s5 === peg$FAILED) { s5 = peg$parseLineTerminator(); @@ -1850,12 +1878,12 @@ function peg$parse(input, options) { s3 = peg$currPos; s4 = peg$currPos; peg$silentFails++; - if (input.substr(peg$currPos, 2) === peg$c28) { - s5 = peg$c28; + if (input.substr(peg$currPos, 2) === peg$c29) { + s5 = peg$c29; peg$currPos += 2; } else { s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e33); } + if (peg$silentFails === 0) { peg$fail(peg$e34); } } if (s5 === peg$FAILED) { s5 = peg$parseLineTerminator(); @@ -1881,12 +1909,12 @@ function peg$parse(input, options) { s3 = peg$FAILED; } } - if (input.substr(peg$currPos, 2) === peg$c28) { - s3 = peg$c28; + if (input.substr(peg$currPos, 2) === peg$c29) { + s3 = peg$c29; peg$currPos += 2; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e33); } + if (peg$silentFails === 0) { peg$fail(peg$e34); } } if (s3 !== peg$FAILED) { s1 = [s1, s2, s3]; @@ -1907,12 +1935,12 @@ function peg$parse(input, options) { var s0, s1, s2, s3, s4, s5; s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c29) { - s1 = peg$c29; + 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 (peg$silentFails === 0) { peg$fail(peg$e35); } } if (s1 !== peg$FAILED) { s2 = []; @@ -1999,7 +2027,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e35); } + if (peg$silentFails === 0) { peg$fail(peg$e36); } } return s0; @@ -2019,20 +2047,20 @@ function peg$parse(input, options) { } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 95) { - s0 = peg$c30; + s0 = peg$c31; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e36); } + if (peg$silentFails === 0) { peg$fail(peg$e37); } } if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c31; + s1 = peg$c32; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e37); } + if (peg$silentFails === 0) { peg$fail(peg$e38); } } if (s1 !== peg$FAILED) { s2 = peg$parseUnicodeEscapeSequence(); @@ -2065,19 +2093,19 @@ function peg$parse(input, options) { s0 = peg$parsePc(); if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8204) { - s0 = peg$c32; + s0 = peg$c33; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e38); } + if (peg$silentFails === 0) { peg$fail(peg$e39); } } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8205) { - s0 = peg$c33; + s0 = peg$c34; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e39); } + if (peg$silentFails === 0) { peg$fail(peg$e40); } } } } @@ -2130,11 +2158,11 @@ function peg$parse(input, options) { s1 = peg$parseStringLiteral(); if (s1 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 105) { - s2 = peg$c34; + s2 = peg$c35; peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e41); } + if (peg$silentFails === 0) { peg$fail(peg$e42); } } if (s2 === peg$FAILED) { s2 = null; @@ -2148,7 +2176,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e40); } + if (peg$silentFails === 0) { peg$fail(peg$e41); } } return s0; @@ -2160,11 +2188,11 @@ function peg$parse(input, options) { peg$silentFails++; s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 34) { - s1 = peg$c35; + s1 = peg$c36; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e43); } + if (peg$silentFails === 0) { peg$fail(peg$e44); } } if (s1 !== peg$FAILED) { s2 = []; @@ -2174,11 +2202,11 @@ function peg$parse(input, options) { s3 = peg$parseDoubleStringCharacter(); } if (input.charCodeAt(peg$currPos) === 34) { - s3 = peg$c35; + s3 = peg$c36; peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e43); } + if (peg$silentFails === 0) { peg$fail(peg$e44); } } if (s3 !== peg$FAILED) { peg$savedPos = s0; @@ -2194,11 +2222,11 @@ function peg$parse(input, options) { if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 39) { - s1 = peg$c36; + s1 = peg$c37; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e44); } + if (peg$silentFails === 0) { peg$fail(peg$e45); } } if (s1 !== peg$FAILED) { s2 = []; @@ -2208,11 +2236,11 @@ function peg$parse(input, options) { s3 = peg$parseSingleStringCharacter(); } if (input.charCodeAt(peg$currPos) === 39) { - s3 = peg$c36; + s3 = peg$c37; peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e44); } + if (peg$silentFails === 0) { peg$fail(peg$e45); } } if (s3 !== peg$FAILED) { peg$savedPos = s0; @@ -2229,7 +2257,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e42); } + if (peg$silentFails === 0) { peg$fail(peg$e43); } } return s0; @@ -2243,19 +2271,19 @@ function peg$parse(input, options) { s2 = peg$currPos; peg$silentFails++; if (input.charCodeAt(peg$currPos) === 34) { - s3 = peg$c35; + s3 = peg$c36; peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e43); } + if (peg$silentFails === 0) { peg$fail(peg$e44); } } if (s3 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 92) { - s3 = peg$c31; + s3 = peg$c32; peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e37); } + if (peg$silentFails === 0) { peg$fail(peg$e38); } } if (s3 === peg$FAILED) { s3 = peg$parseLineTerminator(); @@ -2289,11 +2317,11 @@ function peg$parse(input, options) { if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c31; + s1 = peg$c32; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e37); } + if (peg$silentFails === 0) { peg$fail(peg$e38); } } if (s1 !== peg$FAILED) { s2 = peg$parseEscapeSequence(); @@ -2323,19 +2351,19 @@ function peg$parse(input, options) { s2 = peg$currPos; peg$silentFails++; if (input.charCodeAt(peg$currPos) === 39) { - s3 = peg$c36; + s3 = peg$c37; peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e44); } + if (peg$silentFails === 0) { peg$fail(peg$e45); } } if (s3 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 92) { - s3 = peg$c31; + s3 = peg$c32; peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e37); } + if (peg$silentFails === 0) { peg$fail(peg$e38); } } if (s3 === peg$FAILED) { s3 = peg$parseLineTerminator(); @@ -2369,11 +2397,11 @@ function peg$parse(input, options) { if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c31; + s1 = peg$c32; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e37); } + if (peg$silentFails === 0) { peg$fail(peg$e38); } } if (s1 !== peg$FAILED) { s2 = peg$parseEscapeSequence(); @@ -2401,19 +2429,19 @@ function peg$parse(input, options) { peg$silentFails++; s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 91) { - s1 = peg$c37; + s1 = peg$c38; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e46); } + if (peg$silentFails === 0) { peg$fail(peg$e47); } } if (s1 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 94) { - s2 = peg$c38; + s2 = peg$c39; peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e47); } + if (peg$silentFails === 0) { peg$fail(peg$e48); } } if (s2 === peg$FAILED) { s2 = null; @@ -2431,19 +2459,19 @@ function peg$parse(input, options) { } } if (input.charCodeAt(peg$currPos) === 93) { - s4 = peg$c39; + s4 = peg$c40; peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e48); } + if (peg$silentFails === 0) { peg$fail(peg$e49); } } if (s4 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 105) { - s5 = peg$c34; + s5 = peg$c35; peg$currPos++; } else { s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e41); } + if (peg$silentFails === 0) { peg$fail(peg$e42); } } if (s5 === peg$FAILED) { s5 = null; @@ -2461,7 +2489,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e45); } + if (peg$silentFails === 0) { peg$fail(peg$e46); } } return s0; @@ -2474,11 +2502,11 @@ function peg$parse(input, options) { s1 = peg$parseClassCharacter(); if (s1 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 45) { - s2 = peg$c40; + s2 = peg$c41; peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e49); } + if (peg$silentFails === 0) { peg$fail(peg$e50); } } if (s2 !== peg$FAILED) { s3 = peg$parseClassCharacter(); @@ -2509,19 +2537,19 @@ function peg$parse(input, options) { s2 = peg$currPos; peg$silentFails++; if (input.charCodeAt(peg$currPos) === 93) { - s3 = peg$c39; + s3 = peg$c40; peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e48); } + if (peg$silentFails === 0) { peg$fail(peg$e49); } } if (s3 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 92) { - s3 = peg$c31; + s3 = peg$c32; peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e37); } + if (peg$silentFails === 0) { peg$fail(peg$e38); } } if (s3 === peg$FAILED) { s3 = peg$parseLineTerminator(); @@ -2555,11 +2583,11 @@ function peg$parse(input, options) { if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c31; + s1 = peg$c32; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e37); } + if (peg$silentFails === 0) { peg$fail(peg$e38); } } if (s1 !== peg$FAILED) { s2 = peg$parseEscapeSequence(); @@ -2586,11 +2614,11 @@ function peg$parse(input, options) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c31; + s1 = peg$c32; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e37); } + if (peg$silentFails === 0) { peg$fail(peg$e38); } } if (s1 !== peg$FAILED) { s2 = peg$parseLineTerminatorSequence(); @@ -2616,11 +2644,11 @@ function peg$parse(input, options) { if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 48) { - s1 = peg$c41; + s1 = peg$c42; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e50); } + if (peg$silentFails === 0) { peg$fail(peg$e51); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -2670,36 +2698,36 @@ function peg$parse(input, options) { var s0, s1; if (input.charCodeAt(peg$currPos) === 39) { - s0 = peg$c36; + s0 = peg$c37; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e44); } + if (peg$silentFails === 0) { peg$fail(peg$e45); } } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s0 = peg$c35; + s0 = peg$c36; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e43); } + if (peg$silentFails === 0) { peg$fail(peg$e44); } } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 92) { - s0 = peg$c31; + s0 = peg$c32; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e37); } + if (peg$silentFails === 0) { peg$fail(peg$e38); } } if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 98) { - s1 = peg$c42; + s1 = peg$c43; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e51); } + if (peg$silentFails === 0) { peg$fail(peg$e52); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; @@ -2709,11 +2737,11 @@ function peg$parse(input, options) { if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 102) { - s1 = peg$c43; + s1 = peg$c44; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e52); } + if (peg$silentFails === 0) { peg$fail(peg$e53); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; @@ -2723,11 +2751,11 @@ function peg$parse(input, options) { if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 110) { - s1 = peg$c44; + s1 = peg$c45; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e53); } + if (peg$silentFails === 0) { peg$fail(peg$e54); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; @@ -2737,11 +2765,11 @@ function peg$parse(input, options) { if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 114) { - s1 = peg$c45; + s1 = peg$c46; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e54); } + if (peg$silentFails === 0) { peg$fail(peg$e55); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; @@ -2751,11 +2779,11 @@ function peg$parse(input, options) { if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 116) { - s1 = peg$c46; + s1 = peg$c47; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e55); } + if (peg$silentFails === 0) { peg$fail(peg$e56); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; @@ -2765,11 +2793,11 @@ function peg$parse(input, options) { if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 118) { - s1 = peg$c47; + s1 = peg$c48; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e56); } + if (peg$silentFails === 0) { peg$fail(peg$e57); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; @@ -2836,19 +2864,19 @@ function peg$parse(input, options) { s0 = peg$parseDecimalDigit(); if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 120) { - s0 = peg$c48; + s0 = peg$c49; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e57); } + if (peg$silentFails === 0) { peg$fail(peg$e58); } } if (s0 === peg$FAILED) { if (input.charCodeAt(peg$currPos) === 117) { - s0 = peg$c49; + s0 = peg$c50; peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e58); } + if (peg$silentFails === 0) { peg$fail(peg$e59); } } } } @@ -2862,11 +2890,11 @@ function peg$parse(input, options) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 120) { - s1 = peg$c48; + s1 = peg$c49; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e57); } + if (peg$silentFails === 0) { peg$fail(peg$e58); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -2910,11 +2938,11 @@ function peg$parse(input, options) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 117) { - s1 = peg$c49; + s1 = peg$c50; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e58); } + if (peg$silentFails === 0) { peg$fail(peg$e59); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -2973,7 +3001,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e59); } + if (peg$silentFails === 0) { peg$fail(peg$e60); } } return s0; @@ -2987,7 +3015,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e60); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } return s0; @@ -2998,11 +3026,11 @@ function peg$parse(input, options) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 46) { - s1 = peg$c50; + s1 = peg$c51; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e61); } + if (peg$silentFails === 0) { peg$fail(peg$e62); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; @@ -3047,7 +3075,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e62); } + if (peg$silentFails === 0) { peg$fail(peg$e63); } } return s0; @@ -3079,7 +3107,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + if (peg$silentFails === 0) { peg$fail(peg$e64); } } peg$silentFails--; if (s5 === peg$FAILED) { @@ -3112,7 +3140,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + if (peg$silentFails === 0) { peg$fail(peg$e64); } } peg$silentFails--; if (s5 === peg$FAILED) { @@ -3179,7 +3207,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + if (peg$silentFails === 0) { peg$fail(peg$e64); } } peg$silentFails--; if (s5 === peg$FAILED) { @@ -3212,7 +3240,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + if (peg$silentFails === 0) { peg$fail(peg$e64); } } peg$silentFails--; if (s5 === peg$FAILED) { @@ -3311,7 +3339,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e64); } + if (peg$silentFails === 0) { peg$fail(peg$e65); } } return s0; @@ -3325,7 +3353,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e65); } + if (peg$silentFails === 0) { peg$fail(peg$e66); } } return s0; @@ -3339,7 +3367,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e66); } + if (peg$silentFails === 0) { peg$fail(peg$e67); } } return s0; @@ -3353,7 +3381,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e67); } + if (peg$silentFails === 0) { peg$fail(peg$e68); } } return s0; @@ -3367,7 +3395,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e68); } + if (peg$silentFails === 0) { peg$fail(peg$e69); } } return s0; @@ -3381,7 +3409,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e69); } + if (peg$silentFails === 0) { peg$fail(peg$e70); } } return s0; @@ -3395,7 +3423,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e71); } } return s0; @@ -3409,7 +3437,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e71); } + if (peg$silentFails === 0) { peg$fail(peg$e72); } } return s0; @@ -3423,7 +3451,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e73); } } return s0; @@ -3437,7 +3465,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e73); } + if (peg$silentFails === 0) { peg$fail(peg$e74); } } return s0; @@ -3451,7 +3479,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e75); } } return s0; @@ -3507,11 +3535,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = peg$parse__(); if (input.charCodeAt(peg$currPos) === 59) { - s2 = peg$c51; + s2 = peg$c52; peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e75); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } if (s2 !== peg$FAILED) { s1 = [s1, s2]; @@ -3562,7 +3590,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e16); } + if (peg$silentFails === 0) { peg$fail(peg$e17); } } peg$silentFails--; if (s1 === peg$FAILED) { diff --git a/test/behavior/generated-parser-behavior.spec.js b/test/behavior/generated-parser-behavior.spec.js index 275edcef..50030f3d 100644 --- a/test/behavior/generated-parser-behavior.spec.js +++ b/test/behavior/generated-parser-behavior.spec.js @@ -1480,6 +1480,561 @@ describe("generated parser behavior", () => { }); }); }); + + describe("with delimiter", () => { + describe("with constant boundaries", () => { + it("| .. , delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|.., '~'|", options); + + expect(parser).to.parse("", []); + expect(parser).to.parse("a", ["a"]); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.parse("a~a~a", ["a", "a", "a"]); + }); + + it("|0.. , delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|0.., '~'|", options); + + expect(parser).to.parse("", []); + expect(parser).to.parse("a", ["a"]); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.parse("a~a~a", ["a", "a", "a"]); + }); + + it("|1.. , delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|1.., '~'|", options); + + expect(parser).to.failToParse(""); + expect(parser).to.parse("a", ["a"]); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.parse("a~a~a", ["a", "a", "a"]); + }); + + it("|2.. , delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|2.., '~'|", options); + + expect(parser).to.failToParse(""); + expect(parser).to.failToParse("a"); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.parse("a~a~a", ["a", "a", "a"]); + }); + + it("| ..1, delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|..1, '~'|", options); + + expect(parser).to.parse("", []); + expect(parser).to.parse("a", ["a"]); + expect(parser).to.failToParse("a~a"); + expect(parser).to.failToParse("a~a~a"); + }); + + it("| ..2, delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|..2, '~'|", options); + + expect(parser).to.parse("", []); + expect(parser).to.parse("a", ["a"]); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.failToParse("a~a~a"); + }); + + it("|2..3, delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|2..3, '~'|", options); + + expect(parser).to.failToParse(""); + expect(parser).to.failToParse("a"); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.parse("a~a~a", ["a", "a", "a"]); + expect(parser).to.failToParse("a~a~a~a"); + }); + + it("|2..2, delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|2..2, '~'|", options); + + expect(parser).to.failToParse(""); + expect(parser).to.failToParse("a"); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.failToParse("a~a~a"); + }); + + it("|2 , delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|2, '~'|", options); + + expect(parser).to.failToParse(""); + expect(parser).to.failToParse("a"); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.failToParse("a~a~a"); + }); + + it("|3..2, delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|3..2, '~'|", options); + + expect(parser).to.failToParse(""); + expect(parser).to.failToParse("a"); + expect(parser).to.failToParse("a~a"); + expect(parser).to.failToParse("a~a~a"); + }); + }); + + describe("with variable boundaries", () => { + it("|min.. , delimiter| matches correctly", () => { + const parser = buildParser("val.., '~'"); + + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start1" + i }; + expect(parser).to.failToParse("", undefined, opt); + expect(parser).to.parse("0", [0, [], ""], opt); + expect(parser).to.parse("0==", [0, ["="], "="], opt); + expect(parser).to.parse("0=~=", [0, ["=", "="], ""], opt); + expect(parser).to.failToParse("1", undefined, opt); + expect(parser).to.failToParse("1~", undefined, opt); + expect(parser).to.failToParse("2=", undefined, opt); + expect(parser).to.failToParse("2=~", undefined, opt); + expect(parser).to.failToParse("2==", undefined, opt); + expect(parser).to.parse("2=~=", [2, ["=", "="], ""], opt); + expect(parser).to.parse("2=~=~", [2, ["=", "="], "~"], opt); + expect(parser).to.parse("2=~=~=~=~=", [2, ["=", "=", "=", "=", "="], ""], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start2" + i }; + expect(parser).to.failToParse("-", undefined, opt); + expect(parser).to.parse("-0", ["-", 0, [], ""], opt); + expect(parser).to.parse("-0==", ["-", 0, ["="], "="], opt); + expect(parser).to.parse("-0=~=", ["-", 0, ["=", "="], ""], opt); + expect(parser).to.failToParse("-1", undefined, opt); + expect(parser).to.failToParse("-1~", undefined, opt); + expect(parser).to.failToParse("-2=", undefined, opt); + expect(parser).to.failToParse("-2=~", undefined, opt); + expect(parser).to.failToParse("-2==", undefined, opt); + expect(parser).to.parse("-2=~=", ["-", 2, ["=", "="], ""], opt); + expect(parser).to.parse("-2=~=~", ["-", 2, ["=", "="], "~"], opt); + expect(parser).to.parse("-2=~=~=~=~=", ["-", 2, ["=", "=", "=", "=", "="], ""], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start3" + i }; + expect(parser).to.failToParse("-", undefined, opt); + expect(parser).to.parse("-0", ["-", 0, [], ""], opt); + expect(parser).to.parse("-0==", ["-", 0, ["="], "="], opt); + expect(parser).to.parse("-0=~=", ["-", 0, ["=", "="], ""], opt); + expect(parser).to.failToParse("-1", undefined, opt); + expect(parser).to.failToParse("-1~", undefined, opt); + expect(parser).to.failToParse("-2=", undefined, opt); + expect(parser).to.failToParse("-2=~", undefined, opt); + expect(parser).to.failToParse("-2==", undefined, opt); + expect(parser).to.parse("-2=~=", ["-", 2, ["=", "="], ""], opt); + expect(parser).to.parse("-2=~=~", ["-", 2, ["=", "="], "~"], opt); + expect(parser).to.parse("-2=~=~=~=~=", ["-", 2, ["=", "=", "=", "=", "="], ""], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start4" + i }; + expect(parser).to.failToParse("--", undefined, opt); + expect(parser).to.parse("--0", ["-", "-", 0, [], ""], opt); + expect(parser).to.parse("--0==", ["-", "-", 0, ["="], "="], opt); + expect(parser).to.parse("--0=~=", ["-", "-", 0, ["=", "="], ""], opt); + expect(parser).to.failToParse("--1", undefined, opt); + expect(parser).to.failToParse("--1~", undefined, opt); + expect(parser).to.failToParse("--2=", undefined, opt); + expect(parser).to.failToParse("--2=~", undefined, opt); + expect(parser).to.failToParse("--2==", undefined, opt); + expect(parser).to.parse("--2=~=", ["-", "-", 2, ["=", "="], ""], opt); + expect(parser).to.parse("--2=~=~", ["-", "-", 2, ["=", "="], "~"], opt); + expect(parser).to.parse("--2=~=~=~=~=", ["-", "-", 2, ["=", "=", "=", "=", "="], ""], opt); + } + }); + + it("| ..max, delimiter| matches correctly", () => { + const parser = buildParser("..val, '~'"); + + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start1" + i }; + expect(parser).to.failToParse("", undefined, opt); + expect(parser).to.parse("0", [0, [], ""], opt); + expect(parser).to.parse("0==", [0, [], "=="], opt); + expect(parser).to.parse("0=~=", [0, [], "=~="], opt); + expect(parser).to.parse("3", [3, [], ""], opt); + expect(parser).to.parse("3=", [3, ["="], ""], opt); + expect(parser).to.parse("3===", [3, ["="], "=="], opt); + expect(parser).to.parse("3=~=~", [3, ["=", "="], "~"], opt); + expect(parser).to.parse("3=~=~=", [3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("3=~=~=~=~=", [3, ["=", "=", "="], "~=~="], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start2" + i }; + expect(parser).to.failToParse("-", undefined, opt); + expect(parser).to.parse("-0", ["-", 0, [], ""], opt); + expect(parser).to.parse("-0==", ["-", 0, [], "=="], opt); + expect(parser).to.parse("-0=~=", ["-", 0, [], "=~="], opt); + expect(parser).to.parse("-3", ["-", 3, [], ""], opt); + expect(parser).to.parse("-3=", ["-", 3, ["="], ""], opt); + expect(parser).to.parse("-3===", ["-", 3, ["="], "=="], opt); + expect(parser).to.parse("-3=~=~", ["-", 3, ["=", "="], "~"], opt); + expect(parser).to.parse("-3=~=~=", ["-", 3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("-3=~=~=~=~=", ["-", 3, ["=", "=", "="], "~=~="], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start3" + i }; + expect(parser).to.failToParse("-", undefined, opt); + expect(parser).to.parse("-0", ["-", 0, [], ""], opt); + expect(parser).to.parse("-0==", ["-", 0, [], "=="], opt); + expect(parser).to.parse("-0=~=", ["-", 0, [], "=~="], opt); + expect(parser).to.parse("-3", ["-", 3, [], ""], opt); + expect(parser).to.parse("-3=", ["-", 3, ["="], ""], opt); + expect(parser).to.parse("-3===", ["-", 3, ["="], "=="], opt); + expect(parser).to.parse("-3=~=~", ["-", 3, ["=", "="], "~"], opt); + expect(parser).to.parse("-3=~=~=", ["-", 3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("-3=~=~=~=~=", ["-", 3, ["=", "=", "="], "~=~="], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start4" + i }; + expect(parser).to.failToParse("--", undefined, opt); + expect(parser).to.parse("--0", ["-", "-", 0, [], ""], opt); + expect(parser).to.parse("--0==", ["-", "-", 0, [], "=="], opt); + expect(parser).to.parse("--0=~=", ["-", "-", 0, [], "=~="], opt); + expect(parser).to.parse("--3", ["-", "-", 3, [], ""], opt); + expect(parser).to.parse("--3=", ["-", "-", 3, ["="], ""], opt); + expect(parser).to.parse("--3===", ["-", "-", 3, ["="], "=="], opt); + expect(parser).to.parse("--3=~=~", ["-", "-", 3, ["=", "="], "~"], opt); + expect(parser).to.parse("--3=~=~=", ["-", "-", 3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("--3=~=~=~=~=", ["-", "-", 3, ["=", "=", "="], "~=~="], opt); + } + }); + + it("|min..max, delimiter| matches correctly", () => { + function buildRangeParser() { + const start = []; + for (let i = 1; i <= 4; ++i) { + for (let j = 1; j <= 4; ++j) { + start[start.length] = "start" + String(i) + j; + } + } + const opt = clone(options); + opt.allowedStartRules = start; + + return peg.generate([ + "start11 = min:n1 max:n1 .|min..max, '~'| $.*", + "start12 = min:n1 max:n1 data:.|min..max, '~'| $.*", + "start13 = min:n1 max:n1 .|min..max, '~'| rest:$.*", + "start14 = min:n1 max:n1 data:.|min..max, '~'| rest:$.*", + + "start21 = . min:n1 max:n1 .|min..max, '~'| $.*", + "start22 = . min:n1 max:n1 data:.|min..max, '~'| $.*", + "start23 = . min:n1 max:n1 .|min..max, '~'| rest:$.*", + "start24 = . min:n1 max:n1 data:.|min..max, '~'| rest:$.*", + + "start31 = a:. min:n1 max:n1 .|min..max, '~'| $.*", + "start32 = a:. min:n1 max:n1 data:.|min..max, '~'| $.*", + "start33 = a:. min:n1 max:n1 .|min..max, '~'| rest:$.*", + "start34 = a:. min:n1 max:n1 data:.|min..max, '~'| rest:$.*", + + "start41 = a:. b:. min:n1 max:n1 .|min..max, '~'| $.*", + "start42 = a:. b:. min:n1 max:n1 data:.|min..max, '~'| $.*", + "start43 = a:. b:. min:n1 max:n1 .|min..max, '~'| rest:$.*", + "start44 = a:. b:. min:n1 max:n1 data:.|min..max, '~'| rest:$.*", + + "n1 = n:$[0-9] { return parseInt(n, 10); }", + ].join(";\n"), opt); + } + + const parser = buildRangeParser(); + + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start1" + i }; + expect(parser).to.failToParse("", undefined, opt); + expect(parser).to.parse("00", [0, 0, [], ""], opt); + expect(parser).to.parse("00==", [0, 0, [], "=="], opt); + expect(parser).to.parse("00=~=", [0, 0, [], "=~="], opt); + expect(parser).to.failToParse("23", undefined, opt); + expect(parser).to.failToParse("23=", undefined, opt); + expect(parser).to.failToParse("23=~", undefined, opt); + expect(parser).to.failToParse("23==", undefined, opt); + expect(parser).to.parse("23=~=", [2, 3, ["=", "="], ""], opt); + expect(parser).to.parse("23=~=~", [2, 3, ["=", "="], "~"], opt); + expect(parser).to.parse("23=~=~=", [2, 3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("23=~=~=~=~=", [2, 3, ["=", "=", "="], "~=~="], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start2" + i }; + expect(parser).to.failToParse("-", undefined, opt); + expect(parser).to.parse("-00", ["-", 0, 0, [], ""], opt); + expect(parser).to.parse("-00==", ["-", 0, 0, [], "=="], opt); + expect(parser).to.parse("-00=~=", ["-", 0, 0, [], "=~="], opt); + expect(parser).to.failToParse("-23", undefined, opt); + expect(parser).to.failToParse("-23=", undefined, opt); + expect(parser).to.failToParse("-23=~", undefined, opt); + expect(parser).to.failToParse("-23==", undefined, opt); + expect(parser).to.parse("-23=~=", ["-", 2, 3, ["=", "="], ""], opt); + expect(parser).to.parse("-23=~=~", ["-", 2, 3, ["=", "="], "~"], opt); + expect(parser).to.parse("-23=~=~=", ["-", 2, 3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("-23=~=~=~=~=", ["-", 2, 3, ["=", "=", "="], "~=~="], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start3" + i }; + expect(parser).to.failToParse("-", undefined, opt); + expect(parser).to.parse("-00", ["-", 0, 0, [], ""], opt); + expect(parser).to.parse("-00==", ["-", 0, 0, [], "=="], opt); + expect(parser).to.parse("-00=~=", ["-", 0, 0, [], "=~="], opt); + expect(parser).to.failToParse("-23", undefined, opt); + expect(parser).to.failToParse("-23=", undefined, opt); + expect(parser).to.failToParse("-23=~", undefined, opt); + expect(parser).to.failToParse("-23==", undefined, opt); + expect(parser).to.parse("-23=~=", ["-", 2, 3, ["=", "="], ""], opt); + expect(parser).to.parse("-23=~=~", ["-", 2, 3, ["=", "="], "~"], opt); + expect(parser).to.parse("-23=~=~=", ["-", 2, 3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("-23=~=~=~=~=", ["-", 2, 3, ["=", "=", "="], "~=~="], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start4" + i }; + expect(parser).to.failToParse("--", undefined, opt); + expect(parser).to.parse("--00", ["-", "-", 0, 0, [], ""], opt); + expect(parser).to.parse("--00==", ["-", "-", 0, 0, [], "=="], opt); + expect(parser).to.parse("--00=~=", ["-", "-", 0, 0, [], "=~="], opt); + expect(parser).to.failToParse("--23", undefined, opt); + expect(parser).to.failToParse("--23=", undefined, opt); + expect(parser).to.failToParse("--23=~", undefined, opt); + expect(parser).to.failToParse("--23==", undefined, opt); + expect(parser).to.parse("--23=~=", ["-", "-", 2, 3, ["=", "="], ""], opt); + expect(parser).to.parse("--23=~=~", ["-", "-", 2, 3, ["=", "="], "~"], opt); + expect(parser).to.parse("--23=~=~=", ["-", "-", 2, 3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("--23=~=~=~=~=", ["-", "-", 2, 3, ["=", "=", "="], "~=~="], opt); + } + }); + + it("|val..val, delimiter| matches correctly", () => { + const parser = buildParser("val, '~'"); + + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start1" + i }; + expect(parser).to.failToParse("", undefined, opt); + expect(parser).to.parse("0", [0, [], ""], opt); + expect(parser).to.parse("0==", [0, [], "=="], opt); + expect(parser).to.parse("0=~=", [0, [], "=~="], opt); + expect(parser).to.failToParse("3", undefined, opt); + expect(parser).to.failToParse("3=", undefined, opt); + expect(parser).to.failToParse("3=~", undefined, opt); + expect(parser).to.parse("3=~=~=", [3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("3=~=~=~", [3, ["=", "=", "="], "~"], opt); + expect(parser).to.parse("3=~=~=~=~=", [3, ["=", "=", "="], "~=~="], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start2" + i }; + expect(parser).to.failToParse("-", undefined, opt); + expect(parser).to.parse("-0", ["-", 0, [], ""], opt); + expect(parser).to.parse("-0==", ["-", 0, [], "=="], opt); + expect(parser).to.parse("-0=~=", ["-", 0, [], "=~="], opt); + expect(parser).to.failToParse("-3", undefined, opt); + expect(parser).to.failToParse("-3=", undefined, opt); + expect(parser).to.failToParse("-3=~", undefined, opt); + expect(parser).to.parse("-3=~=~=", ["-", 3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("-3=~=~=~", ["-", 3, ["=", "=", "="], "~"], opt); + expect(parser).to.parse("-3=~=~=~=~=", ["-", 3, ["=", "=", "="], "~=~="], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start3" + i }; + expect(parser).to.failToParse("-", undefined, opt); + expect(parser).to.parse("-0", ["-", 0, [], ""], opt); + expect(parser).to.parse("-0==", ["-", 0, [], "=="], opt); + expect(parser).to.parse("-0=~=", ["-", 0, [], "=~="], opt); + expect(parser).to.failToParse("-3", undefined, opt); + expect(parser).to.failToParse("-3=", undefined, opt); + expect(parser).to.failToParse("-3=~", undefined, opt); + expect(parser).to.parse("-3=~=~=", ["-", 3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("-3=~=~=~", ["-", 3, ["=", "=", "="], "~"], opt); + expect(parser).to.parse("-3=~=~=~=~=", ["-", 3, ["=", "=", "="], "~=~="], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start4" + i }; + expect(parser).to.failToParse("--", undefined, opt); + expect(parser).to.parse("--0", ["-", "-", 0, [], ""], opt); + expect(parser).to.parse("--0==", ["-", "-", 0, [], "=="], opt); + expect(parser).to.parse("--0=~=", ["-", "-", 0, [], "=~="], opt); + expect(parser).to.failToParse("--3", undefined, opt); + expect(parser).to.failToParse("--3=", undefined, opt); + expect(parser).to.failToParse("--3=~", undefined, opt); + expect(parser).to.parse("--3=~=~=", ["-", "-", 3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("--3=~=~=~", ["-", "-", 3, ["=", "=", "="], "~"], opt); + expect(parser).to.parse("--3=~=~=~=~=", ["-", "-", 3, ["=", "=", "="], "~=~="], opt); + } + }); + + it("| exact , delimiter| matches correctly", () => { + const parser = buildParser("val, '~'"); + + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start1" + i }; + expect(parser).to.failToParse("", undefined, opt); + expect(parser).to.parse("0", [0, [], ""], opt); + expect(parser).to.parse("0==", [0, [], "=="], opt); + expect(parser).to.parse("0=~=", [0, [], "=~="], opt); + expect(parser).to.failToParse("3", undefined, opt); + expect(parser).to.failToParse("3=", undefined, opt); + expect(parser).to.failToParse("3=~", undefined, opt); + expect(parser).to.parse("3=~=~=", [3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("3=~=~=~", [3, ["=", "=", "="], "~"], opt); + expect(parser).to.parse("3=~=~=~=~=", [3, ["=", "=", "="], "~=~="], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start2" + i }; + expect(parser).to.failToParse("-", undefined, opt); + expect(parser).to.parse("-0", ["-", 0, [], ""], opt); + expect(parser).to.parse("-0==", ["-", 0, [], "=="], opt); + expect(parser).to.parse("-0=~=", ["-", 0, [], "=~="], opt); + expect(parser).to.failToParse("-3", undefined, opt); + expect(parser).to.failToParse("-3=", undefined, opt); + expect(parser).to.failToParse("-3=~", undefined, opt); + expect(parser).to.parse("-3=~=~=", ["-", 3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("-3=~=~=~", ["-", 3, ["=", "=", "="], "~"], opt); + expect(parser).to.parse("-3=~=~=~=~=", ["-", 3, ["=", "=", "="], "~=~="], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start3" + i }; + expect(parser).to.failToParse("-", undefined, opt); + expect(parser).to.parse("-0", ["-", 0, [], ""], opt); + expect(parser).to.parse("-0==", ["-", 0, [], "=="], opt); + expect(parser).to.parse("-0=~=", ["-", 0, [], "=~="], opt); + expect(parser).to.failToParse("-3", undefined, opt); + expect(parser).to.failToParse("-3=", undefined, opt); + expect(parser).to.failToParse("-3=~", undefined, opt); + expect(parser).to.parse("-3=~=~=", ["-", 3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("-3=~=~=~", ["-", 3, ["=", "=", "="], "~"], opt); + expect(parser).to.parse("-3=~=~=~=~=", ["-", 3, ["=", "=", "="], "~=~="], opt); + } + for (let i = 1; i <= 4; ++i) { + const opt = { startRule: "start4" + i }; + expect(parser).to.failToParse("--", undefined, opt); + expect(parser).to.parse("--0", ["-", "-", 0, [], ""], opt); + expect(parser).to.parse("--0==", ["-", "-", 0, [], "=="], opt); + expect(parser).to.parse("--0=~=", ["-", "-", 0, [], "=~="], opt); + expect(parser).to.failToParse("--3", undefined, opt); + expect(parser).to.failToParse("--3=", undefined, opt); + expect(parser).to.failToParse("--3=~", undefined, opt); + expect(parser).to.parse("--3=~=~=", ["-", "-", 3, ["=", "=", "="], ""], opt); + expect(parser).to.parse("--3=~=~=~", ["-", "-", 3, ["=", "=", "="], "~"], opt); + expect(parser).to.parse("--3=~=~=~=~=", ["-", "-", 3, ["=", "=", "="], "~=~="], opt); + } + }); + }); + + describe("with function boundaries", () => { + it("|{2}.. , delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|{ return 2; }.., '~'|", options); + + expect(parser).to.failToParse(""); + expect(parser).to.failToParse("a"); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.parse("a~a~a", ["a", "a", "a"]); + }); + + it("| ..{2}, delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|..{ return 2; }, '~'|", options); + + expect(parser).to.parse("", []); + expect(parser).to.parse("a", ["a"]); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.failToParse("a~a~a"); + }); + + it("|{2}..{3}, delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|{ return 2; }..{ return 3; }, '~'|", options); + + expect(parser).to.failToParse(""); + expect(parser).to.failToParse("a"); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.parse("a~a~a", ["a", "a", "a"]); + expect(parser).to.failToParse("a~a~a~a"); + }); + + it("|{2}..{2}, delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|{ return 2; }..{ return 2; }, '~'|", options); + + expect(parser).to.failToParse(""); + expect(parser).to.failToParse("a"); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.failToParse("a~a~a"); + }); + + it("|{2} , delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|{ return 2; }, '~'|", options); + + expect(parser).to.failToParse(""); + expect(parser).to.failToParse("a"); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.failToParse("a~a~a"); + }); + + it("|{3}..{2}, delimiter| matches correctly", () => { + const parser = peg.generate("start = 'a'|{ return 3; }..{ return 2; }, '~'|", options); + + expect(parser).to.failToParse(""); + expect(parser).to.failToParse("a"); + expect(parser).to.failToParse("a~a"); + expect(parser).to.failToParse("a~a~a"); + }); + }); + }); + + describe("handle delimiter correctly", () => { + it("with constant boundaries", () => { + const parser = peg.generate("start = 'a'|2..3, '~'|", options); + + expect(parser).to.failToParse(""); + expect(parser).to.failToParse("a"); + expect(parser).to.failToParse("aa"); + expect(parser).to.failToParse("a~"); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.failToParse("a~a~"); + expect(parser).to.parse("a~a~a", ["a", "a", "a"]); + expect(parser).to.failToParse("a~a~a~"); + expect(parser).to.failToParse("a~a~a~a"); + }); + + it("with variable boundaries", () => { + const parser = peg.generate([ + "start = min:n1 max:n1 'a'|min..max, '~'|", + "n1 = n:$[0-9] { return parseInt(n, 10); }", + ].join(";\n"), options); + + expect(parser).to.failToParse("23"); + expect(parser).to.failToParse("23a"); + expect(parser).to.failToParse("23aa"); + expect(parser).to.failToParse("23a~"); + expect(parser).to.parse("23a~a", [2, 3, ["a", "a"]]); + expect(parser).to.failToParse("23a~a~"); + expect(parser).to.parse("23a~a~a", [2, 3, ["a", "a", "a"]]); + expect(parser).to.failToParse("23a~a~a~"); + expect(parser).to.failToParse("23a~a~a~a"); + }); + + it("with variable boundaries in delimiter", () => { + const parser = peg.generate([ + "start = min:n1 max:n1 'a'|2, '~'|min..max||", + "n1 = n:$[0-9] { return parseInt(n, 10); }", + ].join(";\n"), options); + + expect(parser).to.failToParse("23"); + expect(parser).to.failToParse("23a"); + expect(parser).to.failToParse("23aa"); + expect(parser).to.failToParse("23a~"); + expect(parser).to.failToParse("23a~a"); + expect(parser).to.failToParse("23a~~"); + expect(parser).to.parse("23a~~a", [2, 3, ["a", "a"]]); + expect(parser).to.parse("23a~~~a", [2, 3, ["a", "a"]]); + expect(parser).to.failToParse("23a~~~~a"); + expect(parser).to.failToParse("23a~~a~~a"); + }); + + it("with function boundaries", () => { + const parser = peg.generate("start = 'a'|{ return 2; }..{ return 3; }, '~'|", options); + + expect(parser).to.failToParse(""); + expect(parser).to.failToParse("a"); + expect(parser).to.failToParse("aa"); + expect(parser).to.failToParse("a~"); + expect(parser).to.parse("a~a", ["a", "a"]); + expect(parser).to.failToParse("a~a~"); + expect(parser).to.parse("a~a~a", ["a", "a", "a"]); + expect(parser).to.failToParse("a~a~a~"); + expect(parser).to.failToParse("a~a~a~a"); + }); + }); }); describe("text", () => { diff --git a/test/types/peg.test-d.ts b/test/types/peg.test-d.ts index 2de7b645..f7695225 100644 --- a/test/types/peg.test-d.ts +++ b/test/types/peg.test-d.ts @@ -355,6 +355,7 @@ describe("peg.d.ts", () => { expectType(node.location); expectType(node.min); expectType(node.max); + expectType(node.delimiter); expectType(node.expression); visit(node.expression); }, diff --git a/test/unit/compiler/passes/generate-bytecode.spec.js b/test/unit/compiler/passes/generate-bytecode.spec.js index 9d5fd9df..bea90657 100644 --- a/test/unit/compiler/passes/generate-bytecode.spec.js +++ b/test/unit/compiler/passes/generate-bytecode.spec.js @@ -1130,6 +1130,1038 @@ describe("compiler pass |generateBytecode|", () => { }); }); }); + + describe("with delimiter", () => { + describe("| .. , delim| (edge case -- no boundaries)", () => { + const grammar = "start = 'a'| .. , 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 4, // PUSH_EMPTY_ARRAY + 18, 0, 2, 2, 22, 0, 23, 0, // + 16, 30, // WHILE_NOT_ERROR + 10, // * APPEND + 5, // PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [] + )); + }); + }); + + describe("with constant boundaries", () => { + describe("| ..3, delim| (edge case -- no min boundary)", () => { + const grammar = "start = 'a'| ..3, 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 4, // PUSH_EMPTY_ARRAY + 18, 0, 2, 2, 22, 0, 23, 0, // + 16, 35, // WHILE_NOT_ERROR + 10, // * APPEND + 31, 3, 1, 29, // IF_GE <3> + 3, // * PUSH_FAILED + 5, // * PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [] + )); + }); + }); + + describe("| ..1, delim| (edge case -- no min boundary -- same as |optional|)", () => { + const grammar = "start = 'a'| ..1, 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 4, // PUSH_EMPTY_ARRAY + 18, 0, 2, 2, 22, 0, 23, 0, // + 16, 35, // WHILE_NOT_ERROR + 10, // * APPEND + 31, 1, 1, 29, // IF_GE <1> + 3, // * PUSH_FAILED + 5, // * PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [] + )); + }); + }); + + describe("|2.. , delim| (edge case -- no max boundary)", () => { + const grammar = "start = 'a'|2.. , 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 5, // PUSH_CURR_POS + 4, // PUSH_EMPTY_ARRAY + 18, 0, 2, 2, 22, 0, 23, 0, // + 16, 30, // WHILE_NOT_ERROR + 10, // * APPEND + 5, // PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + 30, 2, 3, 1, // IF_LT <2> + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [] + )); + }); + }); + + describe("|0.. , delim| (edge case -- no max boundary -- same as |zero or more|)", () => { + const grammar = "start = 'a'|0.. , 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 4, // PUSH_EMPTY_ARRAY + 18, 0, 2, 2, 22, 0, 23, 0, // + 16, 30, // WHILE_NOT_ERROR + 10, // * APPEND + 5, // PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [] + )); + }); + }); + + describe("|1.. , delim| (edge case -- no max boundary -- same as |one or more|)", () => { + const grammar = "start = 'a'|1.. , 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 5, // PUSH_CURR_POS + 4, // PUSH_EMPTY_ARRAY + 18, 0, 2, 2, 22, 0, 23, 0, // + 16, 30, // WHILE_NOT_ERROR + 10, // * APPEND + 5, // PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + 30, 1, 3, 1, // IF_LT <1> + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [] + )); + }); + }); + + describe("|2..3, delim|", () => { + const grammar = "start = 'a'|2..3, 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 5, // PUSH_CURR_POS + 4, // PUSH_EMPTY_ARRAY + 18, 0, 2, 2, 22, 0, 23, 0, // + 16, 35, // WHILE_NOT_ERROR + 10, // * APPEND + 31, 3, 1, 29, // IF_GE <3> + 3, // * PUSH_FAILED + 5, // * PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + 30, 2, 3, 1, // IF_LT <2> + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [] + )); + }); + }); + + describe("| 42 , delim| (edge case -- exact repetitions)", () => { + const grammar = "start = 'a'|42, 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 5, // PUSH_CURR_POS + 4, // PUSH_EMPTY_ARRAY + 18, 0, 2, 2, 22, 0, 23, 0, // + 16, 35, // WHILE_NOT_ERROR + 10, // * APPEND + 31, 42, 1, 29, // IF_GE <42> + 3, // * PUSH_FAILED + 5, // * PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + 30, 42, 3, 1, // IF_LT <42> + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [] + )); + }); + }); + }); + + describe("with variable boundaries", () => { + describe("| ..x, delim| (edge case -- no min boundary)", () => { + const grammar = "start = max:(''{return 42;}) 'a'| ..max, 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 5, // PUSH_CURR_POS + // ''{return 42;} - max + 5, // PUSH_CURR_POS + 35, // PUSH_EMPTY_STRING + 15, 6, 0, // IF_NOT_ERROR + 24, 1, // * LOAD_SAVED_POS <1> + 26, 0, 1, 0, // CALL <0>, pop 1, args [] + 9, // NIP + + 15, 62, 3, // IF_NOT_ERROR + // 'a'|..max| + 4, // * PUSH_EMPTY_ARRAY + 33, 1, 1, 8, // IF_GE_DYNAMIC <1> + 3, // * PUSH_FAILED + 18, 0, 2, 2, 22, 0, 23, 0, // * + 16, 35, // WHILE_NOT_ERROR + 10, // * APPEND + 33, 1, 1, 29, // IF_GE_DYNAMIC <1> + 3, // * PUSH_FAILED + 5, // * PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + + 15, 3, 4, // IF_NOT_ERROR + 11, 2, // * WRAP <2> + 9, // NIP + 8, 2, // * POP_N <2> + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [{ predicate: false, params: [], body: "return 42;" }] + )); + }); + }); + + describe("|x.. , delim| (edge case -- no max boundary)", () => { + const grammar = "start = min:(''{return 42;}) 'a'|min.. , 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 5, // PUSH_CURR_POS + // ''{return 42;} - min + 5, // PUSH_CURR_POS + 35, // PUSH_EMPTY_STRING + 15, 6, 0, // IF_NOT_ERROR + 24, 1, // * LOAD_SAVED_POS <1> + 26, 0, 1, 0, // CALL <0>, pop 1, args [] + 9, // NIP + + 15, 61, 3, // IF_NOT_ERROR + // 'a'|min..| + 5, // * PUSH_CURR_POS + 4, // PUSH_EMPTY_ARRAY + 18, 0, 2, 2, 22, 0, 23, 0, // + 16, 30, // WHILE_NOT_ERROR + 10, // * APPEND + 5, // PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + 32, 2, 3, 1, // IF_LT_DYNAMIC <2> + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + + 15, 3, 4, // IF_NOT_ERROR + 11, 2, // * WRAP <2> + 9, // NIP + 8, 2, // * POP_N <2> + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [{ predicate: false, params: [], body: "return 42;" }] + )); + }); + }); + + describe("|x..y, delim|", () => { + const grammar = "start = min:(''{return 42;}) max:(''{return 42;}) 'a'|min..max, 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 5, // PUSH_CURR_POS + // ''{return 42;} - min + 5, // PUSH_CURR_POS + 35, // PUSH_EMPTY_STRING + 15, 6, 0, // IF_NOT_ERROR + 24, 1, // * LOAD_SAVED_POS <1> + 26, 0, 1, 0, // CALL <0>, pop 1, args [] + 9, // NIP + + 15, 91, 3, // IF_NOT_ERROR + // ''{return 42;} - max + 5, // * PUSH_CURR_POS + 35, // PUSH_EMPTY_STRING + 15, 7, 0, // IF_NOT_ERROR + 24, 1, // * LOAD_SAVED_POS <1> + 26, 1, 1, 1, 2, // CALL <1>, pop 1, args [2] + 9, // NIP + + 15, 71, 4, // IF_NOT_ERROR + // 'a'|min..max| + 5, // * PUSH_CURR_POS + 4, // PUSH_EMPTY_ARRAY + 33, 2, 1, 8, // IF_GE_DYNAMIC <2> + 3, // * PUSH_FAILED + 18, 0, 2, 2, 22, 0, 23, 0, // * + 16, 35, // WHILE_NOT_ERROR + 10, // * APPEND + 33, 2, 1, 29, // IF_GE_DYNAMIC <2> + 3, // * PUSH_FAILED + 5, // * PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + 32, 3, 3, 1, // IF_LT_DYNAMIC <3> + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + + 15, 3, 4, // IF_NOT_ERROR + 11, 3, // * WRAP <3> + 9, // NIP + 8, 3, // * POP_N <3> + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 8, 2, // * POP_N <2> + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [ + { predicate: false, params: [], body: "return 42;" }, + { predicate: false, params: ["min"], body: "return 42;" }, + ] + )); + }); + }); + + describe("|exact, delim| (edge case -- exact repetitions)", () => { + const grammar = "start = exact:(''{return 42;}) 'a'|exact, 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 5, // PUSH_CURR_POS + // ''{return 42;} + 5, // PUSH_CURR_POS + 35, // PUSH_EMPTY_STRING + 15, 6, 0, // IF_NOT_ERROR + 24, 1, // * LOAD_SAVED_POS <1> + 26, 0, 1, 0, // CALL <0>, pop 1, args [] + 9, // NIP + + 15, 71, 3, // IF_NOT_ERROR + // 'a'|exact| + 5, // * PUSH_CURR_POS + 4, // PUSH_EMPTY_ARRAY + 33, 2, 1, 8, // IF_GE_DYNAMIC <2> + 3, // * PUSH_FAILED + 18, 0, 2, 2, 22, 0, 23, 0, // * + 16, 35, // WHILE_NOT_ERROR + 10, // * APPEND + 33, 2, 1, 29, // IF_GE_DYNAMIC <2> + 3, // * PUSH_FAILED + 5, // * PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + 32, 2, 3, 1, // IF_LT_DYNAMIC <2> + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + + 15, 3, 4, // IF_NOT_ERROR + 11, 2, // * WRAP <2> + 9, // NIP + 8, 2, // * POP_N <2> + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [{ predicate: false, params: [], body: "return 42;" }] + )); + }); + }); + + describe("used in delimiter", () => { + describe("delim|min..|", () => { + const grammar = "start = min:(''{return 42;}) 'a'|.., 'b'|min..| |"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 5, // PUSH_CURR_POS + + // ''{return 42;} - min + 5, // PUSH_CURR_POS + 35, // PUSH_EMPTY_STRING + 15, 6, 0, // IF_NOT_ERROR + 24, 1, // * LOAD_SAVED_POS <1> + 26, 0, 1, 0, // CALL <0>, pop 1, args [] + 9, // NIP + + 15, 74, 3, // IF_NOT_ERROR + 4, // * PUSH_EMPTY_ARRAY + 18, 0, 2, 2, 22, 0, 23, 0, // + 16, 52, // WHILE_NOT_ERROR + 10, // * APPEND + 5, // PUSH_CURR_POS + + // 'b'|min..| + 5, // PUSH_CURR_POS + 4, // PUSH_EMPTY_ARRAY + 18, 1, 2, 2, 22, 1, 23, 1, // + 16, 9, // WHILE_NOT_ERROR + 10, // * APPEND + 18, 1, 2, 2, 22, 1, 23, 1, // + 6, // POP + 32, 4, 3, 1, // IF_LT_DYNAMIC <4> + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + + 15, 16, 1, // IF_NOT_ERROR - delimiter matched? + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // NIP + 6, // POP + 15, 3, 4, // IF_NOT_ERROR + 11, 2, // * WRAP <2> + 9, // NIP + 8, 2, // * POP_N <2> + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [{ predicate: false, params: [], body: "return 42;" }] + )); + }); + }); + + describe("delim|..max|", () => { + const grammar = "start = max:(''{return 42;}) 'a'|.., 'b'|..max| |"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 5, // PUSH_CURR_POS + + // ''{return 42;} - max + 5, // PUSH_CURR_POS + 35, // PUSH_EMPTY_STRING + 15, 6, 0, // IF_NOT_ERROR + 24, 1, // * LOAD_SAVED_POS <1> + 26, 0, 1, 0, // CALL <0>, pop 1, args [] + 9, // NIP + + 15, 75, 3, // IF_NOT_ERROR + 4, // * PUSH_EMPTY_ARRAY + 18, 0, 2, 2, 22, 0, 23, 0, // + 16, 53, // WHILE_NOT_ERROR + 10, // * APPEND + + // 'b'|..max| + 5, // PUSH_CURR_POS + 4, // PUSH_EMPTY_ARRAY + 33, 3, 1, 8, // IF_GE_DYNAMIC <3> + 3, // * PUSH_FAILED + 18, 1, 2, 2, 22, 1, 23, 1, // * + 16, 14, // WHILE_NOT_ERROR + 10, // * APPEND + 33, 3, 1, 8, // IF_GE_DYNAMIC <3> + 3, // * PUSH_FAILED + 18, 1, 2, 2, 22, 1, 23, 1, // * + 6, // POP + + 15, 16, 1, // IF_NOT_ERROR - delimiter matched? + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // NIP + 6, // POP + 15, 3, 4, // IF_NOT_ERROR + 11, 2, // * WRAP <2> + 9, // NIP + 8, 2, // * POP_N <2> + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [{ predicate: false, params: [], body: "return 42;" }] + )); + }); + }); + + describe("delim|exact|", () => { + const grammar = "start = exact:(''{return 42;}) 'a'|.., 'b'|exact| |"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 5, // PUSH_CURR_POS + + // ''{return 42;} - exact + 5, // PUSH_CURR_POS + 35, // PUSH_EMPTY_STRING + 15, 6, 0, // IF_NOT_ERROR + 24, 1, // * LOAD_SAVED_POS <1> + 26, 0, 1, 0, // CALL <0>, pop 1, args [] + 9, // NIP + + 15, 84, 3, // IF_NOT_ERROR + 4, // * PUSH_EMPTY_ARRAY + 18, 0, 2, 2, 22, 0, 23, 0, // + 16, 62, // WHILE_NOT_ERROR + 10, // * APPEND + 5, // PUSH_CURR_POS + + // 'b'|exact| + 5, // PUSH_CURR_POS + 4, // PUSH_EMPTY_ARRAY + 33, 4, 1, 8, // IF_GE_DYNAMIC <4> + 3, // * PUSH_FAILED + 18, 1, 2, 2, 22, 1, 23, 1, // * + 16, 14, // WHILE_NOT_ERROR + 10, // * APPEND + 33, 4, 1, 8, // IF_GE_DYNAMIC <4> + 3, // * PUSH_FAILED + 18, 1, 2, 2, 22, 1, 23, 1, // * + 6, // POP + 32, 4, 3, 1, // IF_LT_DYNAMIC <4> + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + + 15, 16, 1, // IF_NOT_ERROR - delimiter matched? + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // NIP + 6, // POP + 15, 3, 4, // IF_NOT_ERROR + 11, 2, // * WRAP <2> + 9, // NIP + 8, 2, // * POP_N <2> + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [{ predicate: false, params: [], body: "return 42;" }] + )); + }); + }); + }); + }); + + describe("with function boundaries", () => { + describe("| ..x, delim| (edge case -- no min boundary)", () => { + const grammar = "start = 'a'| ..{return 42;}, 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 26, 0, 0, 0, // CALL <0>, pop 0, args [] + + 4, // PUSH_EMPTY_ARRAY + 33, 1, 1, 8, // IF_GE_DYNAMIC <1> + 3, // * PUSH_FAILED + 18, 0, 2, 2, 22, 0, 23, 0, // * + 16, 35, // WHILE_NOT_ERROR + 10, // * APPEND + 33, 1, 1, 29, // IF_GE_DYNAMIC <1> + 3, // * PUSH_FAILED + 5, // * PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + + 9, // NIP + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [{ predicate: true, params: [], body: "return 42;" }] + )); + }); + }); + + describe("|x.. , delim| (edge case -- no max boundary)", () => { + const grammar = "start = 'a'|{return 42;}.. , 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 26, 0, 0, 0, // CALL <0>, pop 0, args [] + + 5, // PUSH_CURR_POS + 4, // PUSH_EMPTY_ARRAY + 18, 0, 2, 2, 22, 0, 23, 0, // + 16, 30, // WHILE_NOT_ERROR + 10, // * APPEND + 5, // PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + + 32, 2, 3, 1, // IF_LT_DYNAMIC <2> + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + + 9, // NIP + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [{ predicate: true, params: [], body: "return 42;" }] + )); + }); + }); + + describe("|x..y, delim|", () => { + const grammar = "start = 'a'|{return 41;}..{return 43;}, 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 26, 0, 0, 0, // CALL <0>, pop 0, args [] + 26, 1, 0, 0, // CALL <1>, pop 0, args [] + + 5, // PUSH_CURR_POS + 4, // PUSH_EMPTY_ARRAY + 33, 2, 1, 8, // IF_GE_DYNAMIC <2> + 3, // * PUSH_FAILED + 18, 0, 2, 2, 22, 0, 23, 0, // * + 16, 35, // WHILE_NOT_ERROR + 10, // * APPEND + 33, 2, 1, 29, // IF_GE_DYNAMIC <2> + 3, // * PUSH_FAILED + 5, // * PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + + 32, 3, 3, 1, // IF_LT_DYNAMIC <3> + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + + 9, // NIP + 9, // NIP + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [ + { predicate: true, params: [], body: "return 41;" }, + { predicate: true, params: [], body: "return 43;" }, + ] + )); + }); + }); + + describe("|exact, delim| (edge case -- exact repetitions)", () => { + const grammar = "start = 'a'|{return 42;}, 'b'|"; + + it("generates correct bytecode", () => { + expect(pass).to.changeAST(grammar, bytecodeDetails([ + 26, 0, 0, 0, // CALL <0>, pop 0, args [] + + 5, // PUSH_CURR_POS + 4, // PUSH_EMPTY_ARRAY + 33, 2, 1, 8, // IF_GE_DYNAMIC <2> + 3, // * PUSH_FAILED + 18, 0, 2, 2, 22, 0, 23, 0, // * + 16, 35, // WHILE_NOT_ERROR + 10, // * APPEND + 33, 2, 1, 29, // IF_GE_DYNAMIC <2> + 3, // * PUSH_FAILED + 5, // * PUSH_CURR_POS + 18, 1, 2, 2, 22, 1, 23, 1, // + 15, 16, 1, // IF_NOT_ERROR + 6, // * POP + 18, 0, 2, 2, 22, 0, 23, 0, // + 14, 3, 1, // IF_ERROR + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + 9, // * NIP + 6, // POP + + 32, 2, 3, 1, // IF_LT_DYNAMIC <2> + 6, // * POP + 7, // POP_CURR_POS + 3, // PUSH_FAILED + 9, // * NIP + + 9, // NIP + ])); + }); + + it("defines correct constants", () => { + expect(pass).to.changeAST(grammar, constsDetails( + ["a", "b"], + [], + [ + { type: "literal", value: "a", ignoreCase: false }, + { type: "literal", value: "b", ignoreCase: false }, + ], + [{ predicate: true, params: [], body: "return 42;" }] + )); + }); + }); + }); + }); }); describe("for group", () => { diff --git a/test/unit/compiler/passes/inference-match-result.spec.js b/test/unit/compiler/passes/inference-match-result.spec.js index 5835105b..d2202ab8 100644 --- a/test/unit/compiler/passes/inference-match-result.spec.js +++ b/test/unit/compiler/passes/inference-match-result.spec.js @@ -199,6 +199,225 @@ describe("compiler pass |inferenceMatchResult|", () => { }); }); }); + + describe("with delimiter", () => { + describe("with constant boundaries", () => { + it("for | .. , delimiter| correctly", () => { + expect(pass).to.changeAST("start = .| .. , .|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = .| .. ,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = .| .. ,[]|", { rules: [{ match: 1 }] }); + + expect(pass).to.changeAST("start = ''| .. , .|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = ''| .. ,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = ''| .. ,[]|", { rules: [{ match: 1 }] }); + + expect(pass).to.changeAST("start = []| .. , .|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = []| .. ,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = []| .. ,[]|", { rules: [{ match: 1 }] }); + }); + it("for | ..1, delimiter| correctly", () => { + expect(pass).to.changeAST("start = .| ..1, .|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = .| ..1,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = .| ..1,[]|", { rules: [{ match: 1 }] }); + + expect(pass).to.changeAST("start = ''| ..1, .|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = ''| ..1,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = ''| ..1,[]|", { rules: [{ match: 1 }] }); + + expect(pass).to.changeAST("start = []| ..1, .|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = []| ..1,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = []| ..1,[]|", { rules: [{ match: 1 }] }); + }); + it("for | ..3, delimiter| correctly", () => { + expect(pass).to.changeAST("start = .| ..3, .|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = .| ..3,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = .| ..3,[]|", { rules: [{ match: 1 }] }); + + expect(pass).to.changeAST("start = ''| ..3, .|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = ''| ..3,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = ''| ..3,[]|", { rules: [{ match: 1 }] }); + + expect(pass).to.changeAST("start = []| ..3, .|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = []| ..3,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = []| ..3,[]|", { rules: [{ match: 1 }] }); + }); + it("for |0.. , delimiter| correctly", () => { + expect(pass).to.changeAST("start = .|0.. , .|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = .|0.. ,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = .|0.. ,[]|", { rules: [{ match: 1 }] }); + + expect(pass).to.changeAST("start = ''|0.. , .|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = ''|0.. ,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = ''|0.. ,[]|", { rules: [{ match: 1 }] }); + + expect(pass).to.changeAST("start = []|0.. , .|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = []|0.. ,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = []|0.. ,[]|", { rules: [{ match: 1 }] }); + }); + it("for |1.. , delimiter| correctly", () => { + expect(pass).to.changeAST("start = .|1.. , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|1.. ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|1.. ,[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = ''|1.. , .|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = ''|1.. ,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = ''|1.. ,[]|", { rules: [{ match: 1 }] }); + + expect(pass).to.changeAST("start = []|1.. , .|", { rules: [{ match: -1 }] }); + expect(pass).to.changeAST("start = []|1.. ,''|", { rules: [{ match: -1 }] }); + expect(pass).to.changeAST("start = []|1.. ,[]|", { rules: [{ match: -1 }] }); + }); + it("for |2.. , delimiter| correctly", () => { + expect(pass).to.changeAST("start = .|2.. , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|2.. ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|2.. ,[]|", { rules: [{ match: -1 }] }); + + expect(pass).to.changeAST("start = ''|2.. , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''|2.. ,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = ''|2.. ,[]|", { rules: [{ match: -1 }] }); + + expect(pass).to.changeAST("start = []|2.. , .|", { rules: [{ match: -1 }] }); + expect(pass).to.changeAST("start = []|2.. ,''|", { rules: [{ match: -1 }] }); + expect(pass).to.changeAST("start = []|2.. ,[]|", { rules: [{ match: -1 }] }); + }); + it("for |2..3, delimiter| correctly", () => { + expect(pass).to.changeAST("start = .|2..3, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|2..3,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|2..3,[]|", { rules: [{ match: -1 }] }); + + expect(pass).to.changeAST("start = ''|2..3, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''|2..3,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = ''|2..3,[]|", { rules: [{ match: -1 }] }); + + expect(pass).to.changeAST("start = []|2..3, .|", { rules: [{ match: -1 }] }); + expect(pass).to.changeAST("start = []|2..3,''|", { rules: [{ match: -1 }] }); + expect(pass).to.changeAST("start = []|2..3,[]|", { rules: [{ match: -1 }] }); + }); + it("for | 42 , delimiter| correctly", () => { + expect(pass).to.changeAST("start = .| 42 , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .| 42 ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .| 42 ,[]|", { rules: [{ match: -1 }] }); + + expect(pass).to.changeAST("start = ''| 42 , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''| 42 ,''|", { rules: [{ match: 1 }] }); + expect(pass).to.changeAST("start = ''| 42 ,[]|", { rules: [{ match: -1 }] }); + + expect(pass).to.changeAST("start = []| 42 , .|", { rules: [{ match: -1 }] }); + expect(pass).to.changeAST("start = []| 42 ,''|", { rules: [{ match: -1 }] }); + expect(pass).to.changeAST("start = []| 42 ,[]|", { rules: [{ match: -1 }] }); + }); + }); + + describe("with variable boundaries", () => { + it("for | ..max, delimiter| correctly", () => { + expect(pass).to.changeAST("start = .| ..max, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .| ..max,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .| ..max,[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = ''| ..max, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''| ..max,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''| ..max,[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = []| ..max, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []| ..max,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []| ..max,[]|", { rules: [{ match: 0 }] }); + }); + it("for |min.. , delimiter| correctly", () => { + expect(pass).to.changeAST("start = .|min.. , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|min.. ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|min.. ,[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = ''|min.. , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''|min.. ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''|min.. ,[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = []|min.. , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []|min.. ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []|min.. ,[]|", { rules: [{ match: 0 }] }); + }); + it("for |min..max, delimiter| correctly", () => { + expect(pass).to.changeAST("start = .|min..max, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|min..max,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|min..max,[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = ''|min..max, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''|min..max,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''|min..max,[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = []|min..max, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []|min..max,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []|min..max,[]|", { rules: [{ match: 0 }] }); + }); + it("for | exact , delimiter| correctly", () => { + expect(pass).to.changeAST("start = .| exact , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .| exact ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .| exact ,[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = ''| exact , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''| exact ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''| exact ,[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = []| exact , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []| exact ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []| exact ,[]|", { rules: [{ match: 0 }] }); + }); + }); + + describe("with function boundaries", () => { + it("for | ..{}, delimiter| correctly", () => { + expect(pass).to.changeAST("start = .| ..{}, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .| ..{},''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .| ..{},[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = ''| ..{}, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''| ..{},''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''| ..{},[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = []| ..{}, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []| ..{},''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []| ..{},[]|", { rules: [{ match: 0 }] }); + }); + it("for |{}.. , delimiter| correctly", () => { + expect(pass).to.changeAST("start = .|{}.. , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|{}.. ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|{}.. ,[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = ''|{}.. , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''|{}.. ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''|{}.. ,[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = []|{}.. , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []|{}.. ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []|{}.. ,[]|", { rules: [{ match: 0 }] }); + }); + it("for |{}..{}, delimiter| correctly", () => { + expect(pass).to.changeAST("start = .|{}..{}, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|{}..{},''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .|{}..{},[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = ''|{}..{}, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''|{}..{},''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''|{}..{},[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = []|{}..{}, .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []|{}..{},''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []|{}..{},[]|", { rules: [{ match: 0 }] }); + }); + it("for | {} , delimiter| correctly", () => { + expect(pass).to.changeAST("start = .| {} , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .| {} ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = .| {} ,[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = ''| {} , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''| {} ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = ''| {} ,[]|", { rules: [{ match: 0 }] }); + + expect(pass).to.changeAST("start = []| {} , .|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []| {} ,''|", { rules: [{ match: 0 }] }); + expect(pass).to.changeAST("start = []| {} ,[]|", { rules: [{ match: 0 }] }); + }); + }); + }); }); it("calculate |match| property for |group| correctly", () => { diff --git a/test/unit/compiler/passes/report-duplicate-labels.spec.js b/test/unit/compiler/passes/report-duplicate-labels.spec.js index 7bf0772c..3849000e 100644 --- a/test/unit/compiler/passes/report-duplicate-labels.spec.js +++ b/test/unit/compiler/passes/report-duplicate-labels.spec.js @@ -41,6 +41,7 @@ describe("compiler pass |reportDuplicateLabels|", () => { expect(pass).to.not.reportError("start = (a:'a')* a:'a'"); expect(pass).to.not.reportError("start = (a:'a')+ a:'a'"); expect(pass).to.not.reportError("start = (a:'a')|2..3| a:'a'"); + expect(pass).to.not.reportError("start = 'a'|2..3, a:'a'| a:'a'"); expect(pass).to.not.reportError("start = (a:'a') a:'a'"); }); }); diff --git a/test/unit/compiler/passes/report-infinite-recursion.spec.js b/test/unit/compiler/passes/report-infinite-recursion.spec.js index 77825094..6d40a62d 100644 --- a/test/unit/compiler/passes/report-infinite-recursion.spec.js +++ b/test/unit/compiler/passes/report-infinite-recursion.spec.js @@ -136,4 +136,26 @@ describe("compiler pass |reportInfiniteRecursion|", () => { expect(pass).to.not.reportError("start = . start"); }); }); + + describe("in repeated with delimiter", () => { + it("doesn't report left recursion for delimiter if expression not match empty string", () => { + expect(pass).to.not.reportError("start = 'a'| .. , start|"); + expect(pass).to.not.reportError("start = 'a'|0.. , start|"); + expect(pass).to.not.reportError("start = 'a'|1.. , start|"); + expect(pass).to.not.reportError("start = 'a'|2.. , start|"); + expect(pass).to.not.reportError("start = 'a'| ..3, start|"); + expect(pass).to.not.reportError("start = 'a'|2..3, start|"); + expect(pass).to.not.reportError("start = 'a'| 42 , start|"); + }); + + it("reports left recursion for delimiter if expression match empty string", () => { + expect(pass).to.reportError("start = ''| .. , start|"); + expect(pass).to.reportError("start = ''|0.. , start|"); + expect(pass).to.reportError("start = ''|1.. , start|"); + expect(pass).to.reportError("start = ''|2.. , start|"); + expect(pass).to.reportError("start = ''| ..3, start|"); + expect(pass).to.reportError("start = ''|2..3, start|"); + expect(pass).to.reportError("start = ''| 42 , start|"); + }); + }); }); diff --git a/test/unit/compiler/passes/report-infinite-repetition.spec.js b/test/unit/compiler/passes/report-infinite-repetition.spec.js index cd1f99d9..f60b0693 100644 --- a/test/unit/compiler/passes/report-infinite-repetition.spec.js +++ b/test/unit/compiler/passes/report-infinite-repetition.spec.js @@ -103,6 +103,108 @@ describe("compiler pass |reportInfiniteRepetition|", () => { expect(pass).to.not.reportError("start = ('')|{}|"); }); }); + + describe("with empty delimiter", () => { + it("with constant boundaries", () => { + expect(pass).to.reportError("start = ('')| .., ''|", { + message: "Possible infinite loop when parsing (unbounded range repetition used with an expression that may not consume any input)", + location: { + source: undefined, + start: { offset: 8, line: 1, column: 9 }, + end: { offset: 21, line: 1, column: 22 }, + }, + }); + expect(pass).to.reportError("start = ('')|0.., ''|", { + message: "Possible infinite loop when parsing (unbounded range repetition used with an expression that may not consume any input)", + location: { + source: undefined, + start: { offset: 8, line: 1, column: 9 }, + end: { offset: 21, line: 1, column: 22 }, + }, + }); + expect(pass).to.reportError("start = ('')|1.., ''|", { + message: "Possible infinite loop when parsing (unbounded range repetition used with an expression that may not consume any input)", + location: { + source: undefined, + start: { offset: 8, line: 1, column: 9 }, + end: { offset: 21, line: 1, column: 22 }, + }, + }); + expect(pass).to.reportError("start = ('')|2.., ''|", { + message: "Possible infinite loop when parsing (unbounded range repetition used with an expression that may not consume any input)", + location: { + source: undefined, + start: { offset: 8, line: 1, column: 9 }, + end: { offset: 21, line: 1, column: 22 }, + }, + }); + + expect(pass).to.not.reportError("start = ('')| ..1, ''|"); + expect(pass).to.not.reportError("start = ('')| ..3, ''|"); + expect(pass).to.not.reportError("start = ('')|2..3, ''|"); + expect(pass).to.not.reportError("start = ('')| 42 , ''|"); + }); + + it("with variable boundaries", () => { + expect(pass).to.reportError("start = ('')|len.., ''|", { + message: "Possible infinite loop when parsing (unbounded range repetition used with an expression that may not consume any input)", + location: { + source: undefined, + start: { offset: 8, line: 1, column: 9 }, + end: { offset: 23, line: 1, column: 24 }, + }, + }); + + expect(pass).to.not.reportError("start = ('')|..len, ''|"); + expect(pass).to.not.reportError("start = ('')|len1..len2, ''|"); + expect(pass).to.not.reportError("start = ('')|len, ''|"); + }); + + it("with function boundaries", () => { + expect(pass).to.reportError("start = ('')|{}.., ''|", { + message: "Possible infinite loop when parsing (unbounded range repetition used with an expression that may not consume any input)", + location: { + source: undefined, + start: { offset: 8, line: 1, column: 9 }, + end: { offset: 22, line: 1, column: 23 }, + }, + }); + + expect(pass).to.not.reportError("start = ('')|..{}, ''|"); + expect(pass).to.not.reportError("start = ('')|{}..{}, ''|"); + expect(pass).to.not.reportError("start = ('')|{}, ''|"); + }); + }); + + describe("with non-empty delimiter", () => { + it("with constant boundaries", () => { + expect(pass).to.not.reportError("start = ('')| .., 'a'|"); + expect(pass).to.not.reportError("start = ('')|0.., 'a'|"); + expect(pass).to.not.reportError("start = ('')|1.., 'a'|"); + expect(pass).to.not.reportError("start = ('')|2.., 'a'|"); + + expect(pass).to.not.reportError("start = ('')| ..1, 'a'|"); + expect(pass).to.not.reportError("start = ('')| ..3, 'a'|"); + expect(pass).to.not.reportError("start = ('')|2..3, 'a'|"); + expect(pass).to.not.reportError("start = ('')| 42 , 'a'|"); + }); + + it("with variable boundaries", () => { + expect(pass).to.not.reportError("start = ('')|len.., 'a'|"); + + expect(pass).to.not.reportError("start = ('')|..len, 'a'|"); + expect(pass).to.not.reportError("start = ('')|len1..len2, 'a'|"); + expect(pass).to.not.reportError("start = ('')|len, 'a'|"); + }); + + it("with function boundaries", () => { + expect(pass).to.not.reportError("start = ('')|{}.., 'a'|"); + + expect(pass).to.not.reportError("start = ('')|..{}, 'a'|"); + expect(pass).to.not.reportError("start = ('')|{}..{}, 'a'|"); + expect(pass).to.not.reportError("start = ('')|{}, 'a'|"); + }); + }); }); it("computes expressions that always consume input on success correctly", () => { diff --git a/test/unit/parser.spec.js b/test/unit/parser.spec.js index 2f46c2fb..799ef474 100644 --- a/test/unit/parser.spec.js +++ b/test/unit/parser.spec.js @@ -101,17 +101,24 @@ describe("Peggy grammar parser", () => { return oneRuleGrammar({ type: "rule_ref", name }); } - function repeatedGrammar(min, max, type = "variable") { + function repeatedGrammar(min, max, type = "variable", delimiter = null) { return oneRuleGrammar({ type: "repeated", min: { type: typeof min === "string" ? type : "constant", value: min }, max: { type: typeof max === "string" ? type : "constant", value: max }, expression: literalAbcd, + delimiter, }); } function repeatedGrammar2(min, max) { return repeatedGrammar(min, max, "function"); } + function repeatedGrammar3(min, max) { + return repeatedGrammar(min, max, "variable", literalEfgh); + } + function repeatedGrammar4(min, max) { + return repeatedGrammar(min, max, "function", literalEfgh); + } const trivialGrammar = literalGrammar("abcd", false); const twoRuleGrammar = { @@ -194,6 +201,12 @@ describe("Peggy grammar parser", () => { delete node.max.codeLocation; delete node.location; strip(node.expression); + + if (node.delimiter) { + delete node.delimiter.location; + + strip(node.delimiter); + } }, group: stripExpression, semantic_and: stripLeaf, @@ -451,6 +464,7 @@ describe("Peggy grammar parser", () => { min: null, max: { type: "constant", value: 3 }, expression: literalAbcd, + delimiter: null, }); expect("start = 'abcd'\n|3|").to.parseAs(grammar); expect("start = 'abcd'|\n3|").to.parseAs(grammar); @@ -471,6 +485,7 @@ describe("Peggy grammar parser", () => { min: null, max: { type: "variable", value: "exact" }, expression: literalAbcd, + delimiter: null, }); expect("start = 'abcd'\n|exact|").to.parseAs(grammar); expect("start = 'abcd'|\nexact|").to.parseAs(grammar); @@ -491,6 +506,7 @@ describe("Peggy grammar parser", () => { min: null, max: { type: "function", value: "exact" }, expression: literalAbcd, + delimiter: null, }); expect("start = 'abcd'\n|{exact}|").to.parseAs(grammar); expect("start = 'abcd'|\n{exact}|").to.parseAs(grammar); @@ -515,6 +531,149 @@ describe("Peggy grammar parser", () => { expect("start = 'abcd'|min..3\n|").to.parseAs(grammar); }); }); + + describe("with delimiter", () => { + it("with constant boundaries", () => { + let grammar = repeatedGrammar3(2, 3); + expect("start = 'abcd'|2..3,'efgh'| ").to.parseAs(grammar); + expect("start = 'abcd'\n|2..3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|\n2..3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2\n..3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2..\n3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2..3\n,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2..3,\n'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2..3,'efgh'\n|").to.parseAs(grammar); + + grammar = oneRuleGrammar({ + type: "repeated", + min: null, + max: { type: "constant", value: 3 }, + expression: literalAbcd, + delimiter: literalEfgh, + }); + expect("start = 'abcd'\n|3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|\n3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|3\n,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|3,\n'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|3,'efgh'\n|").to.parseAs(grammar); + + expect("start = 'abcd'|3, 'efgh'?|").to.parseAs(oneRuleGrammar({ + type: "repeated", + min: null, + max: { type: "constant", value: 3 }, + expression: literalAbcd, + delimiter: { type: "optional", expression: literalEfgh }, + })); + }); + + it("with variable boundaries", () => { + let grammar = repeatedGrammar3("min", "max"); + expect("start = 'abcd'|min..max,'efgh'| ").to.parseAs(grammar); + expect("start = 'abcd'\n|min..max,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|\nmin..max,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|min\n..max,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|min..\nmax,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|min..max\n,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|min..max,\n'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|min..max,'efgh'\n|").to.parseAs(grammar); + + grammar = oneRuleGrammar({ + type: "repeated", + min: null, + max: { type: "variable", value: "exact" }, + expression: literalAbcd, + delimiter: literalEfgh, + }); + expect("start = 'abcd'\n|exact,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|\nexact,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|exact\n,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|exact,\n'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|exact,'efgh'\n|").to.parseAs(grammar); + + expect("start = 'abcd'|exact, 'efgh'?|").to.parseAs(oneRuleGrammar({ + type: "repeated", + min: null, + max: { type: "variable", value: "exact" }, + expression: literalAbcd, + delimiter: { type: "optional", expression: literalEfgh }, + })); + }); + + it("with function boundaries", () => { + let grammar = repeatedGrammar4("min", "max"); + expect("start = 'abcd'|{min}..{max},'efgh'| ").to.parseAs(grammar); + expect("start = 'abcd'\n|{min}..{max},'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|\n{min}..{max},'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|{min}\n..{max},'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|{min}..\n{max},'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|{min}..{max}\n,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|{min}..{max},\n'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|{min}..{max},'efgh'\n|").to.parseAs(grammar); + + grammar = oneRuleGrammar({ + type: "repeated", + min: null, + max: { type: "function", value: "exact" }, + expression: literalAbcd, + delimiter: literalEfgh, + }); + expect("start = 'abcd'\n|{exact},'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|\n{exact},'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|{exact}\n,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|{exact},\n'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|{exact},'efgh'\n|").to.parseAs(grammar); + + expect("start = 'abcd'|{exact}, 'efgh'?|").to.parseAs(oneRuleGrammar({ + type: "repeated", + min: null, + max: { type: "function", value: "exact" }, + expression: literalAbcd, + delimiter: { type: "optional", expression: literalEfgh }, + })); + }); + + it("with mixed boundaries", () => { + let grammar = repeatedGrammar3(2, "max"); + expect("start = 'abcd'|2..max,'efgh'| ").to.parseAs(grammar); + expect("start = 'abcd'\n|2..max,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|\n2..max,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2\n..max,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2..\nmax,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2..max\n,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2..max,\n'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2..max,'efgh'\n|").to.parseAs(grammar); + + grammar = repeatedGrammar3("min", 3); + expect("start = 'abcd'|min..3,'efgh'| ").to.parseAs(grammar); + expect("start = 'abcd'\n|min..3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|\nmin..3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|min\n..3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|min..\n3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|min..3\n,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|min..3,\n'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|min..3,'efgh'\n|").to.parseAs(grammar); + + grammar = repeatedGrammar4(2, "max"); + expect("start = 'abcd'|2..{max},'efgh'| ").to.parseAs(grammar); + expect("start = 'abcd'\n|2..{max},'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|\n2..{max},'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2\n..{max},'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2..\n{max},'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2..{max}\n,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2..{max},\n'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|2..{max},'efgh'\n|").to.parseAs(grammar); + + grammar = repeatedGrammar4("min", 3); + expect("start = 'abcd'|{min}..3,'efgh'| ").to.parseAs(grammar); + expect("start = 'abcd'\n|{min}..3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|\n{min}..3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|{min}\n..3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|{min}..\n3,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|{min}..3\n,'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|{min}..3,\n'efgh'|").to.parseAs(grammar); + expect("start = 'abcd'|{min}..3,'efgh'\n|").to.parseAs(grammar); + }); + }); }); // Canonical RepeatedOperator is "2..3". @@ -536,6 +695,7 @@ describe("Peggy grammar parser", () => { min: null, max: { type: "constant", value: 3 }, expression: literalAbcd, + delimiter: null, })); expect("start = 'abcd'| ..0|").to.failToParse(); @@ -552,6 +712,7 @@ describe("Peggy grammar parser", () => { min: null, max: { type: "variable", value: "exact" }, expression: literalAbcd, + delimiter: null, })); }); @@ -564,12 +725,76 @@ describe("Peggy grammar parser", () => { min: null, max: { type: "function", value: "exact" }, expression: literalAbcd, + delimiter: null, })); }); it("with mixed boundaries", () => { expect("start = 'abcd'|2..max|").to.parseAs(repeatedGrammar(2, "max")); expect("start = 'abcd'|min..3|").to.parseAs(repeatedGrammar("min", 3)); + + expect("start = 'abcd'|2..{max}|").to.parseAs(repeatedGrammar2(2, "max")); + expect("start = 'abcd'|{min}..3|").to.parseAs(repeatedGrammar2("min", 3)); + }); + }); + + describe("with delimiter", () => { + it("with constant boundaries", () => { + expect("start = 'abcd'| .. , 'efgh'|").to.parseAs(repeatedGrammar3(0, null)); + expect("start = 'abcd'|0.. , 'efgh'|").to.parseAs(repeatedGrammar3(0, null)); + expect("start = 'abcd'|1.. , 'efgh'|").to.parseAs(repeatedGrammar3(1, null)); + expect("start = 'abcd'|2.. , 'efgh'|").to.parseAs(repeatedGrammar3(2, null)); + + expect("start = 'abcd'| ..1, 'efgh'|").to.parseAs(repeatedGrammar3(0, 1)); + expect("start = 'abcd'| ..2, 'efgh'|").to.parseAs(repeatedGrammar3(0, 2)); + + expect("start = 'abcd'|2..2, 'efgh'|").to.parseAs(repeatedGrammar3(2, 2)); + expect("start = 'abcd'|2..3, 'efgh'|").to.parseAs(repeatedGrammar3(2, 3)); + expect("start = 'abcd'|3 , 'efgh'|").to.parseAs(oneRuleGrammar({ + type: "repeated", + min: null, + max: { type: "constant", value: 3 }, + expression: literalAbcd, + delimiter: literalEfgh, + })); + + expect("start = 'abcd'| ..0, 'efgh'|").to.failToParse(); + expect("start = 'abcd'|0..0, 'efgh'|").to.failToParse(); + expect("start = 'abcd'|0 , 'efgh'|").to.failToParse(); + }); + + it("with variable boundaries", () => { + expect("start = 'abcd'|min.. , 'efgh'|").to.parseAs(repeatedGrammar3("min", null)); + expect("start = 'abcd'| ..max, 'efgh'|").to.parseAs(repeatedGrammar3(0, "max")); + expect("start = 'abcd'|min..max, 'efgh'|").to.parseAs(repeatedGrammar3("min", "max")); + expect("start = 'abcd'|exact, 'efgh'| ").to.parseAs(oneRuleGrammar({ + type: "repeated", + min: null, + max: { type: "variable", value: "exact" }, + expression: literalAbcd, + delimiter: literalEfgh, + })); + }); + + it("with function boundaries", () => { + expect("start = 'abcd'|{min}.. , 'efgh'|").to.parseAs(repeatedGrammar4("min", null)); + expect("start = 'abcd'| ..{max}, 'efgh'|").to.parseAs(repeatedGrammar4(0, "max")); + expect("start = 'abcd'|{min}..{max}, 'efgh'|").to.parseAs(repeatedGrammar4("min", "max")); + expect("start = 'abcd'|{exact}, 'efgh'|").to.parseAs(oneRuleGrammar({ + type: "repeated", + min: null, + max: { type: "function", value: "exact" }, + expression: literalAbcd, + delimiter: literalEfgh, + })); + }); + + it("with mixed boundaries", () => { + expect("start = 'abcd'|2..max, 'efgh'|").to.parseAs(repeatedGrammar3(2, "max")); + expect("start = 'abcd'|min..3, 'efgh'|").to.parseAs(repeatedGrammar3("min", 3)); + + expect("start = 'abcd'|2..{max}, 'efgh'|").to.parseAs(repeatedGrammar4(2, "max")); + expect("start = 'abcd'|{min}..3, 'efgh'|").to.parseAs(repeatedGrammar4("min", 3)); }); }); });