diff --git a/Gruntfile.js b/Gruntfile.js index 853b6d0e..723050f2 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,10 +1,10 @@ -module.exports = function(grunt) { - 'use strict'; +module.exports = function (grunt) { + 'use strict'; require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks); require('time-grunt')(grunt); - - grunt.registerMultiTask('rex', 'Generate Parsers', function(){ + + grunt.registerMultiTask('rex', 'Generate Parsers', function () { var fs = require('fs'); var request = require('request'); var FormData = require('form-data'); @@ -12,16 +12,16 @@ module.exports = function(grunt) { var Q = require('q'); var done = this.async(); var promises = []; - this.data.grammars.forEach(function(parser){ + this.data.grammars.forEach(function (parser) { var deferred = Q.defer(); var grammar = fs.readFileSync(parser.source); var form = new FormData(); - form.append('tz', parser.tz, { knownLength: new Buffer(parser.tz).length, contentType: 'text/plain' }); + form.append('tz', parser.tz, { knownLength: new Buffer(parser.tz).length, contentType: 'text/plain' }); form.append('command', parser.command, { knownLength: new Buffer(parser.command).length, contentType: 'text/plain' }); - form.append('input', grammar, { knownLength : new Buffer(grammar).length, contentType: 'text/plain', filename: path.basename(parser.source) }); + form.append('input', grammar, { knownLength: new Buffer(grammar).length, contentType: 'text/plain', filename: path.basename(parser.source) }); var length = form.getLengthSync(); - var r = request.post('http://www.bottlecaps.de/rex/', function(err, res, body) { - if(err) { + var r = request.post('https://www.bottlecaps.de/rex/', function (err, res, body) { + if (err) { deferred.reject(err); } else { fs.writeFileSync(parser.destination, body); @@ -33,49 +33,49 @@ module.exports = function(grunt) { promises.push(deferred.promise); }); Q.all(promises) - .then(function(){ - done(); - }) - .catch(function(error){ - grunt.fail.fatal(error); - }); + .then(function () { + done(); + }) + .catch(function (error) { + grunt.fail.fatal(error); + }); }); - + grunt.initConfig({ rex: { parsers: { grammars: [ - { - source: 'lib/parsers/XQueryParser.ebnf', - destination: 'lib/parsers/XQueryParser.js', - command: '-ll 2 -backtrack -tree -javascript -a xqlint', - tz: '-60', - }, - { - source: 'lib/parsers/JSONiqParser.ebnf', - destination: 'lib/parsers/JSONiqParser.js', - command: '-ll 2 -backtrack -tree -javascript -a xqlint', - tz: '-60', - } + { + source: 'lib/parsers/XQueryParser.ebnf', + destination: 'lib/parsers/XQueryParser.js', + command: '-ll 2 -backtrack -tree -javascript -a xqlint', + tz: '-60', + }, + { + source: 'lib/parsers/JSONiqParser.ebnf', + destination: 'lib/parsers/JSONiqParser.js', + command: '-ll 2 -backtrack -tree -javascript -a xqlint', + tz: '-60', + } ] }, - lexers: { + lexers: { grammars: [ { - source: 'lib/lexers/XQueryTokenizer.ebnf', + source: 'lib/lexers/XQueryTokenizer.ebnf', destination: 'lib/lexers/XQueryTokenizer.js', command: '-ll 2 -backtrack -tree -javascript -a xqlint', tz: '-60' }, { - source: 'lib/lexers/JSONiqTokenizer.ebnf', + source: 'lib/lexers/JSONiqTokenizer.ebnf', destination: 'lib/lexers/JSONiqTokenizer.js', command: '-ll 2 -backtrack -tree -javascript -a xqlint', tz: '-60' } - ] - } - }, + ] + } + }, jshint: { options: { jshintrc: '.jshintrc' diff --git a/lib/lexers/JSONiqTokenizer.js b/lib/lexers/JSONiqTokenizer.js index 8fcd737b..e98786c4 100755 --- a/lib/lexers/JSONiqTokenizer.js +++ b/lib/lexers/JSONiqTokenizer.js @@ -1,4 +1,4 @@ -// This file was generated on Thu Jul 24, 2014 15:01 (UTC+01) by REx v5.30 which is Copyright (c) 1979-2014 by Gunther Rademacher +// This file was generated on Thu Oct 31, 2019 20:00 (UTC+01) by REx v5.49 which is Copyright (c) 1979-2019 by Gunther Rademacher // REx command line: JSONiqTokenizer.ebnf -ll 2 -backtrack -tree -javascript -a xqlint // line 2 "JSONiqTokenizer.ebnf" @@ -6,34 +6,36 @@ { init(string, parsingEventHandler); // line 9 "JSONiqTokenizer.js" - var self = this; + var thisParser = this; this.ParseException = function(b, e, s, o, x) { - var - begin = b, - end = e, - state = s, - offending = o, - expected = x; + var begin = b; + var end = e; + var state = s; + var offending = o; + var expected = x; this.getBegin = function() {return begin;}; this.getEnd = function() {return end;}; this.getState = function() {return state;}; this.getExpected = function() {return expected;}; this.getOffending = function() {return offending;}; + this.isAmbiguousInput = function() {return false;}; this.getMessage = function() { - return offending < 0 ? "lexical analysis failed" : "syntax error"; + return offending < 0 + ? "lexical analysis failed" + : "syntax error"; }; }; - function init(string, parsingEventHandler) + function init(source, parsingEventHandler) { eventHandler = parsingEventHandler; - input = string; - size = string.length; + input = source; + size = source.length; reset(0, 0, 0); } @@ -42,6 +44,16 @@ return input; }; + this.getTokenOffset = function() + { + return b0; + }; + + this.getTokenEnd = function() + { + return e0; + }; + function reset(l, b, e) { b0 = b; e0 = b; @@ -50,6 +62,11 @@ eventHandler.reset(input); } + this.reset = function(l, b, e) + { + reset(l, b, e); + }; + this.getOffendingToken = function(e) { var o = e.getOffending(); @@ -72,19 +89,20 @@ this.getErrorMessage = function(e) { - var tokenSet = this.getExpectedTokenSet(e); + var message = e.getMessage(); var found = this.getOffendingToken(e); + var tokenSet = this.getExpectedTokenSet(e); + var size = e.getEnd() - e.getBegin(); + message += (found == null ? "" : ", found " + found) + + "\nwhile expecting " + + (tokenSet.length == 1 ? tokenSet[0] : ("[" + tokenSet.join(", ") + "]")) + + "\n" + + (size == 0 || found != null ? "" : "after successfully scanning " + size + " characters beginning "); var prefix = input.substring(0, e.getBegin()); var lines = prefix.split("\n"); var line = lines.length; var column = lines[line - 1].length + 1; - var size = e.getEnd() - e.getBegin(); - return e.getMessage() - + (found == null ? "" : ", found " + found) - + "\nwhile expecting " - + (tokenSet.length == 1 ? tokenSet[0] : ("[" + tokenSet.join(", ") + "]")) - + "\n" - + (size == 0 || found != null ? "" : "after successfully scanning " + size + " characters beginning ") + return message + "at line " + line + ", column " + column + ":\n..." + input.substring(e.getBegin(), Math.min(input.length, e.getBegin() + 64)) + "..."; @@ -121,106 +139,106 @@ switch (l1) { case 58: // '' - shift(61); // '>' + consume(61); // '>' break; case 53: // '/>' - shift(53); // '/>' + consume(53); // '/>' break; case 29: // QName - shift(29); // QName + consume(29); // QName break; case 60: // '=' - shift(60); // '=' + consume(60); // '=' break; case 37: // '"' - shift(37); // '"' + consume(37); // '"' break; case 41: // "'" - shift(41); // "'" + consume(41); // "'" break; default: - shift(35); // EOF + consume(35); // EOF } eventHandler.endNonterminal("StartTag", e0); }; @@ -266,37 +284,37 @@ switch (l1) { case 25: // ElementContentChar - shift(25); // ElementContentChar + consume(25); // ElementContentChar break; case 9: // Tag - shift(9); // Tag + consume(9); // Tag break; case 10: // EndTag - shift(10); // EndTag + consume(10); // EndTag break; case 58: // '' - shift(67); // ']]>' + consume(67); // ']]>' break; default: - shift(35); // EOF + consume(35); // EOF } eventHandler.endNonterminal("CData", e0); }; @@ -400,13 +418,13 @@ switch (l1) { case 12: // DirCommentContents - shift(12); // DirCommentContents + consume(12); // DirCommentContents break; case 50: // '-->' - shift(50); // '-->' + consume(50); // '-->' break; default: - shift(35); // EOF + consume(35); // EOF } eventHandler.endNonterminal("XMLComment", e0); }; @@ -418,16 +436,16 @@ switch (l1) { case 13: // DirPIContents - shift(13); // DirPIContents + consume(13); // DirPIContents break; case 62: // '?' - shift(62); // '?' + consume(62); // '?' break; case 63: // '?>' - shift(63); // '?>' + consume(63); // '?>' break; default: - shift(35); // EOF + consume(35); // EOF } eventHandler.endNonterminal("PI", e0); }; @@ -439,16 +457,16 @@ switch (l1) { case 11: // PragmaContents - shift(11); // PragmaContents + consume(11); // PragmaContents break; case 38: // '#' - shift(38); // '#' + consume(38); // '#' break; case 39: // '#)' - shift(39); // '#)' + consume(39); // '#)' break; default: - shift(35); // EOF + consume(35); // EOF } eventHandler.endNonterminal("Pragma", e0); }; @@ -460,16 +478,16 @@ switch (l1) { case 55: // ':)' - shift(55); // ':)' + consume(55); // ':)' break; case 44: // '(:' - shift(44); // '(:' + consume(44); // '(:' break; case 32: // CommentContents - shift(32); // CommentContents + consume(32); // CommentContents break; default: - shift(35); // EOF + consume(35); // EOF } eventHandler.endNonterminal("Comment", e0); }; @@ -481,19 +499,19 @@ switch (l1) { case 33: // DocTag - shift(33); // DocTag + consume(33); // DocTag break; case 34: // DocCommentContents - shift(34); // DocCommentContents + consume(34); // DocCommentContents break; case 55: // ':)' - shift(55); // ':)' + consume(55); // ':)' break; case 44: // '(:' - shift(44); // '(:' + consume(44); // '(:' break; default: - shift(35); // EOF + consume(35); // EOF } eventHandler.endNonterminal("CommentDoc", e0); }; @@ -505,19 +523,19 @@ switch (l1) { case 3: // JSONPredefinedCharRef - shift(3); // JSONPredefinedCharRef + consume(3); // JSONPredefinedCharRef break; case 2: // JSONCharRef - shift(2); // JSONCharRef + consume(2); // JSONCharRef break; case 1: // JSONChar - shift(1); // JSONChar + consume(1); // JSONChar break; case 37: // '"' - shift(37); // '"' + consume(37); // '"' break; default: - shift(35); // EOF + consume(35); // EOF } eventHandler.endNonterminal("QuotString", e0); }; @@ -529,22 +547,22 @@ switch (l1) { case 21: // PredefinedEntityRef - shift(21); // PredefinedEntityRef + consume(21); // PredefinedEntityRef break; case 31: // CharRef - shift(31); // CharRef + consume(31); // CharRef break; case 23: // EscapeApos - shift(23); // EscapeApos + consume(23); // EscapeApos break; case 24: // AposChar - shift(24); // AposChar + consume(24); // AposChar break; case 41: // "'" - shift(41); // "'" + consume(41); // "'" break; default: - shift(35); // EOF + consume(35); // EOF } eventHandler.endNonterminal("AposString", e0); }; @@ -613,52 +631,52 @@ switch (l1) { case 80: // 'attribute' - shift(80); // 'attribute' + consume(80); // 'attribute' break; case 94: // 'comment' - shift(94); // 'comment' + consume(94); // 'comment' break; case 118: // 'document-node' - shift(118); // 'document-node' + consume(118); // 'document-node' break; case 119: // 'element' - shift(119); // 'element' + consume(119); // 'element' break; case 122: // 'empty-sequence' - shift(122); // 'empty-sequence' + consume(122); // 'empty-sequence' break; case 143: // 'function' - shift(143); // 'function' + consume(143); // 'function' break; case 150: // 'if' - shift(150); // 'if' + consume(150); // 'if' break; case 163: // 'item' - shift(163); // 'item' + consume(163); // 'item' break; case 183: // 'namespace-node' - shift(183); // 'namespace-node' + consume(183); // 'namespace-node' break; case 189: // 'node' - shift(189); // 'node' + consume(189); // 'node' break; case 214: // 'processing-instruction' - shift(214); // 'processing-instruction' + consume(214); // 'processing-instruction' break; case 224: // 'schema-attribute' - shift(224); // 'schema-attribute' + consume(224); // 'schema-attribute' break; case 225: // 'schema-element' - shift(225); // 'schema-element' + consume(225); // 'schema-element' break; case 241: // 'switch' - shift(241); // 'switch' + consume(241); // 'switch' break; case 242: // 'text' - shift(242); // 'text' + consume(242); // 'text' break; case 251: // 'typeswitch' - shift(251); // 'typeswitch' + consume(251); // 'typeswitch' break; default: parse_FunctionName(); @@ -672,343 +690,343 @@ switch (l1) { case 17: // EQName^Token - shift(17); // EQName^Token + consume(17); // EQName^Token break; case 68: // 'after' - shift(68); // 'after' + consume(68); // 'after' break; case 71: // 'ancestor' - shift(71); // 'ancestor' + consume(71); // 'ancestor' break; case 72: // 'ancestor-or-self' - shift(72); // 'ancestor-or-self' + consume(72); // 'ancestor-or-self' break; case 73: // 'and' - shift(73); // 'and' + consume(73); // 'and' break; case 77: // 'as' - shift(77); // 'as' + consume(77); // 'as' break; case 78: // 'ascending' - shift(78); // 'ascending' + consume(78); // 'ascending' break; case 82: // 'before' - shift(82); // 'before' + consume(82); // 'before' break; case 86: // 'case' - shift(86); // 'case' + consume(86); // 'case' break; case 87: // 'cast' - shift(87); // 'cast' + consume(87); // 'cast' break; case 88: // 'castable' - shift(88); // 'castable' + consume(88); // 'castable' break; case 91: // 'child' - shift(91); // 'child' + consume(91); // 'child' break; case 92: // 'collation' - shift(92); // 'collation' + consume(92); // 'collation' break; case 101: // 'copy' - shift(101); // 'copy' + consume(101); // 'copy' break; case 103: // 'count' - shift(103); // 'count' + consume(103); // 'count' break; case 106: // 'declare' - shift(106); // 'declare' + consume(106); // 'declare' break; case 107: // 'default' - shift(107); // 'default' + consume(107); // 'default' break; case 108: // 'delete' - shift(108); // 'delete' + consume(108); // 'delete' break; case 109: // 'descendant' - shift(109); // 'descendant' + consume(109); // 'descendant' break; case 110: // 'descendant-or-self' - shift(110); // 'descendant-or-self' + consume(110); // 'descendant-or-self' break; case 111: // 'descending' - shift(111); // 'descending' + consume(111); // 'descending' break; case 116: // 'div' - shift(116); // 'div' + consume(116); // 'div' break; case 117: // 'document' - shift(117); // 'document' + consume(117); // 'document' break; case 120: // 'else' - shift(120); // 'else' + consume(120); // 'else' break; case 121: // 'empty' - shift(121); // 'empty' + consume(121); // 'empty' break; case 124: // 'end' - shift(124); // 'end' + consume(124); // 'end' break; case 126: // 'eq' - shift(126); // 'eq' + consume(126); // 'eq' break; case 127: // 'every' - shift(127); // 'every' + consume(127); // 'every' break; case 129: // 'except' - shift(129); // 'except' + consume(129); // 'except' break; case 132: // 'first' - shift(132); // 'first' + consume(132); // 'first' break; case 133: // 'following' - shift(133); // 'following' + consume(133); // 'following' break; case 134: // 'following-sibling' - shift(134); // 'following-sibling' + consume(134); // 'following-sibling' break; case 135: // 'for' - shift(135); // 'for' + consume(135); // 'for' break; case 144: // 'ge' - shift(144); // 'ge' + consume(144); // 'ge' break; case 146: // 'group' - shift(146); // 'group' + consume(146); // 'group' break; case 148: // 'gt' - shift(148); // 'gt' + consume(148); // 'gt' break; case 149: // 'idiv' - shift(149); // 'idiv' + consume(149); // 'idiv' break; case 151: // 'import' - shift(151); // 'import' + consume(151); // 'import' break; case 157: // 'insert' - shift(157); // 'insert' + consume(157); // 'insert' break; case 158: // 'instance' - shift(158); // 'instance' + consume(158); // 'instance' break; case 160: // 'intersect' - shift(160); // 'intersect' + consume(160); // 'intersect' break; case 161: // 'into' - shift(161); // 'into' + consume(161); // 'into' break; case 162: // 'is' - shift(162); // 'is' + consume(162); // 'is' break; case 168: // 'last' - shift(168); // 'last' + consume(168); // 'last' break; case 170: // 'le' - shift(170); // 'le' + consume(170); // 'le' break; case 172: // 'let' - shift(172); // 'let' + consume(172); // 'let' break; case 176: // 'lt' - shift(176); // 'lt' + consume(176); // 'lt' break; case 178: // 'mod' - shift(178); // 'mod' + consume(178); // 'mod' break; case 179: // 'modify' - shift(179); // 'modify' + consume(179); // 'modify' break; case 180: // 'module' - shift(180); // 'module' + consume(180); // 'module' break; case 182: // 'namespace' - shift(182); // 'namespace' + consume(182); // 'namespace' break; case 184: // 'ne' - shift(184); // 'ne' + consume(184); // 'ne' break; case 196: // 'only' - shift(196); // 'only' + consume(196); // 'only' break; case 198: // 'or' - shift(198); // 'or' + consume(198); // 'or' break; case 199: // 'order' - shift(199); // 'order' + consume(199); // 'order' break; case 200: // 'ordered' - shift(200); // 'ordered' + consume(200); // 'ordered' break; case 204: // 'parent' - shift(204); // 'parent' + consume(204); // 'parent' break; case 210: // 'preceding' - shift(210); // 'preceding' + consume(210); // 'preceding' break; case 211: // 'preceding-sibling' - shift(211); // 'preceding-sibling' + consume(211); // 'preceding-sibling' break; case 216: // 'rename' - shift(216); // 'rename' + consume(216); // 'rename' break; case 217: // 'replace' - shift(217); // 'replace' + consume(217); // 'replace' break; case 218: // 'return' - shift(218); // 'return' + consume(218); // 'return' break; case 222: // 'satisfies' - shift(222); // 'satisfies' + consume(222); // 'satisfies' break; case 227: // 'self' - shift(227); // 'self' + consume(227); // 'self' break; case 233: // 'some' - shift(233); // 'some' + consume(233); // 'some' break; case 234: // 'stable' - shift(234); // 'stable' + consume(234); // 'stable' break; case 235: // 'start' - shift(235); // 'start' + consume(235); // 'start' break; case 246: // 'to' - shift(246); // 'to' + consume(246); // 'to' break; case 247: // 'treat' - shift(247); // 'treat' + consume(247); // 'treat' break; case 248: // 'try' - shift(248); // 'try' + consume(248); // 'try' break; case 252: // 'union' - shift(252); // 'union' + consume(252); // 'union' break; case 254: // 'unordered' - shift(254); // 'unordered' + consume(254); // 'unordered' break; case 258: // 'validate' - shift(258); // 'validate' + consume(258); // 'validate' break; case 264: // 'where' - shift(264); // 'where' + consume(264); // 'where' break; case 268: // 'with' - shift(268); // 'with' + consume(268); // 'with' break; case 272: // 'xquery' - shift(272); // 'xquery' + consume(272); // 'xquery' break; case 70: // 'allowing' - shift(70); // 'allowing' + consume(70); // 'allowing' break; case 79: // 'at' - shift(79); // 'at' + consume(79); // 'at' break; case 81: // 'base-uri' - shift(81); // 'base-uri' + consume(81); // 'base-uri' break; case 83: // 'boundary-space' - shift(83); // 'boundary-space' + consume(83); // 'boundary-space' break; case 84: // 'break' - shift(84); // 'break' + consume(84); // 'break' break; case 89: // 'catch' - shift(89); // 'catch' + consume(89); // 'catch' break; case 96: // 'construction' - shift(96); // 'construction' + consume(96); // 'construction' break; case 99: // 'context' - shift(99); // 'context' + consume(99); // 'context' break; case 100: // 'continue' - shift(100); // 'continue' + consume(100); // 'continue' break; case 102: // 'copy-namespaces' - shift(102); // 'copy-namespaces' + consume(102); // 'copy-namespaces' break; case 104: // 'decimal-format' - shift(104); // 'decimal-format' + consume(104); // 'decimal-format' break; case 123: // 'encoding' - shift(123); // 'encoding' + consume(123); // 'encoding' break; case 130: // 'exit' - shift(130); // 'exit' + consume(130); // 'exit' break; case 131: // 'external' - shift(131); // 'external' + consume(131); // 'external' break; case 139: // 'ft-option' - shift(139); // 'ft-option' + consume(139); // 'ft-option' break; case 152: // 'in' - shift(152); // 'in' + consume(152); // 'in' break; case 153: // 'index' - shift(153); // 'index' + consume(153); // 'index' break; case 159: // 'integrity' - shift(159); // 'integrity' + consume(159); // 'integrity' break; case 169: // 'lax' - shift(169); // 'lax' + consume(169); // 'lax' break; case 190: // 'nodes' - shift(190); // 'nodes' + consume(190); // 'nodes' break; case 197: // 'option' - shift(197); // 'option' + consume(197); // 'option' break; case 201: // 'ordering' - shift(201); // 'ordering' + consume(201); // 'ordering' break; case 220: // 'revalidation' - shift(220); // 'revalidation' + consume(220); // 'revalidation' break; case 223: // 'schema' - shift(223); // 'schema' + consume(223); // 'schema' break; case 226: // 'score' - shift(226); // 'score' + consume(226); // 'score' break; case 232: // 'sliding' - shift(232); // 'sliding' + consume(232); // 'sliding' break; case 238: // 'strict' - shift(238); // 'strict' + consume(238); // 'strict' break; case 249: // 'tumbling' - shift(249); // 'tumbling' + consume(249); // 'tumbling' break; case 250: // 'type' - shift(250); // 'type' + consume(250); // 'type' break; case 255: // 'updating' - shift(255); // 'updating' + consume(255); // 'updating' break; case 259: // 'value' - shift(259); // 'value' + consume(259); // 'value' break; case 260: // 'variable' - shift(260); // 'variable' + consume(260); // 'variable' break; case 261: // 'version' - shift(261); // 'version' + consume(261); // 'version' break; case 265: // 'while' - shift(265); // 'while' + consume(265); // 'while' break; case 95: // 'constraint' - shift(95); // 'constraint' + consume(95); // 'constraint' break; case 174: // 'loop' - shift(174); // 'loop' + consume(174); // 'loop' break; default: - shift(219); // 'returning' + consume(219); // 'returning' } eventHandler.endNonterminal("FunctionName", e0); } @@ -1019,401 +1037,401 @@ switch (l1) { case 28: // NCName^Token - shift(28); // NCName^Token + consume(28); // NCName^Token break; case 68: // 'after' - shift(68); // 'after' + consume(68); // 'after' break; case 73: // 'and' - shift(73); // 'and' + consume(73); // 'and' break; case 77: // 'as' - shift(77); // 'as' + consume(77); // 'as' break; case 78: // 'ascending' - shift(78); // 'ascending' + consume(78); // 'ascending' break; case 82: // 'before' - shift(82); // 'before' + consume(82); // 'before' break; case 86: // 'case' - shift(86); // 'case' + consume(86); // 'case' break; case 87: // 'cast' - shift(87); // 'cast' + consume(87); // 'cast' break; case 88: // 'castable' - shift(88); // 'castable' + consume(88); // 'castable' break; case 92: // 'collation' - shift(92); // 'collation' + consume(92); // 'collation' break; case 103: // 'count' - shift(103); // 'count' + consume(103); // 'count' break; case 107: // 'default' - shift(107); // 'default' + consume(107); // 'default' break; case 111: // 'descending' - shift(111); // 'descending' + consume(111); // 'descending' break; case 116: // 'div' - shift(116); // 'div' + consume(116); // 'div' break; case 120: // 'else' - shift(120); // 'else' + consume(120); // 'else' break; case 121: // 'empty' - shift(121); // 'empty' + consume(121); // 'empty' break; case 124: // 'end' - shift(124); // 'end' + consume(124); // 'end' break; case 126: // 'eq' - shift(126); // 'eq' + consume(126); // 'eq' break; case 129: // 'except' - shift(129); // 'except' + consume(129); // 'except' break; case 135: // 'for' - shift(135); // 'for' + consume(135); // 'for' break; case 144: // 'ge' - shift(144); // 'ge' + consume(144); // 'ge' break; case 146: // 'group' - shift(146); // 'group' + consume(146); // 'group' break; case 148: // 'gt' - shift(148); // 'gt' + consume(148); // 'gt' break; case 149: // 'idiv' - shift(149); // 'idiv' + consume(149); // 'idiv' break; case 158: // 'instance' - shift(158); // 'instance' + consume(158); // 'instance' break; case 160: // 'intersect' - shift(160); // 'intersect' + consume(160); // 'intersect' break; case 161: // 'into' - shift(161); // 'into' + consume(161); // 'into' break; case 162: // 'is' - shift(162); // 'is' + consume(162); // 'is' break; case 170: // 'le' - shift(170); // 'le' + consume(170); // 'le' break; case 172: // 'let' - shift(172); // 'let' + consume(172); // 'let' break; case 176: // 'lt' - shift(176); // 'lt' + consume(176); // 'lt' break; case 178: // 'mod' - shift(178); // 'mod' + consume(178); // 'mod' break; case 179: // 'modify' - shift(179); // 'modify' + consume(179); // 'modify' break; case 184: // 'ne' - shift(184); // 'ne' + consume(184); // 'ne' break; case 196: // 'only' - shift(196); // 'only' + consume(196); // 'only' break; case 198: // 'or' - shift(198); // 'or' + consume(198); // 'or' break; case 199: // 'order' - shift(199); // 'order' + consume(199); // 'order' break; case 218: // 'return' - shift(218); // 'return' + consume(218); // 'return' break; case 222: // 'satisfies' - shift(222); // 'satisfies' + consume(222); // 'satisfies' break; case 234: // 'stable' - shift(234); // 'stable' + consume(234); // 'stable' break; case 235: // 'start' - shift(235); // 'start' + consume(235); // 'start' break; case 246: // 'to' - shift(246); // 'to' + consume(246); // 'to' break; case 247: // 'treat' - shift(247); // 'treat' + consume(247); // 'treat' break; case 252: // 'union' - shift(252); // 'union' + consume(252); // 'union' break; case 264: // 'where' - shift(264); // 'where' + consume(264); // 'where' break; case 268: // 'with' - shift(268); // 'with' + consume(268); // 'with' break; case 71: // 'ancestor' - shift(71); // 'ancestor' + consume(71); // 'ancestor' break; case 72: // 'ancestor-or-self' - shift(72); // 'ancestor-or-self' + consume(72); // 'ancestor-or-self' break; case 80: // 'attribute' - shift(80); // 'attribute' + consume(80); // 'attribute' break; case 91: // 'child' - shift(91); // 'child' + consume(91); // 'child' break; case 94: // 'comment' - shift(94); // 'comment' + consume(94); // 'comment' break; case 101: // 'copy' - shift(101); // 'copy' + consume(101); // 'copy' break; case 106: // 'declare' - shift(106); // 'declare' + consume(106); // 'declare' break; case 108: // 'delete' - shift(108); // 'delete' + consume(108); // 'delete' break; case 109: // 'descendant' - shift(109); // 'descendant' + consume(109); // 'descendant' break; case 110: // 'descendant-or-self' - shift(110); // 'descendant-or-self' + consume(110); // 'descendant-or-self' break; case 117: // 'document' - shift(117); // 'document' + consume(117); // 'document' break; case 118: // 'document-node' - shift(118); // 'document-node' + consume(118); // 'document-node' break; case 119: // 'element' - shift(119); // 'element' + consume(119); // 'element' break; case 122: // 'empty-sequence' - shift(122); // 'empty-sequence' + consume(122); // 'empty-sequence' break; case 127: // 'every' - shift(127); // 'every' + consume(127); // 'every' break; case 132: // 'first' - shift(132); // 'first' + consume(132); // 'first' break; case 133: // 'following' - shift(133); // 'following' + consume(133); // 'following' break; case 134: // 'following-sibling' - shift(134); // 'following-sibling' + consume(134); // 'following-sibling' break; case 143: // 'function' - shift(143); // 'function' + consume(143); // 'function' break; case 150: // 'if' - shift(150); // 'if' + consume(150); // 'if' break; case 151: // 'import' - shift(151); // 'import' + consume(151); // 'import' break; case 157: // 'insert' - shift(157); // 'insert' + consume(157); // 'insert' break; case 163: // 'item' - shift(163); // 'item' + consume(163); // 'item' break; case 168: // 'last' - shift(168); // 'last' + consume(168); // 'last' break; case 180: // 'module' - shift(180); // 'module' + consume(180); // 'module' break; case 182: // 'namespace' - shift(182); // 'namespace' + consume(182); // 'namespace' break; case 183: // 'namespace-node' - shift(183); // 'namespace-node' + consume(183); // 'namespace-node' break; case 189: // 'node' - shift(189); // 'node' + consume(189); // 'node' break; case 200: // 'ordered' - shift(200); // 'ordered' + consume(200); // 'ordered' break; case 204: // 'parent' - shift(204); // 'parent' + consume(204); // 'parent' break; case 210: // 'preceding' - shift(210); // 'preceding' + consume(210); // 'preceding' break; case 211: // 'preceding-sibling' - shift(211); // 'preceding-sibling' + consume(211); // 'preceding-sibling' break; case 214: // 'processing-instruction' - shift(214); // 'processing-instruction' + consume(214); // 'processing-instruction' break; case 216: // 'rename' - shift(216); // 'rename' + consume(216); // 'rename' break; case 217: // 'replace' - shift(217); // 'replace' + consume(217); // 'replace' break; case 224: // 'schema-attribute' - shift(224); // 'schema-attribute' + consume(224); // 'schema-attribute' break; case 225: // 'schema-element' - shift(225); // 'schema-element' + consume(225); // 'schema-element' break; case 227: // 'self' - shift(227); // 'self' + consume(227); // 'self' break; case 233: // 'some' - shift(233); // 'some' + consume(233); // 'some' break; case 241: // 'switch' - shift(241); // 'switch' + consume(241); // 'switch' break; case 242: // 'text' - shift(242); // 'text' + consume(242); // 'text' break; case 248: // 'try' - shift(248); // 'try' + consume(248); // 'try' break; case 251: // 'typeswitch' - shift(251); // 'typeswitch' + consume(251); // 'typeswitch' break; case 254: // 'unordered' - shift(254); // 'unordered' + consume(254); // 'unordered' break; case 258: // 'validate' - shift(258); // 'validate' + consume(258); // 'validate' break; case 260: // 'variable' - shift(260); // 'variable' + consume(260); // 'variable' break; case 272: // 'xquery' - shift(272); // 'xquery' + consume(272); // 'xquery' break; case 70: // 'allowing' - shift(70); // 'allowing' + consume(70); // 'allowing' break; case 79: // 'at' - shift(79); // 'at' + consume(79); // 'at' break; case 81: // 'base-uri' - shift(81); // 'base-uri' + consume(81); // 'base-uri' break; case 83: // 'boundary-space' - shift(83); // 'boundary-space' + consume(83); // 'boundary-space' break; case 84: // 'break' - shift(84); // 'break' + consume(84); // 'break' break; case 89: // 'catch' - shift(89); // 'catch' + consume(89); // 'catch' break; case 96: // 'construction' - shift(96); // 'construction' + consume(96); // 'construction' break; case 99: // 'context' - shift(99); // 'context' + consume(99); // 'context' break; case 100: // 'continue' - shift(100); // 'continue' + consume(100); // 'continue' break; case 102: // 'copy-namespaces' - shift(102); // 'copy-namespaces' + consume(102); // 'copy-namespaces' break; case 104: // 'decimal-format' - shift(104); // 'decimal-format' + consume(104); // 'decimal-format' break; case 123: // 'encoding' - shift(123); // 'encoding' + consume(123); // 'encoding' break; case 130: // 'exit' - shift(130); // 'exit' + consume(130); // 'exit' break; case 131: // 'external' - shift(131); // 'external' + consume(131); // 'external' break; case 139: // 'ft-option' - shift(139); // 'ft-option' + consume(139); // 'ft-option' break; case 152: // 'in' - shift(152); // 'in' + consume(152); // 'in' break; case 153: // 'index' - shift(153); // 'index' + consume(153); // 'index' break; case 159: // 'integrity' - shift(159); // 'integrity' + consume(159); // 'integrity' break; case 169: // 'lax' - shift(169); // 'lax' + consume(169); // 'lax' break; case 190: // 'nodes' - shift(190); // 'nodes' + consume(190); // 'nodes' break; case 197: // 'option' - shift(197); // 'option' + consume(197); // 'option' break; case 201: // 'ordering' - shift(201); // 'ordering' + consume(201); // 'ordering' break; case 220: // 'revalidation' - shift(220); // 'revalidation' + consume(220); // 'revalidation' break; case 223: // 'schema' - shift(223); // 'schema' + consume(223); // 'schema' break; case 226: // 'score' - shift(226); // 'score' + consume(226); // 'score' break; case 232: // 'sliding' - shift(232); // 'sliding' + consume(232); // 'sliding' break; case 238: // 'strict' - shift(238); // 'strict' + consume(238); // 'strict' break; case 249: // 'tumbling' - shift(249); // 'tumbling' + consume(249); // 'tumbling' break; case 250: // 'type' - shift(250); // 'type' + consume(250); // 'type' break; case 255: // 'updating' - shift(255); // 'updating' + consume(255); // 'updating' break; case 259: // 'value' - shift(259); // 'value' + consume(259); // 'value' break; case 261: // 'version' - shift(261); // 'version' + consume(261); // 'version' break; case 265: // 'while' - shift(265); // 'while' + consume(265); // 'while' break; case 95: // 'constraint' - shift(95); // 'constraint' + consume(95); // 'constraint' break; case 174: // 'loop' - shift(174); // 'loop' + consume(174); // 'loop' break; default: - shift(219); // 'returning' + consume(219); // 'returning' } eventHandler.endNonterminal("NCName", e0); } - function shift(t) + function consume(t) { if (l1 == t) { whitespace(); - eventHandler.terminal(JSONiqTokenizer.TOKEN[l1], b1, e1 > size ? size : e1); + eventHandler.terminal(JSONiqTokenizer.TOKEN[l1], b1, e1); b0 = b1; e0 = e1; l1 = 0; } else @@ -1426,9 +1444,8 @@ { if (e0 != b1) { - b0 = e0; + eventHandler.whitespace(e0, b1); e0 = b1; - eventHandler.whitespace(b0, e0); } } @@ -1468,15 +1485,16 @@ function error(b, e, s, l, t) { - throw new self.ParseException(b, e, s, l, t); + throw new thisParser.ParseException(b, e, s, l, t); } - var lk, b0, e0; + var b0, e0; var l1, b1, e1; var eventHandler; var input; var size; + var begin; var end; @@ -1514,6 +1532,7 @@ nonbmp = true; } } + var lo = 0, hi = 5; for (var m = 3; ; m = (hi + lo) >> 1) { @@ -1559,14 +1578,115 @@ end -= result >> 9; } + if (end > size) end = size; return (result & 511) - 1; } + } +JSONiqTokenizer.XmlSerializer = function(log, indent) +{ + var input = null; + var delayedTag = null; + var hasChildElement = false; + var depth = 0; + + this.reset = function(string) + { + log(""); + input = string; + delayedTag = null; + hasChildElement = false; + depth = 0; + }; + + this.startNonterminal = function(tag, begin) + { + if (delayedTag != null) + { + log("<"); + log(delayedTag); + log(">"); + } + delayedTag = tag; + if (indent) + { + log("\n"); + for (var i = 0; i < depth; ++i) + { + log(" "); + } + } + hasChildElement = false; + ++depth; + }; + + this.endNonterminal = function(tag, end) + { + --depth; + if (delayedTag != null) + { + delayedTag = null; + log("<"); + log(tag); + log("/>"); + } + else + { + if (indent) + { + if (hasChildElement) + { + log("\n"); + for (var i = 0; i < depth; ++i) + { + log(" "); + } + } + } + log(""); + } + hasChildElement = true; + }; + + this.terminal = function(tag, begin, end) + { + if (tag.charAt(0) == '\'') tag = "TOKEN"; + this.startNonterminal(tag, begin); + characters(begin, end); + this.endNonterminal(tag, end); + }; + + this.whitespace = function(begin, end) + { + characters(begin, end); + }; + + function characters(begin, end) + { + if (begin < end) + { + if (delayedTag != null) + { + log("<"); + log(delayedTag); + log(">"); + delayedTag = null; + } + log(input.substring(begin, end) + .replace(/&/g, "&") + .replace(//g, ">")); + } + } +}; + JSONiqTokenizer.getTokenSet = function(tokenSetId) { var set = []; - var s = tokenSetId < 0 ? - tokenSetId : INITIAL[tokenSetId] & 4095; + var s = tokenSetId < 0 ? - tokenSetId : JSONiqTokenizer.INITIAL[tokenSetId] & 4095; for (var i = 0; i < 279; i += 32) { var j = i; @@ -1585,6 +1705,86 @@ JSONiqTokenizer.getTokenSet = function(tokenSetId) return set; }; +JSONiqTokenizer.TopDownTreeBuilder = function() +{ + var input = null; + var stack = null; + + this.reset = function(i) + { + input = i; + stack = []; + }; + + this.startNonterminal = function(name, begin) + { + var nonterminal = new JSONiqTokenizer.Nonterminal(name, begin, begin, []); + if (stack.length > 0) addChild(nonterminal); + stack.push(nonterminal); + }; + + this.endNonterminal = function(name, end) + { + stack[stack.length - 1].end = end; + if (stack.length > 1) stack.pop(); + }; + + this.terminal = function(name, begin, end) + { + addChild(new JSONiqTokenizer.Terminal(name, begin, end)); + }; + + this.whitespace = function(begin, end) + { + }; + + function addChild(s) + { + var current = stack[stack.length - 1]; + current.children.push(s); + } + + this.serialize = function(e) + { + e.reset(input); + stack[0].send(e); + }; +}; + +JSONiqTokenizer.Terminal = function(name, begin, end) +{ + this.begin = begin; + this.end = end; + + this.send = function(e) + { + e.terminal(name, begin, end); + }; +}; + +JSONiqTokenizer.Nonterminal = function(name, begin, end, children) +{ + this.begin = begin; + this.end = end; + + this.send = function(e) + { + e.startNonterminal(name, begin); + var pos = begin; + children.forEach + ( + function(c) + { + if (pos < c.begin) e.whitespace(pos, c.begin); + c.send(e); + pos = c.end; + } + ); + if (pos < end) e.whitespace(pos, end); + e.endNonterminal(name, end); + }; +}; + JSONiqTokenizer.MAP0 = [ /* 0 */ 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, @@ -4201,4 +4401,7 @@ JSONiqTokenizer.TOKEN = "'}}'" ]; + // line 520 "JSONiqTokenizer.ebnf" + + // line 4407 "JSONiqTokenizer.js" // End diff --git a/lib/lexers/XQueryTokenizer.js b/lib/lexers/XQueryTokenizer.js index 9ebe64fc..78402170 100755 --- a/lib/lexers/XQueryTokenizer.js +++ b/lib/lexers/XQueryTokenizer.js @@ -1,4 +1,4 @@ -// This file was generated on Thu Jul 24, 2014 15:01 (UTC+01) by REx v5.30 which is Copyright (c) 1979-2014 by Gunther Rademacher +// This file was generated on Thu Oct 31, 2019 20:00 (UTC+01) by REx v5.49 which is Copyright (c) 1979-2019 by Gunther Rademacher // REx command line: XQueryTokenizer.ebnf -ll 2 -backtrack -tree -javascript -a xqlint // line 2 "XQueryTokenizer.ebnf" @@ -6,34 +6,36 @@ { init(string, parsingEventHandler); // line 9 "XQueryTokenizer.js" - var self = this; + var thisParser = this; this.ParseException = function(b, e, s, o, x) { - var - begin = b, - end = e, - state = s, - offending = o, - expected = x; + var begin = b; + var end = e; + var state = s; + var offending = o; + var expected = x; this.getBegin = function() {return begin;}; this.getEnd = function() {return end;}; this.getState = function() {return state;}; this.getExpected = function() {return expected;}; this.getOffending = function() {return offending;}; + this.isAmbiguousInput = function() {return false;}; this.getMessage = function() { - return offending < 0 ? "lexical analysis failed" : "syntax error"; + return offending < 0 + ? "lexical analysis failed" + : "syntax error"; }; }; - function init(string, parsingEventHandler) + function init(source, parsingEventHandler) { eventHandler = parsingEventHandler; - input = string; - size = string.length; + input = source; + size = source.length; reset(0, 0, 0); } @@ -42,6 +44,16 @@ return input; }; + this.getTokenOffset = function() + { + return b0; + }; + + this.getTokenEnd = function() + { + return e0; + }; + function reset(l, b, e) { b0 = b; e0 = b; @@ -50,6 +62,11 @@ eventHandler.reset(input); } + this.reset = function(l, b, e) + { + reset(l, b, e); + }; + this.getOffendingToken = function(e) { var o = e.getOffending(); @@ -72,19 +89,20 @@ this.getErrorMessage = function(e) { - var tokenSet = this.getExpectedTokenSet(e); + var message = e.getMessage(); var found = this.getOffendingToken(e); + var tokenSet = this.getExpectedTokenSet(e); + var size = e.getEnd() - e.getBegin(); + message += (found == null ? "" : ", found " + found) + + "\nwhile expecting " + + (tokenSet.length == 1 ? tokenSet[0] : ("[" + tokenSet.join(", ") + "]")) + + "\n" + + (size == 0 || found != null ? "" : "after successfully scanning " + size + " characters beginning "); var prefix = input.substring(0, e.getBegin()); var lines = prefix.split("\n"); var line = lines.length; var column = lines[line - 1].length + 1; - var size = e.getEnd() - e.getBegin(); - return e.getMessage() - + (found == null ? "" : ", found " + found) - + "\nwhile expecting " - + (tokenSet.length == 1 ? tokenSet[0] : ("[" + tokenSet.join(", ") + "]")) - + "\n" - + (size == 0 || found != null ? "" : "after successfully scanning " + size + " characters beginning ") + return message + "at line " + line + ", column " + column + ":\n..." + input.substring(e.getBegin(), Math.min(input.length, e.getBegin() + 64)) + "..."; @@ -121,103 +139,103 @@ switch (l1) { case 55: // '' - shift(58); // '>' + consume(58); // '>' break; case 50: // '/>' - shift(50); // '/>' + consume(50); // '/>' break; case 27: // QName - shift(27); // QName + consume(27); // QName break; case 57: // '=' - shift(57); // '=' + consume(57); // '=' break; case 35: // '"' - shift(35); // '"' + consume(35); // '"' break; case 38: // "'" - shift(38); // "'" + consume(38); // "'" break; default: - shift(33); // EOF + consume(33); // EOF } eventHandler.endNonterminal("StartTag", e0); }; @@ -263,37 +281,37 @@ switch (l1) { case 23: // ElementContentChar - shift(23); // ElementContentChar + consume(23); // ElementContentChar break; case 6: // Tag - shift(6); // Tag + consume(6); // Tag break; case 7: // EndTag - shift(7); // EndTag + consume(7); // EndTag break; case 55: // '' - shift(64); // ']]>' + consume(64); // ']]>' break; default: - shift(33); // EOF + consume(33); // EOF } eventHandler.endNonterminal("CData", e0); }; @@ -397,13 +415,13 @@ switch (l1) { case 9: // DirCommentContents - shift(9); // DirCommentContents + consume(9); // DirCommentContents break; case 47: // '-->' - shift(47); // '-->' + consume(47); // '-->' break; default: - shift(33); // EOF + consume(33); // EOF } eventHandler.endNonterminal("XMLComment", e0); }; @@ -415,16 +433,16 @@ switch (l1) { case 10: // DirPIContents - shift(10); // DirPIContents + consume(10); // DirPIContents break; case 59: // '?' - shift(59); // '?' + consume(59); // '?' break; case 60: // '?>' - shift(60); // '?>' + consume(60); // '?>' break; default: - shift(33); // EOF + consume(33); // EOF } eventHandler.endNonterminal("PI", e0); }; @@ -436,16 +454,16 @@ switch (l1) { case 8: // PragmaContents - shift(8); // PragmaContents + consume(8); // PragmaContents break; case 36: // '#' - shift(36); // '#' + consume(36); // '#' break; case 37: // '#)' - shift(37); // '#)' + consume(37); // '#)' break; default: - shift(33); // EOF + consume(33); // EOF } eventHandler.endNonterminal("Pragma", e0); }; @@ -457,16 +475,16 @@ switch (l1) { case 52: // ':)' - shift(52); // ':)' + consume(52); // ':)' break; case 41: // '(:' - shift(41); // '(:' + consume(41); // '(:' break; case 30: // CommentContents - shift(30); // CommentContents + consume(30); // CommentContents break; default: - shift(33); // EOF + consume(33); // EOF } eventHandler.endNonterminal("Comment", e0); }; @@ -478,19 +496,19 @@ switch (l1) { case 31: // DocTag - shift(31); // DocTag + consume(31); // DocTag break; case 32: // DocCommentContents - shift(32); // DocCommentContents + consume(32); // DocCommentContents break; case 52: // ':)' - shift(52); // ':)' + consume(52); // ':)' break; case 41: // '(:' - shift(41); // '(:' + consume(41); // '(:' break; default: - shift(33); // EOF + consume(33); // EOF } eventHandler.endNonterminal("CommentDoc", e0); }; @@ -502,22 +520,22 @@ switch (l1) { case 18: // PredefinedEntityRef - shift(18); // PredefinedEntityRef + consume(18); // PredefinedEntityRef break; case 29: // CharRef - shift(29); // CharRef + consume(29); // CharRef break; case 19: // EscapeQuot - shift(19); // EscapeQuot + consume(19); // EscapeQuot break; case 21: // QuotChar - shift(21); // QuotChar + consume(21); // QuotChar break; case 35: // '"' - shift(35); // '"' + consume(35); // '"' break; default: - shift(33); // EOF + consume(33); // EOF } eventHandler.endNonterminal("QuotString", e0); }; @@ -529,22 +547,22 @@ switch (l1) { case 18: // PredefinedEntityRef - shift(18); // PredefinedEntityRef + consume(18); // PredefinedEntityRef break; case 29: // CharRef - shift(29); // CharRef + consume(29); // CharRef break; case 20: // EscapeApos - shift(20); // EscapeApos + consume(20); // EscapeApos break; case 22: // AposChar - shift(22); // AposChar + consume(22); // AposChar break; case 38: // "'" - shift(38); // "'" + consume(38); // "'" break; default: - shift(33); // EOF + consume(33); // EOF } eventHandler.endNonterminal("AposString", e0); }; @@ -613,52 +631,52 @@ switch (l1) { case 77: // 'attribute' - shift(77); // 'attribute' + consume(77); // 'attribute' break; case 91: // 'comment' - shift(91); // 'comment' + consume(91); // 'comment' break; case 115: // 'document-node' - shift(115); // 'document-node' + consume(115); // 'document-node' break; case 116: // 'element' - shift(116); // 'element' + consume(116); // 'element' break; case 119: // 'empty-sequence' - shift(119); // 'empty-sequence' + consume(119); // 'empty-sequence' break; case 140: // 'function' - shift(140); // 'function' + consume(140); // 'function' break; case 147: // 'if' - shift(147); // 'if' + consume(147); // 'if' break; case 160: // 'item' - shift(160); // 'item' + consume(160); // 'item' break; case 180: // 'namespace-node' - shift(180); // 'namespace-node' + consume(180); // 'namespace-node' break; case 186: // 'node' - shift(186); // 'node' + consume(186); // 'node' break; case 211: // 'processing-instruction' - shift(211); // 'processing-instruction' + consume(211); // 'processing-instruction' break; case 221: // 'schema-attribute' - shift(221); // 'schema-attribute' + consume(221); // 'schema-attribute' break; case 222: // 'schema-element' - shift(222); // 'schema-element' + consume(222); // 'schema-element' break; case 238: // 'switch' - shift(238); // 'switch' + consume(238); // 'switch' break; case 239: // 'text' - shift(239); // 'text' + consume(239); // 'text' break; case 248: // 'typeswitch' - shift(248); // 'typeswitch' + consume(248); // 'typeswitch' break; default: parse_FunctionName(); @@ -672,343 +690,343 @@ switch (l1) { case 14: // EQName^Token - shift(14); // EQName^Token + consume(14); // EQName^Token break; case 65: // 'after' - shift(65); // 'after' + consume(65); // 'after' break; case 68: // 'ancestor' - shift(68); // 'ancestor' + consume(68); // 'ancestor' break; case 69: // 'ancestor-or-self' - shift(69); // 'ancestor-or-self' + consume(69); // 'ancestor-or-self' break; case 70: // 'and' - shift(70); // 'and' + consume(70); // 'and' break; case 74: // 'as' - shift(74); // 'as' + consume(74); // 'as' break; case 75: // 'ascending' - shift(75); // 'ascending' + consume(75); // 'ascending' break; case 79: // 'before' - shift(79); // 'before' + consume(79); // 'before' break; case 83: // 'case' - shift(83); // 'case' + consume(83); // 'case' break; case 84: // 'cast' - shift(84); // 'cast' + consume(84); // 'cast' break; case 85: // 'castable' - shift(85); // 'castable' + consume(85); // 'castable' break; case 88: // 'child' - shift(88); // 'child' + consume(88); // 'child' break; case 89: // 'collation' - shift(89); // 'collation' + consume(89); // 'collation' break; case 98: // 'copy' - shift(98); // 'copy' + consume(98); // 'copy' break; case 100: // 'count' - shift(100); // 'count' + consume(100); // 'count' break; case 103: // 'declare' - shift(103); // 'declare' + consume(103); // 'declare' break; case 104: // 'default' - shift(104); // 'default' + consume(104); // 'default' break; case 105: // 'delete' - shift(105); // 'delete' + consume(105); // 'delete' break; case 106: // 'descendant' - shift(106); // 'descendant' + consume(106); // 'descendant' break; case 107: // 'descendant-or-self' - shift(107); // 'descendant-or-self' + consume(107); // 'descendant-or-self' break; case 108: // 'descending' - shift(108); // 'descending' + consume(108); // 'descending' break; case 113: // 'div' - shift(113); // 'div' + consume(113); // 'div' break; case 114: // 'document' - shift(114); // 'document' + consume(114); // 'document' break; case 117: // 'else' - shift(117); // 'else' + consume(117); // 'else' break; case 118: // 'empty' - shift(118); // 'empty' + consume(118); // 'empty' break; case 121: // 'end' - shift(121); // 'end' + consume(121); // 'end' break; case 123: // 'eq' - shift(123); // 'eq' + consume(123); // 'eq' break; case 124: // 'every' - shift(124); // 'every' + consume(124); // 'every' break; case 126: // 'except' - shift(126); // 'except' + consume(126); // 'except' break; case 129: // 'first' - shift(129); // 'first' + consume(129); // 'first' break; case 130: // 'following' - shift(130); // 'following' + consume(130); // 'following' break; case 131: // 'following-sibling' - shift(131); // 'following-sibling' + consume(131); // 'following-sibling' break; case 132: // 'for' - shift(132); // 'for' + consume(132); // 'for' break; case 141: // 'ge' - shift(141); // 'ge' + consume(141); // 'ge' break; case 143: // 'group' - shift(143); // 'group' + consume(143); // 'group' break; case 145: // 'gt' - shift(145); // 'gt' + consume(145); // 'gt' break; case 146: // 'idiv' - shift(146); // 'idiv' + consume(146); // 'idiv' break; case 148: // 'import' - shift(148); // 'import' + consume(148); // 'import' break; case 154: // 'insert' - shift(154); // 'insert' + consume(154); // 'insert' break; case 155: // 'instance' - shift(155); // 'instance' + consume(155); // 'instance' break; case 157: // 'intersect' - shift(157); // 'intersect' + consume(157); // 'intersect' break; case 158: // 'into' - shift(158); // 'into' + consume(158); // 'into' break; case 159: // 'is' - shift(159); // 'is' + consume(159); // 'is' break; case 165: // 'last' - shift(165); // 'last' + consume(165); // 'last' break; case 167: // 'le' - shift(167); // 'le' + consume(167); // 'le' break; case 169: // 'let' - shift(169); // 'let' + consume(169); // 'let' break; case 173: // 'lt' - shift(173); // 'lt' + consume(173); // 'lt' break; case 175: // 'mod' - shift(175); // 'mod' + consume(175); // 'mod' break; case 176: // 'modify' - shift(176); // 'modify' + consume(176); // 'modify' break; case 177: // 'module' - shift(177); // 'module' + consume(177); // 'module' break; case 179: // 'namespace' - shift(179); // 'namespace' + consume(179); // 'namespace' break; case 181: // 'ne' - shift(181); // 'ne' + consume(181); // 'ne' break; case 193: // 'only' - shift(193); // 'only' + consume(193); // 'only' break; case 195: // 'or' - shift(195); // 'or' + consume(195); // 'or' break; case 196: // 'order' - shift(196); // 'order' + consume(196); // 'order' break; case 197: // 'ordered' - shift(197); // 'ordered' + consume(197); // 'ordered' break; case 201: // 'parent' - shift(201); // 'parent' + consume(201); // 'parent' break; case 207: // 'preceding' - shift(207); // 'preceding' + consume(207); // 'preceding' break; case 208: // 'preceding-sibling' - shift(208); // 'preceding-sibling' + consume(208); // 'preceding-sibling' break; case 213: // 'rename' - shift(213); // 'rename' + consume(213); // 'rename' break; case 214: // 'replace' - shift(214); // 'replace' + consume(214); // 'replace' break; case 215: // 'return' - shift(215); // 'return' + consume(215); // 'return' break; case 219: // 'satisfies' - shift(219); // 'satisfies' + consume(219); // 'satisfies' break; case 224: // 'self' - shift(224); // 'self' + consume(224); // 'self' break; case 230: // 'some' - shift(230); // 'some' + consume(230); // 'some' break; case 231: // 'stable' - shift(231); // 'stable' + consume(231); // 'stable' break; case 232: // 'start' - shift(232); // 'start' + consume(232); // 'start' break; case 243: // 'to' - shift(243); // 'to' + consume(243); // 'to' break; case 244: // 'treat' - shift(244); // 'treat' + consume(244); // 'treat' break; case 245: // 'try' - shift(245); // 'try' + consume(245); // 'try' break; case 249: // 'union' - shift(249); // 'union' + consume(249); // 'union' break; case 251: // 'unordered' - shift(251); // 'unordered' + consume(251); // 'unordered' break; case 255: // 'validate' - shift(255); // 'validate' + consume(255); // 'validate' break; case 261: // 'where' - shift(261); // 'where' + consume(261); // 'where' break; case 265: // 'with' - shift(265); // 'with' + consume(265); // 'with' break; case 269: // 'xquery' - shift(269); // 'xquery' + consume(269); // 'xquery' break; case 67: // 'allowing' - shift(67); // 'allowing' + consume(67); // 'allowing' break; case 76: // 'at' - shift(76); // 'at' + consume(76); // 'at' break; case 78: // 'base-uri' - shift(78); // 'base-uri' + consume(78); // 'base-uri' break; case 80: // 'boundary-space' - shift(80); // 'boundary-space' + consume(80); // 'boundary-space' break; case 81: // 'break' - shift(81); // 'break' + consume(81); // 'break' break; case 86: // 'catch' - shift(86); // 'catch' + consume(86); // 'catch' break; case 93: // 'construction' - shift(93); // 'construction' + consume(93); // 'construction' break; case 96: // 'context' - shift(96); // 'context' + consume(96); // 'context' break; case 97: // 'continue' - shift(97); // 'continue' + consume(97); // 'continue' break; case 99: // 'copy-namespaces' - shift(99); // 'copy-namespaces' + consume(99); // 'copy-namespaces' break; case 101: // 'decimal-format' - shift(101); // 'decimal-format' + consume(101); // 'decimal-format' break; case 120: // 'encoding' - shift(120); // 'encoding' + consume(120); // 'encoding' break; case 127: // 'exit' - shift(127); // 'exit' + consume(127); // 'exit' break; case 128: // 'external' - shift(128); // 'external' + consume(128); // 'external' break; case 136: // 'ft-option' - shift(136); // 'ft-option' + consume(136); // 'ft-option' break; case 149: // 'in' - shift(149); // 'in' + consume(149); // 'in' break; case 150: // 'index' - shift(150); // 'index' + consume(150); // 'index' break; case 156: // 'integrity' - shift(156); // 'integrity' + consume(156); // 'integrity' break; case 166: // 'lax' - shift(166); // 'lax' + consume(166); // 'lax' break; case 187: // 'nodes' - shift(187); // 'nodes' + consume(187); // 'nodes' break; case 194: // 'option' - shift(194); // 'option' + consume(194); // 'option' break; case 198: // 'ordering' - shift(198); // 'ordering' + consume(198); // 'ordering' break; case 217: // 'revalidation' - shift(217); // 'revalidation' + consume(217); // 'revalidation' break; case 220: // 'schema' - shift(220); // 'schema' + consume(220); // 'schema' break; case 223: // 'score' - shift(223); // 'score' + consume(223); // 'score' break; case 229: // 'sliding' - shift(229); // 'sliding' + consume(229); // 'sliding' break; case 235: // 'strict' - shift(235); // 'strict' + consume(235); // 'strict' break; case 246: // 'tumbling' - shift(246); // 'tumbling' + consume(246); // 'tumbling' break; case 247: // 'type' - shift(247); // 'type' + consume(247); // 'type' break; case 252: // 'updating' - shift(252); // 'updating' + consume(252); // 'updating' break; case 256: // 'value' - shift(256); // 'value' + consume(256); // 'value' break; case 257: // 'variable' - shift(257); // 'variable' + consume(257); // 'variable' break; case 258: // 'version' - shift(258); // 'version' + consume(258); // 'version' break; case 262: // 'while' - shift(262); // 'while' + consume(262); // 'while' break; case 92: // 'constraint' - shift(92); // 'constraint' + consume(92); // 'constraint' break; case 171: // 'loop' - shift(171); // 'loop' + consume(171); // 'loop' break; default: - shift(216); // 'returning' + consume(216); // 'returning' } eventHandler.endNonterminal("FunctionName", e0); } @@ -1019,401 +1037,401 @@ switch (l1) { case 26: // NCName^Token - shift(26); // NCName^Token + consume(26); // NCName^Token break; case 65: // 'after' - shift(65); // 'after' + consume(65); // 'after' break; case 70: // 'and' - shift(70); // 'and' + consume(70); // 'and' break; case 74: // 'as' - shift(74); // 'as' + consume(74); // 'as' break; case 75: // 'ascending' - shift(75); // 'ascending' + consume(75); // 'ascending' break; case 79: // 'before' - shift(79); // 'before' + consume(79); // 'before' break; case 83: // 'case' - shift(83); // 'case' + consume(83); // 'case' break; case 84: // 'cast' - shift(84); // 'cast' + consume(84); // 'cast' break; case 85: // 'castable' - shift(85); // 'castable' + consume(85); // 'castable' break; case 89: // 'collation' - shift(89); // 'collation' + consume(89); // 'collation' break; case 100: // 'count' - shift(100); // 'count' + consume(100); // 'count' break; case 104: // 'default' - shift(104); // 'default' + consume(104); // 'default' break; case 108: // 'descending' - shift(108); // 'descending' + consume(108); // 'descending' break; case 113: // 'div' - shift(113); // 'div' + consume(113); // 'div' break; case 117: // 'else' - shift(117); // 'else' + consume(117); // 'else' break; case 118: // 'empty' - shift(118); // 'empty' + consume(118); // 'empty' break; case 121: // 'end' - shift(121); // 'end' + consume(121); // 'end' break; case 123: // 'eq' - shift(123); // 'eq' + consume(123); // 'eq' break; case 126: // 'except' - shift(126); // 'except' + consume(126); // 'except' break; case 132: // 'for' - shift(132); // 'for' + consume(132); // 'for' break; case 141: // 'ge' - shift(141); // 'ge' + consume(141); // 'ge' break; case 143: // 'group' - shift(143); // 'group' + consume(143); // 'group' break; case 145: // 'gt' - shift(145); // 'gt' + consume(145); // 'gt' break; case 146: // 'idiv' - shift(146); // 'idiv' + consume(146); // 'idiv' break; case 155: // 'instance' - shift(155); // 'instance' + consume(155); // 'instance' break; case 157: // 'intersect' - shift(157); // 'intersect' + consume(157); // 'intersect' break; case 158: // 'into' - shift(158); // 'into' + consume(158); // 'into' break; case 159: // 'is' - shift(159); // 'is' + consume(159); // 'is' break; case 167: // 'le' - shift(167); // 'le' + consume(167); // 'le' break; case 169: // 'let' - shift(169); // 'let' + consume(169); // 'let' break; case 173: // 'lt' - shift(173); // 'lt' + consume(173); // 'lt' break; case 175: // 'mod' - shift(175); // 'mod' + consume(175); // 'mod' break; case 176: // 'modify' - shift(176); // 'modify' + consume(176); // 'modify' break; case 181: // 'ne' - shift(181); // 'ne' + consume(181); // 'ne' break; case 193: // 'only' - shift(193); // 'only' + consume(193); // 'only' break; case 195: // 'or' - shift(195); // 'or' + consume(195); // 'or' break; case 196: // 'order' - shift(196); // 'order' + consume(196); // 'order' break; case 215: // 'return' - shift(215); // 'return' + consume(215); // 'return' break; case 219: // 'satisfies' - shift(219); // 'satisfies' + consume(219); // 'satisfies' break; case 231: // 'stable' - shift(231); // 'stable' + consume(231); // 'stable' break; case 232: // 'start' - shift(232); // 'start' + consume(232); // 'start' break; case 243: // 'to' - shift(243); // 'to' + consume(243); // 'to' break; case 244: // 'treat' - shift(244); // 'treat' + consume(244); // 'treat' break; case 249: // 'union' - shift(249); // 'union' + consume(249); // 'union' break; case 261: // 'where' - shift(261); // 'where' + consume(261); // 'where' break; case 265: // 'with' - shift(265); // 'with' + consume(265); // 'with' break; case 68: // 'ancestor' - shift(68); // 'ancestor' + consume(68); // 'ancestor' break; case 69: // 'ancestor-or-self' - shift(69); // 'ancestor-or-self' + consume(69); // 'ancestor-or-self' break; case 77: // 'attribute' - shift(77); // 'attribute' + consume(77); // 'attribute' break; case 88: // 'child' - shift(88); // 'child' + consume(88); // 'child' break; case 91: // 'comment' - shift(91); // 'comment' + consume(91); // 'comment' break; case 98: // 'copy' - shift(98); // 'copy' + consume(98); // 'copy' break; case 103: // 'declare' - shift(103); // 'declare' + consume(103); // 'declare' break; case 105: // 'delete' - shift(105); // 'delete' + consume(105); // 'delete' break; case 106: // 'descendant' - shift(106); // 'descendant' + consume(106); // 'descendant' break; case 107: // 'descendant-or-self' - shift(107); // 'descendant-or-self' + consume(107); // 'descendant-or-self' break; case 114: // 'document' - shift(114); // 'document' + consume(114); // 'document' break; case 115: // 'document-node' - shift(115); // 'document-node' + consume(115); // 'document-node' break; case 116: // 'element' - shift(116); // 'element' + consume(116); // 'element' break; case 119: // 'empty-sequence' - shift(119); // 'empty-sequence' + consume(119); // 'empty-sequence' break; case 124: // 'every' - shift(124); // 'every' + consume(124); // 'every' break; case 129: // 'first' - shift(129); // 'first' + consume(129); // 'first' break; case 130: // 'following' - shift(130); // 'following' + consume(130); // 'following' break; case 131: // 'following-sibling' - shift(131); // 'following-sibling' + consume(131); // 'following-sibling' break; case 140: // 'function' - shift(140); // 'function' + consume(140); // 'function' break; case 147: // 'if' - shift(147); // 'if' + consume(147); // 'if' break; case 148: // 'import' - shift(148); // 'import' + consume(148); // 'import' break; case 154: // 'insert' - shift(154); // 'insert' + consume(154); // 'insert' break; case 160: // 'item' - shift(160); // 'item' + consume(160); // 'item' break; case 165: // 'last' - shift(165); // 'last' + consume(165); // 'last' break; case 177: // 'module' - shift(177); // 'module' + consume(177); // 'module' break; case 179: // 'namespace' - shift(179); // 'namespace' + consume(179); // 'namespace' break; case 180: // 'namespace-node' - shift(180); // 'namespace-node' + consume(180); // 'namespace-node' break; case 186: // 'node' - shift(186); // 'node' + consume(186); // 'node' break; case 197: // 'ordered' - shift(197); // 'ordered' + consume(197); // 'ordered' break; case 201: // 'parent' - shift(201); // 'parent' + consume(201); // 'parent' break; case 207: // 'preceding' - shift(207); // 'preceding' + consume(207); // 'preceding' break; case 208: // 'preceding-sibling' - shift(208); // 'preceding-sibling' + consume(208); // 'preceding-sibling' break; case 211: // 'processing-instruction' - shift(211); // 'processing-instruction' + consume(211); // 'processing-instruction' break; case 213: // 'rename' - shift(213); // 'rename' + consume(213); // 'rename' break; case 214: // 'replace' - shift(214); // 'replace' + consume(214); // 'replace' break; case 221: // 'schema-attribute' - shift(221); // 'schema-attribute' + consume(221); // 'schema-attribute' break; case 222: // 'schema-element' - shift(222); // 'schema-element' + consume(222); // 'schema-element' break; case 224: // 'self' - shift(224); // 'self' + consume(224); // 'self' break; case 230: // 'some' - shift(230); // 'some' + consume(230); // 'some' break; case 238: // 'switch' - shift(238); // 'switch' + consume(238); // 'switch' break; case 239: // 'text' - shift(239); // 'text' + consume(239); // 'text' break; case 245: // 'try' - shift(245); // 'try' + consume(245); // 'try' break; case 248: // 'typeswitch' - shift(248); // 'typeswitch' + consume(248); // 'typeswitch' break; case 251: // 'unordered' - shift(251); // 'unordered' + consume(251); // 'unordered' break; case 255: // 'validate' - shift(255); // 'validate' + consume(255); // 'validate' break; case 257: // 'variable' - shift(257); // 'variable' + consume(257); // 'variable' break; case 269: // 'xquery' - shift(269); // 'xquery' + consume(269); // 'xquery' break; case 67: // 'allowing' - shift(67); // 'allowing' + consume(67); // 'allowing' break; case 76: // 'at' - shift(76); // 'at' + consume(76); // 'at' break; case 78: // 'base-uri' - shift(78); // 'base-uri' + consume(78); // 'base-uri' break; case 80: // 'boundary-space' - shift(80); // 'boundary-space' + consume(80); // 'boundary-space' break; case 81: // 'break' - shift(81); // 'break' + consume(81); // 'break' break; case 86: // 'catch' - shift(86); // 'catch' + consume(86); // 'catch' break; case 93: // 'construction' - shift(93); // 'construction' + consume(93); // 'construction' break; case 96: // 'context' - shift(96); // 'context' + consume(96); // 'context' break; case 97: // 'continue' - shift(97); // 'continue' + consume(97); // 'continue' break; case 99: // 'copy-namespaces' - shift(99); // 'copy-namespaces' + consume(99); // 'copy-namespaces' break; case 101: // 'decimal-format' - shift(101); // 'decimal-format' + consume(101); // 'decimal-format' break; case 120: // 'encoding' - shift(120); // 'encoding' + consume(120); // 'encoding' break; case 127: // 'exit' - shift(127); // 'exit' + consume(127); // 'exit' break; case 128: // 'external' - shift(128); // 'external' + consume(128); // 'external' break; case 136: // 'ft-option' - shift(136); // 'ft-option' + consume(136); // 'ft-option' break; case 149: // 'in' - shift(149); // 'in' + consume(149); // 'in' break; case 150: // 'index' - shift(150); // 'index' + consume(150); // 'index' break; case 156: // 'integrity' - shift(156); // 'integrity' + consume(156); // 'integrity' break; case 166: // 'lax' - shift(166); // 'lax' + consume(166); // 'lax' break; case 187: // 'nodes' - shift(187); // 'nodes' + consume(187); // 'nodes' break; case 194: // 'option' - shift(194); // 'option' + consume(194); // 'option' break; case 198: // 'ordering' - shift(198); // 'ordering' + consume(198); // 'ordering' break; case 217: // 'revalidation' - shift(217); // 'revalidation' + consume(217); // 'revalidation' break; case 220: // 'schema' - shift(220); // 'schema' + consume(220); // 'schema' break; case 223: // 'score' - shift(223); // 'score' + consume(223); // 'score' break; case 229: // 'sliding' - shift(229); // 'sliding' + consume(229); // 'sliding' break; case 235: // 'strict' - shift(235); // 'strict' + consume(235); // 'strict' break; case 246: // 'tumbling' - shift(246); // 'tumbling' + consume(246); // 'tumbling' break; case 247: // 'type' - shift(247); // 'type' + consume(247); // 'type' break; case 252: // 'updating' - shift(252); // 'updating' + consume(252); // 'updating' break; case 256: // 'value' - shift(256); // 'value' + consume(256); // 'value' break; case 258: // 'version' - shift(258); // 'version' + consume(258); // 'version' break; case 262: // 'while' - shift(262); // 'while' + consume(262); // 'while' break; case 92: // 'constraint' - shift(92); // 'constraint' + consume(92); // 'constraint' break; case 171: // 'loop' - shift(171); // 'loop' + consume(171); // 'loop' break; default: - shift(216); // 'returning' + consume(216); // 'returning' } eventHandler.endNonterminal("NCName", e0); } - function shift(t) + function consume(t) { if (l1 == t) { whitespace(); - eventHandler.terminal(XQueryTokenizer.TOKEN[l1], b1, e1 > size ? size : e1); + eventHandler.terminal(XQueryTokenizer.TOKEN[l1], b1, e1); b0 = b1; e0 = e1; l1 = 0; } else @@ -1426,9 +1444,8 @@ { if (e0 != b1) { - b0 = e0; + eventHandler.whitespace(e0, b1); e0 = b1; - eventHandler.whitespace(b0, e0); } } @@ -1468,15 +1485,16 @@ function error(b, e, s, l, t) { - throw new self.ParseException(b, e, s, l, t); + throw new thisParser.ParseException(b, e, s, l, t); } - var lk, b0, e0; + var b0, e0; var l1, b1, e1; var eventHandler; var input; var size; + var begin; var end; @@ -1514,6 +1532,7 @@ nonbmp = true; } } + var lo = 0, hi = 5; for (var m = 3; ; m = (hi + lo) >> 1) { @@ -1559,14 +1578,115 @@ end -= result >> 9; } + if (end > size) end = size; return (result & 511) - 1; } + } +XQueryTokenizer.XmlSerializer = function(log, indent) +{ + var input = null; + var delayedTag = null; + var hasChildElement = false; + var depth = 0; + + this.reset = function(string) + { + log(""); + input = string; + delayedTag = null; + hasChildElement = false; + depth = 0; + }; + + this.startNonterminal = function(tag, begin) + { + if (delayedTag != null) + { + log("<"); + log(delayedTag); + log(">"); + } + delayedTag = tag; + if (indent) + { + log("\n"); + for (var i = 0; i < depth; ++i) + { + log(" "); + } + } + hasChildElement = false; + ++depth; + }; + + this.endNonterminal = function(tag, end) + { + --depth; + if (delayedTag != null) + { + delayedTag = null; + log("<"); + log(tag); + log("/>"); + } + else + { + if (indent) + { + if (hasChildElement) + { + log("\n"); + for (var i = 0; i < depth; ++i) + { + log(" "); + } + } + } + log(""); + } + hasChildElement = true; + }; + + this.terminal = function(tag, begin, end) + { + if (tag.charAt(0) == '\'') tag = "TOKEN"; + this.startNonterminal(tag, begin); + characters(begin, end); + this.endNonterminal(tag, end); + }; + + this.whitespace = function(begin, end) + { + characters(begin, end); + }; + + function characters(begin, end) + { + if (begin < end) + { + if (delayedTag != null) + { + log("<"); + log(delayedTag); + log(">"); + delayedTag = null; + } + log(input.substring(begin, end) + .replace(/&/g, "&") + .replace(//g, ">")); + } + } +}; + XQueryTokenizer.getTokenSet = function(tokenSetId) { var set = []; - var s = tokenSetId < 0 ? - tokenSetId : INITIAL[tokenSetId] & 4095; + var s = tokenSetId < 0 ? - tokenSetId : XQueryTokenizer.INITIAL[tokenSetId] & 4095; for (var i = 0; i < 276; i += 32) { var j = i; @@ -1585,6 +1705,86 @@ XQueryTokenizer.getTokenSet = function(tokenSetId) return set; }; +XQueryTokenizer.TopDownTreeBuilder = function() +{ + var input = null; + var stack = null; + + this.reset = function(i) + { + input = i; + stack = []; + }; + + this.startNonterminal = function(name, begin) + { + var nonterminal = new XQueryTokenizer.Nonterminal(name, begin, begin, []); + if (stack.length > 0) addChild(nonterminal); + stack.push(nonterminal); + }; + + this.endNonterminal = function(name, end) + { + stack[stack.length - 1].end = end; + if (stack.length > 1) stack.pop(); + }; + + this.terminal = function(name, begin, end) + { + addChild(new XQueryTokenizer.Terminal(name, begin, end)); + }; + + this.whitespace = function(begin, end) + { + }; + + function addChild(s) + { + var current = stack[stack.length - 1]; + current.children.push(s); + } + + this.serialize = function(e) + { + e.reset(input); + stack[0].send(e); + }; +}; + +XQueryTokenizer.Terminal = function(name, begin, end) +{ + this.begin = begin; + this.end = end; + + this.send = function(e) + { + e.terminal(name, begin, end); + }; +}; + +XQueryTokenizer.Nonterminal = function(name, begin, end, children) +{ + this.begin = begin; + this.end = end; + + this.send = function(e) + { + e.startNonterminal(name, begin); + var pos = begin; + children.forEach + ( + function(c) + { + if (pos < c.begin) e.whitespace(pos, c.begin); + c.send(e); + pos = c.end; + } + ); + if (pos < end) e.whitespace(pos, end); + e.endNonterminal(name, end); + }; +}; + XQueryTokenizer.MAP0 = [ /* 0 */ 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, @@ -4168,4 +4368,7 @@ XQueryTokenizer.TOKEN = "'}}'" ]; + // line 510 "XQueryTokenizer.ebnf" + + // line 4374 "XQueryTokenizer.js" // End diff --git a/lib/parsers/JSONiqParser.js b/lib/parsers/JSONiqParser.js index f5f68a05..46258e7c 100644 --- a/lib/parsers/JSONiqParser.js +++ b/lib/parsers/JSONiqParser.js @@ -1,4 +1,4 @@ -// This file was generated on Tue Mar 29, 2016 09:35 (UTC+01) by REx v5.37 which is Copyright (c) 1979-2016 by Gunther Rademacher +// This file was generated on Thu Oct 31, 2019 19:56 (UTC+01) by REx v5.49 which is Copyright (c) 1979-2019 by Gunther Rademacher // REx command line: JSONiqParser.ebnf -ll 2 -backtrack -tree -javascript -a xqlint // line 2 "JSONiqParser.ebnf" @@ -6,34 +6,36 @@ { init(string, parsingEventHandler); // line 9 "JSONiqParser.js" - var self = this; + var thisParser = this; this.ParseException = function(b, e, s, o, x) { - var - begin = b, - end = e, - state = s, - offending = o, - expected = x; + var begin = b; + var end = e; + var state = s; + var offending = o; + var expected = x; this.getBegin = function() {return begin;}; this.getEnd = function() {return end;}; this.getState = function() {return state;}; this.getExpected = function() {return expected;}; this.getOffending = function() {return offending;}; + this.isAmbiguousInput = function() {return false;}; this.getMessage = function() { - return offending < 0 ? "lexical analysis failed" : "syntax error"; + return offending < 0 + ? "lexical analysis failed" + : "syntax error"; }; }; - function init(string, parsingEventHandler) + function init(source, parsingEventHandler) { eventHandler = parsingEventHandler; - input = string; - size = string.length; + input = source; + size = source.length; reset(0, 0, 0); } @@ -42,6 +44,16 @@ return input; }; + this.getTokenOffset = function() + { + return b0; + }; + + this.getTokenEnd = function() + { + return e0; + }; + function reset(l, b, e) { b0 = b; e0 = b; @@ -53,6 +65,11 @@ eventHandler.reset(input); } + this.reset = function(l, b, e) + { + reset(l, b, e); + }; + this.getOffendingToken = function(e) { var o = e.getOffending(); @@ -75,19 +92,20 @@ this.getErrorMessage = function(e) { - var tokenSet = this.getExpectedTokenSet(e); + var message = e.getMessage(); var found = this.getOffendingToken(e); + var tokenSet = this.getExpectedTokenSet(e); + var size = e.getEnd() - e.getBegin(); + message += (found == null ? "" : ", found " + found) + + "\nwhile expecting " + + (tokenSet.length == 1 ? tokenSet[0] : ("[" + tokenSet.join(", ") + "]")) + + "\n" + + (size == 0 || found != null ? "" : "after successfully scanning " + size + " characters beginning "); var prefix = input.substring(0, e.getBegin()); var lines = prefix.split("\n"); var line = lines.length; var column = lines[line - 1].length + 1; - var size = e.getEnd() - e.getBegin(); - return e.getMessage() - + (found == null ? "" : ", found " + found) - + "\nwhile expecting " - + (tokenSet.length == 1 ? tokenSet[0] : ("[" + tokenSet.join(", ") + "]")) - + "\n" - + (size == 0 || found != null ? "" : "after successfully scanning " + size + " characters beginning ") + return message + "at line " + line + ", column " + column + ":\n..." + input.substring(e.getBegin(), Math.min(input.length, e.getBegin() + 64)) + "..."; @@ -36912,7 +36930,7 @@ lx = l; tx = t; } - throw new self.ParseException(bx, ex, sx, lx, tx); + throw new thisParser.ParseException(bx, ex, sx, lx, tx); } var lk, b0, e0; @@ -36935,6 +36953,7 @@ var input; var size; + var begin; var end; @@ -36972,6 +36991,7 @@ nonbmp = true; } } + var lo = 0, hi = 5; for (var m = 3; ; m = (hi + lo) >> 1) { @@ -37020,8 +37040,108 @@ if (end > size) end = size; return (result & 511) - 1; } + } +JSONiqParser.XmlSerializer = function(log, indent) +{ + var input = null; + var delayedTag = null; + var hasChildElement = false; + var depth = 0; + + this.reset = function(string) + { + log(""); + input = string; + delayedTag = null; + hasChildElement = false; + depth = 0; + }; + + this.startNonterminal = function(tag, begin) + { + if (delayedTag != null) + { + log("<"); + log(delayedTag); + log(">"); + } + delayedTag = tag; + if (indent) + { + log("\n"); + for (var i = 0; i < depth; ++i) + { + log(" "); + } + } + hasChildElement = false; + ++depth; + }; + + this.endNonterminal = function(tag, end) + { + --depth; + if (delayedTag != null) + { + delayedTag = null; + log("<"); + log(tag); + log("/>"); + } + else + { + if (indent) + { + if (hasChildElement) + { + log("\n"); + for (var i = 0; i < depth; ++i) + { + log(" "); + } + } + } + log(""); + } + hasChildElement = true; + }; + + this.terminal = function(tag, begin, end) + { + if (tag.charAt(0) == '\'') tag = "TOKEN"; + this.startNonterminal(tag, begin); + characters(begin, end); + this.endNonterminal(tag, end); + }; + + this.whitespace = function(begin, end) + { + characters(begin, end); + }; + + function characters(begin, end) + { + if (begin < end) + { + if (delayedTag != null) + { + log("<"); + log(delayedTag); + log(">"); + delayedTag = null; + } + log(input.substring(begin, end) + .replace(/&/g, "&") + .replace(//g, ">")); + } + } +}; + JSONiqParser.getTokenSet = function(tokenSetId) { var set = []; @@ -37060,22 +37180,22 @@ JSONiqParser.TopDownTreeBuilder = function() var nonterminal = new JSONiqParser.Nonterminal(name, begin, begin, []); if (stack.length > 0) addChild(nonterminal); stack.push(nonterminal); - } + }; this.endNonterminal = function(name, end) { stack[stack.length - 1].end = end; if (stack.length > 1) stack.pop(); - } + }; this.terminal = function(name, begin, end) { addChild(new JSONiqParser.Terminal(name, begin, end)); - } + }; this.whitespace = function(begin, end) { - } + }; function addChild(s) { @@ -37087,27 +37207,24 @@ JSONiqParser.TopDownTreeBuilder = function() { e.reset(input); stack[0].send(e); - } -} + }; +}; JSONiqParser.Terminal = function(name, begin, end) { this.begin = begin; this.end = end; - this.name = name; this.send = function(e) { e.terminal(name, begin, end); - } -} + }; +}; JSONiqParser.Nonterminal = function(name, begin, end, children) { this.begin = begin; this.end = end; - this.name = name; - this.children = children; this.send = function(e) { @@ -37124,8 +37241,8 @@ JSONiqParser.Nonterminal = function(name, begin, end, children) ); if (pos < end) e.whitespace(pos, end); e.endNonterminal(name, end); - } -} + }; +}; JSONiqParser.MAP0 = [ diff --git a/lib/parsers/XQueryParser.ebnf b/lib/parsers/XQueryParser.ebnf index 44bd1e66..5b56f592 100644 --- a/lib/parsers/XQueryParser.ebnf +++ b/lib/parsers/XQueryParser.ebnf @@ -211,7 +211,9 @@ TreatExpr ::= CastableExpr ( 'treat' 'as' SequenceType )? CastableExpr ::= CastExpr ( 'castable' 'as' SingleType )? -CastExpr ::= UnaryExpr ( 'cast' 'as' SingleType )? +CastExpr ::= ArrowExpr ( 'cast' 'as' SingleType )? +ArrowExpr + ::= UnaryExpr ( '=>' ArrowFunctionSpecifier ArgumentList )* UnaryExpr ::= ( '-' | '+' )* ValueExpr ValueExpr @@ -293,6 +295,9 @@ Predicate Lookup ::= '?' KeySpecifier UnaryLookup ::= '?' KeySpecifier KeySpecifier ::= NCName | IntegerLiteral | ParenthesizedExpr | '*' +ArrowFunctionSpecifier ::= EQName + | VarRef + | ParenthesizedExpr Literal ::= NumericLiteral | StringLiteral NumericLiteral @@ -1028,6 +1033,7 @@ PrimaryExpr | BlockExpr | ObjectConstructor | ArrayConstructor + | StringConstructor | UnaryLookup | JSONSimpleObjectUnion @@ -1046,6 +1052,15 @@ SquareArrayConstructor ::= "[" (ExprSingle ("," ExprSingle)*)? "]" CurlyArrayConstructor ::= "array" EnclosedExpr +StringConstructor + ::= '``[' StringConstructorContent ']``' + /* ws: explicit */ +StringConstructorContent + ::= StringConstructorChars ( StringConstructorInterpolation StringConstructorChars )* + /* ws: explicit */ +StringConstructorInterpolation + ::= '`{' Expr? '}`' + BlockExpr ::= '{' StatementsAndOptionalExpr '}' FunctionDecl @@ -1119,6 +1134,9 @@ UnprefixedName Prefix ::= NCName LocalPart ::= NCName +StringConstructorChars + ::= ( Char* - ( Char* ( '`{' | ']``' ) Char* ) ) &( '`{' | ']`' ) + /* ws: explicit */ S ::= [#x0009#x000A#x000D#x0020]+ CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9A-Fa-f]+ ';' diff --git a/lib/parsers/XQueryParser.js b/lib/parsers/XQueryParser.js index c483ff9e..3eb33bc0 100644 --- a/lib/parsers/XQueryParser.js +++ b/lib/parsers/XQueryParser.js @@ -1,4 +1,4 @@ -// This file was generated on Tue Jan 2, 2018 19:56 (UTC+01) by REx v5.47 which is Copyright (c) 1979-2017 by Gunther Rademacher +// This file was generated on Thu Oct 31, 2019 19:56 (UTC+01) by REx v5.49 which is Copyright (c) 1979-2019 by Gunther Rademacher // REx command line: XQueryParser.ebnf -ll 2 -backtrack -tree -javascript -a xqlint // line 2 "XQueryParser.ebnf" @@ -114,11 +114,11 @@ this.parse_XQuery = function() { eventHandler.startNonterminal("XQuery", e0); - lookahead1W(280); // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | + lookahead1W(284); // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | // StringLiteral | S^WS | EOF | '$' | '%' | '(' | '(#' | '(:' | '+' | '-' | '.' | - // '..' | '/' | '//' | ';' | '<' | '' - consume(43); // '-->' + lookahead1(7); // '-->' + consume(44); // '-->' eventHandler.endNonterminal("DirCommentConstructor", e0); } function try_DirCommentConstructor() { - consumeT(55); // '' - consumeT(43); // '-->' + lookahead1(7); // '-->' + consumeT(44); // '-->' } function parse_DirPIConstructor() { eventHandler.startNonterminal("DirPIConstructor", e0); - consume(59); // '' - if (l1 == 21) // S + lookahead1(14); // S | '?>' + if (l1 == 22) // S { - consume(21); // S + consume(22); // S lookahead1(2); // DirPIContents consume(3); // DirPIContents } - lookahead1(9); // '?>' - consume(65); // '?>' + lookahead1(10); // '?>' + consume(67); // '?>' eventHandler.endNonterminal("DirPIConstructor", e0); } function try_DirPIConstructor() { - consumeT(59); // '' - if (l1 == 21) // S + lookahead1(14); // S | '?>' + if (l1 == 22) // S { - consumeT(21); // S + consumeT(22); // S lookahead1(2); // DirPIContents consumeT(3); // DirPIContents } - lookahead1(9); // '?>' - consumeT(65); // '?>' + lookahead1(10); // '?>' + consumeT(67); // '?>' } function parse_ComputedConstructor() @@ -12797,22 +13029,22 @@ eventHandler.startNonterminal("ComputedConstructor", e0); switch (l1) { - case 119: // 'document' + case 124: // 'document' parse_CompDocConstructor(); break; - case 121: // 'element' + case 126: // 'element' parse_CompElemConstructor(); break; - case 82: // 'attribute' + case 87: // 'attribute' parse_CompAttrConstructor(); break; - case 185: // 'namespace' + case 190: // 'namespace' parse_CompNamespaceConstructor(); break; - case 245: // 'text' + case 250: // 'text' parse_CompTextConstructor(); break; - case 96: // 'comment' + case 101: // 'comment' parse_CompCommentConstructor(); break; default: @@ -12825,22 +13057,22 @@ { switch (l1) { - case 119: // 'document' + case 124: // 'document' try_CompDocConstructor(); break; - case 121: // 'element' + case 126: // 'element' try_CompElemConstructor(); break; - case 82: // 'attribute' + case 87: // 'attribute' try_CompAttrConstructor(); break; - case 185: // 'namespace' + case 190: // 'namespace' try_CompNamespaceConstructor(); break; - case 245: // 'text' + case 250: // 'text' try_CompTextConstructor(); break; - case 96: // 'comment' + case 101: // 'comment' try_CompCommentConstructor(); break; default: @@ -12851,8 +13083,8 @@ function parse_CompElemConstructor() { eventHandler.startNonterminal("CompElemConstructor", e0); - consume(121); // 'element' - lookahead1W(262); // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' | + consume(126); // 'element' + lookahead1W(264); // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' | // 'ancestor-or-self' | 'and' | 'append' | 'array' | 'as' | 'ascending' | 'at' | // 'attribute' | 'base-uri' | 'before' | 'boundary-space' | 'break' | 'case' | // 'cast' | 'castable' | 'catch' | 'child' | 'collation' | 'comment' | @@ -12876,79 +13108,81 @@ // 'where' | 'while' | 'with' | 'xquery' | '{' switch (l1) { - case 277: // '{' - consume(277); // '{' - lookahead1W(273); // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | + case 282: // '{' + consume(282); // '{' + lookahead1W(276); // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | // StringLiteral | S^WS | '$' | '%' | '(' | '(#' | '(:' | '+' | '-' | '.' | '..' | - // '/' | '//' | '<' | '