From 24e2e9c3ce3a43862284c4e054ae8e27e63e8729 Mon Sep 17 00:00:00 2001 From: Dan Selman Date: Thu, 8 Jun 2017 12:08:34 +0100 Subject: [PATCH 1/5] Fixed broken links in docs --- .../jekylldocs/business-network/bnd-create.md | 2 +- .../jekylldocs/business-network/testing.md | 2 +- .../installing/getting-started-cmd-line.md | 233 ------------------ .../introduction/businessnetwork.md | 37 --- .../jekylldocs/introduction/key-concepts.md | 2 +- .../introduction/participantsandidentities.md | 69 ------ .../managing/participantsandidentities.md | 16 +- 7 files changed, 11 insertions(+), 350 deletions(-) delete mode 100644 packages/composer-website/jekylldocs/installing/getting-started-cmd-line.md delete mode 100644 packages/composer-website/jekylldocs/introduction/businessnetwork.md delete mode 100644 packages/composer-website/jekylldocs/introduction/participantsandidentities.md diff --git a/packages/composer-website/jekylldocs/business-network/bnd-create.md b/packages/composer-website/jekylldocs/business-network/bnd-create.md index 2413ac4ab7..c5d8b02be2 100644 --- a/packages/composer-website/jekylldocs/business-network/bnd-create.md +++ b/packages/composer-website/jekylldocs/business-network/bnd-create.md @@ -27,7 +27,7 @@ A description of the purpose of the business network using the Markdown mark-up ## Package.json A Business Network Definition has a name (limited to basic ASCII alphanumeric characters and `-`), a human-readable description and a version number. The version number for the network should take the form Major.Minor.Micro and -[Semantic Versioning](semver.org) principles should be used when incrementing the version number. +[Semantic Versioning](http://semver.org) principles should be used when incrementing the version number. The identifier of the network is formed from its name, the `-` character and its version number. A valid identifier is therefore `mybusinessnetwork-0.6.3`. diff --git a/packages/composer-website/jekylldocs/business-network/testing.md b/packages/composer-website/jekylldocs/business-network/testing.md index a36c14a94e..af9c863494 100644 --- a/packages/composer-website/jekylldocs/business-network/testing.md +++ b/packages/composer-website/jekylldocs/business-network/testing.md @@ -42,7 +42,7 @@ https://github.com/hyperledger/composer-sample-networks/blob/master/packages/bon ## References * [**Composer CLI commands**](../reference/commands.html) -* [**Mocha**](https://mochajs.orgl) +* [**Mocha**](https://mochajs.org) * [**Chai**](http://chaijs.com) * [**Sinon**](http://sinonjs.org) * [**Istambul**](https://istanbul.js.org) diff --git a/packages/composer-website/jekylldocs/installing/getting-started-cmd-line.md b/packages/composer-website/jekylldocs/installing/getting-started-cmd-line.md deleted file mode 100644 index c02fe16d6d..0000000000 --- a/packages/composer-website/jekylldocs/installing/getting-started-cmd-line.md +++ /dev/null @@ -1,233 +0,0 @@ ---- -layout: default -title: Getting Started with Hyperledger Composer -category: start -sidebar: sidebars/installing.md -excerpt: Getting Started with Hyperledger Composer ---- - -# Running a sample with the CLI - ---- - -Before you follow these instructions, make sure you've completed the -[Quickstart](../installing/quickstart.html)! After the end of the Quickstart there will be a local Hyperledger Fabric instance running and a deployed business network. - -This guide will explain more about the business network, and explain in more detail what is happening in the sample application. This is all done using a simple business network **Digital Property Network** - -## What is the Digital Property Network? - -This network will be expanded for other tutorials, but for this getting started we'll keep it simple. - -We going to model *Land Titles*, each of which has an owner, description, and a boolean saying if this property/land is up for sale. - -``` -asset LandTitle identified by titleId { - o String titleId - --> Person owner - o String information - o Boolean forSale optional -} -``` - -We'll also model the *Owner* as a Person (First,Last name). - -``` -participant Person identified by personId { - o String personId - o String firstName - o String lastName -} -``` - -We want to be able to mark one of the titles for sale so we'll create a *RegisterPropertyForSale* transaction that will update the for sale flag. - -``` -transaction RegisterPropertyForSale identified by transactionId{ - o String transactionId - --> Person seller - --> LandTitle title -} -``` - -The applications we're going to look at are going to store a number of (pretend) land titles, and mark them for sale. All this will be using the {{site.data.conrefs.composer_full}} backed by a real blockchain in the shape of a locally executing Hyperledger Fabric. - -## But what is an asset? -An asset is a term used to describe things of value both in the physical world and the equally real intangible world. These are stored in Asset Registries. Participants can act on these assets by submitting transactions. With the features of a blockchain provided by the Hyperledger Fabric, an application using {{site.data.conrefs.composer_full}} has a single source of truth for the state of these assets and their history. - -It's worth reading the [introduction](../introduction/introduction.html) page to get an idea of how everything fits together. The [Glossary](../reference/glossary.md) provides a detailed description of each term. - -## Updating the Business Network -All the resources and scripts you'll need are in a git repository that we'll clone, this will have the code for the applications along with the scripts to get the Hyperledger setup and ready to go. - -The first thing to do is to ensure that you have a suitable system ready for development. - -**Ensure that you have followed the steps in our [Quickstart](../installing/quickstart.md) before continuing!** - -Let's go ahead and make a change to start to show how easy it is to develop with {{site.data.conrefs.composer_full}}. - -### Clone the Repository and Install Dependencies -First clone the repository that contains the Business Network Definition (note this is not the same as the sample-applications repository). - -```bash -git clone https://github.com/hyperledger/composer-sample-networks.git -cd composer-sample-networks/packages/DigitalProperty-Network -npm install -``` - -### Update the Transaction Processor Function - -Open the file `lib/DigitalLandTitle.js` in a text editor and replace the contents with: - -```javascript - -'use strict'; - -/** Process a property that is held for sale - * @param {net.biz.digitalPropertyNetwork.RegisterPropertyForSale} propertyForSale the property to be sold - * @transaction - */ -function onRegisterPropertyForSale(propertyForSale) { - console.log('### onRegisterPropertyForSale ' + propertyForSale.toString()); - propertyForSale.title.forSale = true; - - /* new line is here to update the information */ - propertyForSale.title.information = propertyForSale.title.information + ' Updated at: ' + new Date().toDateString(); - - return getAssetRegistry('net.biz.digitalPropertyNetwork.LandTitle').then(function(result) { - return result.update(propertyForSale.title); - } - ); -} -``` - -### Update the Business Network Definition -In a real-life scenario at this point you would edit `package.json` to increment the version number in the `DigitalProperty-Network` directory and publish this to npm. Please do not publish to the DigitalProperty-Network in npm. - -What we'll do therefore is adopt a different approach to create the Business Network Archive. From within the DigitalProperty-Network directory. - -```bash -composer archive create --sourceType dir --sourceName . -Creating Business Network Archive -Looking for package.json of Business Network Definition in /home/matthew/git17/DigitalProperty-Network - -Description:Digital Property Network -Name:digitalproperty-network -Identifier:digitalproperty-network-0.0.22 - -Written Business Network Definition Archive file to digitalproperty-network-0.0.22.bna -Command completed successfully. -``` - -We now have a new file that is the digital business network archive. - -### Update the deployed business network - -```bash -composer network update --archiveFile digitalproperty-network@0.0.22.bna --enrollId WebAppAdmin --enrollSecret DJY27pEnl16d -Deploying business network from archive digitalproperty-network-0.0.22.bna -Business network definition: - Identifier: digitalproperty-network-0.0.22 - Description: Digital Property Network -Updating business network definition. This may take a few seconds... -Command completed successfully. -``` - -### Rerun the Test -If you go back to the getting started directory now - and list all the commands that available, you'll see one called `submitTransaction` - -```bash -npm run -Lifecycle scripts included in getting-started: - test - mocha --recursive && npm run bootstrapAssets && npm run listAssets && npm run submitTransaction - install - scripts/download-hyperledger.sh && scripts/start-hyperledger.sh && npm run deployNetwork - -available via `npm run-script`: - submitTransaction - node cli.js landregistry submit && node cli.js landregistry list - listAssets - node cli.js landregistry list - bootstrapAssets - node cli.js landregistry bootstrap - startHLF - scripts/start-hyperledger.sh - stopHLF - scripts/stop-hyperledger.sh - teardownHLF - scripts/teardown.sh - deployNetwork - composer archive create --sourceName digitalproperty-network --sourceType module --archiveFile digitalPropertyNetwork.bna && composer network deploy --archiveFile digitalPropertyNetwork.bna --enrollId WebAppAdmin --enrollSecret DJY27pEnl16d && composer network list -n digitalproperty-network --enrollId WebAppAdmin --enrollSecret DJY27pEnl16d - -``` - -If you issue this command, that will submit a transaction as before - but importantly this is the updated transaction function. You should now see: - -``` -npm run submitTransaction - -> getting-started@1.0.0 submitTransaction /home/matthew/github_lenny/sample-applications/packages/getting-started -> node cli.js landregistry submit && node cli.js landregistry list - -info: [Composer-GettingStarted] Hyperledger Composer: Getting Started appliation -info: [Composer-GettingStarted] LandRegistry: businessNetworkDefinition obtained digitalproperty-network@0.0.22 -info: [Composer-GettingStarted] updateForSale Getting assest from the registry. -info: [Composer-GettingStarted] updateForSale Submitting transaction -info: [Composer-GettingStarted] Transaction Submitted -undefined -info: [Composer-GettingStarted] Command completed successfully. -info: [Composer-GettingStarted] Hyperledger Composer: Getting Started appliation -info: [Composer-GettingStarted] LandRegistry: businessNetworkDefinition obtained digitalproperty-network@0.0.22 -info: [Composer-GettingStarted] listTitles Getting the asset registry -info: [Composer-GettingStarted] listTitles Getting all assest from the registry. -info: [Composer-GettingStarted] listTitles Current Land Titles -info: [Composer-GettingStarted] Titles listed -info: [Composer-GettingStarted] -┌──────────┬────────────────┬────────────┬─────────┬──────────────────────────────────────────────────────────┬─────────┐ -│ TitleID │ OwnerID │ First Name │ Surname │ Description │ ForSale │ -├──────────┼────────────────┼────────────┼─────────┼──────────────────────────────────────────────────────────┼─────────┤ -│ LID:1148 │ PID:1234567890 │ Fred │ Bloggs │ A nice house in the country Updated at: Thu, 02 Mar 2017 │ Yes │ -├──────────┼────────────────┼────────────┼─────────┼──────────────────────────────────────────────────────────┼─────────┤ -│ LID:6789 │ PID:1234567890 │ Fred │ Bloggs │ A small flat in the city │ No │ -└──────────┴────────────────┴────────────┴─────────┴──────────────────────────────────────────────────────────┴─────────┘ - -``` - -## Digging Deeper - -* `scripts/download-hyperledger.sh` This is a shell script that will download and tag the docker images for Hyperledger v0.6. It is important to note that this script will also delete the {{site.data.conrefs.composer_full}} Connection Profiles. This is important if you have connected to other Hyperledger Fabrics, or have changed the default ports that Hyperledger uses.`npm install` uses this script. - -* `scripts/start-hyperledger.sh` This is a shell script that starts the Hyperledger Fabric, this will also wait to make sure the Hyperledger Fabric has started. -`npm run startHLF` can also be used to call this script. -* `scripts/stop-hyperledger.sh` This is the opposite of the start script, and will stop the Hyperledger Fabric - but it critically does not delete or remove any state. Therefore it canbe restarted with the start script. `npm run stopHLF` can also be used to call this script. -* `scripts/teardown.sh` This will stop and remove all the docker images related to Hyperledger Fabric. This can be used to do an effective clean-up of the Hyperledger Fabric and the {{site.data.conrefs.composer_full}} Connection Profiles. - -**Composer CLI** - -* `composer archive create -m digitalproperty-network --archiveFile digitalPropertyNetwork.bna` -This command is used to create a Business Network Archive. `--archiveFile` is the name of the file. The `-m` is the npm module name of the business network to use. There is also a -d option to specify the directory the business network is in. Useful whilst developing the business network transactions functions. - -* `composer network deploy --archiveFile digitalPropertyNetwork.bna --enrollId WebAppAdmin --enrollSecret DJY27pEnl16d` -This deploys the business network to the HyperLedger runtime; the archive is specified but also the Hyperledger Entrollment Id and Secret (the secret if not included in the command line will be prompted for) -* `composer network list -n digitalproperty-network --enrollId WebAppAdmin --enrollSecret DJY27pEnl16d` -This lists the deployed business network details. `-n` is the name of the business network. With the same options for the Hyperledger Entrollment Id and Secret (the secret if not included in the command line will be prompted for) - -**Sample Applications** - -There are 3 sample JavaScript applications that use the {{site.data.conrefs.composer_full}} Client API to perform operations on the business network. These are applications that specific to the business network that has been defined in this Digital Property Network. - -* `node cli.js landregistry submit` This applications connects, and submits a transaction. -* `node cli.js landregistry list` This lists the contents of the asset registries that have been defined in the business network. -* `node cli.js landregistry bootstrap` This applications puts some pretend assets into the registries to work with. - -### Completed! -We have downloaded the Hyperledger Fabric Docker containers and started a locally running fabric. We have used the {{site.data.conrefs.composer_full}} Command line to deploy and update the DigitalProperty Network. We have used some JavaScript applications in node.js to list assets and submit transactions to work on those assets. A simple change and update has been made to one of the transaction functions. - -If you want to continue exploring, check out our other Getting Started guides: - -[Coding a Business Network Definition](../business-network/getting-started-coding-bnd.html) - -[Generating a REST API](../integrating/getting-started-rest-api.html) - -[Writing a Node.js App](../applications/getting-started-nodejs-app.html) diff --git a/packages/composer-website/jekylldocs/introduction/businessnetwork.md b/packages/composer-website/jekylldocs/introduction/businessnetwork.md deleted file mode 100644 index eb41ae65b2..0000000000 --- a/packages/composer-website/jekylldocs/introduction/businessnetwork.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -layout: default -title: Hyperledger Composer - Business Network -category: concepts -sidebar: sidebars/introduction.md -excerpt: Business Network ---- - -# An Example Business Network - ---- - -Imagine a property network, comprising participants who want to buy and sell property, estate agents (realtors) who provide matching services between buyers and sellers, conveyancers who exchange legal contracts related to the buying and selling of property, and government land registries who record the ongoing ownership of property. - -Here are the key elements of this property network. - -* Participants. Buyers, sellers, estate agents (realtors), conveyancers and the government land registry are the people and organizations who participate in this network. - -* Assets. Property is the asset that is exchanged and between buyers and sellers in the property network. Property is advertised by estate agents (realtors), exchanged by conveyancers, and recorded by land registries. Property has a fairly rich lifecycle, in that it can be created, exchanged, modified and destroyed. - -* Registries. Clearly the Land Registry record of properties is an obvious registry in this network, but there are others. The estate agent (realtor) has a set of properties for sale by registered sellers and interested buyers, and probably a separate record of the deals between buyers and sellers that are in-flight at a given moment in time. Conveyancers probably have a registry of properties in the process of being legally exchanged between buyers and sellers. Assets will be updated within these registries as they are exchanged between buyers and sellers. - -* Transactions. There are many transactions going on in this property network. Sellers sell property and buyers buy them. Conveyancers create and exchange legal contracts with other conveyancers on behalf of buyers and sellers and their respective property sales. The Land Registry records updates to property ownership, and estate agents (realtors) indicate that properties are for sale in a market and remove them from that market once they have been sold. - -{{site.data.conrefs.composer_full}} makes it easy to create these elements in a business network, and the applications which capture interactions between different participants. - -## Related Concepts - -[Business Network Definition](../introduction/businessnetworkdefinition.html) - -## Related Tasks - -[Deploying a business network](../business-network/deploybusinessnetwork.html) - -## Related Reference - -[Network deploy command](../reference/composer.network.deploy.md) diff --git a/packages/composer-website/jekylldocs/introduction/key-concepts.md b/packages/composer-website/jekylldocs/introduction/key-concepts.md index 74353e1f78..13fa335c3b 100644 --- a/packages/composer-website/jekylldocs/introduction/key-concepts.md +++ b/packages/composer-website/jekylldocs/introduction/key-concepts.md @@ -75,4 +75,4 @@ Business networks may contain a set of access control rules. Access control rule * To try {{site.data.conrefs.composer_full}} right away, see the [Online Playground](../installing/getting-started-with-playground.html) * For an architectural overview of a typical solution built with {{site.data.conrefs.composer_short}}, see [Typical Solution Architecture](./solution-architecture.html) -* To install the Development Tools, see [Getting setup with development tools](../installing/getting-started-cmd-line.html) +* To install the Development Tools, see [Getting setup with development tools](../installing/development-tools.html) diff --git a/packages/composer-website/jekylldocs/introduction/participantsandidentities.md b/packages/composer-website/jekylldocs/introduction/participantsandidentities.md deleted file mode 100644 index 8dc4f48423..0000000000 --- a/packages/composer-website/jekylldocs/introduction/participantsandidentities.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -layout: default -title: Hyperledger Composer - Participants and Identities -category: concepts -sidebar: sidebars/introduction.md -excerpt: Business Network ---- - -# Participants and Identities - ---- - -A `Participant` is an actor in a business network. A participant might be an -individual or an organization. A participant can create assets, and also exchange -assets with other participants. A participant works with assets by submitting transactions. - -A participant has a set of `Identity` documents that can be validated to prove the -identity of that participant. For example, an individual may have one or more of -the following identity documents that prove who they are: - -* Passport -* Driving license -* Fingerprints -* Retina scan -* SSL certificate - -In order for a new participant to join a business network, a new instance of that -participant must be created in the business network. An identity document must -then be `Issued` to that participant. The new participant can then use that identity -document to interact with the business network. - -Identity documents usually expire after a set period of time. Identity documents may -also be lost or stolen. If the identity document expires, or if it needs to be -replaced, then it must be `Revoked` so it can no longer be used to interact with -the business network. - -These actions are performed by an existing participant in the business network, -for example a regulatory body, or a participant in the same organization who has -been trusted to manage participants/identities in that organization. - -In {{site.data.conrefs.composer_full}}, the structure of a participant is modelled in a -model file. This structure may include various information about the participant, -for example the participants name, address, e-mail address, date of birth, etc. -New instances of that modelled participant can then be created and stored in a -participant registry. - -{{site.data.conrefs.composer_full}} uses Hyperledger Fabric enrollment certificates as -identity documents. APIs and command line applications are provided to issue and -revoke enrollment certificates to participants that are stored in a participant -registry. When transactions are submitted using those enrollment certificates, the -participant is identified and is made available for the transaction processor -function to use. - -## Related Concepts - -[Business Network](../introduction/businessnetwork.html) - -## Related Tasks - -[Create a Business Domain Model](../business-network/model-define.html) -[Add a Participant](../managing/participant-add.html) -[Issue an Identity to a Participant](../managing/identity-issue.html) -[Revoke an Identity from a Participant](../managing/identity-revoke.html) - -## Related Reference - -[Participant add command](../reference/composer.participant.add.html) -[Identity issue command](../reference/composer.identity.issue.html) -[Identity revoke command](../reference/composer.identity.revoke.html) diff --git a/packages/composer-website/jekylldocs/managing/participantsandidentities.md b/packages/composer-website/jekylldocs/managing/participantsandidentities.md index bfe4511f4b..3f1ab5af24 100644 --- a/packages/composer-website/jekylldocs/managing/participantsandidentities.md +++ b/packages/composer-website/jekylldocs/managing/participantsandidentities.md @@ -54,17 +54,17 @@ function to use. ## Related Concepts -[Business Network](../introduction/businessnetwork.html) +[Business Network](../business-network/business-network-index.html) ## Related Tasks -[Create a Business Domain Model](../business-network/model-define.html) -[Add a Participant](../managing/participant-add.html) -[Issue an Identity to a Participant](../managing/identity-issue.html) -[Revoke an Identity from a Participant](../managing/identity-revoke.html) +[Create a Business Network Definition](../business-network/bnd-create.html) +[Add a Participant](participant-add.html) +[Issue an Identity to a Participant](identity-issue.html) +[Revoke an Identity from a Participant](identity-revoke.html) ## Related Reference -[Participant add command](../reference/participant-add.html) -[Identity issue command](../reference/identity-issue.html) -[Identity revoke command](../reference/identity-revoke.html) +[Participant add command](../reference/composer.participant.add.html) +[Identity issue command](../reference/composer.identity.issue.html) +[Identity revoke command](../reference/composer.identity.revoke.html) From 20b57b7d8ee87824bbe2b3756ae1aaac3866c18c Mon Sep 17 00:00:00 2001 From: Dan Selman Date: Sun, 11 Jun 2017 20:30:24 +0100 Subject: [PATCH 2/5] Workin in progress changes for query DSL --- packages/composer-common/.eslintignore | 1 + .../composer-common/lib/query/condition.js | 147 + packages/composer-common/lib/query/orderby.js | 128 + packages/composer-common/lib/query/parser.js | 4945 +++++++++++++++++ .../composer-common/lib/query/parser.pegjs | 668 +++ packages/composer-common/lib/query/query.js | 118 + .../composer-common/lib/query/queryfile.js | 132 + packages/composer-common/lib/query/select.js | 146 + packages/composer-common/lib/query/where.js | 110 + packages/composer-common/package.json | 2 +- .../composer-common/test/query/invalid.qry | 3 + packages/composer-common/test/query/model.cto | 23 + .../composer-common/test/query/queryfile.js | 136 + packages/composer-common/test/query/test.qry | 106 + 14 files changed, 6664 insertions(+), 1 deletion(-) create mode 100644 packages/composer-common/lib/query/condition.js create mode 100644 packages/composer-common/lib/query/orderby.js create mode 100644 packages/composer-common/lib/query/parser.js create mode 100644 packages/composer-common/lib/query/parser.pegjs create mode 100644 packages/composer-common/lib/query/query.js create mode 100644 packages/composer-common/lib/query/queryfile.js create mode 100644 packages/composer-common/lib/query/select.js create mode 100644 packages/composer-common/lib/query/where.js create mode 100644 packages/composer-common/test/query/invalid.qry create mode 100644 packages/composer-common/test/query/model.cto create mode 100644 packages/composer-common/test/query/queryfile.js create mode 100644 packages/composer-common/test/query/test.qry diff --git a/packages/composer-common/.eslintignore b/packages/composer-common/.eslintignore index f4e3708187..6487264051 100644 --- a/packages/composer-common/.eslintignore +++ b/packages/composer-common/.eslintignore @@ -3,4 +3,5 @@ node_modules out lib/introspect/parser.js lib/acl/parser.js +lib/query/parser.js test/data diff --git a/packages/composer-common/lib/query/condition.js b/packages/composer-common/lib/query/condition.js new file mode 100644 index 0000000000..5cc0b3c9ca --- /dev/null +++ b/packages/composer-common/lib/query/condition.js @@ -0,0 +1,147 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const Where = require('./where'); +const OrderBy = require('./orderby'); +const IllegalModelException = require('../introspect/illegalmodelexception'); + +/** + * Condition defines the left-hand-side, operator and right-hand-side + * for a conditional select in a Where clause. + * + * @private + * @class + * @memberof module:composer-common + */ +class Condition { + + /** + * Create an Select from an Abstract Syntax Tree. The AST is the + * result of parsing. + * + * @param {Query} query - the Query for this select + * @param {string} ast - the AST created by the parser + * @throws {IllegalModelException} + */ + constructor(query, ast) { + if(!query || !ast) { + throw new IllegalModelException('Invalid Query or AST'); + } + + this.ast = ast; + this.query = query; + this.process(); + } + + /** + * Visitor design pattern + * @param {Object} visitor - the visitor + * @param {Object} parameters - the parameter + * @return {Object} the result of visiting or null + * @private + */ + accept(visitor,parameters) { + return visitor.visit(this, parameters); + } + + /** + * Returns the QueryFile that owns this Query. + * + * @return {AclFile} the owning QueryFile + */ + getQuery() { + return this.query; + } + + /** + * Process the AST and build the model + * + * @throws {IllegalModelException} + * @private + */ + process() { + this.resource = this.ast.resource; + + this.where = null; + if(this.ast.where) { + this.where = new Where(this.ast.where); + } + + this.limit = null; + if(this.ast.limit) { + this.limit = parseInt(this.ast.limit); + } + + this.skip = null; + if(this.ast.skip) { + this.skip = parseInt(this.ast.skip); + } + + this.orderBy = null; + if(this.ast.orderBy) { + this.orderBy = new OrderBy(this.ast.orderBy); + } + } + + /** + * Semantic validation of the structure of this select. + * + * @throws {IllegalModelException} + * @private + */ + validate() { + const mm = this.getQuery().getQueryFile().getModelManager(); + + // checks the resource type exists + const resourceClassDeclaration = mm.getType(this.resource); + + // check that it is not an enum or concept + if(resourceClassDeclaration.isConcept() || resourceClassDeclaration.isEnum()) { + throw new Error('Can only select assets, participants and transactions.'); + } + + if(this.where) { + this.where.validate(); + } + + if(this.orderBy) { + this.orderBy.validate(); + } + } + + /** + * Returns the FQN of the resource of this select. + * + * @return {string} the fully qualified name of the select + */ + getResource() { + return this.resource; + } + + /** + * Returns a new object representing this Query that is + * suitable for serializing as JSON. + * @return {Object} A new object suitable for serializing as JSON. + */ + toJSON() { + let result = { + resouce: this.resource + }; + return result; + } +} + +module.exports = Condition; diff --git a/packages/composer-common/lib/query/orderby.js b/packages/composer-common/lib/query/orderby.js new file mode 100644 index 0000000000..0c74326809 --- /dev/null +++ b/packages/composer-common/lib/query/orderby.js @@ -0,0 +1,128 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const IllegalModelException = require('../introspect/illegalmodelexception'); +const Where = require('../where'); + +/** + * Select defines a SELECT query over a resource (asset, transaction or participant) + * + * @private + * @class + * @memberof module:composer-common + */ +class OrderBy { + + /** + * Create an Select from an Abstract Syntax Tree. The AST is the + * result of parsing. + * + * @param {Query} query - the Query for this select + * @param {string} ast - the AST created by the parser + * @throws {IllegalModelException} + */ + constructor(query, ast) { + if(!query || !ast) { + throw new IllegalModelException('Invalid Query or AST'); + } + + this.ast = ast; + this.query = query; + this.process(); + } + + /** + * Visitor design pattern + * @param {Object} visitor - the visitor + * @param {Object} parameters - the parameter + * @return {Object} the result of visiting or null + * @private + */ + accept(visitor,parameters) { + return visitor.visit(this, parameters); + } + + /** + * Returns the QueryFile that owns this Query. + * + * @return {AclFile} the owning QueryFile + */ + getQuery() { + return this.query; + } + + /** + * Process the AST and build the model + * + * @throws {IllegalModelException} + * @private + */ + process() { + this.resource = this.ast.resource; + + this.where = null; + if(this.ast.where) { + this.where = new Where(this.ast.where); + } + + this.limit = null; + if(this.ast.limit) { + this.limit = this.ast.limit; + } + + this.skip = null; + if(this.ast.skip) { + this.skip = this.ast.skip; + } + + this.orderBy = null; + if(this.ast.orderBy) { + this.orderBy = new OrderBy(this.ast.orderBy); + } + } + + /** + * Semantic validation of the structure of this select. + * + * @throws {IllegalModelException} + * @private + */ + validate() { + } + + /** + * Returns the FQN of the resource of this select. + * + * @return {string} the fully qualified name of the select + */ + getResource() { + return this.resource; + } + + /** + * Returns a new object representing this Query that is + * suitable for serializing as JSON. + * @return {Object} A new object suitable for serializing as JSON. + */ + toJSON() { + let result = { + resouce: this.resource + }; + return result; + } +} + +module.exports = OrderBy; diff --git a/packages/composer-common/lib/query/parser.js b/packages/composer-common/lib/query/parser.js new file mode 100644 index 0000000000..4b0a1bc592 --- /dev/null +++ b/packages/composer-common/lib/query/parser.js @@ -0,0 +1,4945 @@ +module.exports = (function() { + "use strict"; + + /* + * Generated by PEG.js 0.9.0. + * + * http://pegjs.org/ + */ + + function peg$subclass(child, parent) { + function ctor() { this.constructor = child; } + ctor.prototype = parent.prototype; + child.prototype = new ctor(); + } + + function peg$SyntaxError(message, expected, found, location) { + this.message = message; + this.expected = expected; + this.found = found; + this.location = location; + this.name = "SyntaxError"; + + if (typeof Error.captureStackTrace === "function") { + Error.captureStackTrace(this, peg$SyntaxError); + } + } + + peg$subclass(peg$SyntaxError, Error); + + function peg$parse(input) { + var options = arguments.length > 1 ? arguments[1] : {}, + parser = this, + + peg$FAILED = {}, + + peg$startRuleFunctions = { Start: peg$parseStart }, + peg$startRuleFunction = peg$parseStart, + + peg$c0 = function(program) { return program; }, + peg$c1 = { type: "any", description: "any character" }, + peg$c2 = { type: "other", description: "whitespace" }, + peg$c3 = "\t", + peg$c4 = { type: "literal", value: "\t", description: "\"\\t\"" }, + peg$c5 = "\x0B", + peg$c6 = { type: "literal", value: "\x0B", description: "\"\\x0B\"" }, + peg$c7 = "\f", + peg$c8 = { type: "literal", value: "\f", description: "\"\\f\"" }, + peg$c9 = " ", + peg$c10 = { type: "literal", value: " ", description: "\" \"" }, + peg$c11 = "\xA0", + peg$c12 = { type: "literal", value: "\xA0", description: "\"\\xA0\"" }, + peg$c13 = "\uFEFF", + peg$c14 = { type: "literal", value: "\uFEFF", description: "\"\\uFEFF\"" }, + peg$c15 = /^[\n\r\u2028\u2029]/, + peg$c16 = { type: "class", value: "[\\n\\r\\u2028\\u2029]", description: "[\\n\\r\\u2028\\u2029]" }, + peg$c17 = { type: "other", description: "end of line" }, + peg$c18 = "\n", + peg$c19 = { type: "literal", value: "\n", description: "\"\\n\"" }, + peg$c20 = "\r\n", + peg$c21 = { type: "literal", value: "\r\n", description: "\"\\r\\n\"" }, + peg$c22 = "\r", + peg$c23 = { type: "literal", value: "\r", description: "\"\\r\"" }, + peg$c24 = "\u2028", + peg$c25 = { type: "literal", value: "\u2028", description: "\"\\u2028\"" }, + peg$c26 = "\u2029", + peg$c27 = { type: "literal", value: "\u2029", description: "\"\\u2029\"" }, + peg$c28 = { type: "other", description: "comment" }, + peg$c29 = "/*", + peg$c30 = { type: "literal", value: "/*", description: "\"/*\"" }, + peg$c31 = "*/", + peg$c32 = { type: "literal", value: "*/", description: "\"*/\"" }, + peg$c33 = "//", + peg$c34 = { type: "literal", value: "//", description: "\"//\"" }, + peg$c35 = function(name) { return name; }, + peg$c36 = { type: "other", description: "identifier" }, + peg$c37 = function(first, rest) { + return { + type: "Identifier", + name: first + rest.join("") + }; + }, + peg$c38 = "$", + peg$c39 = { type: "literal", value: "$", description: "\"$\"" }, + peg$c40 = "_", + peg$c41 = { type: "literal", value: "_", description: "\"_\"" }, + peg$c42 = "\\", + peg$c43 = { type: "literal", value: "\\", description: "\"\\\\\"" }, + peg$c44 = function(sequence) { return sequence; }, + peg$c45 = "\u200C", + peg$c46 = { type: "literal", value: "\u200C", description: "\"\\u200C\"" }, + peg$c47 = "\u200D", + peg$c48 = { type: "literal", value: "\u200D", description: "\"\\u200D\"" }, + peg$c49 = function() { return { type: "Literal", value: null }; }, + peg$c50 = function() { return { type: "Literal", value: true }; }, + peg$c51 = function() { return { type: "Literal", value: false }; }, + peg$c52 = { type: "other", description: "number" }, + peg$c53 = function(literal) { + return literal; + }, + peg$c54 = ".", + peg$c55 = { type: "literal", value: ".", description: "\".\"" }, + peg$c56 = function() { + return { type: "Literal", value: parseFloat(text()) }; + }, + peg$c57 = "0", + peg$c58 = { type: "literal", value: "0", description: "\"0\"" }, + peg$c59 = /^[0-9]/, + peg$c60 = { type: "class", value: "[0-9]", description: "[0-9]" }, + peg$c61 = /^[1-9]/, + peg$c62 = { type: "class", value: "[1-9]", description: "[1-9]" }, + peg$c63 = "e", + peg$c64 = { type: "literal", value: "e", description: "\"e\"" }, + peg$c65 = /^[+\-]/, + peg$c66 = { type: "class", value: "[+-]", description: "[+-]" }, + peg$c67 = "0x", + peg$c68 = { type: "literal", value: "0x", description: "\"0x\"" }, + peg$c69 = function(digits) { + return { type: "Literal", value: parseInt(digits, 16) }; + }, + peg$c70 = /^[0-9a-f]/i, + peg$c71 = { type: "class", value: "[0-9a-f]i", description: "[0-9a-f]i" }, + peg$c72 = { type: "other", description: "string" }, + peg$c73 = "\"", + peg$c74 = { type: "literal", value: "\"", description: "\"\\\"\"" }, + peg$c75 = function(chars) { + return { type: "Literal", value: chars.join("") }; + }, + peg$c76 = "'", + peg$c77 = { type: "literal", value: "'", description: "\"'\"" }, + peg$c78 = function() { return text(); }, + peg$c79 = function() { return ""; }, + peg$c80 = function() { return "\0"; }, + peg$c81 = "b", + peg$c82 = { type: "literal", value: "b", description: "\"b\"" }, + peg$c83 = function() { return "\b"; }, + peg$c84 = "f", + peg$c85 = { type: "literal", value: "f", description: "\"f\"" }, + peg$c86 = function() { return "\f"; }, + peg$c87 = "n", + peg$c88 = { type: "literal", value: "n", description: "\"n\"" }, + peg$c89 = function() { return "\n"; }, + peg$c90 = "r", + peg$c91 = { type: "literal", value: "r", description: "\"r\"" }, + peg$c92 = function() { return "\r"; }, + peg$c93 = "t", + peg$c94 = { type: "literal", value: "t", description: "\"t\"" }, + peg$c95 = function() { return "\t"; }, + peg$c96 = "v", + peg$c97 = { type: "literal", value: "v", description: "\"v\"" }, + peg$c98 = function() { return "\x0B"; }, + peg$c99 = "x", + peg$c100 = { type: "literal", value: "x", description: "\"x\"" }, + peg$c101 = "u", + peg$c102 = { type: "literal", value: "u", description: "\"u\"" }, + peg$c103 = function(digits) { + return String.fromCharCode(parseInt(digits, 16)); + }, + peg$c104 = { type: "other", description: "regular expression" }, + peg$c105 = "/", + peg$c106 = { type: "literal", value: "/", description: "\"/\"" }, + peg$c107 = function(pattern, flags) { + var value; + + try { + value = new RegExp(pattern, flags); + } catch (e) { + error(e.message); + } + + return { type: "Literal", value: value }; + }, + peg$c108 = /^[*\\\/[]/, + peg$c109 = { type: "class", value: "[*\\\\/[]", description: "[*\\\\/[]" }, + peg$c110 = /^[\\\/[]/, + peg$c111 = { type: "class", value: "[\\\\/[]", description: "[\\\\/[]" }, + peg$c112 = "[", + peg$c113 = { type: "literal", value: "[", description: "\"[\"" }, + peg$c114 = "]", + peg$c115 = { type: "literal", value: "]", description: "\"]\"" }, + peg$c116 = /^[\]\\]/, + peg$c117 = { type: "class", value: "[\\]\\\\]", description: "[\\]\\\\]" }, + peg$c118 = /^[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]/, + peg$c119 = { type: "class", value: "[\\u0061-\\u007A\\u00B5\\u00DF-\\u00F6\\u00F8-\\u00FF\\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]", description: "[\\u0061-\\u007A\\u00B5\\u00DF-\\u00F6\\u00F8-\\u00FF\\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]" }, + peg$c120 = /^[\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]/, + peg$c121 = { type: "class", value: "[\\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]", description: "[\\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]" }, + peg$c122 = /^[\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]/, + peg$c123 = { type: "class", value: "[\\u00AA\\u00BA\\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]", description: "[\\u00AA\\u00BA\\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]" }, + peg$c124 = /^[\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC]/, + peg$c125 = { type: "class", value: "[\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88-\\u1F8F\\u1F98-\\u1F9F\\u1FA8-\\u1FAF\\u1FBC\\u1FCC\\u1FFC]", description: "[\\u01C5\\u01C8\\u01CB\\u01F2\\u1F88-\\u1F8F\\u1F98-\\u1F9F\\u1FA8-\\u1FAF\\u1FBC\\u1FCC\\u1FFC]" }, + peg$c126 = /^[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]/, + peg$c127 = { type: "class", value: "[\\u0041-\\u005A\\u00C0-\\u00D6\\u00D8-\\u00DE\\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]", description: "[\\u0041-\\u005A\\u00C0-\\u00D6\\u00D8-\\u00DE\\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]" }, + peg$c128 = /^[\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]/, + peg$c129 = { type: "class", value: "[\\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]", description: "[\\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]" }, + peg$c130 = /^[\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]/, + peg$c131 = { type: "class", value: "[\\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]", description: "[\\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]" }, + peg$c132 = /^[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]/, + peg$c133 = { type: "class", value: "[\\u0030-\\u0039\\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]", description: "[\\u0030-\\u0039\\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]" }, + peg$c134 = /^[\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF]/, + peg$c135 = { type: "class", value: "[\\u16EE-\\u16F0\\u2160-\\u2182\\u2185-\\u2188\\u3007\\u3021-\\u3029\\u3038-\\u303A\\uA6E6-\\uA6EF]", description: "[\\u16EE-\\u16F0\\u2160-\\u2182\\u2185-\\u2188\\u3007\\u3021-\\u3029\\u3038-\\u303A\\uA6E6-\\uA6EF]" }, + peg$c136 = /^[_\u203F-\u2040\u2054\uFE33-\uFE34\uFE4D-\uFE4F\uFF3F]/, + peg$c137 = { type: "class", value: "[\\u005F\\u203F-\\u2040\\u2054\\uFE33-\\uFE34\\uFE4D-\\uFE4F\\uFF3F]", description: "[\\u005F\\u203F-\\u2040\\u2054\\uFE33-\\uFE34\\uFE4D-\\uFE4F\\uFF3F]" }, + peg$c138 = /^[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/, + peg$c139 = { type: "class", value: "[\\u0020\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]", description: "[\\u0020\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]" }, + peg$c140 = "query", + peg$c141 = { type: "literal", value: "query", description: "\"query\"" }, + peg$c142 = "import", + peg$c143 = { type: "literal", value: "import", description: "\"import\"" }, + peg$c144 = "null", + peg$c145 = { type: "literal", value: "null", description: "\"null\"" }, + peg$c146 = "true", + peg$c147 = { type: "literal", value: "true", description: "\"true\"" }, + peg$c148 = "false", + peg$c149 = { type: "literal", value: "false", description: "\"false\"" }, + peg$c150 = "SELECT", + peg$c151 = { type: "literal", value: "SELECT", description: "\"SELECT\"" }, + peg$c152 = "FROM", + peg$c153 = { type: "literal", value: "FROM", description: "\"FROM\"" }, + peg$c154 = "WHERE", + peg$c155 = { type: "literal", value: "WHERE", description: "\"WHERE\"" }, + peg$c156 = "OR", + peg$c157 = { type: "literal", value: "OR", description: "\"OR\"" }, + peg$c158 = "AND", + peg$c159 = { type: "literal", value: "AND", description: "\"AND\"" }, + peg$c160 = "ORDER BY", + peg$c161 = { type: "literal", value: "ORDER BY", description: "\"ORDER BY\"" }, + peg$c162 = "SKIP", + peg$c163 = { type: "literal", value: "SKIP", description: "\"SKIP\"" }, + peg$c164 = "LIMIT", + peg$c165 = { type: "literal", value: "LIMIT", description: "\"LIMIT\"" }, + peg$c166 = "ASC", + peg$c167 = { type: "literal", value: "ASC", description: "\"ASC\"" }, + peg$c168 = "DESC", + peg$c169 = { type: "literal", value: "DESC", description: "\"DESC\"" }, + peg$c170 = "!=", + peg$c171 = { type: "literal", value: "!=", description: "\"!=\"" }, + peg$c172 = "=", + peg$c173 = { type: "literal", value: "=", description: "\"=\"" }, + peg$c174 = "<", + peg$c175 = { type: "literal", value: "<", description: "\"<\"" }, + peg$c176 = "<=", + peg$c177 = { type: "literal", value: "<=", description: "\"<=\"" }, + peg$c178 = ">", + peg$c179 = { type: "literal", value: ">", description: "\">\"" }, + peg$c180 = ">=", + peg$c181 = { type: "literal", value: ">=", description: "\">=\"" }, + peg$c182 = ";", + peg$c183 = { type: "literal", value: ";", description: "\";\"" }, + peg$c184 = "}", + peg$c185 = { type: "literal", value: "}", description: "\"}\"" }, + peg$c186 = function(first, rest) { + return first.concat(JSON.stringify(rest).replace(/['"]+/g, '')); + }, + peg$c187 = function(queries) { + return { + type: "Queries", + queries: queries + }; + }, + peg$c188 = "{", + peg$c189 = { type: "literal", value: "{", description: "\"{\"" }, + peg$c190 = "description:", + peg$c191 = { type: "literal", value: "description:", description: "\"description:\"" }, + peg$c192 = "statement:", + peg$c193 = { type: "literal", value: "statement:", description: "\"statement:\"" }, + peg$c194 = function(id, description, select) { + return { + type: "Query", + identifier: id, + description: description, + select: select, + location: location() + }; + }, + peg$c195 = function(resource, from, registry, where, orderBy, limit, skip) { + return { + type: "SELECT FROM", + resource: resource, + registry: registry, + where: where, + limit: limit, + skip: skip, + orderBy: orderBy, + location: location() + }; + }, + peg$c196 = function(resource, where, orderBy, limit, skip) { + return { + type: "SELECT", + resource: resource, + where: where, + limit: limit, + skip: skip, + orderBy: orderBy, + location: location() + }; + }, + peg$c197 = function(limit) { + return { + limit: limit + }; + }, + peg$c198 = function(skip) { + return { + skip: skip + }; + }, + peg$c199 = function() { return "ASC"; }, + peg$c200 = function() { return "DESC"; }, + peg$c201 = function(sort) { + return { + sort: sort, + }; + }, + peg$c202 = function(first, rest) { + return [first].concat(rest); + }, + peg$c203 = ",", + peg$c204 = { type: "literal", value: ",", description: "\",\"" }, + peg$c205 = function(item) { + return item; + }, + peg$c206 = function(fieldName, direction) { + return { + fieldName: fieldName, + direction: direction + }; + }, + peg$c207 = { type: "other", description: "where expression" }, + peg$c208 = function(x, xs) { + return { + conditions: [x].concat(xs), + location: location() + }; + }, + peg$c209 = "(", + peg$c210 = { type: "literal", value: "(", description: "\"(\"" }, + peg$c211 = ")", + peg$c212 = { type: "literal", value: ")", description: "\")\"" }, + peg$c213 = function(x, xs) { + return [x].concat(xs); + }, + peg$c214 = function(left, op, right) { + return { + left: left, + op: op, + right: right, + location: location() + }; + }, + peg$c215 = function(j, l) { + return { + joiner: j, + expression: l + }; + }, + peg$c216 = function() { return "!="; }, + peg$c217 = function() { return "="; }, + peg$c218 = function() { return "<"; }, + peg$c219 = function() { return "<="; }, + peg$c220 = function() { return ">"; }, + peg$c221 = function() { return ">="; }, + peg$c222 = "@", + peg$c223 = { type: "literal", value: "@", description: "\"@\"" }, + peg$c224 = function(name) { + return { + type: "Placeholder", + index: name, + location: location() + }; + }, + peg$c225 = function(chars) { + return chars.join(""); + }, + + peg$currPos = 0, + peg$savedPos = 0, + peg$posDetailsCache = [{ line: 1, column: 1, seenCR: false }], + peg$maxFailPos = 0, + peg$maxFailExpected = [], + peg$silentFails = 0, + + peg$result; + + if ("startRule" in options) { + if (!(options.startRule in peg$startRuleFunctions)) { + throw new Error("Can't start parsing from rule \"" + options.startRule + "\"."); + } + + peg$startRuleFunction = peg$startRuleFunctions[options.startRule]; + } + + function text() { + return input.substring(peg$savedPos, peg$currPos); + } + + function location() { + return peg$computeLocation(peg$savedPos, peg$currPos); + } + + function expected(description) { + throw peg$buildException( + null, + [{ type: "other", description: description }], + input.substring(peg$savedPos, peg$currPos), + peg$computeLocation(peg$savedPos, peg$currPos) + ); + } + + function error(message) { + throw peg$buildException( + message, + null, + input.substring(peg$savedPos, peg$currPos), + peg$computeLocation(peg$savedPos, peg$currPos) + ); + } + + function peg$computePosDetails(pos) { + var details = peg$posDetailsCache[pos], + p, ch; + + if (details) { + return details; + } else { + p = pos - 1; + while (!peg$posDetailsCache[p]) { + p--; + } + + details = peg$posDetailsCache[p]; + details = { + line: details.line, + column: details.column, + seenCR: details.seenCR + }; + + while (p < pos) { + ch = input.charAt(p); + if (ch === "\n") { + if (!details.seenCR) { details.line++; } + details.column = 1; + details.seenCR = false; + } else if (ch === "\r" || ch === "\u2028" || ch === "\u2029") { + details.line++; + details.column = 1; + details.seenCR = true; + } else { + details.column++; + details.seenCR = false; + } + + p++; + } + + peg$posDetailsCache[pos] = details; + return details; + } + } + + function peg$computeLocation(startPos, endPos) { + var startPosDetails = peg$computePosDetails(startPos), + endPosDetails = peg$computePosDetails(endPos); + + return { + start: { + offset: startPos, + line: startPosDetails.line, + column: startPosDetails.column + }, + end: { + offset: endPos, + line: endPosDetails.line, + column: endPosDetails.column + } + }; + } + + function peg$fail(expected) { + if (peg$currPos < peg$maxFailPos) { return; } + + if (peg$currPos > peg$maxFailPos) { + peg$maxFailPos = peg$currPos; + peg$maxFailExpected = []; + } + + peg$maxFailExpected.push(expected); + } + + function peg$buildException(message, expected, found, location) { + function cleanupExpected(expected) { + var i = 1; + + expected.sort(function(a, b) { + if (a.description < b.description) { + return -1; + } else if (a.description > b.description) { + return 1; + } else { + return 0; + } + }); + + while (i < expected.length) { + if (expected[i - 1] === expected[i]) { + expected.splice(i, 1); + } else { + i++; + } + } + } + + function buildMessage(expected, found) { + function stringEscape(s) { + function hex(ch) { return ch.charCodeAt(0).toString(16).toUpperCase(); } + + return s + .replace(/\\/g, '\\\\') + .replace(/"/g, '\\"') + .replace(/\x08/g, '\\b') + .replace(/\t/g, '\\t') + .replace(/\n/g, '\\n') + .replace(/\f/g, '\\f') + .replace(/\r/g, '\\r') + .replace(/[\x00-\x07\x0B\x0E\x0F]/g, function(ch) { return '\\x0' + hex(ch); }) + .replace(/[\x10-\x1F\x80-\xFF]/g, function(ch) { return '\\x' + hex(ch); }) + .replace(/[\u0100-\u0FFF]/g, function(ch) { return '\\u0' + hex(ch); }) + .replace(/[\u1000-\uFFFF]/g, function(ch) { return '\\u' + hex(ch); }); + } + + var expectedDescs = new Array(expected.length), + expectedDesc, foundDesc, i; + + for (i = 0; i < expected.length; i++) { + expectedDescs[i] = expected[i].description; + } + + expectedDesc = expected.length > 1 + ? expectedDescs.slice(0, -1).join(", ") + + " or " + + expectedDescs[expected.length - 1] + : expectedDescs[0]; + + foundDesc = found ? "\"" + stringEscape(found) + "\"" : "end of input"; + + return "Expected " + expectedDesc + " but " + foundDesc + " found."; + } + + if (expected !== null) { + cleanupExpected(expected); + } + + return new peg$SyntaxError( + message !== null ? message : buildMessage(expected, found), + expected, + found, + location + ); + } + + function peg$parseStart() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parse__(); + if (s1 !== peg$FAILED) { + s2 = peg$parseProgram(); + if (s2 !== peg$FAILED) { + s3 = peg$parse__(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c0(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSourceCharacter() { + var s0; + + if (input.length > peg$currPos) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c1); } + } + + return s0; + } + + function peg$parseWhiteSpace() { + var s0, s1; + + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 9) { + s0 = peg$c3; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c4); } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 11) { + s0 = peg$c5; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c6); } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 12) { + s0 = peg$c7; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c8); } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 32) { + s0 = peg$c9; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c10); } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 160) { + s0 = peg$c11; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c12); } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 65279) { + s0 = peg$c13; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c14); } + } + if (s0 === peg$FAILED) { + s0 = peg$parseZs(); + } + } + } + } + } + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c2); } + } + + return s0; + } + + function peg$parseLineTerminator() { + var s0; + + if (peg$c15.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c16); } + } + + return s0; + } + + function peg$parseLineTerminatorSequence() { + var s0, s1; + + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 10) { + s0 = peg$c18; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c19); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c20) { + s0 = peg$c20; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c21); } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 13) { + s0 = peg$c22; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c23); } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 8232) { + s0 = peg$c24; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c25); } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 8233) { + s0 = peg$c26; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c27); } + } + } + } + } + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c17); } + } + + return s0; + } + + function peg$parseComment() { + var s0, s1; + + peg$silentFails++; + s0 = peg$parseMultiLineComment(); + if (s0 === peg$FAILED) { + s0 = peg$parseSingleLineComment(); + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c28); } + } + + return s0; + } + + function peg$parseMultiLineComment() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c29) { + s1 = peg$c29; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c30); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$currPos; + peg$silentFails++; + if (input.substr(peg$currPos, 2) === peg$c31) { + s5 = peg$c31; + peg$currPos += 2; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c32); } + } + peg$silentFails--; + if (s5 === peg$FAILED) { + s4 = void 0; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$currPos; + peg$silentFails++; + if (input.substr(peg$currPos, 2) === peg$c31) { + s5 = peg$c31; + peg$currPos += 2; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c32); } + } + peg$silentFails--; + if (s5 === peg$FAILED) { + s4 = void 0; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c31) { + s3 = peg$c31; + peg$currPos += 2; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c32); } + } + if (s3 !== peg$FAILED) { + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseMultiLineCommentNoLineTerminator() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c29) { + s1 = peg$c29; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c30); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$currPos; + peg$silentFails++; + if (input.substr(peg$currPos, 2) === peg$c31) { + s5 = peg$c31; + peg$currPos += 2; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c32); } + } + if (s5 === peg$FAILED) { + s5 = peg$parseLineTerminator(); + } + peg$silentFails--; + if (s5 === peg$FAILED) { + s4 = void 0; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$currPos; + peg$silentFails++; + if (input.substr(peg$currPos, 2) === peg$c31) { + s5 = peg$c31; + peg$currPos += 2; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c32); } + } + if (s5 === peg$FAILED) { + s5 = peg$parseLineTerminator(); + } + peg$silentFails--; + if (s5 === peg$FAILED) { + s4 = void 0; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c31) { + s3 = peg$c31; + peg$currPos += 2; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c32); } + } + if (s3 !== peg$FAILED) { + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSingleLineComment() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c33) { + s1 = peg$c33; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c34); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$currPos; + peg$silentFails++; + s5 = peg$parseLineTerminator(); + peg$silentFails--; + if (s5 === peg$FAILED) { + s4 = void 0; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$currPos; + peg$silentFails++; + s5 = peg$parseLineTerminator(); + peg$silentFails--; + if (s5 === peg$FAILED) { + s4 = void 0; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s5 = peg$parseSourceCharacter(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseIdentifier() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$silentFails++; + s2 = peg$parseReservedWord(); + peg$silentFails--; + if (s2 === peg$FAILED) { + s1 = void 0; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s2 = peg$parseIdentifierName(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c35(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseIdentifierName() { + var s0, s1, s2, s3; + + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$parseIdentifierStart(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseIdentifierPart(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseIdentifierPart(); + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c37(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c36); } + } + + return s0; + } + + function peg$parseIdentifierStart() { + var s0, s1, s2; + + s0 = peg$parseUnicodeLetter(); + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 36) { + s0 = peg$c38; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c39); } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 95) { + s0 = peg$c40; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c41); } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c42; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c43); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseUnicodeEscapeSequence(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c44(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + } + + return s0; + } + + function peg$parseIdentifierPart() { + var s0; + + s0 = peg$parseIdentifierStart(); + if (s0 === peg$FAILED) { + s0 = peg$parseUnicodeCombiningMark(); + if (s0 === peg$FAILED) { + s0 = peg$parseNd(); + if (s0 === peg$FAILED) { + s0 = peg$parsePc(); + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 8204) { + s0 = peg$c45; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c46); } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 8205) { + s0 = peg$c47; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c48); } + } + } + } + } + } + } + + return s0; + } + + function peg$parseUnicodeLetter() { + var s0; + + s0 = peg$parseLu(); + if (s0 === peg$FAILED) { + s0 = peg$parseLl(); + if (s0 === peg$FAILED) { + s0 = peg$parseLt(); + if (s0 === peg$FAILED) { + s0 = peg$parseLm(); + if (s0 === peg$FAILED) { + s0 = peg$parseLo(); + if (s0 === peg$FAILED) { + s0 = peg$parseNl(); + } + } + } + } + } + + return s0; + } + + function peg$parseUnicodeCombiningMark() { + var s0; + + s0 = peg$parseMn(); + if (s0 === peg$FAILED) { + s0 = peg$parseMc(); + } + + return s0; + } + + function peg$parseReservedWord() { + var s0; + + s0 = peg$parseKeyword(); + if (s0 === peg$FAILED) { + s0 = peg$parseImportToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseNullLiteral(); + if (s0 === peg$FAILED) { + s0 = peg$parseBooleanLiteral(); + } + } + } + + return s0; + } + + function peg$parseKeyword() { + var s0; + + s0 = peg$parseSelectToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseWhereToken(); + } + + return s0; + } + + function peg$parseLiteral() { + var s0; + + s0 = peg$parseNullLiteral(); + if (s0 === peg$FAILED) { + s0 = peg$parseBooleanLiteral(); + if (s0 === peg$FAILED) { + s0 = peg$parseNumericLiteral(); + if (s0 === peg$FAILED) { + s0 = peg$parseStringLiteral(); + if (s0 === peg$FAILED) { + s0 = peg$parseRegularExpressionLiteral(); + } + } + } + } + + return s0; + } + + function peg$parseNullLiteral() { + var s0, s1; + + s0 = peg$currPos; + s1 = peg$parseNullToken(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c49(); + } + s0 = s1; + + return s0; + } + + function peg$parseBooleanLiteral() { + var s0, s1; + + s0 = peg$currPos; + s1 = peg$parseTrueToken(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c50(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseFalseToken(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c51(); + } + s0 = s1; + } + + return s0; + } + + function peg$parseNumericLiteral() { + var s0, s1, s2, s3; + + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$parseHexIntegerLiteral(); + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierStart(); + if (s3 === peg$FAILED) { + s3 = peg$parseDecimalDigit(); + } + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c53(s1); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseDecimalLiteral(); + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierStart(); + if (s3 === peg$FAILED) { + s3 = peg$parseDecimalDigit(); + } + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c53(s1); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c52); } + } + + return s0; + } + + function peg$parseDecimalLiteral() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parseDecimalIntegerLiteral(); + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 46) { + s2 = peg$c54; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c55); } + } + if (s2 !== peg$FAILED) { + s3 = []; + s4 = peg$parseDecimalDigit(); + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parseDecimalDigit(); + } + if (s3 !== peg$FAILED) { + s4 = peg$parseExponentPart(); + if (s4 === peg$FAILED) { + s4 = null; + } + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c56(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 46) { + s1 = peg$c54; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c55); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseDecimalDigit(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseDecimalDigit(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseExponentPart(); + if (s3 === peg$FAILED) { + s3 = null; + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c56(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseDecimalIntegerLiteral(); + if (s1 !== peg$FAILED) { + s2 = peg$parseExponentPart(); + if (s2 === peg$FAILED) { + s2 = null; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c56(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + + return s0; + } + + function peg$parseDecimalIntegerLiteral() { + var s0, s1, s2, s3; + + if (input.charCodeAt(peg$currPos) === 48) { + s0 = peg$c57; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c58); } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseNonZeroDigit(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseDecimalDigit(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseDecimalDigit(); + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + return s0; + } + + function peg$parseDecimalDigit() { + var s0; + + if (peg$c59.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c60); } + } + + return s0; + } + + function peg$parseNonZeroDigit() { + var s0; + + if (peg$c61.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c62); } + } + + return s0; + } + + function peg$parseExponentPart() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$parseExponentIndicator(); + if (s1 !== peg$FAILED) { + s2 = peg$parseSignedInteger(); + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseExponentIndicator() { + var s0; + + if (input.substr(peg$currPos, 1).toLowerCase() === peg$c63) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c64); } + } + + return s0; + } + + function peg$parseSignedInteger() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (peg$c65.test(input.charAt(peg$currPos))) { + s1 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c66); } + } + if (s1 === peg$FAILED) { + s1 = null; + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseDecimalDigit(); + if (s3 !== peg$FAILED) { + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseDecimalDigit(); + } + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseHexIntegerLiteral() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 2).toLowerCase() === peg$c67) { + s1 = input.substr(peg$currPos, 2); + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c68); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = []; + s4 = peg$parseHexDigit(); + if (s4 !== peg$FAILED) { + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parseHexDigit(); + } + } else { + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = input.substring(s2, peg$currPos); + } else { + s2 = s3; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c69(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseHexDigit() { + var s0; + + if (peg$c70.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c71); } + } + + return s0; + } + + function peg$parseStringLiteral() { + var s0, s1, s2, s3; + + peg$silentFails++; + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 34) { + s1 = peg$c73; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c74); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseDoubleStringCharacter(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseDoubleStringCharacter(); + } + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 34) { + s3 = peg$c73; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c74); } + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c75(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 39) { + s1 = peg$c76; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c77); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseSingleStringCharacter(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseSingleStringCharacter(); + } + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 39) { + s3 = peg$c76; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c77); } + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c75(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c72); } + } + + return s0; + } + + function peg$parseDoubleStringCharacter() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 34) { + s2 = peg$c73; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c74); } + } + if (s2 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 92) { + s2 = peg$c42; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c43); } + } + if (s2 === peg$FAILED) { + s2 = peg$parseLineTerminator(); + } + } + peg$silentFails--; + if (s2 === peg$FAILED) { + s1 = void 0; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s2 = peg$parseSourceCharacter(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c78(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c42; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c43); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseEscapeSequence(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c44(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseLineContinuation(); + } + } + + return s0; + } + + function peg$parseSingleStringCharacter() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 39) { + s2 = peg$c76; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c77); } + } + if (s2 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 92) { + s2 = peg$c42; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c43); } + } + if (s2 === peg$FAILED) { + s2 = peg$parseLineTerminator(); + } + } + peg$silentFails--; + if (s2 === peg$FAILED) { + s1 = void 0; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s2 = peg$parseSourceCharacter(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c78(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c42; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c43); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseEscapeSequence(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c44(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseLineContinuation(); + } + } + + return s0; + } + + function peg$parseLineContinuation() { + var s0, s1, s2; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c42; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c43); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseLineTerminatorSequence(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c79(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseEscapeSequence() { + var s0, s1, s2, s3; + + s0 = peg$parseCharacterEscapeSequence(); + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 48) { + s1 = peg$c57; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c58); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseDecimalDigit(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c80(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseHexEscapeSequence(); + if (s0 === peg$FAILED) { + s0 = peg$parseUnicodeEscapeSequence(); + } + } + } + + return s0; + } + + function peg$parseCharacterEscapeSequence() { + var s0; + + s0 = peg$parseSingleEscapeCharacter(); + if (s0 === peg$FAILED) { + s0 = peg$parseNonEscapeCharacter(); + } + + return s0; + } + + function peg$parseSingleEscapeCharacter() { + var s0, s1; + + if (input.charCodeAt(peg$currPos) === 39) { + s0 = peg$c76; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c77); } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 34) { + s0 = peg$c73; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c74); } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 92) { + s0 = peg$c42; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c43); } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 98) { + s1 = peg$c81; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c82); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c83(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 102) { + s1 = peg$c84; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c85); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c86(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 110) { + s1 = peg$c87; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c88); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c89(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 114) { + s1 = peg$c90; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c91); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c92(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 116) { + s1 = peg$c93; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c94); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c95(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 118) { + s1 = peg$c96; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c97); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c98(); + } + s0 = s1; + } + } + } + } + } + } + } + } + + return s0; + } + + function peg$parseNonEscapeCharacter() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$silentFails++; + s2 = peg$parseEscapeCharacter(); + if (s2 === peg$FAILED) { + s2 = peg$parseLineTerminator(); + } + peg$silentFails--; + if (s2 === peg$FAILED) { + s1 = void 0; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s2 = peg$parseSourceCharacter(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c78(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseEscapeCharacter() { + var s0; + + s0 = peg$parseSingleEscapeCharacter(); + if (s0 === peg$FAILED) { + s0 = peg$parseDecimalDigit(); + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 120) { + s0 = peg$c99; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c100); } + } + if (s0 === peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 117) { + s0 = peg$c101; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c102); } + } + } + } + } + + return s0; + } + + function peg$parseHexEscapeSequence() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 120) { + s1 = peg$c99; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c100); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = peg$currPos; + s4 = peg$parseHexDigit(); + if (s4 !== peg$FAILED) { + s5 = peg$parseHexDigit(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = input.substring(s2, peg$currPos); + } else { + s2 = s3; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c103(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseUnicodeEscapeSequence() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 117) { + s1 = peg$c101; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c102); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = peg$currPos; + s4 = peg$parseHexDigit(); + if (s4 !== peg$FAILED) { + s5 = peg$parseHexDigit(); + if (s5 !== peg$FAILED) { + s6 = peg$parseHexDigit(); + if (s6 !== peg$FAILED) { + s7 = peg$parseHexDigit(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = input.substring(s2, peg$currPos); + } else { + s2 = s3; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c103(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseRegularExpressionLiteral() { + var s0, s1, s2, s3, s4, s5; + + peg$silentFails++; + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 47) { + s1 = peg$c105; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c106); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = peg$parseRegularExpressionBody(); + if (s3 !== peg$FAILED) { + s2 = input.substring(s2, peg$currPos); + } else { + s2 = s3; + } + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 47) { + s3 = peg$c105; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c106); } + } + if (s3 !== peg$FAILED) { + s4 = peg$currPos; + s5 = peg$parseRegularExpressionFlags(); + if (s5 !== peg$FAILED) { + s4 = input.substring(s4, peg$currPos); + } else { + s4 = s5; + } + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c107(s2, s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c104); } + } + + return s0; + } + + function peg$parseRegularExpressionBody() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parseRegularExpressionFirstChar(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseRegularExpressionChar(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseRegularExpressionChar(); + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseRegularExpressionFirstChar() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$silentFails++; + if (peg$c108.test(input.charAt(peg$currPos))) { + s2 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c109); } + } + peg$silentFails--; + if (s2 === peg$FAILED) { + s1 = void 0; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s2 = peg$parseRegularExpressionNonTerminator(); + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseRegularExpressionBackslashSequence(); + if (s0 === peg$FAILED) { + s0 = peg$parseRegularExpressionClass(); + } + } + + return s0; + } + + function peg$parseRegularExpressionChar() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$silentFails++; + if (peg$c110.test(input.charAt(peg$currPos))) { + s2 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c111); } + } + peg$silentFails--; + if (s2 === peg$FAILED) { + s1 = void 0; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s2 = peg$parseRegularExpressionNonTerminator(); + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseRegularExpressionBackslashSequence(); + if (s0 === peg$FAILED) { + s0 = peg$parseRegularExpressionClass(); + } + } + + return s0; + } + + function peg$parseRegularExpressionBackslashSequence() { + var s0, s1, s2; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 92) { + s1 = peg$c42; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c43); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseRegularExpressionNonTerminator(); + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseRegularExpressionNonTerminator() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$silentFails++; + s2 = peg$parseLineTerminator(); + peg$silentFails--; + if (s2 === peg$FAILED) { + s1 = void 0; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s2 = peg$parseSourceCharacter(); + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseRegularExpressionClass() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 91) { + s1 = peg$c112; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c113); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$parseRegularExpressionClassChar(); + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$parseRegularExpressionClassChar(); + } + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 93) { + s3 = peg$c114; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + if (s3 !== peg$FAILED) { + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseRegularExpressionClassChar() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$silentFails++; + if (peg$c116.test(input.charAt(peg$currPos))) { + s2 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c117); } + } + peg$silentFails--; + if (s2 === peg$FAILED) { + s1 = void 0; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s2 = peg$parseRegularExpressionNonTerminator(); + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseRegularExpressionBackslashSequence(); + } + + return s0; + } + + function peg$parseRegularExpressionFlags() { + var s0, s1; + + s0 = []; + s1 = peg$parseIdentifierPart(); + while (s1 !== peg$FAILED) { + s0.push(s1); + s1 = peg$parseIdentifierPart(); + } + + return s0; + } + + function peg$parseLl() { + var s0; + + if (peg$c118.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c119); } + } + + return s0; + } + + function peg$parseLm() { + var s0; + + if (peg$c120.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c121); } + } + + return s0; + } + + function peg$parseLo() { + var s0; + + if (peg$c122.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c123); } + } + + return s0; + } + + function peg$parseLt() { + var s0; + + if (peg$c124.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c125); } + } + + return s0; + } + + function peg$parseLu() { + var s0; + + if (peg$c126.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c127); } + } + + return s0; + } + + function peg$parseMc() { + var s0; + + if (peg$c128.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c129); } + } + + return s0; + } + + function peg$parseMn() { + var s0; + + if (peg$c130.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c131); } + } + + return s0; + } + + function peg$parseNd() { + var s0; + + if (peg$c132.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c133); } + } + + return s0; + } + + function peg$parseNl() { + var s0; + + if (peg$c134.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c135); } + } + + return s0; + } + + function peg$parsePc() { + var s0; + + if (peg$c136.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c137); } + } + + return s0; + } + + function peg$parseZs() { + var s0; + + if (peg$c138.test(input.charAt(peg$currPos))) { + s0 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c139); } + } + + return s0; + } + + function peg$parseQueryToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c140) { + s1 = peg$c140; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c141); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseImportToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 6) === peg$c142) { + s1 = peg$c142; + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c143); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseNullToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c144) { + s1 = peg$c144; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c145); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseTrueToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c146) { + s1 = peg$c146; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c147); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseFalseToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c148) { + s1 = peg$c148; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c149); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSelectToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 6) === peg$c150) { + s1 = peg$c150; + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c151); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseFromToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c152) { + s1 = peg$c152; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c153); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseWhereToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c154) { + s1 = peg$c154; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c155); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseOrToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c156) { + s1 = peg$c156; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c157); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseAndToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c158) { + s1 = peg$c158; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c159); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseOrderByToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 8) === peg$c160) { + s1 = peg$c160; + peg$currPos += 8; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c161); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSkipToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c162) { + s1 = peg$c162; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c163); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLimitToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c164) { + s1 = peg$c164; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c165); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseAscToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c166) { + s1 = peg$c166; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c167); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseDescToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c168) { + s1 = peg$c168; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c169); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseNotEqualToken() { + var s0; + + if (input.substr(peg$currPos, 2) === peg$c170) { + s0 = peg$c170; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c171); } + } + + return s0; + } + + function peg$parseEqualToken() { + var s0; + + if (input.charCodeAt(peg$currPos) === 61) { + s0 = peg$c172; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c173); } + } + + return s0; + } + + function peg$parseLTToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 60) { + s1 = peg$c174; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c175); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseEqualToken(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLTEToken() { + var s0; + + if (input.substr(peg$currPos, 2) === peg$c176) { + s0 = peg$c176; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c177); } + } + + return s0; + } + + function peg$parseGTToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 62) { + s1 = peg$c178; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c179); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseEqualToken(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseGTEToken() { + var s0; + + if (input.substr(peg$currPos, 2) === peg$c180) { + s0 = peg$c180; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c181); } + } + + return s0; + } + + function peg$parse__() { + var s0, s1; + + s0 = []; + s1 = peg$parseWhiteSpace(); + if (s1 === peg$FAILED) { + s1 = peg$parseLineTerminatorSequence(); + if (s1 === peg$FAILED) { + s1 = peg$parseComment(); + } + } + while (s1 !== peg$FAILED) { + s0.push(s1); + s1 = peg$parseWhiteSpace(); + if (s1 === peg$FAILED) { + s1 = peg$parseLineTerminatorSequence(); + if (s1 === peg$FAILED) { + s1 = peg$parseComment(); + } + } + } + + return s0; + } + + function peg$parse_() { + var s0, s1; + + s0 = []; + s1 = peg$parseWhiteSpace(); + if (s1 === peg$FAILED) { + s1 = peg$parseMultiLineCommentNoLineTerminator(); + } + while (s1 !== peg$FAILED) { + s0.push(s1); + s1 = peg$parseWhiteSpace(); + if (s1 === peg$FAILED) { + s1 = peg$parseMultiLineCommentNoLineTerminator(); + } + } + + return s0; + } + + function peg$parseEOS() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parse__(); + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 59) { + s2 = peg$c182; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c183); } + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + s2 = peg$parseSingleLineComment(); + if (s2 === peg$FAILED) { + s2 = null; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseLineTerminatorSequence(); + if (s3 !== peg$FAILED) { + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 125) { + s3 = peg$c184; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c185); } + } + peg$silentFails--; + if (s3 !== peg$FAILED) { + peg$currPos = s2; + s2 = void 0; + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parse__(); + if (s1 !== peg$FAILED) { + s2 = peg$parseEOF(); + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + } + + return s0; + } + + function peg$parseEOF() { + var s0, s1; + + s0 = peg$currPos; + peg$silentFails++; + if (input.length > peg$currPos) { + s1 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c1); } + } + peg$silentFails--; + if (s1 === peg$FAILED) { + s0 = void 0; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseQualifiedName() { + var s0, s1, s2, s3, s4, s5, s6; + + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$parseIdentifier(); + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); + } else { + s1 = s2; + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = []; + s4 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 46) { + s5 = peg$c54; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c55); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parseIdentifier(); + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 46) { + s5 = peg$c54; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c55); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parseIdentifier(); + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } + if (s3 !== peg$FAILED) { + s2 = input.substring(s2, peg$currPos); + } else { + s2 = s3; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c186(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseProgram() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = []; + s2 = peg$parseQuery(); + if (s2 !== peg$FAILED) { + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parseQuery(); + } + } else { + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c187(s1); + } + s0 = s1; + + return s0; + } + + function peg$parseQuery() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c140) { + s1 = peg$c140; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c141); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parseIdentifier(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 123) { + s5 = peg$c188; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c189); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + if (input.substr(peg$currPos, 12) === peg$c190) { + s7 = peg$c190; + peg$currPos += 12; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c191); } + } + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 34) { + s9 = peg$c73; + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c74); } + } + if (s9 !== peg$FAILED) { + s10 = peg$parseStringSequence(); + if (s10 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 34) { + s11 = peg$c73; + peg$currPos++; + } else { + s11 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c74); } + } + if (s11 !== peg$FAILED) { + s12 = peg$parse__(); + if (s12 !== peg$FAILED) { + if (input.substr(peg$currPos, 10) === peg$c192) { + s13 = peg$c192; + peg$currPos += 10; + } else { + s13 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c193); } + } + if (s13 !== peg$FAILED) { + s14 = peg$parse__(); + if (s14 !== peg$FAILED) { + s15 = peg$parseSelectStatement(); + if (s15 !== peg$FAILED) { + s16 = peg$parse__(); + if (s16 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s17 = peg$c184; + peg$currPos++; + } else { + s17 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c185); } + } + if (s17 !== peg$FAILED) { + s18 = peg$parse__(); + if (s18 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c194(s3, s10, s15); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSelectStatement() { + var s0; + + s0 = peg$parseFromSelectStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseSimpleSelectStatement(); + } + + return s0; + } + + function peg$parseFromSelectStatement() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16; + + s0 = peg$currPos; + s1 = peg$parse__(); + if (s1 !== peg$FAILED) { + s2 = peg$parseSelectToken(); + if (s2 !== peg$FAILED) { + s3 = peg$parse__(); + if (s3 !== peg$FAILED) { + s4 = peg$parseQualifiedName(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s6 = peg$parseFromToken(); + if (s6 !== peg$FAILED) { + s7 = peg$parse__(); + if (s7 !== peg$FAILED) { + s8 = peg$parseQualifiedName(); + if (s8 !== peg$FAILED) { + s9 = peg$parse__(); + if (s9 !== peg$FAILED) { + s10 = peg$parseWhereExpr(); + if (s10 === peg$FAILED) { + s10 = null; + } + if (s10 !== peg$FAILED) { + s11 = peg$parse__(); + if (s11 !== peg$FAILED) { + s12 = peg$parseOrderBy(); + if (s12 === peg$FAILED) { + s12 = null; + } + if (s12 !== peg$FAILED) { + s13 = peg$parse__(); + if (s13 !== peg$FAILED) { + s14 = peg$parseLimit(); + if (s14 === peg$FAILED) { + s14 = null; + } + if (s14 !== peg$FAILED) { + s15 = peg$parse__(); + if (s15 !== peg$FAILED) { + s16 = peg$parseSkip(); + if (s16 === peg$FAILED) { + s16 = null; + } + if (s16 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c195(s4, s6, s8, s10, s12, s14, s16); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSimpleSelectStatement() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12; + + s0 = peg$currPos; + s1 = peg$parse__(); + if (s1 !== peg$FAILED) { + s2 = peg$parseSelectToken(); + if (s2 !== peg$FAILED) { + s3 = peg$parse__(); + if (s3 !== peg$FAILED) { + s4 = peg$parseQualifiedName(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s6 = peg$parseWhereExpr(); + if (s6 === peg$FAILED) { + s6 = null; + } + if (s6 !== peg$FAILED) { + s7 = peg$parse__(); + if (s7 !== peg$FAILED) { + s8 = peg$parseOrderBy(); + if (s8 === peg$FAILED) { + s8 = null; + } + if (s8 !== peg$FAILED) { + s9 = peg$parse__(); + if (s9 !== peg$FAILED) { + s10 = peg$parseLimit(); + if (s10 === peg$FAILED) { + s10 = null; + } + if (s10 !== peg$FAILED) { + s11 = peg$parse__(); + if (s11 !== peg$FAILED) { + s12 = peg$parseSkip(); + if (s12 === peg$FAILED) { + s12 = null; + } + if (s12 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c196(s4, s6, s8, s10, s12); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLimit() { + var s0; + + s0 = peg$parseLimitPlaceholder(); + if (s0 === peg$FAILED) { + s0 = peg$parseLimitLiteral(); + } + + return s0; + } + + function peg$parseLimitPlaceholder() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parseLimitToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsePlaceholder(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c197(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLimitLiteral() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parseLimitToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parseDecimalIntegerLiteral(); + if (s4 !== peg$FAILED) { + s3 = input.substring(s3, peg$currPos); + } else { + s3 = s4; + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c197(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSkip() { + var s0; + + s0 = peg$parseSkipPlaceholder(); + if (s0 === peg$FAILED) { + s0 = peg$parseSkipLiteral(); + } + + return s0; + } + + function peg$parseSkipPlaceholder() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parseSkipToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parsePlaceholder(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c198(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSkipLiteral() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parseSkipToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parseDecimalIntegerLiteral(); + if (s4 !== peg$FAILED) { + s3 = input.substring(s3, peg$currPos); + } else { + s3 = s4; + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c198(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSortDirection() { + var s0, s1; + + s0 = peg$currPos; + s1 = peg$parseAscToken(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c199(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseDescToken(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c200(); + } + s0 = s1; + } + + return s0; + } + + function peg$parseOrderBy() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$parseOrderByToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parseSort(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c201(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSort() { + var s0; + + s0 = peg$parseSortSingleField(); + if (s0 === peg$FAILED) { + s0 = peg$parseSortArray(); + } + + return s0; + } + + function peg$parseSortArray() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parse__(); + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 91) { + s2 = peg$c112; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c113); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + s4 = peg$parseSortSingleField(); + if (s4 !== peg$FAILED) { + s5 = peg$parse_(); + if (s5 !== peg$FAILED) { + s6 = []; + s7 = peg$parseSortRest(); + while (s7 !== peg$FAILED) { + s6.push(s7); + s7 = peg$parseSortRest(); + } + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 93) { + s7 = peg$c114; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c202(s4, s6); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSortRest() { + var s0, s1, s2; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 44) { + s1 = peg$c203; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c204); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parseSortSingleField(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c205(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSortSingleField() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parse__(); + if (s1 !== peg$FAILED) { + s2 = peg$parseIdentifier(); + if (s2 !== peg$FAILED) { + s3 = peg$parse__(); + if (s3 !== peg$FAILED) { + s4 = peg$parseSortDirection(); + if (s4 === peg$FAILED) { + s4 = null; + } + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c206(s2, s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseWhereExpr() { + var s0, s1, s2, s3, s4; + + peg$silentFails++; + s0 = peg$currPos; + s1 = peg$parseWhereToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parseLogicExpr(); + if (s2 !== peg$FAILED) { + s3 = []; + s4 = peg$parseLogicExprRest(); + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$parseLogicExprRest(); + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c208(s2, s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c207); } + } + + return s0; + } + + function peg$parseLogicExpr() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8; + + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s2 = peg$c209; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c210); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + s4 = peg$parseLogicExpr(); + if (s4 !== peg$FAILED) { + s5 = []; + s6 = peg$parseLogicExprRest(); + while (s6 !== peg$FAILED) { + s5.push(s6); + s6 = peg$parseLogicExprRest(); + } + if (s5 !== peg$FAILED) { + s6 = peg$parse_(); + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s7 = peg$c211; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c212); } + } + if (s7 !== peg$FAILED) { + s8 = peg$parse_(); + if (s8 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c213(s4, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + s2 = peg$parseExpr(); + if (s2 !== peg$FAILED) { + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + s4 = peg$parseOperator(); + if (s4 !== peg$FAILED) { + s5 = peg$parse_(); + if (s5 !== peg$FAILED) { + s6 = peg$parseExpr(); + if (s6 !== peg$FAILED) { + s7 = peg$parse_(); + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c214(s2, s4, s6); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + return s0; + } + + function peg$parseLogicExprRest() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + s2 = peg$parseJoiner(); + if (s2 !== peg$FAILED) { + s3 = peg$parse_(); + if (s3 !== peg$FAILED) { + s4 = peg$parseLogicExpr(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c215(s2, s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseJoiner() { + var s0; + + s0 = peg$parseOrToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseAndToken(); + } + + return s0; + } + + function peg$parseOperator() { + var s0, s1; + + s0 = peg$currPos; + s1 = peg$parseNotEqualToken(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c216(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseEqualToken(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c217(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseLTToken(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c218(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseLTEToken(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c219(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseGTToken(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c220(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseGTEToken(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c221(); + } + s0 = s1; + } + } + } + } + } + + return s0; + } + + function peg$parsePlaceholder() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 64) { + s2 = peg$c222; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c223); } + } + if (s2 !== peg$FAILED) { + s3 = peg$parseIdentifier(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c224(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseExpr() { + var s0; + + s0 = peg$parseLiteral(); + if (s0 === peg$FAILED) { + s0 = peg$parsePlaceholder(); + if (s0 === peg$FAILED) { + s0 = peg$parseQualifiedName(); + } + } + + return s0; + } + + function peg$parseStringSequence() { + var s0, s1, s2; + + peg$silentFails++; + s0 = peg$currPos; + s1 = []; + s2 = peg$parseDoubleStringCharacter(); + while (s2 !== peg$FAILED) { + s1.push(s2); + s2 = peg$parseDoubleStringCharacter(); + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c225(s1); + } + s0 = s1; + peg$silentFails--; + if (s0 === peg$FAILED) { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c72); } + } + + return s0; + } + + + var TYPES_TO_PROPERTY_NAMES = { + CallExpression: "callee", + MemberExpression: "object", + }; + + function filledArray(count, value) { + var result = new Array(count), i; + + for (i = 0; i < count; i++) { + result[i] = value; + } + + return result; + } + + function extractOptional(optional, index) { + return optional ? optional[index] : null; + } + + function extractList(list, index) { + var result = new Array(list.length), i; + + for (i = 0; i < list.length; i++) { + result[i] = list[i][index]; + } + + return result; + } + + function buildList(first, rest, index) { + return [first].concat(extractList(rest, index)); + } + + function buildTree(first, rest, builder) { + var result = first, i; + + for (i = 0; i < rest.length; i++) { + result = builder(result, rest[i]); + } + + return result; + } + + function buildBinaryExpression(first, rest) { + return buildTree(first, rest, function(result, element) { + return { + type: "BinaryExpression", + operator: element[1], + left: result, + right: element[3] + }; + }); + } + + function buildLogicalExpression(first, rest) { + return buildTree(first, rest, function(result, element) { + return { + type: "LogicalExpression", + operator: element[1], + left: result, + right: element[3] + }; + }); + } + + function optionalList(value) { + return value !== null ? value : []; + } + + + peg$result = peg$startRuleFunction(); + + if (peg$result !== peg$FAILED && peg$currPos === input.length) { + return peg$result; + } else { + if (peg$result !== peg$FAILED && peg$currPos < input.length) { + peg$fail({ type: "end", description: "end of input" }); + } + + throw peg$buildException( + null, + peg$maxFailExpected, + peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null, + peg$maxFailPos < input.length + ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1) + : peg$computeLocation(peg$maxFailPos, peg$maxFailPos) + ); + } + } + + return { + SyntaxError: peg$SyntaxError, + parse: peg$parse + }; +})(); diff --git a/packages/composer-common/lib/query/parser.pegjs b/packages/composer-common/lib/query/parser.pegjs new file mode 100644 index 0000000000..0bb7948eba --- /dev/null +++ b/packages/composer-common/lib/query/parser.pegjs @@ -0,0 +1,668 @@ +/* + * Grammar for Queries + * =================== + * + * The capabilities of the query language are based on the features of the + * CouchDB backing store: http://docs.couchdb.org/en/2.0.0/api/database/find.html#selector-basics + * + */ +{ + var TYPES_TO_PROPERTY_NAMES = { + CallExpression: "callee", + MemberExpression: "object", + }; + + function filledArray(count, value) { + var result = new Array(count), i; + + for (i = 0; i < count; i++) { + result[i] = value; + } + + return result; + } + + function extractOptional(optional, index) { + return optional ? optional[index] : null; + } + + function extractList(list, index) { + var result = new Array(list.length), i; + + for (i = 0; i < list.length; i++) { + result[i] = list[i][index]; + } + + return result; + } + + function buildList(first, rest, index) { + return [first].concat(extractList(rest, index)); + } + + function buildTree(first, rest, builder) { + var result = first, i; + + for (i = 0; i < rest.length; i++) { + result = builder(result, rest[i]); + } + + return result; + } + + function buildBinaryExpression(first, rest) { + return buildTree(first, rest, function(result, element) { + return { + type: "BinaryExpression", + operator: element[1], + left: result, + right: element[3] + }; + }); + } + + function buildLogicalExpression(first, rest) { + return buildTree(first, rest, function(result, element) { + return { + type: "LogicalExpression", + operator: element[1], + left: result, + right: element[3] + }; + }); + } + + function optionalList(value) { + return value !== null ? value : []; + } +} + +Start + = __ program:Program __ { return program; } + +/* ----- A.1 Lexical Grammar ----- */ + +SourceCharacter + = . + +WhiteSpace "whitespace" + = "\t" + / "\v" + / "\f" + / " " + / "\u00A0" + / "\uFEFF" + / Zs + +LineTerminator + = [\n\r\u2028\u2029] + +LineTerminatorSequence "end of line" + = "\n" + / "\r\n" + / "\r" + / "\u2028" + / "\u2029" + +Comment "comment" + = MultiLineComment + / SingleLineComment + +MultiLineComment + = "/*" (!"*/" SourceCharacter)* "*/" + +MultiLineCommentNoLineTerminator + = "/*" (!("*/" / LineTerminator) SourceCharacter)* "*/" + +SingleLineComment + = "//" (!LineTerminator SourceCharacter)* + +Identifier + = !ReservedWord name:IdentifierName { return name; } + +IdentifierName "identifier" + = first:IdentifierStart rest:IdentifierPart* { + return { + type: "Identifier", + name: first + rest.join("") + }; + } + +IdentifierStart + = UnicodeLetter + / "$" + / "_" + / "\\" sequence:UnicodeEscapeSequence { return sequence; } + +IdentifierPart + = IdentifierStart + / UnicodeCombiningMark + / UnicodeDigit + / UnicodeConnectorPunctuation + / "\u200C" + / "\u200D" + +UnicodeLetter + = Lu + / Ll + / Lt + / Lm + / Lo + / Nl + +UnicodeCombiningMark + = Mn + / Mc + +UnicodeDigit + = Nd + +UnicodeConnectorPunctuation + = Pc + +ReservedWord + = Keyword + / FutureReservedWord + / NullLiteral + / BooleanLiteral + +Keyword + = SelectToken + / WhereToken + +FutureReservedWord + = ImportToken + +Literal + = NullLiteral + / BooleanLiteral + / NumericLiteral + / StringLiteral + / RegularExpressionLiteral + +NullLiteral + = NullToken { return { type: "Literal", value: null }; } + +BooleanLiteral + = TrueToken { return { type: "Literal", value: true }; } + / FalseToken { return { type: "Literal", value: false }; } + +/* + * The "!(IdentifierStart / DecimalDigit)" predicate is not part of the official + * grammar, it comes from text in section 7.8.3. + */ +NumericLiteral "number" + = literal:HexIntegerLiteral !(IdentifierStart / DecimalDigit) { + return literal; + } + / literal:DecimalLiteral !(IdentifierStart / DecimalDigit) { + return literal; + } + +DecimalLiteral + = DecimalIntegerLiteral "." DecimalDigit* ExponentPart? { + return { type: "Literal", value: parseFloat(text()) }; + } + / "." DecimalDigit+ ExponentPart? { + return { type: "Literal", value: parseFloat(text()) }; + } + / DecimalIntegerLiteral ExponentPart? { + return { type: "Literal", value: parseFloat(text()) }; + } + +DecimalIntegerLiteral + = "0" + / NonZeroDigit DecimalDigit* + +DecimalDigit + = [0-9] + +NonZeroDigit + = [1-9] + +ExponentPart + = ExponentIndicator SignedInteger + +ExponentIndicator + = "e"i + +SignedInteger + = [+-]? DecimalDigit+ + +HexIntegerLiteral + = "0x"i digits:$HexDigit+ { + return { type: "Literal", value: parseInt(digits, 16) }; + } + +HexDigit + = [0-9a-f]i + +StringLiteral "string" + = '"' chars:DoubleStringCharacter* '"' { + return { type: "Literal", value: chars.join("") }; + } + / "'" chars:SingleStringCharacter* "'" { + return { type: "Literal", value: chars.join("") }; + } + +DoubleStringCharacter + = !('"' / "\\" / LineTerminator) SourceCharacter { return text(); } + / "\\" sequence:EscapeSequence { return sequence; } + / LineContinuation + +SingleStringCharacter + = !("'" / "\\" / LineTerminator) SourceCharacter { return text(); } + / "\\" sequence:EscapeSequence { return sequence; } + / LineContinuation + +LineContinuation + = "\\" LineTerminatorSequence { return ""; } + +EscapeSequence + = CharacterEscapeSequence + / "0" !DecimalDigit { return "\0"; } + / HexEscapeSequence + / UnicodeEscapeSequence + +CharacterEscapeSequence + = SingleEscapeCharacter + / NonEscapeCharacter + +SingleEscapeCharacter + = "'" + / '"' + / "\\" + / "b" { return "\b"; } + / "f" { return "\f"; } + / "n" { return "\n"; } + / "r" { return "\r"; } + / "t" { return "\t"; } + / "v" { return "\x0B"; } // IE does not recognize "\v". + +NonEscapeCharacter + = !(EscapeCharacter / LineTerminator) SourceCharacter { return text(); } + +EscapeCharacter + = SingleEscapeCharacter + / DecimalDigit + / "x" + / "u" + +HexEscapeSequence + = "x" digits:$(HexDigit HexDigit) { + return String.fromCharCode(parseInt(digits, 16)); + } + +UnicodeEscapeSequence + = "u" digits:$(HexDigit HexDigit HexDigit HexDigit) { + return String.fromCharCode(parseInt(digits, 16)); + } + +RegularExpressionLiteral "regular expression" + = "/" pattern:$RegularExpressionBody "/" flags:$RegularExpressionFlags { + var value; + + try { + value = new RegExp(pattern, flags); + } catch (e) { + error(e.message); + } + + return { type: "Literal", value: value }; + } + +RegularExpressionBody + = RegularExpressionFirstChar RegularExpressionChar* + +RegularExpressionFirstChar + = ![*\\/[] RegularExpressionNonTerminator + / RegularExpressionBackslashSequence + / RegularExpressionClass + +RegularExpressionChar + = ![\\/[] RegularExpressionNonTerminator + / RegularExpressionBackslashSequence + / RegularExpressionClass + +RegularExpressionBackslashSequence + = "\\" RegularExpressionNonTerminator + +RegularExpressionNonTerminator + = !LineTerminator SourceCharacter + +RegularExpressionClass + = "[" RegularExpressionClassChar* "]" + +RegularExpressionClassChar + = ![\]\\] RegularExpressionNonTerminator + / RegularExpressionBackslashSequence + +RegularExpressionFlags + = IdentifierPart* + +/* + * Unicode Character Categories + * + * Extracted from the following Unicode Character Database file: + * + * http://www.unicode.org/Public/8.0.0/ucd/extracted/DerivedGeneralCategory.txt + * + * Unix magic used: + * + * grep "; $CATEGORY" DerivedGeneralCategory.txt | # Filter characters + * cut -f1 -d " " | # Extract code points + * grep -v '[0-9a-fA-F]\{5\}' | # Exclude non-BMP characters + * sed -e 's/\.\./-/' | # Adjust formatting + * sed -e 's/\([0-9a-fA-F]\{4\}\)/\\u\1/g' | # Adjust formatting + * tr -d '\n' # Join lines + * + * ECMA-262 allows using Unicode 3.0 or later, version 8.0.0 was the latest one + * at the time of writing. + * + * Non-BMP characters are completely ignored to avoid surrogate pair handling + * (detecting surrogate pairs isn't possible with a simple character class and + * other methods would degrade performance). I don't consider it a big deal as + * even parsers in JavaScript engines of common browsers seem to ignore them. + */ + +// Letter, Lowercase +Ll = [\u0061-\u007A\u00B5\u00DF-\u00F6\u00F8-\u00FF\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] + +// Letter, Modifier +Lm = [\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] + +// Letter, Other +Lo = [\u00AA\u00BA\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] + +// Letter, Titlecase +Lt = [\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC] + +// Letter, Uppercase +Lu = [\u0041-\u005A\u00C0-\u00D6\u00D8-\u00DE\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] + +// Mark, Spacing Combining +Mc = [\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] + +// Mark, Nonspacing +Mn = [\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] + +// Number, Decimal Digit +Nd = [\u0030-\u0039\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] + +// Number, Letter +Nl = [\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF] + +// Punctuation, Connector +Pc = [\u005F\u203F-\u2040\u2054\uFE33-\uFE34\uFE4D-\uFE4F\uFF3F] + +// Separator, Space +Zs = [\u0020\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000] + +/* Tokens */ +QueryToken = "query" !IdentifierPart +ImportToken = "import" !IdentifierPart +NullToken = "null" !IdentifierPart +TrueToken = "true" !IdentifierPart +FalseToken = "false" !IdentifierPart + +SelectToken = "SELECT" !IdentifierPart +FromToken = "FROM" !IdentifierPart +WhereToken = "WHERE" !IdentifierPart +OrToken = "OR" !IdentifierPart +AndToken = "AND" !IdentifierPart + +OrderByToken = "ORDER BY" !IdentifierPart +SkipToken = "SKIP" !IdentifierPart +LimitToken = "LIMIT" !IdentifierPart +AscToken = "ASC" !IdentifierPart +DescToken = "DESC" !IdentifierPart + +NotEqualToken = "!=" +EqualToken = "=" +LTToken = "<" !EqualToken +LTEToken = "<=" +GTToken = ">" !EqualToken +GTEToken = ">=" + +// Not yet implemented, but supported by CouchDB +// NotToken = "NOT" !IdentifierPart +// InToken = "IN" !IdentifierPart +// LikeToken = "LIKE" !IdentifierPart +// NotInToken = "NOT IN" !IdentifierPart +// ExistsToken = "EXISTS" !IdentifierPart +// SizeToken = "SIZE" !IdentifierPart + +/* Skipped */ + +__ + = (WhiteSpace / LineTerminatorSequence / Comment)* + +_ + = (WhiteSpace / MultiLineCommentNoLineTerminator)* + +/* Automatic Semicolon Insertion */ + +EOS + = __ ";" + / _ SingleLineComment? LineTerminatorSequence + / _ &"}" + / __ EOF + +EOF + = !. + +QualifiedName + = first:$Identifier rest:$('.' Identifier)* { + return first.concat(JSON.stringify(rest).replace(/['"]+/g, '')); + } + +/* ----- A.6 Universal Resource Identifier Character Classes ----- */ + +/* Irrelevant. */ + +/* ----- A.7 Regular Expressions ----- */ + +/* Irrelevant. */ + +/* ----- A.8 JSON ----- */ + +/* Irrelevant. */ + +/* ROOT OF GRAMMAR */ +Program + = queries:Query+ + { + return { + type: "Queries", + queries: queries + }; + } + +Query + = "query" _ id:Identifier __ "{" __ + "description:" __ "\"" description:StringSequence "\"" __ + "statement:" __ select:SelectStatement __ + "}" __ + { + return { + type: "Query", + identifier: id, + description: description, + select: select, + location: location() + }; + } + +SelectStatement + = FromSelectStatement + / SimpleSelectStatement + +FromSelectStatement + = __ SelectToken + __ resource:QualifiedName + __ from:FromToken __ registry:QualifiedName + __ where:WhereExpr? + __ orderBy:OrderBy? + __ limit:Limit? + __ skip:Skip? { + return { + type: "SELECT FROM", + resource: resource, + registry: registry, + where: where, + limit: limit, + skip: skip, + orderBy: orderBy, + location: location() + }; + } + +SimpleSelectStatement + = __ SelectToken + __ resource:QualifiedName + __ where:WhereExpr? + __ orderBy:OrderBy? + __ limit:Limit? + __ skip:Skip? { + return { + type: "SELECT", + resource: resource, + where: where, + limit: limit, + skip: skip, + orderBy: orderBy, + location: location() + }; + } + +Limit + = LimitPlaceholder + / LimitLiteral + +LimitPlaceholder + = LimitToken _ limit:Placeholder { + return { + limit: limit + }; + } + +LimitLiteral + = LimitToken _ limit:$DecimalIntegerLiteral { + return { + limit: limit + }; + } + +Skip + = SkipPlaceholder + / SkipLiteral + +SkipPlaceholder + = SkipToken _ skip:Placeholder { + return { + skip: skip + }; + } + +SkipLiteral + = SkipToken _ skip:$DecimalIntegerLiteral { + return { + skip: skip + }; + } + +SortDirection + = AscToken { return "ASC"; } + / DescToken { return "DESC"; } + +OrderBy + = OrderByToken sort:Sort { + return { + sort: sort, + }; + } + +Sort + = SortSingleField + / SortArray + +SortArray + = __ "[" _ first:SortSingleField _ rest:SortRest* "]" { + return [first].concat(rest); + } + +SortRest + = "," item: SortSingleField { + return item; + } + +SortSingleField + = __ fieldName:Identifier __ direction:SortDirection? { + return { + fieldName: fieldName, + direction: direction + }; + } + +WhereExpr "where expression" + = WhereToken x:LogicExpr xs:LogicExprRest* { + return { + conditions: [x].concat(xs), + location: location() + }; + } + +LogicExpr + = _ "(" _ x:LogicExpr xs:LogicExprRest* _ ")" _ { + return [x].concat(xs); + } + / _ left:Expr _ op:Operator _ right:Expr _ { + return { + left: left, + op: op, + right: right, + location: location() + }; + } + +LogicExprRest + = _ j:Joiner _ l:LogicExpr { + return { + joiner: j, + expression: l + }; + } + +Joiner + = OrToken + / AndToken + +Operator + = NotEqualToken { return "!="; } + / EqualToken { return "="; } + / LTToken { return "<"; } + / LTEToken { return "<="; } + / GTToken { return ">"; } + / GTEToken { return ">="; } + +Placeholder + = _ "@" name:Identifier { + return { + type: "Placeholder", + index: name, + location: location() + }; + } + +/* Expressions */ + +Expr + = Literal + / Placeholder + / QualifiedName + +StringSequence "string" + = chars:DoubleStringCharacter* { + return chars.join(""); + } + diff --git a/packages/composer-common/lib/query/query.js b/packages/composer-common/lib/query/query.js new file mode 100644 index 0000000000..21fe4b1e50 --- /dev/null +++ b/packages/composer-common/lib/query/query.js @@ -0,0 +1,118 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const IllegalModelException = require('../introspect/illegalmodelexception'); + +/** + * Query defines a SELECT query over a resource (asset, transaction or participant) + * + * @private + * @class + * @memberof module:composer-common + */ +class Query { + + /** + * Create an Query from an Abstract Syntax Tree. The AST is the + * result of parsing. + * + * @param {QueryFile} queryFile - the QueryFile for this query + * @param {string} ast - the AST created by the parser + * @throws {IllegalModelException} + */ + constructor(queryFile, ast) { + if(!queryFile || !ast) { + throw new IllegalModelException('Invalid QueryFile or AST'); + } + + this.ast = ast; + this.queryFile = queryFile; + this.process(); + } + + /** + * Visitor design pattern + * @param {Object} visitor - the visitor + * @param {Object} parameters - the parameter + * @return {Object} the result of visiting or null + * @private + */ + accept(visitor,parameters) { + return visitor.visit(this, parameters); + } + + /** + * Returns the QueryFile that owns this Query. + * + * @return {AclFile} the owning QueryFile + */ + getQueryFile() { + return this.queryFile; + } + + /** + * Process the AST and build the model + * + * @throws {IllegalModelException} + * @private + */ + process() { + this.name = this.ast.identifier.name; + this.description = this.ast.description; + } + + /** + * Semantic validation of the structure of this Query. + * + * @throws {IllegalModelException} + * @private + */ + validate() { + } + + /** + * Returns the name of this Query. + * + * @return {string} the name of the Query + */ + getName() { + return this.name; + } + + /** + * Returns the description associated with this ACL Rule. + * + * @return {string} the description + */ + getDescription() { + return this.description; + } + + /** + * Returns a new object representing this Query that is + * suitable for serializing as JSON. + * @return {Object} A new object suitable for serializing as JSON. + */ + toJSON() { + let result = { + name: this.name, + description: this.description + }; + return result; + } +} + +module.exports = Query; diff --git a/packages/composer-common/lib/query/queryfile.js b/packages/composer-common/lib/query/queryfile.js new file mode 100644 index 0000000000..12d7a71a5a --- /dev/null +++ b/packages/composer-common/lib/query/queryfile.js @@ -0,0 +1,132 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const parser = require('./parser'); +const Query = require('./query'); +const ParseException = require('../introspect/parseexception'); + +/** + * Class representing a Query File + * @private + * @class + * @memberof module:composer-common + */ +class QueryFile { + + /** + * Create an QueryFile. This should only be called by framework code. + * @param {string} id - The identifier of this Query File (may be a filename for example) + * @param {ModelManager} modelManager - the ModelManager that manages this + * ModelFile and that will be used to validate the queries in the QueryFile + * @param {string} definitions - The queries as a string. + * @throws {IllegalModelException} + */ + constructor(id, modelManager, definitions) { + this.modelManager = modelManager; + this.queries = []; + this.identifier = id; + + if(!definitions || typeof definitions !== 'string') { + throw new Error('QueryFile expects an QueryFile as a string as input.'); + } + this.definitions = definitions; + + try { + this.ast = parser.parse(definitions); + } + catch(err) { + if(err.location && err.location.start) { + throw new ParseException( err.message + ' Line ' + err.location.start.line + ' column ' + err.location.start.column, err.location ); + } + else { + throw err; + } + } + + for(let n=0; n < this.ast.queries.length; n++ ) { + let thing = this.ast.queries[n]; + const query = new Query(this, thing); + this.queries.push(query); + } + + // console.log(JSON.stringify(this.ast)); + } + + /** + * Returns the identifier of this Query File. + * @return {string} the identifier of this Query File + */ + getIdentifier() { + return this.identifier; + } + + /** + * Visitor design pattern + * @param {Object} visitor - the visitor + * @param {Object} parameters - the parameter + * @return {Object} the result of visiting or null + * @private + */ + accept(visitor,parameters) { + return visitor.visit(this, parameters); + } + + /** + * Returns the ModelManager associated with this QueryFile + * + * @return {ModelManager} The ModelManager for this QueryFile + */ + getModelManager() { + return this.modelManager; + } + + /** + * Validates the QueryFile. + * + * @throws {IllegalModelException} if the query file is invalid + * @private + */ + validate() { + const queries = {}; + this.queries.forEach((query) => { + query.validate(); + let name = query.getName(); + if (queries[name]){ + throw new Error(`Found two or more queries with the name '${name}'`); + } + queries[name] = query; + }); + } + + /** + * Get all declarations in this Query file + * @return {Query[]} the Queries defined in the Query file + */ + getQueries() { + return this.queries; + } + + /** + * Get the definitions for this Query file. + * @return {string} The definitions for this Query file. + */ + getDefinitions() { + return this.definitions; + } + +} + +module.exports = QueryFile; diff --git a/packages/composer-common/lib/query/select.js b/packages/composer-common/lib/query/select.js new file mode 100644 index 0000000000..4cec098636 --- /dev/null +++ b/packages/composer-common/lib/query/select.js @@ -0,0 +1,146 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const Where = require('./where'); +const OrderBy = require('./orderby'); +const IllegalModelException = require('../introspect/illegalmodelexception'); + +/** + * Select defines a SELECT query over a resource (asset, transaction or participant) + * + * @private + * @class + * @memberof module:composer-common + */ +class Select { + + /** + * Create an Select from an Abstract Syntax Tree. The AST is the + * result of parsing. + * + * @param {Query} query - the Query for this select + * @param {string} ast - the AST created by the parser + * @throws {IllegalModelException} + */ + constructor(query, ast) { + if(!query || !ast) { + throw new IllegalModelException('Invalid Query or AST'); + } + + this.ast = ast; + this.query = query; + this.process(); + } + + /** + * Visitor design pattern + * @param {Object} visitor - the visitor + * @param {Object} parameters - the parameter + * @return {Object} the result of visiting or null + * @private + */ + accept(visitor,parameters) { + return visitor.visit(this, parameters); + } + + /** + * Returns the QueryFile that owns this Query. + * + * @return {AclFile} the owning QueryFile + */ + getQuery() { + return this.query; + } + + /** + * Process the AST and build the model + * + * @throws {IllegalModelException} + * @private + */ + process() { + this.resource = this.ast.resource; + + this.where = null; + if(this.ast.where) { + this.where = new Where(this.ast.where); + } + + this.limit = null; + if(this.ast.limit) { + this.limit = parseInt(this.ast.limit); + } + + this.skip = null; + if(this.ast.skip) { + this.skip = parseInt(this.ast.skip); + } + + this.orderBy = null; + if(this.ast.orderBy) { + this.orderBy = new OrderBy(this.ast.orderBy); + } + } + + /** + * Semantic validation of the structure of this select. + * + * @throws {IllegalModelException} + * @private + */ + validate() { + const mm = this.getQuery().getQueryFile().getModelManager(); + + // checks the resource type exists + const resourceClassDeclaration = mm.getType(this.resource); + + // check that it is not an enum or concept + if(resourceClassDeclaration.isConcept() || resourceClassDeclaration.isEnum()) { + throw new Error('Can only select assets, participants and transactions.'); + } + + if(this.where) { + this.where.validate(); + } + + if(this.orderBy) { + this.orderBy.validate(); + } + } + + /** + * Returns the FQN of the resource of this select. + * + * @return {string} the fully qualified name of the select + */ + getResource() { + return this.resource; + } + + /** + * Returns a new object representing this Query that is + * suitable for serializing as JSON. + * @return {Object} A new object suitable for serializing as JSON. + */ + toJSON() { + let result = { + resouce: this.resource + }; + return result; + } +} + +module.exports = Select; diff --git a/packages/composer-common/lib/query/where.js b/packages/composer-common/lib/query/where.js new file mode 100644 index 0000000000..18300b02d3 --- /dev/null +++ b/packages/composer-common/lib/query/where.js @@ -0,0 +1,110 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const IllegalModelException = require('../introspect/illegalmodelexception'); +const Condition = require('./condition'); + +/** + * Where defines the WHERE portion of a SELECT statement + * + * @private + * @class + * @memberof module:composer-common + */ +class Where { + + /** + * Create a Where from an Abstract Syntax Tree. The AST is the + * result of parsing. + * + * @param {Select} select - the Select for this Where + * @param {string} ast - the AST created by the parser + * @throws {IllegalModelException} + */ + constructor(select, ast) { + if(!select || !ast) { + throw new IllegalModelException('Invalid Select or AST'); + } + + this.ast = ast; + this.select = select; + this.process(); + } + + /** + * Visitor design pattern + * @param {Object} visitor - the visitor + * @param {Object} parameters - the parameter + * @return {Object} the result of visiting or null + * @private + */ + accept(visitor,parameters) { + return visitor.visit(this, parameters); + } + + /** + * Returns the Select that owns this Where. + * + * @return {Select} the owning Select + */ + getSelect() { + return this.select; + } + + /** + * Process the AST and build the model + * + * @throws {IllegalModelException} + * @private + */ + process() { + this.conditions = null; + + if(this.ast.conditions) { + for(let n=0; nDriver owner +} + +participant Driver identified by email { + o String email + o String firstName + o String lastName + o Integer age +} + +participant Regulator identified by email { + o String email + o String firstName + o String lastName +} + +transaction Transaction identified by transactionId { + o String transactionId +} diff --git a/packages/composer-common/test/query/queryfile.js b/packages/composer-common/test/query/queryfile.js new file mode 100644 index 0000000000..38c206d1ea --- /dev/null +++ b/packages/composer-common/test/query/queryfile.js @@ -0,0 +1,136 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const QueryFile = require('../../lib/query/queryfile'); +const parser = require('../../lib/query/parser'); +const ModelManager = require('../../lib/modelmanager'); +const fs = require('fs'); +const path = require('path'); + +require('chai').should(); +const sinon = require('sinon'); + +describe('QueryFile', () => { + + const testQuery = fs.readFileSync(path.resolve(__dirname, './test.qry'), 'utf8'); + const invalidQuery = fs.readFileSync(path.resolve(__dirname, './invalid.qry'), 'utf8'); + const testModel = fs.readFileSync(path.resolve(__dirname, './model.cto'), 'utf8'); + + let modelManager; + let sandbox; + + beforeEach(() => { + modelManager = new ModelManager(); + modelManager.addModelFile(testModel); + sandbox = sinon.sandbox.create(); + }); + + afterEach(() => { + sandbox.restore(); + }); + + describe('#constructor', () => { + + it('should throw when null definitions provided', () => { + (() => { + new QueryFile(modelManager, null); + }).should.throw(/as a string as input/); + }); + + it('should throw when invalid definitions provided', () => { + (() => { + new QueryFile( 'test', modelManager, [{}]); + }).should.throw(/as a string as input/); + }); + + it('should call the parser with the definitions and save the abstract syntax tree', () => { + const ast = { + queries: [ {identifier: {name: 'fake'}, statement: 'org.acme'} ] + }; + sandbox.stub(parser, 'parse').returns(ast); + let mf = new QueryFile( 'test', modelManager, 'fake definitions'); + mf.ast.should.equal(ast); + }); + + it('should throw a ParseException on invalid input', () => { + (() => { + new QueryFile('test.qry', modelManager, invalidQuery); + }).should.throw(/Line 3/); + }); + + it('should throw an error if it does not have a location', () => { + (() => { + sandbox.stub(parser, 'parse').throws(new Error('such error')); + new QueryFile('test.acl', modelManager, invalidQuery); + }).should.throw(/such error/); + }); + }); + + describe('#constructor', () => { + + it('should parse a query correctly', () => { + const queryContents = `query Q1 { + description: "Select all cars" + statement: SELECT org.acme.Car + }`; + const queryFile = new QueryFile('test.qry', modelManager, queryContents); + queryFile.getQueries().length.should.equal(1); + queryFile.getDefinitions().should.equal(queryContents); + const q1 = queryFile.getQueries()[0]; + q1.getName().should.equal('Q1'); + q1.getDescription().should.equal('Select all cars'); + }); + }); + + describe('#validate', () => { + + it('should validate correct contents', () => { + const queryFile = new QueryFile( 'test.qry', modelManager, testQuery); + queryFile.validate(); + }); + + it('should throw for duplicate query names', () => { + const queryContents = `query Q1 { + description: "some rule" + statement: SELECT org.acme.Car + } + + query Q1 { + description: "some rule" + statement: SELECT org.acme.Car + }`; + + const queryFile = new QueryFile('test.qry', modelManager, queryContents); + (() => { + queryFile.validate(); + }).should.throw(/Found two or more queries with the name/); + }); + + }); + + describe('#accept', () => { + + it('should call the visitor', () => { + let queryFile = new QueryFile('test.qry', modelManager, testQuery); + let visitor = { + visit: sinon.stub() + }; + queryFile.accept(visitor, ['some', 'args']); + sinon.assert.calledOnce(visitor.visit); + sinon.assert.calledWith(visitor.visit, queryFile, ['some', 'args']); + }); + }); +}); diff --git a/packages/composer-common/test/query/test.qry b/packages/composer-common/test/query/test.qry new file mode 100644 index 0000000000..e50b4a055a --- /dev/null +++ b/packages/composer-common/test/query/test.qry @@ -0,0 +1,106 @@ +query Q1 { + description: "Select all drivers" + statement: SELECT org.acme.Driver +} query Q2 { // test missing whitespace + description: "Select all regulators" + statement: SELECT org.acme.Regulator FROM mycustomer.Registry +} + +query Q3 { + description: "Select all transactions" + statement: SELECT org.acme.Transaction +} + +// single line comment +query Q4 { + description: "Select all Drivers called Dan" // inline comment + statement: SELECT org.acme.Driver WHERE firstName='Dan' +} + +/** + * Multiline comment + */ +query Q5 { + description: "Select all Drivers called Dan Selman" // inline comment + statement: SELECT org.acme.Driver WHERE firstName='Dan' AND lastName='Selman' +} + +query Q6 { + description: "Select all Drivers called Dan Selman with parens" + statement: SELECT org.acme.Driver WHERE (firstName='Dan' AND lastName='Selman') +} + +query Q7 { + description: "Select all Drivers called Dan Selman with parens limit" + statement: SELECT org.acme.Driver WHERE (firstName='Dan' AND lastName='Selman') LIMIT 5 +} + +query Q8 { + description: "Select all Drivers called Dan Selman with parens skip" + statement: SELECT org.acme.Driver WHERE (firstName='Dan' AND lastName='Selman') SKIP 5 +} + +// all on a single line +query Q9 {description: "Skip" statement: SELECT org.acme.Driver SKIP 5} +query Q10 {description: "Limit" statement: SELECT org.acme.Driver LIMIT 5} + + +query Q11 { + description: "Select all drivers aged 44" + statement: + SELECT org.acme.Driver + WHERE age=44 +} + +query Q12 { + description: "Select all drivers aged less than 44" + statement: + SELECT org.acme.Driver + WHERE age<44 +} + +query Q13 { + description: "Select all drivers aged less than equal 44" + statement: + SELECT org.acme.Driver + WHERE age <= 44 +} + +query Q14 { + description: "Select all drivers aged older than 44" + statement: + SELECT org.acme.Driver + WHERE age >45 +} + +query Q15 { + description: "Select all drivers aged older than or equal to 44" + statement: + SELECT org.acme.Driver + WHERE age>= 45 +} + +query Q16 { + description: "Select all drivers aged older than or equal to PARAM" + statement: + SELECT org.acme.Driver + WHERE age>= @ageParam +} + +query Q17 { + description: "Select all drivers aged older than PARAM" + statement: + SELECT org.acme.Driver + WHERE @ageParam < age +} + +query Q18 { + description: "Select all drivers aged older than PARAM" + statement: + SELECT org.acme.Driver + WHERE @ageParam < age + ORDER BY [lastName ASC, firstName DESC] + LIMIT @limitParam + SKIP @skipParam + +} \ No newline at end of file From b96bc35bee7739c67314cfc05e4c00a20e7ba1e8 Mon Sep 17 00:00:00 2001 From: Dan Selman Date: Sun, 11 Jun 2017 22:47:19 +0100 Subject: [PATCH 3/5] wip --- .../composer-common/lib/query/condition.js | 77 +- packages/composer-common/lib/query/orderby.js | 22 +- packages/composer-common/lib/query/parser.js | 10601 +++++++++++++++- .../composer-common/lib/query/parser.pegjs | 991 +- .../composer-common/lib/query/queryfile.js | 1 + packages/composer-common/lib/query/sort.js | 125 + packages/composer-common/test/query/model.cto | 5 + packages/composer-common/test/query/test.qry | 69 +- 8 files changed, 11213 insertions(+), 678 deletions(-) create mode 100644 packages/composer-common/lib/query/sort.js diff --git a/packages/composer-common/lib/query/condition.js b/packages/composer-common/lib/query/condition.js index 5cc0b3c9ca..2ec1486edd 100644 --- a/packages/composer-common/lib/query/condition.js +++ b/packages/composer-common/lib/query/condition.js @@ -14,8 +14,6 @@ 'use strict'; -const Where = require('./where'); -const OrderBy = require('./orderby'); const IllegalModelException = require('../introspect/illegalmodelexception'); /** @@ -29,20 +27,19 @@ const IllegalModelException = require('../introspect/illegalmodelexception'); class Condition { /** - * Create an Select from an Abstract Syntax Tree. The AST is the - * result of parsing. + * Create a Condition for a Where clause * - * @param {Query} query - the Query for this select + * @param {Where} where - the Where for this condition * @param {string} ast - the AST created by the parser * @throws {IllegalModelException} */ - constructor(query, ast) { - if(!query || !ast) { - throw new IllegalModelException('Invalid Query or AST'); + constructor(where, ast) { + if(!where || !ast) { + throw new IllegalModelException('Invalid Where or AST'); } this.ast = ast; - this.query = query; + this.where = where; this.process(); } @@ -58,12 +55,12 @@ class Condition { } /** - * Returns the QueryFile that owns this Query. + * Returns the Where that owns this condition. * - * @return {AclFile} the owning QueryFile + * @return {Where} the owning where clause */ - getQuery() { - return this.query; + getWhere() { + return this.where; } /** @@ -73,27 +70,9 @@ class Condition { * @private */ process() { - this.resource = this.ast.resource; - - this.where = null; - if(this.ast.where) { - this.where = new Where(this.ast.where); - } - - this.limit = null; - if(this.ast.limit) { - this.limit = parseInt(this.ast.limit); - } - - this.skip = null; - if(this.ast.skip) { - this.skip = parseInt(this.ast.skip); - } - - this.orderBy = null; - if(this.ast.orderBy) { - this.orderBy = new OrderBy(this.ast.orderBy); - } + this.left = this.ast.left; + this.op = this.ast.op; + this.right = this.right.value; } /** @@ -103,32 +82,6 @@ class Condition { * @private */ validate() { - const mm = this.getQuery().getQueryFile().getModelManager(); - - // checks the resource type exists - const resourceClassDeclaration = mm.getType(this.resource); - - // check that it is not an enum or concept - if(resourceClassDeclaration.isConcept() || resourceClassDeclaration.isEnum()) { - throw new Error('Can only select assets, participants and transactions.'); - } - - if(this.where) { - this.where.validate(); - } - - if(this.orderBy) { - this.orderBy.validate(); - } - } - - /** - * Returns the FQN of the resource of this select. - * - * @return {string} the fully qualified name of the select - */ - getResource() { - return this.resource; } /** @@ -138,7 +91,9 @@ class Condition { */ toJSON() { let result = { - resouce: this.resource + left: this.left, + op: this.op, + right: this.right }; return result; } diff --git a/packages/composer-common/lib/query/orderby.js b/packages/composer-common/lib/query/orderby.js index 0c74326809..03fc6e926d 100644 --- a/packages/composer-common/lib/query/orderby.js +++ b/packages/composer-common/lib/query/orderby.js @@ -18,7 +18,7 @@ const IllegalModelException = require('../introspect/illegalmodelexception'); const Where = require('../where'); /** - * Select defines a SELECT query over a resource (asset, transaction or participant) + * Defines the ORDER BY specification for a SELECT statement * * @private * @class @@ -27,20 +27,20 @@ const Where = require('../where'); class OrderBy { /** - * Create an Select from an Abstract Syntax Tree. The AST is the + * Create an OrderBy from an Abstract Syntax Tree. The AST is the * result of parsing. * - * @param {Query} query - the Query for this select + * @param {Select} select - the Select for this order by * @param {string} ast - the AST created by the parser * @throws {IllegalModelException} */ - constructor(query, ast) { - if(!query || !ast) { - throw new IllegalModelException('Invalid Query or AST'); + constructor(select, ast) { + if(!select || !ast) { + throw new IllegalModelException('Invalid Select or AST'); } this.ast = ast; - this.query = query; + this.select = select; this.process(); } @@ -56,12 +56,12 @@ class OrderBy { } /** - * Returns the QueryFile that owns this Query. + * Returns the Select that owns this OrderBy. * - * @return {AclFile} the owning QueryFile + * @return {Select} the owning Select */ - getQuery() { - return this.query; + getSelect() { + return this.select; } /** diff --git a/packages/composer-common/lib/query/parser.js b/packages/composer-common/lib/query/parser.js index 4b0a1bc592..49a0092589 100644 --- a/packages/composer-common/lib/query/parser.js +++ b/packages/composer-common/lib/query/parser.js @@ -201,68 +201,578 @@ module.exports = (function() { peg$c137 = { type: "class", value: "[\\u005F\\u203F-\\u2040\\u2054\\uFE33-\\uFE34\\uFE4D-\\uFE4F\\uFF3F]", description: "[\\u005F\\u203F-\\u2040\\u2054\\uFE33-\\uFE34\\uFE4D-\\uFE4F\\uFF3F]" }, peg$c138 = /^[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/, peg$c139 = { type: "class", value: "[\\u0020\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]", description: "[\\u0020\\u00A0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]" }, - peg$c140 = "query", - peg$c141 = { type: "literal", value: "query", description: "\"query\"" }, - peg$c142 = "import", - peg$c143 = { type: "literal", value: "import", description: "\"import\"" }, - peg$c144 = "null", - peg$c145 = { type: "literal", value: "null", description: "\"null\"" }, - peg$c146 = "true", - peg$c147 = { type: "literal", value: "true", description: "\"true\"" }, - peg$c148 = "false", - peg$c149 = { type: "literal", value: "false", description: "\"false\"" }, - peg$c150 = "SELECT", - peg$c151 = { type: "literal", value: "SELECT", description: "\"SELECT\"" }, - peg$c152 = "FROM", - peg$c153 = { type: "literal", value: "FROM", description: "\"FROM\"" }, - peg$c154 = "WHERE", - peg$c155 = { type: "literal", value: "WHERE", description: "\"WHERE\"" }, - peg$c156 = "OR", - peg$c157 = { type: "literal", value: "OR", description: "\"OR\"" }, - peg$c158 = "AND", - peg$c159 = { type: "literal", value: "AND", description: "\"AND\"" }, - peg$c160 = "ORDER BY", - peg$c161 = { type: "literal", value: "ORDER BY", description: "\"ORDER BY\"" }, - peg$c162 = "SKIP", - peg$c163 = { type: "literal", value: "SKIP", description: "\"SKIP\"" }, - peg$c164 = "LIMIT", - peg$c165 = { type: "literal", value: "LIMIT", description: "\"LIMIT\"" }, - peg$c166 = "ASC", - peg$c167 = { type: "literal", value: "ASC", description: "\"ASC\"" }, - peg$c168 = "DESC", - peg$c169 = { type: "literal", value: "DESC", description: "\"DESC\"" }, - peg$c170 = "!=", - peg$c171 = { type: "literal", value: "!=", description: "\"!=\"" }, - peg$c172 = "=", - peg$c173 = { type: "literal", value: "=", description: "\"=\"" }, - peg$c174 = "<", - peg$c175 = { type: "literal", value: "<", description: "\"<\"" }, - peg$c176 = "<=", - peg$c177 = { type: "literal", value: "<=", description: "\"<=\"" }, - peg$c178 = ">", - peg$c179 = { type: "literal", value: ">", description: "\">\"" }, - peg$c180 = ">=", - peg$c181 = { type: "literal", value: ">=", description: "\">=\"" }, - peg$c182 = ";", - peg$c183 = { type: "literal", value: ";", description: "\";\"" }, - peg$c184 = "}", - peg$c185 = { type: "literal", value: "}", description: "\"}\"" }, - peg$c186 = function(first, rest) { + peg$c140 = "break", + peg$c141 = { type: "literal", value: "break", description: "\"break\"" }, + peg$c142 = "case", + peg$c143 = { type: "literal", value: "case", description: "\"case\"" }, + peg$c144 = "catch", + peg$c145 = { type: "literal", value: "catch", description: "\"catch\"" }, + peg$c146 = "class", + peg$c147 = { type: "literal", value: "class", description: "\"class\"" }, + peg$c148 = "asset", + peg$c149 = { type: "literal", value: "asset", description: "\"asset\"" }, + peg$c150 = "transaction", + peg$c151 = { type: "literal", value: "transaction", description: "\"transaction\"" }, + peg$c152 = "participant", + peg$c153 = { type: "literal", value: "participant", description: "\"participant\"" }, + peg$c154 = "const", + peg$c155 = { type: "literal", value: "const", description: "\"const\"" }, + peg$c156 = "continue", + peg$c157 = { type: "literal", value: "continue", description: "\"continue\"" }, + peg$c158 = "debugger", + peg$c159 = { type: "literal", value: "debugger", description: "\"debugger\"" }, + peg$c160 = "default", + peg$c161 = { type: "literal", value: "default", description: "\"default\"" }, + peg$c162 = "delete", + peg$c163 = { type: "literal", value: "delete", description: "\"delete\"" }, + peg$c164 = "do", + peg$c165 = { type: "literal", value: "do", description: "\"do\"" }, + peg$c166 = "else", + peg$c167 = { type: "literal", value: "else", description: "\"else\"" }, + peg$c168 = "enum", + peg$c169 = { type: "literal", value: "enum", description: "\"enum\"" }, + peg$c170 = "export", + peg$c171 = { type: "literal", value: "export", description: "\"export\"" }, + peg$c172 = "extends", + peg$c173 = { type: "literal", value: "extends", description: "\"extends\"" }, + peg$c174 = "false", + peg$c175 = { type: "literal", value: "false", description: "\"false\"" }, + peg$c176 = "finally", + peg$c177 = { type: "literal", value: "finally", description: "\"finally\"" }, + peg$c178 = "for", + peg$c179 = { type: "literal", value: "for", description: "\"for\"" }, + peg$c180 = "function", + peg$c181 = { type: "literal", value: "function", description: "\"function\"" }, + peg$c182 = "get", + peg$c183 = { type: "literal", value: "get", description: "\"get\"" }, + peg$c184 = "if", + peg$c185 = { type: "literal", value: "if", description: "\"if\"" }, + peg$c186 = "import", + peg$c187 = { type: "literal", value: "import", description: "\"import\"" }, + peg$c188 = "instanceof", + peg$c189 = { type: "literal", value: "instanceof", description: "\"instanceof\"" }, + peg$c190 = "in", + peg$c191 = { type: "literal", value: "in", description: "\"in\"" }, + peg$c192 = "new", + peg$c193 = { type: "literal", value: "new", description: "\"new\"" }, + peg$c194 = "null", + peg$c195 = { type: "literal", value: "null", description: "\"null\"" }, + peg$c196 = "return", + peg$c197 = { type: "literal", value: "return", description: "\"return\"" }, + peg$c198 = "set", + peg$c199 = { type: "literal", value: "set", description: "\"set\"" }, + peg$c200 = "super", + peg$c201 = { type: "literal", value: "super", description: "\"super\"" }, + peg$c202 = "switch", + peg$c203 = { type: "literal", value: "switch", description: "\"switch\"" }, + peg$c204 = "this", + peg$c205 = { type: "literal", value: "this", description: "\"this\"" }, + peg$c206 = "throw", + peg$c207 = { type: "literal", value: "throw", description: "\"throw\"" }, + peg$c208 = "true", + peg$c209 = { type: "literal", value: "true", description: "\"true\"" }, + peg$c210 = "try", + peg$c211 = { type: "literal", value: "try", description: "\"try\"" }, + peg$c212 = "typeof", + peg$c213 = { type: "literal", value: "typeof", description: "\"typeof\"" }, + peg$c214 = "var", + peg$c215 = { type: "literal", value: "var", description: "\"var\"" }, + peg$c216 = "void", + peg$c217 = { type: "literal", value: "void", description: "\"void\"" }, + peg$c218 = "while", + peg$c219 = { type: "literal", value: "while", description: "\"while\"" }, + peg$c220 = "with", + peg$c221 = { type: "literal", value: "with", description: "\"with\"" }, + peg$c222 = "namespace", + peg$c223 = { type: "literal", value: "namespace", description: "\"namespace\"" }, + peg$c224 = "abstract", + peg$c225 = { type: "literal", value: "abstract", description: "\"abstract\"" }, + peg$c226 = ";", + peg$c227 = { type: "literal", value: ";", description: "\";\"" }, + peg$c228 = "}", + peg$c229 = { type: "literal", value: "}", description: "\"}\"" }, + peg$c230 = function() { return { type: "ThisExpression" }; }, + peg$c231 = "(", + peg$c232 = { type: "literal", value: "(", description: "\"(\"" }, + peg$c233 = ")", + peg$c234 = { type: "literal", value: ")", description: "\")\"" }, + peg$c235 = function(expression) { return expression; }, + peg$c236 = function(elision) { + return { + type: "ArrayExpression", + elements: optionalList(extractOptional(elision, 0)) + }; + }, + peg$c237 = function(elements) { + return { + type: "ArrayExpression", + elements: elements + }; + }, + peg$c238 = ",", + peg$c239 = { type: "literal", value: ",", description: "\",\"" }, + peg$c240 = function(elements, elision) { + return { + type: "ArrayExpression", + elements: elements.concat(optionalList(extractOptional(elision, 0))) + }; + }, + peg$c241 = function(elision, element) { + return optionalList(extractOptional(elision, 0)).concat(element); + }, + peg$c242 = function(first, elision, element) { + return optionalList(extractOptional(elision, 0)).concat(element); + }, + peg$c243 = function(first, rest) { return Array.prototype.concat.apply(first, rest); }, + peg$c244 = function(commas) { return filledArray(commas.length + 1, null); }, + peg$c245 = "{", + peg$c246 = { type: "literal", value: "{", description: "\"{\"" }, + peg$c247 = function() { return { type: "ObjectExpression", properties: [] }; }, + peg$c248 = function(properties) { + return { type: "ObjectExpression", properties: properties }; + }, + peg$c249 = function(first, rest) { + return buildList(first, rest, 3); + }, + peg$c250 = ":", + peg$c251 = { type: "literal", value: ":", description: "\":\"" }, + peg$c252 = function(key, value) { + return { key: key, value: value, kind: "init" }; + }, + peg$c253 = function(key, body) { + return { + key: key, + value: { + type: "FunctionExpression", + id: null, + params: [], + body: body + }, + kind: "get" + }; + }, + peg$c254 = function(key, params, body) { + return { + key: key, + value: { + type: "FunctionExpression", + id: null, + params: params, + body: body + }, + kind: "set" + }; + }, + peg$c255 = function(id) { return [id]; }, + peg$c256 = function(callee, args) { + return { type: "NewExpression", callee: callee, arguments: args }; + }, + peg$c257 = function(first, property) { + return { property: property, computed: true }; + }, + peg$c258 = function(first, property) { + return { property: property, computed: false }; + }, + peg$c259 = function(first, rest) { + return buildTree(first, rest, function(result, element) { + return { + type: "MemberExpression", + object: result, + property: element.property, + computed: element.computed + }; + }); + }, + peg$c260 = function(callee) { + return { type: "NewExpression", callee: callee, arguments: [] }; + }, + peg$c261 = function(callee, args) { + return { type: "CallExpression", callee: callee, arguments: args }; + }, + peg$c262 = function(first, args) { + return { type: "CallExpression", arguments: args }; + }, + peg$c263 = function(first, property) { + return { + type: "MemberExpression", + property: property, + computed: true + }; + }, + peg$c264 = function(first, property) { + return { + type: "MemberExpression", + property: property, + computed: false + }; + }, + peg$c265 = function(first, rest) { + return buildTree(first, rest, function(result, element) { + element[TYPES_TO_PROPERTY_NAMES[element.type]] = result; + + return element; + }); + }, + peg$c266 = function(args) { + return optionalList(extractOptional(args, 0)); + }, + peg$c267 = function(operator, argument) { + return { + type: "UnaryExpression", + operator: operator, + argument: argument, + prefix: true + }; + }, + peg$c268 = "!", + peg$c269 = { type: "literal", value: "!", description: "\"!\"" }, + peg$c270 = function(first, rest) { return buildBinaryExpression(first, rest); }, + peg$c271 = "*", + peg$c272 = { type: "literal", value: "*", description: "\"*\"" }, + peg$c273 = "=", + peg$c274 = { type: "literal", value: "=", description: "\"=\"" }, + peg$c275 = "%", + peg$c276 = { type: "literal", value: "%", description: "\"%\"" }, + peg$c277 = "+", + peg$c278 = { type: "literal", value: "+", description: "\"+\"" }, + peg$c279 = /^[+=]/, + peg$c280 = { type: "class", value: "[+=]", description: "[+=]" }, + peg$c281 = "-", + peg$c282 = { type: "literal", value: "-", description: "\"-\"" }, + peg$c283 = /^[\-=]/, + peg$c284 = { type: "class", value: "[-=]", description: "[-=]" }, + peg$c285 = "<<", + peg$c286 = { type: "literal", value: "<<", description: "\"<<\"" }, + peg$c287 = ">>>", + peg$c288 = { type: "literal", value: ">>>", description: "\">>>\"" }, + peg$c289 = ">>", + peg$c290 = { type: "literal", value: ">>", description: "\">>\"" }, + peg$c291 = "<=", + peg$c292 = { type: "literal", value: "<=", description: "\"<=\"" }, + peg$c293 = ">=", + peg$c294 = { type: "literal", value: ">=", description: "\">=\"" }, + peg$c295 = "<", + peg$c296 = { type: "literal", value: "<", description: "\"<\"" }, + peg$c297 = ">", + peg$c298 = { type: "literal", value: ">", description: "\">\"" }, + peg$c299 = "==", + peg$c300 = { type: "literal", value: "==", description: "\"==\"" }, + peg$c301 = "!=", + peg$c302 = { type: "literal", value: "!=", description: "\"!=\"" }, + peg$c303 = "&", + peg$c304 = { type: "literal", value: "&", description: "\"&\"" }, + peg$c305 = /^[&=]/, + peg$c306 = { type: "class", value: "[&=]", description: "[&=]" }, + peg$c307 = "^", + peg$c308 = { type: "literal", value: "^", description: "\"^\"" }, + peg$c309 = "|", + peg$c310 = { type: "literal", value: "|", description: "\"|\"" }, + peg$c311 = /^[|=]/, + peg$c312 = { type: "class", value: "[|=]", description: "[|=]" }, + peg$c313 = "AND", + peg$c314 = { type: "literal", value: "AND", description: "\"AND\"" }, + peg$c315 = "OR", + peg$c316 = { type: "literal", value: "OR", description: "\"OR\"" }, + peg$c317 = "?", + peg$c318 = { type: "literal", value: "?", description: "\"?\"" }, + peg$c319 = function(test, consequent, alternate) { + return { + type: "ConditionalExpression", + test: test, + consequent: consequent, + alternate: alternate + }; + }, + peg$c320 = function(left, right) { + return { + type: "AssignmentExpression", + operator: "=", + left: left, + right: right + }; + }, + peg$c321 = function(left, operator, right) { + return { + type: "AssignmentExpression", + operator: operator, + left: left, + right: right + }; + }, + peg$c322 = "*=", + peg$c323 = { type: "literal", value: "*=", description: "\"*=\"" }, + peg$c324 = "/=", + peg$c325 = { type: "literal", value: "/=", description: "\"/=\"" }, + peg$c326 = "%=", + peg$c327 = { type: "literal", value: "%=", description: "\"%=\"" }, + peg$c328 = "+=", + peg$c329 = { type: "literal", value: "+=", description: "\"+=\"" }, + peg$c330 = "-=", + peg$c331 = { type: "literal", value: "-=", description: "\"-=\"" }, + peg$c332 = "<<=", + peg$c333 = { type: "literal", value: "<<=", description: "\"<<=\"" }, + peg$c334 = ">>=", + peg$c335 = { type: "literal", value: ">>=", description: "\">>=\"" }, + peg$c336 = ">>>=", + peg$c337 = { type: "literal", value: ">>>=", description: "\">>>=\"" }, + peg$c338 = "&=", + peg$c339 = { type: "literal", value: "&=", description: "\"&=\"" }, + peg$c340 = "^=", + peg$c341 = { type: "literal", value: "^=", description: "\"^=\"" }, + peg$c342 = "|=", + peg$c343 = { type: "literal", value: "|=", description: "\"|=\"" }, + peg$c344 = function(first, rest) { + return rest.length > 0 + ? { type: "SequenceExpression", expressions: buildList(first, rest, 3) } + : first; + }, + peg$c345 = function(body) { + return { + type: "BlockStatement", + body: optionalList(extractOptional(body, 0)) + }; + }, + peg$c346 = function(first, rest) { return buildList(first, rest, 1); }, + peg$c347 = function(declarations) { + return { + type: "VariableDeclaration", + declarations: declarations + }; + }, + peg$c348 = function(id, init) { + return { + type: "VariableDeclarator", + id: id, + init: extractOptional(init, 1) + }; + }, + peg$c349 = function() { return { type: "EmptyStatement" }; }, + peg$c350 = function(expression) { + return { + type: "ExpressionStatement", + expression: expression + }; + }, + peg$c351 = function(test, consequent, alternate) { + return { + type: "IfStatement", + test: test, + consequent: consequent, + alternate: alternate + }; + }, + peg$c352 = function(test, consequent) { + return { + type: "IfStatement", + test: test, + consequent: consequent, + alternate: null + }; + }, + peg$c353 = function(body, test) { return { type: "DoWhileStatement", body: body, test: test }; }, + peg$c354 = function(test, body) { return { type: "WhileStatement", test: test, body: body }; }, + peg$c355 = function(init, test, update, body) { + return { + type: "ForStatement", + init: extractOptional(init, 0), + test: extractOptional(test, 0), + update: extractOptional(update, 0), + body: body + }; + }, + peg$c356 = function(declarations, test, update, body) { + return { + type: "ForStatement", + init: { + type: "VariableDeclaration", + declarations: declarations + }, + test: extractOptional(test, 0), + update: extractOptional(update, 0), + body: body + }; + }, + peg$c357 = function(left, right, body) { + return { + type: "ForInStatement", + left: left, + right: right, + body: body + }; + }, + peg$c358 = function(declarations, right, body) { + return { + type: "ForInStatement", + left: { + type: "VariableDeclaration", + declarations: declarations + }, + right: right, + body: body + }; + }, + peg$c359 = function() { + return { type: "ContinueStatement", label: null }; + }, + peg$c360 = function(label) { + return { type: "ContinueStatement", label: label }; + }, + peg$c361 = function() { + return { type: "BreakStatement", label: null }; + }, + peg$c362 = function(label) { + return { type: "BreakStatement", label: label }; + }, + peg$c363 = function() { + return { type: "ReturnStatement", argument: null }; + }, + peg$c364 = function(argument) { + return { type: "ReturnStatement", argument: argument }; + }, + peg$c365 = function(object, body) { return { type: "WithStatement", object: object, body: body }; }, + peg$c366 = function(discriminant, cases) { + return { + type: "SwitchStatement", + discriminant: discriminant, + cases: cases + }; + }, + peg$c367 = function(clauses) { + return optionalList(extractOptional(clauses, 0)); + }, + peg$c368 = function(before, default_, after) { + return optionalList(extractOptional(before, 0)) + .concat(default_) + .concat(optionalList(extractOptional(after, 0))); + }, + peg$c369 = function(test, consequent) { + return { + type: "SwitchCase", + test: test, + consequent: optionalList(extractOptional(consequent, 1)) + }; + }, + peg$c370 = function(consequent) { + return { + type: "SwitchCase", + test: null, + consequent: optionalList(extractOptional(consequent, 1)) + }; + }, + peg$c371 = function(label, body) { + return { type: "LabeledStatement", label: label, body: body }; + }, + peg$c372 = function(argument) { + return { type: "ThrowStatement", argument: argument }; + }, + peg$c373 = function(block, handler, finalizer) { + return { + type: "TryStatement", + block: block, + handler: handler, + finalizer: finalizer + }; + }, + peg$c374 = function(block, handler) { + return { + type: "TryStatement", + block: block, + handler: handler, + finalizer: null + }; + }, + peg$c375 = function(block, finalizer) { + return { + type: "TryStatement", + block: block, + handler: null, + finalizer: finalizer + }; + }, + peg$c376 = function(param, body) { + return { + type: "CatchClause", + param: param, + body: body + }; + }, + peg$c377 = function(block) { return block; }, + peg$c378 = function() { return { type: "DebuggerStatement" }; }, + peg$c379 = function(id, params, body) { + return { + type: "FunctionDeclaration", + id: id, + params: optionalList(extractOptional(params, 0)), + body: body + }; + }, + peg$c380 = function(id, params, body) { + return { + type: "FunctionExpression", + id: extractOptional(id, 0), + params: optionalList(extractOptional(params, 0)), + body: body + }; + }, + peg$c381 = function(statementList) { + return { + type: "FunctionBody", + statementList: statementList + }; + }, + peg$c382 = "validator", + peg$c383 = { type: "literal", value: "validator", description: "\"validator\"" }, + peg$c384 = function(validator) { + return { + type: "Validator", + text: validator + }; + }, + peg$c385 = "optional", + peg$c386 = { type: "literal", value: "optional", description: "\"optional\"" }, + peg$c387 = function() { + return { + type: "Optional" + }; + }, + peg$c388 = function(def) { + return { + type: "Default", + text: def + }; + }, + peg$c389 = function(first, rest) { return first.concat(JSON.stringify(rest).replace(/['"]+/g, '')); }, - peg$c187 = function(queries) { + peg$c390 = "query", + peg$c391 = { type: "literal", value: "query", description: "\"query\"" }, + peg$c392 = "SELECT", + peg$c393 = { type: "literal", value: "SELECT", description: "\"SELECT\"" }, + peg$c394 = "FROM", + peg$c395 = { type: "literal", value: "FROM", description: "\"FROM\"" }, + peg$c396 = "WHERE", + peg$c397 = { type: "literal", value: "WHERE", description: "\"WHERE\"" }, + peg$c398 = "ORDER BY", + peg$c399 = { type: "literal", value: "ORDER BY", description: "\"ORDER BY\"" }, + peg$c400 = "SKIP", + peg$c401 = { type: "literal", value: "SKIP", description: "\"SKIP\"" }, + peg$c402 = "LIMIT", + peg$c403 = { type: "literal", value: "LIMIT", description: "\"LIMIT\"" }, + peg$c404 = "ASC", + peg$c405 = { type: "literal", value: "ASC", description: "\"ASC\"" }, + peg$c406 = "DESC", + peg$c407 = { type: "literal", value: "DESC", description: "\"DESC\"" }, + peg$c408 = function(queries) { return { type: "Queries", queries: queries }; }, - peg$c188 = "{", - peg$c189 = { type: "literal", value: "{", description: "\"{\"" }, - peg$c190 = "description:", - peg$c191 = { type: "literal", value: "description:", description: "\"description:\"" }, - peg$c192 = "statement:", - peg$c193 = { type: "literal", value: "statement:", description: "\"statement:\"" }, - peg$c194 = function(id, description, select) { + peg$c409 = "description:", + peg$c410 = { type: "literal", value: "description:", description: "\"description:\"" }, + peg$c411 = "statement:", + peg$c412 = { type: "literal", value: "statement:", description: "\"statement:\"" }, + peg$c413 = function(id, description, select) { return { type: "Query", identifier: id, @@ -271,7 +781,7 @@ module.exports = (function() { location: location() }; }, - peg$c195 = function(resource, from, registry, where, orderBy, limit, skip) { + peg$c414 = function(resource, from, registry, where, orderBy, limit, skip) { return { type: "SELECT FROM", resource: resource, @@ -283,7 +793,7 @@ module.exports = (function() { location: location() }; }, - peg$c196 = function(resource, where, orderBy, limit, skip) { + peg$c415 = function(resource, where, orderBy, limit, skip) { return { type: "SELECT", resource: resource, @@ -294,81 +804,54 @@ module.exports = (function() { location: location() }; }, - peg$c197 = function(limit) { + peg$c416 = function(limit) { return { limit: limit }; }, - peg$c198 = function(skip) { + peg$c417 = function(skip) { return { skip: skip }; }, - peg$c199 = function() { return "ASC"; }, - peg$c200 = function() { return "DESC"; }, - peg$c201 = function(sort) { + peg$c418 = function() { return "ASC"; }, + peg$c419 = function() { return "DESC"; }, + peg$c420 = function(sort) { return { sort: sort, }; }, - peg$c202 = function(first, rest) { + peg$c421 = function(first, rest) { return [first].concat(rest); }, - peg$c203 = ",", - peg$c204 = { type: "literal", value: ",", description: "\",\"" }, - peg$c205 = function(item) { + peg$c422 = function(item) { return item; }, - peg$c206 = function(fieldName, direction) { + peg$c423 = function(fieldName, direction) { return { fieldName: fieldName, direction: direction }; }, - peg$c207 = { type: "other", description: "where expression" }, - peg$c208 = function(x, xs) { - return { - conditions: [x].concat(xs), - location: location() - }; - }, - peg$c209 = "(", - peg$c210 = { type: "literal", value: "(", description: "\"(\"" }, - peg$c211 = ")", - peg$c212 = { type: "literal", value: ")", description: "\")\"" }, - peg$c213 = function(x, xs) { - return [x].concat(xs); - }, - peg$c214 = function(left, op, right) { - return { - left: left, - op: op, - right: right, - location: location() - }; - }, - peg$c215 = function(j, l) { - return { - joiner: j, - expression: l - }; - }, - peg$c216 = function() { return "!="; }, - peg$c217 = function() { return "="; }, - peg$c218 = function() { return "<"; }, - peg$c219 = function() { return "<="; }, - peg$c220 = function() { return ">"; }, - peg$c221 = function() { return ">="; }, - peg$c222 = "@", - peg$c223 = { type: "literal", value: "@", description: "\"@\"" }, - peg$c224 = function(name) { + peg$c424 = function(test) { + return test; + }, + peg$c425 = function() { return "OR"; }, + peg$c426 = function() { return "AND"; }, + peg$c427 = function() { return "!="; }, + peg$c428 = function() { return "="; }, + peg$c429 = function() { return "<"; }, + peg$c430 = function() { return "<="; }, + peg$c431 = function() { return ">"; }, + peg$c432 = function() { return ">="; }, + peg$c433 = function(name) { return { type: "Placeholder", index: name, location: location() }; }, - peg$c225 = function(chars) { + peg$c434 = function(chars) { return chars.join(""); }, @@ -1236,7 +1719,7 @@ module.exports = (function() { s0 = peg$parseKeyword(); if (s0 === peg$FAILED) { - s0 = peg$parseImportToken(); + s0 = peg$parseFutureReservedWord(); if (s0 === peg$FAILED) { s0 = peg$parseNullLiteral(); if (s0 === peg$FAILED) { @@ -1251,9 +1734,107 @@ module.exports = (function() { function peg$parseKeyword() { var s0; - s0 = peg$parseSelectToken(); + s0 = peg$parseBreakToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseCaseToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseCatchToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseContinueToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseDebuggerToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseDefaultToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseDeleteToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseDoToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseElseToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseFinallyToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseForToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseFunctionToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseIfToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseInstanceofToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseInToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseNewToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseReturnToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseSwitchToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseThisToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseThrowToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseTryToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseTypeofToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseVarToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseVoidToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseWhileToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseWithToken(); + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + + return s0; + } + + function peg$parseFutureReservedWord() { + var s0; + + s0 = peg$parseClassToken(); if (s0 === peg$FAILED) { - s0 = peg$parseWhereToken(); + s0 = peg$parseConstToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseEnumToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseExportToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseExtendsToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseImportToken(); + if (s0 === peg$FAILED) { + s0 = peg$parseSuperToken(); + } + } + } + } + } } return s0; @@ -2816,7 +3397,7 @@ module.exports = (function() { return s0; } - function peg$parseQueryToken() { + function peg$parseBreakToken() { var s0, s1, s2, s3; s0 = peg$currPos; @@ -2853,13 +3434,13 @@ module.exports = (function() { return s0; } - function peg$parseImportToken() { + function peg$parseCaseToken() { var s0, s1, s2, s3; s0 = peg$currPos; - if (input.substr(peg$currPos, 6) === peg$c142) { + if (input.substr(peg$currPos, 4) === peg$c142) { s1 = peg$c142; - peg$currPos += 6; + peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c143); } @@ -2890,13 +3471,13 @@ module.exports = (function() { return s0; } - function peg$parseNullToken() { + function peg$parseCatchToken() { var s0, s1, s2, s3; s0 = peg$currPos; - if (input.substr(peg$currPos, 4) === peg$c144) { + if (input.substr(peg$currPos, 5) === peg$c144) { s1 = peg$c144; - peg$currPos += 4; + peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c145); } @@ -2927,13 +3508,13 @@ module.exports = (function() { return s0; } - function peg$parseTrueToken() { + function peg$parseClassToken() { var s0, s1, s2, s3; s0 = peg$currPos; - if (input.substr(peg$currPos, 4) === peg$c146) { + if (input.substr(peg$currPos, 5) === peg$c146) { s1 = peg$c146; - peg$currPos += 4; + peg$currPos += 5; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c147); } @@ -2964,7 +3545,7 @@ module.exports = (function() { return s0; } - function peg$parseFalseToken() { + function peg$parseAssetToken() { var s0, s1, s2, s3; s0 = peg$currPos; @@ -3001,13 +3582,13 @@ module.exports = (function() { return s0; } - function peg$parseSelectToken() { + function peg$parseTransactionToken() { var s0, s1, s2, s3; s0 = peg$currPos; - if (input.substr(peg$currPos, 6) === peg$c150) { + if (input.substr(peg$currPos, 11) === peg$c150) { s1 = peg$c150; - peg$currPos += 6; + peg$currPos += 11; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c151); } @@ -3038,13 +3619,13 @@ module.exports = (function() { return s0; } - function peg$parseFromToken() { + function peg$parseParticipantToken() { var s0, s1, s2, s3; s0 = peg$currPos; - if (input.substr(peg$currPos, 4) === peg$c152) { + if (input.substr(peg$currPos, 11) === peg$c152) { s1 = peg$c152; - peg$currPos += 4; + peg$currPos += 11; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c153); } @@ -3075,7 +3656,7 @@ module.exports = (function() { return s0; } - function peg$parseWhereToken() { + function peg$parseConstToken() { var s0, s1, s2, s3; s0 = peg$currPos; @@ -3112,13 +3693,13 @@ module.exports = (function() { return s0; } - function peg$parseOrToken() { + function peg$parseContinueToken() { var s0, s1, s2, s3; s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c156) { + if (input.substr(peg$currPos, 8) === peg$c156) { s1 = peg$c156; - peg$currPos += 2; + peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c157); } @@ -3149,13 +3730,13 @@ module.exports = (function() { return s0; } - function peg$parseAndToken() { + function peg$parseDebuggerToken() { var s0, s1, s2, s3; s0 = peg$currPos; - if (input.substr(peg$currPos, 3) === peg$c158) { + if (input.substr(peg$currPos, 8) === peg$c158) { s1 = peg$c158; - peg$currPos += 3; + peg$currPos += 8; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c159); } @@ -3186,13 +3767,13 @@ module.exports = (function() { return s0; } - function peg$parseOrderByToken() { + function peg$parseDefaultToken() { var s0, s1, s2, s3; s0 = peg$currPos; - if (input.substr(peg$currPos, 8) === peg$c160) { + if (input.substr(peg$currPos, 7) === peg$c160) { s1 = peg$c160; - peg$currPos += 8; + peg$currPos += 7; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c161); } @@ -3223,13 +3804,13 @@ module.exports = (function() { return s0; } - function peg$parseSkipToken() { + function peg$parseDeleteToken() { var s0, s1, s2, s3; s0 = peg$currPos; - if (input.substr(peg$currPos, 4) === peg$c162) { + if (input.substr(peg$currPos, 6) === peg$c162) { s1 = peg$c162; - peg$currPos += 4; + peg$currPos += 6; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c163); } @@ -3260,13 +3841,13 @@ module.exports = (function() { return s0; } - function peg$parseLimitToken() { + function peg$parseDoToken() { var s0, s1, s2, s3; s0 = peg$currPos; - if (input.substr(peg$currPos, 5) === peg$c164) { + if (input.substr(peg$currPos, 2) === peg$c164) { s1 = peg$c164; - peg$currPos += 5; + peg$currPos += 2; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c165); } @@ -3297,13 +3878,13 @@ module.exports = (function() { return s0; } - function peg$parseAscToken() { + function peg$parseElseToken() { var s0, s1, s2, s3; s0 = peg$currPos; - if (input.substr(peg$currPos, 3) === peg$c166) { + if (input.substr(peg$currPos, 4) === peg$c166) { s1 = peg$c166; - peg$currPos += 3; + peg$currPos += 4; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c167); } @@ -3334,7 +3915,7 @@ module.exports = (function() { return s0; } - function peg$parseDescToken() { + function peg$parseEnumToken() { var s0, s1, s2, s3; s0 = peg$currPos; @@ -3371,49 +3952,58 @@ module.exports = (function() { return s0; } - function peg$parseNotEqualToken() { - var s0; + function peg$parseExportToken() { + var s0, s1, s2, s3; - if (input.substr(peg$currPos, 2) === peg$c170) { - s0 = peg$c170; - peg$currPos += 2; + s0 = peg$currPos; + if (input.substr(peg$currPos, 6) === peg$c170) { + s1 = peg$c170; + peg$currPos += 6; } else { - s0 = peg$FAILED; + s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c171); } } - - return s0; - } - - function peg$parseEqualToken() { - var s0; - - if (input.charCodeAt(peg$currPos) === 61) { - s0 = peg$c172; - peg$currPos++; + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } } else { + peg$currPos = s0; s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c173); } } return s0; } - function peg$parseLTToken() { + function peg$parseExtendsToken() { var s0, s1, s2, s3; s0 = peg$currPos; - if (input.charCodeAt(peg$currPos) === 60) { - s1 = peg$c174; - peg$currPos++; + if (input.substr(peg$currPos, 7) === peg$c172) { + s1 = peg$c172; + peg$currPos += 7; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c175); } + if (peg$silentFails === 0) { peg$fail(peg$c173); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; peg$silentFails++; - s3 = peg$parseEqualToken(); + s3 = peg$parseIdentifierPart(); peg$silentFails--; if (s3 === peg$FAILED) { s2 = void 0; @@ -3436,27 +4026,87 @@ module.exports = (function() { return s0; } - function peg$parseLTEToken() { - var s0; + function peg$parseFalseToken() { + var s0, s1, s2, s3; - if (input.substr(peg$currPos, 2) === peg$c176) { - s0 = peg$c176; - peg$currPos += 2; - } else { + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c174) { + s1 = peg$c174; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c175); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseFinallyToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 7) === peg$c176) { + s1 = peg$c176; + peg$currPos += 7; + } else { + s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c177); } } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } return s0; } - function peg$parseGTToken() { + function peg$parseForToken() { var s0, s1, s2, s3; s0 = peg$currPos; - if (input.charCodeAt(peg$currPos) === 62) { + if (input.substr(peg$currPos, 3) === peg$c178) { s1 = peg$c178; - peg$currPos++; + peg$currPos += 3; } else { s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c179); } @@ -3464,7 +4114,7 @@ module.exports = (function() { if (s1 !== peg$FAILED) { s2 = peg$currPos; peg$silentFails++; - s3 = peg$parseEqualToken(); + s3 = peg$parseIdentifierPart(); peg$silentFails--; if (s3 === peg$FAILED) { s2 = void 0; @@ -3487,76 +4137,138 @@ module.exports = (function() { return s0; } - function peg$parseGTEToken() { - var s0; + function peg$parseFunctionToken() { + var s0, s1, s2, s3; - if (input.substr(peg$currPos, 2) === peg$c180) { - s0 = peg$c180; - peg$currPos += 2; + s0 = peg$currPos; + if (input.substr(peg$currPos, 8) === peg$c180) { + s1 = peg$c180; + peg$currPos += 8; } else { - s0 = peg$FAILED; + s1 = peg$FAILED; if (peg$silentFails === 0) { peg$fail(peg$c181); } } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } return s0; } - function peg$parse__() { - var s0, s1; + function peg$parseGetToken() { + var s0, s1, s2, s3; - s0 = []; - s1 = peg$parseWhiteSpace(); - if (s1 === peg$FAILED) { - s1 = peg$parseLineTerminatorSequence(); - if (s1 === peg$FAILED) { - s1 = peg$parseComment(); - } + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c182) { + s1 = peg$c182; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c183); } } - while (s1 !== peg$FAILED) { - s0.push(s1); - s1 = peg$parseWhiteSpace(); - if (s1 === peg$FAILED) { - s1 = peg$parseLineTerminatorSequence(); - if (s1 === peg$FAILED) { - s1 = peg$parseComment(); - } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; } + } else { + peg$currPos = s0; + s0 = peg$FAILED; } return s0; } - function peg$parse_() { - var s0, s1; + function peg$parseIfToken() { + var s0, s1, s2, s3; - s0 = []; - s1 = peg$parseWhiteSpace(); - if (s1 === peg$FAILED) { - s1 = peg$parseMultiLineCommentNoLineTerminator(); + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c184) { + s1 = peg$c184; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c185); } } - while (s1 !== peg$FAILED) { - s0.push(s1); - s1 = peg$parseWhiteSpace(); - if (s1 === peg$FAILED) { - s1 = peg$parseMultiLineCommentNoLineTerminator(); + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; } + } else { + peg$currPos = s0; + s0 = peg$FAILED; } return s0; } - function peg$parseEOS() { + function peg$parseImportToken() { var s0, s1, s2, s3; s0 = peg$currPos; - s1 = peg$parse__(); + if (input.substr(peg$currPos, 6) === peg$c186) { + s1 = peg$c186; + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c187); } + } if (s1 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 59) { - s2 = peg$c182; - peg$currPos++; + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; } else { + peg$currPos = s2; s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c183); } } if (s2 !== peg$FAILED) { s1 = [s1, s2]; @@ -3569,69 +4281,8501 @@ module.exports = (function() { peg$currPos = s0; s0 = peg$FAILED; } - if (s0 === peg$FAILED) { - s0 = peg$currPos; - s1 = peg$parse_(); - if (s1 !== peg$FAILED) { - s2 = peg$parseSingleLineComment(); - if (s2 === peg$FAILED) { - s2 = null; - } - if (s2 !== peg$FAILED) { - s3 = peg$parseLineTerminatorSequence(); - if (s3 !== peg$FAILED) { - s1 = [s1, s2, s3]; - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } + + return s0; + } + + function peg$parseInstanceofToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 10) === peg$c188) { + s1 = peg$c188; + peg$currPos += 10; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c189); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; } else { peg$currPos = s0; s0 = peg$FAILED; } - if (s0 === peg$FAILED) { - s0 = peg$currPos; - s1 = peg$parse_(); - if (s1 !== peg$FAILED) { - s2 = peg$currPos; - peg$silentFails++; - if (input.charCodeAt(peg$currPos) === 125) { - s3 = peg$c184; - peg$currPos++; - } else { - s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c185); } - } - peg$silentFails--; - if (s3 !== peg$FAILED) { - peg$currPos = s2; - s2 = void 0; - } else { - s2 = peg$FAILED; - } - if (s2 !== peg$FAILED) { - s1 = [s1, s2]; - s0 = s1; - } else { + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseInToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c190) { + s1 = peg$c190; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c191); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseNewToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c192) { + s1 = peg$c192; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c193); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseNullToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c194) { + s1 = peg$c194; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c195); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseReturnToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 6) === peg$c196) { + s1 = peg$c196; + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c197); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSetToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c198) { + s1 = peg$c198; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c199); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSuperToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c200) { + s1 = peg$c200; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c201); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSwitchToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 6) === peg$c202) { + s1 = peg$c202; + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c203); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseThisToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c204) { + s1 = peg$c204; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c205); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseThrowToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c206) { + s1 = peg$c206; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c207); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseTrueToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c208) { + s1 = peg$c208; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c209); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseTryToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c210) { + s1 = peg$c210; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c211); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseTypeofToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 6) === peg$c212) { + s1 = peg$c212; + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c213); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseVarToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c214) { + s1 = peg$c214; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c215); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseVoidToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c216) { + s1 = peg$c216; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c217); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseWhileToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c218) { + s1 = peg$c218; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c219); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseWithToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c220) { + s1 = peg$c220; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c221); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseNamespaceToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 9) === peg$c222) { + s1 = peg$c222; + peg$currPos += 9; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c223); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseAbstractToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 8) === peg$c224) { + s1 = peg$c224; + peg$currPos += 8; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c225); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parse__() { + var s0, s1; + + s0 = []; + s1 = peg$parseWhiteSpace(); + if (s1 === peg$FAILED) { + s1 = peg$parseLineTerminatorSequence(); + if (s1 === peg$FAILED) { + s1 = peg$parseComment(); + } + } + while (s1 !== peg$FAILED) { + s0.push(s1); + s1 = peg$parseWhiteSpace(); + if (s1 === peg$FAILED) { + s1 = peg$parseLineTerminatorSequence(); + if (s1 === peg$FAILED) { + s1 = peg$parseComment(); + } + } + } + + return s0; + } + + function peg$parse_() { + var s0, s1; + + s0 = []; + s1 = peg$parseWhiteSpace(); + if (s1 === peg$FAILED) { + s1 = peg$parseMultiLineCommentNoLineTerminator(); + } + while (s1 !== peg$FAILED) { + s0.push(s1); + s1 = peg$parseWhiteSpace(); + if (s1 === peg$FAILED) { + s1 = peg$parseMultiLineCommentNoLineTerminator(); + } + } + + return s0; + } + + function peg$parseEOS() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parse__(); + if (s1 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 59) { + s2 = peg$c226; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c227); } + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + s2 = peg$parseSingleLineComment(); + if (s2 === peg$FAILED) { + s2 = null; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseLineTerminatorSequence(); + if (s3 !== peg$FAILED) { + s1 = [s1, s2, s3]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parse_(); + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 125) { + s3 = peg$c228; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c229); } + } + peg$silentFails--; + if (s3 !== peg$FAILED) { + peg$currPos = s2; + s2 = void 0; + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parse__(); + if (s1 !== peg$FAILED) { + s2 = peg$parseEOF(); + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + } + + return s0; + } + + function peg$parseEOF() { + var s0, s1; + + s0 = peg$currPos; + peg$silentFails++; + if (input.length > peg$currPos) { + s1 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c1); } + } + peg$silentFails--; + if (s1 === peg$FAILED) { + s0 = void 0; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsePrimaryExpression() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + s1 = peg$parseThisToken(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c230(); + } + s0 = s1; + if (s0 === peg$FAILED) { + s0 = peg$parseIdentifier(); + if (s0 === peg$FAILED) { + s0 = peg$parseLiteral(); + if (s0 === peg$FAILED) { + s0 = peg$parseArrayLiteral(); + if (s0 === peg$FAILED) { + s0 = peg$parseObjectLiteral(); + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 40) { + s1 = peg$c231; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseExpression(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s5 = peg$c233; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c235(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + } + } + } + + return s0; + } + + function peg$parseArrayLiteral() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 91) { + s1 = peg$c112; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c113); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parseElision(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 === peg$FAILED) { + s3 = null; + } + if (s3 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 93) { + s4 = peg$c114; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c236(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 91) { + s1 = peg$c112; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c113); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseElementList(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 93) { + s5 = peg$c114; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c237(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 91) { + s1 = peg$c112; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c113); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseElementList(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$currPos; + s8 = peg$parseElision(); + if (s8 !== peg$FAILED) { + s9 = peg$parse__(); + if (s9 !== peg$FAILED) { + s8 = [s8, s9]; + s7 = s8; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + if (s7 === peg$FAILED) { + s7 = null; + } + if (s7 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 93) { + s8 = peg$c114; + peg$currPos++; + } else { + s8 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + if (s8 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c240(s3, s7); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + + return s0; + } + + function peg$parseElementList() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$currPos; + s3 = peg$parseElision(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s3 = [s3, s4]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 === peg$FAILED) { + s2 = null; + } + if (s2 !== peg$FAILED) { + s3 = peg$parseAssignmentExpression(); + if (s3 !== peg$FAILED) { + peg$savedPos = s1; + s2 = peg$c241(s2, s3); + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$currPos; + s8 = peg$parseElision(); + if (s8 !== peg$FAILED) { + s9 = peg$parse__(); + if (s9 !== peg$FAILED) { + s8 = [s8, s9]; + s7 = s8; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + if (s7 === peg$FAILED) { + s7 = null; + } + if (s7 !== peg$FAILED) { + s8 = peg$parseAssignmentExpression(); + if (s8 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c242(s1, s7, s8); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$currPos; + s8 = peg$parseElision(); + if (s8 !== peg$FAILED) { + s9 = peg$parse__(); + if (s9 !== peg$FAILED) { + s8 = [s8, s9]; + s7 = s8; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + if (s7 === peg$FAILED) { + s7 = null; + } + if (s7 !== peg$FAILED) { + s8 = peg$parseAssignmentExpression(); + if (s8 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c242(s1, s7, s8); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c243(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseElision() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 44) { + s1 = peg$c238; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c244(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseObjectLiteral() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 123) { + s1 = peg$c245; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c246); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s3 = peg$c228; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c229); } + } + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c247(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 123) { + s1 = peg$c245; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c246); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parsePropertyNameAndValueList(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s5 = peg$c228; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c229); } + } + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c248(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 123) { + s1 = peg$c245; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c246); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parsePropertyNameAndValueList(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s7 = peg$c228; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c229); } + } + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c248(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + + return s0; + } + + function peg$parsePropertyNameAndValueList() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parsePropertyAssignment(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parsePropertyAssignment(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parsePropertyAssignment(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c249(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsePropertyAssignment() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15; + + s0 = peg$currPos; + s1 = peg$parsePropertyName(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 58) { + s3 = peg$c250; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c251); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseAssignmentExpression(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c252(s1, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseGetToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parsePropertyName(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s5 = peg$c231; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s7 = peg$c233; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 123) { + s9 = peg$c245; + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c246); } + } + if (s9 !== peg$FAILED) { + s10 = peg$parse__(); + if (s10 !== peg$FAILED) { + s11 = peg$parseFunctionBody(); + if (s11 !== peg$FAILED) { + s12 = peg$parse__(); + if (s12 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s13 = peg$c228; + peg$currPos++; + } else { + s13 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c229); } + } + if (s13 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c253(s3, s11); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseSetToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parsePropertyName(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s5 = peg$c231; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parsePropertySetParameterList(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s9 = peg$c233; + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s9 !== peg$FAILED) { + s10 = peg$parse__(); + if (s10 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 123) { + s11 = peg$c245; + peg$currPos++; + } else { + s11 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c246); } + } + if (s11 !== peg$FAILED) { + s12 = peg$parse__(); + if (s12 !== peg$FAILED) { + s13 = peg$parseFunctionBody(); + if (s13 !== peg$FAILED) { + s14 = peg$parse__(); + if (s14 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s15 = peg$c228; + peg$currPos++; + } else { + s15 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c229); } + } + if (s15 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c254(s3, s7, s13); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + + return s0; + } + + function peg$parsePropertyName() { + var s0; + + s0 = peg$parseIdentifierName(); + if (s0 === peg$FAILED) { + s0 = peg$parseStringLiteral(); + if (s0 === peg$FAILED) { + s0 = peg$parseNumericLiteral(); + } + } + + return s0; + } + + function peg$parsePropertySetParameterList() { + var s0, s1; + + s0 = peg$currPos; + s1 = peg$parseIdentifier(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c255(s1); + } + s0 = s1; + + return s0; + } + + function peg$parseMemberExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + s0 = peg$currPos; + s1 = peg$parsePrimaryExpression(); + if (s1 === peg$FAILED) { + s1 = peg$parseFunctionExpression(); + if (s1 === peg$FAILED) { + s1 = peg$currPos; + s2 = peg$parseNewToken(); + if (s2 !== peg$FAILED) { + s3 = peg$parse__(); + if (s3 !== peg$FAILED) { + s4 = peg$parseMemberExpression(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s6 = peg$parseArguments(); + if (s6 !== peg$FAILED) { + peg$savedPos = s1; + s2 = peg$c256(s4, s6); + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 91) { + s5 = peg$c112; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c113); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseExpression(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 93) { + s9 = peg$c114; + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + if (s9 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c257(s1, s7); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 === peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 46) { + s5 = peg$c54; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c55); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseIdentifierName(); + if (s7 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c258(s1, s7); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 91) { + s5 = peg$c112; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c113); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseExpression(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 93) { + s9 = peg$c114; + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + if (s9 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c257(s1, s7); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 === peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 46) { + s5 = peg$c54; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c55); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseIdentifierName(); + if (s7 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c258(s1, s7); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c259(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseNewExpression() { + var s0, s1, s2, s3; + + s0 = peg$parseMemberExpression(); + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseNewToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseNewExpression(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c260(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + return s0; + } + + function peg$parseCallExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$parseMemberExpression(); + if (s2 !== peg$FAILED) { + s3 = peg$parse__(); + if (s3 !== peg$FAILED) { + s4 = peg$parseArguments(); + if (s4 !== peg$FAILED) { + peg$savedPos = s1; + s2 = peg$c261(s2, s4); + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseArguments(); + if (s5 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c262(s1, s5); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 === peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 91) { + s5 = peg$c112; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c113); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseExpression(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 93) { + s9 = peg$c114; + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + if (s9 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c263(s1, s7); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 === peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 46) { + s5 = peg$c54; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c55); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseIdentifierName(); + if (s7 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c264(s1, s7); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseArguments(); + if (s5 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c262(s1, s5); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 === peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 91) { + s5 = peg$c112; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c113); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseExpression(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 93) { + s9 = peg$c114; + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c115); } + } + if (s9 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c263(s1, s7); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 === peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 46) { + s5 = peg$c54; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c55); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseIdentifierName(); + if (s7 !== peg$FAILED) { + peg$savedPos = s3; + s4 = peg$c264(s1, s7); + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c265(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseArguments() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 40) { + s1 = peg$c231; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parseArgumentList(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 === peg$FAILED) { + s3 = null; + } + if (s3 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s4 = peg$c233; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c266(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseArgumentList() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseAssignmentExpression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseAssignmentExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseAssignmentExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c249(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseUnaryExpression() { + var s0, s1, s2, s3; + + s0 = peg$parseMemberExpression(); + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseUnaryOperator(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseUnaryExpression(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c267(s1, s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + return s0; + } + + function peg$parseUnaryOperator() { + var s0; + + if (input.charCodeAt(peg$currPos) === 33) { + s0 = peg$c268; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c269); } + } + + return s0; + } + + function peg$parseMultiplicativeExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseUnaryExpression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseMultiplicativeOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseUnaryExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseMultiplicativeOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseUnaryExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseMultiplicativeOperator() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 42) { + s2 = peg$c271; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c272); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 61) { + s4 = peg$c273; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 47) { + s2 = peg$c105; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c106); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 61) { + s4 = peg$c273; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 37) { + s2 = peg$c275; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c276); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 61) { + s4 = peg$c273; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + } + } + + return s0; + } + + function peg$parseAdditiveExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseMultiplicativeExpression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseAdditiveOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseMultiplicativeExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseAdditiveOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseMultiplicativeExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseAdditiveOperator() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 43) { + s2 = peg$c277; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c278); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (peg$c279.test(input.charAt(peg$currPos))) { + s4 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c280); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 45) { + s2 = peg$c281; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c282); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (peg$c283.test(input.charAt(peg$currPos))) { + s4 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c284); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + } + + return s0; + } + + function peg$parseShiftExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseUnaryExpression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseShiftOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseUnaryExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseShiftOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseUnaryExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseShiftOperator() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c285) { + s2 = peg$c285; + peg$currPos += 2; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c286); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 61) { + s4 = peg$c273; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c287) { + s2 = peg$c287; + peg$currPos += 3; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c288); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 61) { + s4 = peg$c273; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c289) { + s2 = peg$c289; + peg$currPos += 2; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c290); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 61) { + s4 = peg$c273; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + } + } + + return s0; + } + + function peg$parseRelationalExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseShiftExpression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseRelationalOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseShiftExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseRelationalOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseShiftExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseRelationalOperator() { + var s0, s1, s2, s3, s4; + + if (input.substr(peg$currPos, 2) === peg$c291) { + s0 = peg$c291; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c292); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c293) { + s0 = peg$c293; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c294); } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 60) { + s2 = peg$c295; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c296); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 60) { + s4 = peg$c295; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c296); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 62) { + s2 = peg$c297; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c298); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 62) { + s4 = peg$c297; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c298); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + } + } + } + + return s0; + } + + function peg$parseRelationalExpressionNoIn() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseShiftExpression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseRelationalOperatorNoIn(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseShiftExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseRelationalOperatorNoIn(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseShiftExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseRelationalOperatorNoIn() { + var s0, s1, s2, s3, s4; + + if (input.substr(peg$currPos, 2) === peg$c291) { + s0 = peg$c291; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c292); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c293) { + s0 = peg$c293; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c294); } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 60) { + s2 = peg$c295; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c296); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 60) { + s4 = peg$c295; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c296); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 62) { + s2 = peg$c297; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c298); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 62) { + s4 = peg$c297; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c298); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + } + } + } + + return s0; + } + + function peg$parseEqualityExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseRelationalExpression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseEqualityOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseRelationalExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseEqualityOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseRelationalExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseEqualityExpressionNoIn() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseRelationalExpressionNoIn(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseEqualityOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseRelationalExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseEqualityOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseRelationalExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseEqualityOperator() { + var s0; + + if (input.substr(peg$currPos, 2) === peg$c299) { + s0 = peg$c299; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c300); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c301) { + s0 = peg$c301; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c302); } + } + } + + return s0; + } + + function peg$parseBitwiseANDExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseEqualityExpression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseBitwiseANDOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseEqualityExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseBitwiseANDOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseEqualityExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseBitwiseANDExpressionNoIn() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseEqualityExpressionNoIn(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseBitwiseANDOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseEqualityExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseBitwiseANDOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseEqualityExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseBitwiseANDOperator() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 38) { + s2 = peg$c303; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c304); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (peg$c305.test(input.charAt(peg$currPos))) { + s4 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c306); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + + return s0; + } + + function peg$parseBitwiseXORExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseBitwiseANDExpression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseBitwiseXOROperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseBitwiseANDExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseBitwiseXOROperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseBitwiseANDExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseBitwiseXORExpressionNoIn() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseBitwiseANDExpressionNoIn(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseBitwiseXOROperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseBitwiseANDExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseBitwiseXOROperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseBitwiseANDExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseBitwiseXOROperator() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 94) { + s2 = peg$c307; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c308); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 61) { + s4 = peg$c273; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + + return s0; + } + + function peg$parseBitwiseORExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseBitwiseXORExpression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseBitwiseOROperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseBitwiseXORExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseBitwiseOROperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseBitwiseXORExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseBitwiseORExpressionNoIn() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseBitwiseXORExpressionNoIn(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseBitwiseOROperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseBitwiseXORExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseBitwiseOROperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseBitwiseXORExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseBitwiseOROperator() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 124) { + s2 = peg$c309; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c310); } + } + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + peg$silentFails++; + if (peg$c311.test(input.charAt(peg$currPos))) { + s4 = input.charAt(peg$currPos); + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c312); } + } + peg$silentFails--; + if (s4 === peg$FAILED) { + s3 = void 0; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 !== peg$FAILED) { + s2 = [s2, s3]; + s1 = s2; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s0 = input.substring(s0, peg$currPos); + } else { + s0 = s1; + } + + return s0; + } + + function peg$parseLogicalANDExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseBitwiseORExpression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseLogicalANDOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseBitwiseORExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseLogicalANDOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseBitwiseORExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLogicalANDExpressionNoIn() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseBitwiseORExpressionNoIn(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseLogicalANDOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseBitwiseORExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseLogicalANDOperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseBitwiseORExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLogicalANDOperator() { + var s0; + + if (input.substr(peg$currPos, 3) === peg$c313) { + s0 = peg$c313; + peg$currPos += 3; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c314); } + } + + return s0; + } + + function peg$parseLogicalORExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseLogicalANDExpression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseLogicalOROperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseLogicalANDExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseLogicalOROperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseLogicalANDExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLogicalORExpressionNoIn() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseLogicalANDExpressionNoIn(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseLogicalOROperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseLogicalANDExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseLogicalOROperator(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseLogicalANDExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c270(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLogicalOROperator() { + var s0; + + if (input.substr(peg$currPos, 2) === peg$c315) { + s0 = peg$c315; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c316); } + } + + return s0; + } + + function peg$parseConditionalExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + s0 = peg$currPos; + s1 = peg$parseLogicalORExpression(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 63) { + s3 = peg$c317; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c318); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseAssignmentExpression(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 58) { + s7 = peg$c250; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c251); } + } + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + s9 = peg$parseAssignmentExpression(); + if (s9 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c319(s1, s5, s9); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseLogicalORExpression(); + } + + return s0; + } + + function peg$parseConditionalExpressionNoIn() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + s0 = peg$currPos; + s1 = peg$parseLogicalORExpressionNoIn(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 63) { + s3 = peg$c317; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c318); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseAssignmentExpression(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 58) { + s7 = peg$c250; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c251); } + } + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + s9 = peg$parseAssignmentExpressionNoIn(); + if (s9 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c319(s1, s5, s9); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseLogicalORExpressionNoIn(); + } + + return s0; + } + + function peg$parseAssignmentExpression() { + var s0, s1, s2, s3, s4, s5, s6; + + s0 = peg$currPos; + s1 = peg$parseMemberExpression(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 61) { + s3 = peg$c273; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + if (s3 !== peg$FAILED) { + s4 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 61) { + s5 = peg$c273; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + peg$silentFails--; + if (s5 === peg$FAILED) { + s4 = void 0; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s6 = peg$parseAssignmentExpression(); + if (s6 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c320(s1, s6); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseMemberExpression(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseAssignmentOperator(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseAssignmentExpression(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c321(s1, s3, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseConditionalExpression(); + } + } + + return s0; + } + + function peg$parseAssignmentExpressionNoIn() { + var s0, s1, s2, s3, s4, s5, s6; + + s0 = peg$currPos; + s1 = peg$parseMemberExpression(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 61) { + s3 = peg$c273; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + if (s3 !== peg$FAILED) { + s4 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 61) { + s5 = peg$c273; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + peg$silentFails--; + if (s5 === peg$FAILED) { + s4 = void 0; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s6 = peg$parseAssignmentExpressionNoIn(); + if (s6 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c320(s1, s6); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseMemberExpression(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseAssignmentOperator(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseAssignmentExpressionNoIn(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c321(s1, s3, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$parseConditionalExpressionNoIn(); + } + } + + return s0; + } + + function peg$parseAssignmentOperator() { + var s0; + + if (input.substr(peg$currPos, 2) === peg$c322) { + s0 = peg$c322; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c323); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c324) { + s0 = peg$c324; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c325); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c326) { + s0 = peg$c326; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c327); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c328) { + s0 = peg$c328; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c329); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c330) { + s0 = peg$c330; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c331); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c332) { + s0 = peg$c332; + peg$currPos += 3; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c333); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 3) === peg$c334) { + s0 = peg$c334; + peg$currPos += 3; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c335); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 4) === peg$c336) { + s0 = peg$c336; + peg$currPos += 4; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c337); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c338) { + s0 = peg$c338; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c339); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c340) { + s0 = peg$c340; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c341); } + } + if (s0 === peg$FAILED) { + if (input.substr(peg$currPos, 2) === peg$c342) { + s0 = peg$c342; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c343); } + } + } + } + } + } + } + } + } + } + } + } + + return s0; + } + + function peg$parseExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseAssignmentExpression(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseAssignmentExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseAssignmentExpression(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c344(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseExpressionNoIn() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseAssignmentExpressionNoIn(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseAssignmentExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseAssignmentExpressionNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c344(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseStatement() { + var s0; + + s0 = peg$parseBlock(); + if (s0 === peg$FAILED) { + s0 = peg$parseVariableStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseEmptyStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseExpressionStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseIfStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseIterationStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseContinueStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseBreakStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseReturnStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseWithStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseLabelledStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseSwitchStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseThrowStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseTryStatement(); + if (s0 === peg$FAILED) { + s0 = peg$parseDebuggerStatement(); + } + } + } + } + } + } + } + } + } + } + } + } + } + } + + return s0; + } + + function peg$parseBlock() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 123) { + s1 = peg$c245; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c246); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parseStatementList(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 === peg$FAILED) { + s3 = null; + } + if (s3 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s4 = peg$c228; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c229); } + } + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c345(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseStatementList() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + s1 = peg$parseStatement(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseStatement(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseStatement(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c346(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseVariableStatement() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parseVarToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseVariableDeclarationList(); + if (s3 !== peg$FAILED) { + s4 = peg$parseEOS(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c347(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseVariableDeclarationList() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseVariableDeclaration(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseVariableDeclaration(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseVariableDeclaration(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c249(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseVariableDeclarationListNoIn() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseVariableDeclarationNoIn(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseVariableDeclarationNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseVariableDeclarationNoIn(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c249(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseVariableDeclaration() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parseIdentifier(); + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = peg$parse__(); + if (s3 !== peg$FAILED) { + s4 = peg$parseInitialiser(); + if (s4 !== peg$FAILED) { + s3 = [s3, s4]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 === peg$FAILED) { + s2 = null; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c348(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseVariableDeclarationNoIn() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parseIdentifier(); + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = peg$parse__(); + if (s3 !== peg$FAILED) { + s4 = peg$parseInitialiserNoIn(); + if (s4 !== peg$FAILED) { + s3 = [s3, s4]; + s2 = s3; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 === peg$FAILED) { + s2 = null; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c348(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseInitialiser() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 61) { + s1 = peg$c273; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 61) { + s3 = peg$c273; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parse__(); + if (s3 !== peg$FAILED) { + s4 = peg$parseAssignmentExpression(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c235(s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseInitialiserNoIn() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 61) { + s1 = peg$c273; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 61) { + s3 = peg$c273; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s3 = peg$parse__(); + if (s3 !== peg$FAILED) { + s4 = peg$parseAssignmentExpressionNoIn(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c235(s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseEmptyStatement() { + var s0, s1; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 59) { + s1 = peg$c226; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c227); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c349(); + } + s0 = s1; + + return s0; + } + + function peg$parseExpressionStatement() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$currPos; + peg$silentFails++; + if (input.charCodeAt(peg$currPos) === 123) { + s2 = peg$c245; + peg$currPos++; + } else { + s2 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c246); } + } + if (s2 === peg$FAILED) { + s2 = peg$parseFunctionToken(); + } + peg$silentFails--; + if (s2 === peg$FAILED) { + s1 = void 0; + } else { + peg$currPos = s1; + s1 = peg$FAILED; + } + if (s1 !== peg$FAILED) { + s2 = peg$parseExpression(); + if (s2 !== peg$FAILED) { + s3 = peg$parseEOS(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c350(s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseIfStatement() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13; + + s0 = peg$currPos; + s1 = peg$parseIfToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s3 = peg$c231; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseExpression(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s7 = peg$c233; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + s9 = peg$parseStatement(); + if (s9 !== peg$FAILED) { + s10 = peg$parse__(); + if (s10 !== peg$FAILED) { + s11 = peg$parseElseToken(); + if (s11 !== peg$FAILED) { + s12 = peg$parse__(); + if (s12 !== peg$FAILED) { + s13 = peg$parseStatement(); + if (s13 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c351(s5, s9, s13); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseIfToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s3 = peg$c231; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseExpression(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s7 = peg$c233; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + s9 = peg$parseStatement(); + if (s9 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c352(s5, s9); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + return s0; + } + + function peg$parseIterationStatement() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17; + + s0 = peg$currPos; + s1 = peg$parseDoToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseStatement(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseWhileToken(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s7 = peg$c231; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + s9 = peg$parseExpression(); + if (s9 !== peg$FAILED) { + s10 = peg$parse__(); + if (s10 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s11 = peg$c233; + peg$currPos++; + } else { + s11 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s11 !== peg$FAILED) { + s12 = peg$parseEOS(); + if (s12 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c353(s3, s9); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseWhileToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s3 = peg$c231; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseExpression(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s7 = peg$c233; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + s9 = peg$parseStatement(); + if (s9 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c354(s5, s9); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseForToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s3 = peg$c231; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$currPos; + s6 = peg$parseExpressionNoIn(); + if (s6 !== peg$FAILED) { + s7 = peg$parse__(); + if (s7 !== peg$FAILED) { + s6 = [s6, s7]; + s5 = s6; + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + } else { + peg$currPos = s5; + s5 = peg$FAILED; + } + if (s5 === peg$FAILED) { + s5 = null; + } + if (s5 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 59) { + s6 = peg$c226; + peg$currPos++; + } else { + s6 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c227); } + } + if (s6 !== peg$FAILED) { + s7 = peg$parse__(); + if (s7 !== peg$FAILED) { + s8 = peg$currPos; + s9 = peg$parseExpression(); + if (s9 !== peg$FAILED) { + s10 = peg$parse__(); + if (s10 !== peg$FAILED) { + s9 = [s9, s10]; + s8 = s9; + } else { + peg$currPos = s8; + s8 = peg$FAILED; + } + } else { + peg$currPos = s8; + s8 = peg$FAILED; + } + if (s8 === peg$FAILED) { + s8 = null; + } + if (s8 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 59) { + s9 = peg$c226; + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c227); } + } + if (s9 !== peg$FAILED) { + s10 = peg$parse__(); + if (s10 !== peg$FAILED) { + s11 = peg$currPos; + s12 = peg$parseExpression(); + if (s12 !== peg$FAILED) { + s13 = peg$parse__(); + if (s13 !== peg$FAILED) { + s12 = [s12, s13]; + s11 = s12; + } else { + peg$currPos = s11; + s11 = peg$FAILED; + } + } else { + peg$currPos = s11; + s11 = peg$FAILED; + } + if (s11 === peg$FAILED) { + s11 = null; + } + if (s11 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s12 = peg$c233; + peg$currPos++; + } else { + s12 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s12 !== peg$FAILED) { + s13 = peg$parse__(); + if (s13 !== peg$FAILED) { + s14 = peg$parseStatement(); + if (s14 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c355(s5, s8, s11, s14); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseForToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s3 = peg$c231; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseVarToken(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseVariableDeclarationListNoIn(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 59) { + s9 = peg$c226; + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c227); } + } + if (s9 !== peg$FAILED) { + s10 = peg$parse__(); + if (s10 !== peg$FAILED) { + s11 = peg$currPos; + s12 = peg$parseExpression(); + if (s12 !== peg$FAILED) { + s13 = peg$parse__(); + if (s13 !== peg$FAILED) { + s12 = [s12, s13]; + s11 = s12; + } else { + peg$currPos = s11; + s11 = peg$FAILED; + } + } else { + peg$currPos = s11; + s11 = peg$FAILED; + } + if (s11 === peg$FAILED) { + s11 = null; + } + if (s11 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 59) { + s12 = peg$c226; + peg$currPos++; + } else { + s12 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c227); } + } + if (s12 !== peg$FAILED) { + s13 = peg$parse__(); + if (s13 !== peg$FAILED) { + s14 = peg$currPos; + s15 = peg$parseExpression(); + if (s15 !== peg$FAILED) { + s16 = peg$parse__(); + if (s16 !== peg$FAILED) { + s15 = [s15, s16]; + s14 = s15; + } else { + peg$currPos = s14; + s14 = peg$FAILED; + } + } else { + peg$currPos = s14; + s14 = peg$FAILED; + } + if (s14 === peg$FAILED) { + s14 = null; + } + if (s14 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s15 = peg$c233; + peg$currPos++; + } else { + s15 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s15 !== peg$FAILED) { + s16 = peg$parse__(); + if (s16 !== peg$FAILED) { + s17 = peg$parseStatement(); + if (s17 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c356(s7, s11, s14, s17); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseForToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s3 = peg$c231; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseMemberExpression(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseInToken(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + s9 = peg$parseExpression(); + if (s9 !== peg$FAILED) { + s10 = peg$parse__(); + if (s10 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s11 = peg$c233; + peg$currPos++; + } else { + s11 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s11 !== peg$FAILED) { + s12 = peg$parse__(); + if (s12 !== peg$FAILED) { + s13 = peg$parseStatement(); + if (s13 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c357(s5, s9, s13); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseForToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s3 = peg$c231; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseVarToken(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseVariableDeclarationListNoIn(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + s9 = peg$parseInToken(); + if (s9 !== peg$FAILED) { + s10 = peg$parse__(); + if (s10 !== peg$FAILED) { + s11 = peg$parseExpression(); + if (s11 !== peg$FAILED) { + s12 = peg$parse__(); + if (s12 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s13 = peg$c233; + peg$currPos++; + } else { + s13 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s13 !== peg$FAILED) { + s14 = peg$parse__(); + if (s14 !== peg$FAILED) { + s15 = peg$parseStatement(); + if (s15 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c358(s7, s11, s15); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + } + } + } + + return s0; + } + + function peg$parseContinueStatement() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parseContinueToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parseEOS(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c359(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseContinueToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parseIdentifier(); + if (s3 !== peg$FAILED) { + s4 = peg$parseEOS(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c360(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + return s0; + } + + function peg$parseBreakStatement() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parseBreakToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parseEOS(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c361(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseBreakToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parseIdentifier(); + if (s3 !== peg$FAILED) { + s4 = peg$parseEOS(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c362(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + return s0; + } + + function peg$parseReturnStatement() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parseReturnToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parseEOS(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c363(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseReturnToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parseExpression(); + if (s3 !== peg$FAILED) { + s4 = peg$parseEOS(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c364(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + return s0; + } + + function peg$parseWithStatement() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + s0 = peg$currPos; + s1 = peg$parseWithToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s3 = peg$c231; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseExpression(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s7 = peg$c233; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + s9 = peg$parseStatement(); + if (s9 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c365(s5, s9); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSwitchStatement() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + s0 = peg$currPos; + s1 = peg$parseSwitchToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s3 = peg$c231; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseExpression(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s7 = peg$c233; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + s9 = peg$parseCaseBlock(); + if (s9 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c366(s5, s9); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseCaseBlock() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8; + + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 123) { + s1 = peg$c245; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c246); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parseCaseClauses(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 === peg$FAILED) { + s3 = null; + } + if (s3 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s4 = peg$c228; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c229); } + } + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c367(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 123) { + s1 = peg$c245; + peg$currPos++; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c246); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parseCaseClauses(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 === peg$FAILED) { + s3 = null; + } + if (s3 !== peg$FAILED) { + s4 = peg$parseDefaultClause(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s6 = peg$currPos; + s7 = peg$parseCaseClauses(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + s7 = [s7, s8]; + s6 = s7; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + if (s6 === peg$FAILED) { + s6 = null; + } + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s7 = peg$c228; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c229); } + } + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c368(s3, s4, s6); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + + return s0; + } + + function peg$parseCaseClauses() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + s1 = peg$parseCaseClause(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseCaseClause(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseCaseClause(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c346(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseCaseClause() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8; + + s0 = peg$currPos; + s1 = peg$parseCaseToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseExpression(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 58) { + s5 = peg$c250; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c251); } + } + if (s5 !== peg$FAILED) { + s6 = peg$currPos; + s7 = peg$parse__(); + if (s7 !== peg$FAILED) { + s8 = peg$parseStatementList(); + if (s8 !== peg$FAILED) { + s7 = [s7, s8]; + s6 = s7; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + if (s6 === peg$FAILED) { + s6 = null; + } + if (s6 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c369(s3, s6); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseDefaultClause() { + var s0, s1, s2, s3, s4, s5, s6; + + s0 = peg$currPos; + s1 = peg$parseDefaultToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 58) { + s3 = peg$c250; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c251); } + } + if (s3 !== peg$FAILED) { + s4 = peg$currPos; + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s6 = peg$parseStatementList(); + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + if (s4 === peg$FAILED) { + s4 = null; + } + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c370(s4); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLabelledStatement() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + s1 = peg$parseIdentifier(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 58) { + s3 = peg$c250; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c251); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseStatement(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c371(s1, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseThrowStatement() { + var s0, s1, s2, s3, s4; + + s0 = peg$currPos; + s1 = peg$parseThrowToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse_(); + if (s2 !== peg$FAILED) { + s3 = peg$parseExpression(); + if (s3 !== peg$FAILED) { + s4 = peg$parseEOS(); + if (s4 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c372(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseTryStatement() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseTryToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseBlock(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseCatch(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseFinally(); + if (s7 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c373(s3, s5, s7); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseTryToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseBlock(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseCatch(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c374(s3, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = peg$parseTryToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseBlock(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseFinally(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c375(s3, s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } + } + + return s0; + } + + function peg$parseCatch() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9; + + s0 = peg$currPos; + s1 = peg$parseCatchToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s3 = peg$c231; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseIdentifier(); + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s7 = peg$c233; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + s9 = peg$parseBlock(); + if (s9 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c376(s5, s9); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseFinally() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = peg$parseFinallyToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseBlock(); + if (s3 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c377(s3); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseDebuggerStatement() { + var s0, s1, s2; + + s0 = peg$currPos; + s1 = peg$parseDebuggerToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parseEOS(); + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c378(); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseFunctionDeclaration() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14; + + s0 = peg$currPos; + s1 = peg$parseFunctionToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$parseIdentifier(); + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s5 = peg$c231; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$currPos; + s8 = peg$parseFormalParameterList(); + if (s8 !== peg$FAILED) { + s9 = peg$parse__(); + if (s9 !== peg$FAILED) { + s8 = [s8, s9]; + s7 = s8; + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + } else { + peg$currPos = s7; + s7 = peg$FAILED; + } + if (s7 === peg$FAILED) { + s7 = null; + } + if (s7 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s8 = peg$c233; + peg$currPos++; + } else { + s8 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s8 !== peg$FAILED) { + s9 = peg$parse__(); + if (s9 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 123) { + s10 = peg$c245; + peg$currPos++; + } else { + s10 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c246); } + } + if (s10 !== peg$FAILED) { + s11 = peg$parse__(); + if (s11 !== peg$FAILED) { + s12 = peg$parseFunctionBody(); + if (s12 !== peg$FAILED) { + s13 = peg$parse__(); + if (s13 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s14 = peg$c228; + peg$currPos++; + } else { + s14 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c229); } + } + if (s14 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c379(s3, s7, s12); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseFunctionExpression() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13; + + s0 = peg$currPos; + s1 = peg$parseFunctionToken(); + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + s3 = peg$currPos; + s4 = peg$parseIdentifier(); + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s4 = [s4, s5]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + if (s3 === peg$FAILED) { + s3 = null; + } + if (s3 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 40) { + s4 = peg$c231; + peg$currPos++; + } else { + s4 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } + } + if (s4 !== peg$FAILED) { + s5 = peg$parse__(); + if (s5 !== peg$FAILED) { + s6 = peg$currPos; + s7 = peg$parseFormalParameterList(); + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + s7 = [s7, s8]; + s6 = s7; + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + } else { + peg$currPos = s6; + s6 = peg$FAILED; + } + if (s6 === peg$FAILED) { + s6 = null; + } + if (s6 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 41) { + s7 = peg$c233; + peg$currPos++; + } else { + s7 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c234); } + } + if (s7 !== peg$FAILED) { + s8 = peg$parse__(); + if (s8 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 123) { + s9 = peg$c245; + peg$currPos++; + } else { + s9 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c246); } + } + if (s9 !== peg$FAILED) { + s10 = peg$parse__(); + if (s10 !== peg$FAILED) { + s11 = peg$parseFunctionBody(); + if (s11 !== peg$FAILED) { + s12 = peg$parse__(); + if (s12 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 125) { + s13 = peg$c228; + peg$currPos++; + } else { + s13 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c229); } + } + if (s13 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c380(s3, s6, s11); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseFormalParameterList() { + var s0, s1, s2, s3, s4, s5, s6, s7; + + s0 = peg$currPos; + s1 = peg$parseIdentifier(); + if (s1 !== peg$FAILED) { + s2 = []; + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseIdentifier(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + while (s3 !== peg$FAILED) { + s2.push(s3); + s3 = peg$currPos; + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 44) { + s5 = peg$c238; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c239); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parse__(); + if (s6 !== peg$FAILED) { + s7 = peg$parseIdentifier(); + if (s7 !== peg$FAILED) { + s4 = [s4, s5, s6, s7]; + s3 = s4; + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } else { + peg$currPos = s3; + s3 = peg$FAILED; + } + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c249(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseFunctionBody() { + var s0, s1; + + s0 = peg$currPos; + s1 = peg$parseStatementList(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c381(s1); + } + s0 = s1; + + return s0; + } + + function peg$parseValidator() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 9) === peg$c382) { + s1 = peg$c382; + peg$currPos += 9; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c383); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 61) { + s3 = peg$c273; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } + } + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseStringLiteral(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c384(s5); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { peg$currPos = s0; s0 = peg$FAILED; } } else { - peg$currPos = s0; - s0 = peg$FAILED; + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseOptional() { + var s0, s1; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 8) === peg$c385) { + s1 = peg$c385; + peg$currPos += 8; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c386); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c387(); + } + s0 = s1; + + return s0; + } + + function peg$parseDefault() { + var s0, s1, s2, s3, s4, s5; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 7) === peg$c160) { + s1 = peg$c160; + peg$currPos += 7; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c161); } + } + if (s1 !== peg$FAILED) { + s2 = peg$parse__(); + if (s2 !== peg$FAILED) { + if (input.charCodeAt(peg$currPos) === 61) { + s3 = peg$c273; + peg$currPos++; + } else { + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } } - if (s0 === peg$FAILED) { - s0 = peg$currPos; - s1 = peg$parse__(); - if (s1 !== peg$FAILED) { - s2 = peg$parseEOF(); - if (s2 !== peg$FAILED) { - s1 = [s1, s2]; + if (s3 !== peg$FAILED) { + s4 = peg$parse__(); + if (s4 !== peg$FAILED) { + s5 = peg$parseStringLiteral(); + if (s5 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c388(s5); s0 = s1; } else { peg$currPos = s0; @@ -3641,28 +12785,566 @@ module.exports = (function() { peg$currPos = s0; s0 = peg$FAILED; } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseQualifiedName() { + var s0, s1, s2, s3, s4, s5, s6; + + s0 = peg$currPos; + s1 = peg$currPos; + s2 = peg$parseIdentifier(); + if (s2 !== peg$FAILED) { + s1 = input.substring(s1, peg$currPos); + } else { + s1 = s2; + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + s3 = []; + s4 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 46) { + s5 = peg$c54; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c55); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parseIdentifier(); + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + while (s4 !== peg$FAILED) { + s3.push(s4); + s4 = peg$currPos; + if (input.charCodeAt(peg$currPos) === 46) { + s5 = peg$c54; + peg$currPos++; + } else { + s5 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c55); } + } + if (s5 !== peg$FAILED) { + s6 = peg$parseIdentifier(); + if (s6 !== peg$FAILED) { + s5 = [s5, s6]; + s4 = s5; + } else { + peg$currPos = s4; + s4 = peg$FAILED; + } + } else { + peg$currPos = s4; + s4 = peg$FAILED; } } + if (s3 !== peg$FAILED) { + s2 = input.substring(s2, peg$currPos); + } else { + s2 = s3; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c389(s1, s2); + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseQueryToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c390) { + s1 = peg$c390; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c391); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSelectToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 6) === peg$c392) { + s1 = peg$c392; + peg$currPos += 6; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c393); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseFromToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c394) { + s1 = peg$c394; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c395); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseWhereToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c396) { + s1 = peg$c396; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c397); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseOrToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 2) === peg$c315) { + s1 = peg$c315; + peg$currPos += 2; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c316); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseAndToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c313) { + s1 = peg$c313; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c314); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseOrderByToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 8) === peg$c398) { + s1 = peg$c398; + peg$currPos += 8; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c399); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseSkipToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c400) { + s1 = peg$c400; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c401); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseLimitToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 5) === peg$c402) { + s1 = peg$c402; + peg$currPos += 5; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c403); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseAscToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 3) === peg$c404) { + s1 = peg$c404; + peg$currPos += 3; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c405); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseDescToken() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + if (input.substr(peg$currPos, 4) === peg$c406) { + s1 = peg$c406; + peg$currPos += 4; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c407); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseIdentifierPart(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parseNotEqualToken() { + var s0; + + if (input.substr(peg$currPos, 2) === peg$c301) { + s0 = peg$c301; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c302); } + } + + return s0; + } + + function peg$parseEqualToken() { + var s0; + + if (input.charCodeAt(peg$currPos) === 61) { + s0 = peg$c273; + peg$currPos++; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c274); } } return s0; } - function peg$parseEOF() { - var s0, s1; + function peg$parseLTToken() { + var s0, s1, s2, s3; s0 = peg$currPos; - peg$silentFails++; - if (input.length > peg$currPos) { - s1 = input.charAt(peg$currPos); + if (input.charCodeAt(peg$currPos) === 60) { + s1 = peg$c295; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c1); } + if (peg$silentFails === 0) { peg$fail(peg$c296); } } - peg$silentFails--; - if (s1 === peg$FAILED) { - s0 = void 0; + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parseEqualToken(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; + } else { + peg$currPos = s2; + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + s1 = [s1, s2]; + s0 = s1; + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3671,73 +13353,44 @@ module.exports = (function() { return s0; } - function peg$parseQualifiedName() { - var s0, s1, s2, s3, s4, s5, s6; + function peg$parseLTEToken() { + var s0; + + if (input.substr(peg$currPos, 2) === peg$c291) { + s0 = peg$c291; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c292); } + } + + return s0; + } + + function peg$parseGTToken() { + var s0, s1, s2, s3; s0 = peg$currPos; - s1 = peg$currPos; - s2 = peg$parseIdentifier(); - if (s2 !== peg$FAILED) { - s1 = input.substring(s1, peg$currPos); + if (input.charCodeAt(peg$currPos) === 62) { + s1 = peg$c297; + peg$currPos++; } else { - s1 = s2; + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c298); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; - s3 = []; - s4 = peg$currPos; - if (input.charCodeAt(peg$currPos) === 46) { - s5 = peg$c54; - peg$currPos++; - } else { - s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c55); } - } - if (s5 !== peg$FAILED) { - s6 = peg$parseIdentifier(); - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - while (s4 !== peg$FAILED) { - s3.push(s4); - s4 = peg$currPos; - if (input.charCodeAt(peg$currPos) === 46) { - s5 = peg$c54; - peg$currPos++; - } else { - s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c55); } - } - if (s5 !== peg$FAILED) { - s6 = peg$parseIdentifier(); - if (s6 !== peg$FAILED) { - s5 = [s5, s6]; - s4 = s5; - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } else { - peg$currPos = s4; - s4 = peg$FAILED; - } - } - if (s3 !== peg$FAILED) { - s2 = input.substring(s2, peg$currPos); + peg$silentFails++; + s3 = peg$parseEqualToken(); + peg$silentFails--; + if (s3 === peg$FAILED) { + s2 = void 0; } else { - s2 = s3; + peg$currPos = s2; + s2 = peg$FAILED; } if (s2 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c186(s1, s2); + s1 = [s1, s2]; s0 = s1; } else { peg$currPos = s0; @@ -3751,6 +13404,20 @@ module.exports = (function() { return s0; } + function peg$parseGTEToken() { + var s0; + + if (input.substr(peg$currPos, 2) === peg$c293) { + s0 = peg$c293; + peg$currPos += 2; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c294); } + } + + return s0; + } + function peg$parseProgram() { var s0, s1, s2; @@ -3767,7 +13434,7 @@ module.exports = (function() { } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c187(s1); + s1 = peg$c408(s1); } s0 = s1; @@ -3778,12 +13445,12 @@ module.exports = (function() { var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14, s15, s16, s17, s18; s0 = peg$currPos; - if (input.substr(peg$currPos, 5) === peg$c140) { - s1 = peg$c140; + if (input.substr(peg$currPos, 5) === peg$c390) { + s1 = peg$c390; peg$currPos += 5; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c141); } + if (peg$silentFails === 0) { peg$fail(peg$c391); } } if (s1 !== peg$FAILED) { s2 = peg$parse_(); @@ -3793,21 +13460,21 @@ module.exports = (function() { s4 = peg$parse__(); if (s4 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 123) { - s5 = peg$c188; + s5 = peg$c245; peg$currPos++; } else { s5 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c189); } + if (peg$silentFails === 0) { peg$fail(peg$c246); } } if (s5 !== peg$FAILED) { s6 = peg$parse__(); if (s6 !== peg$FAILED) { - if (input.substr(peg$currPos, 12) === peg$c190) { - s7 = peg$c190; + if (input.substr(peg$currPos, 12) === peg$c409) { + s7 = peg$c409; peg$currPos += 12; } else { s7 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c191); } + if (peg$silentFails === 0) { peg$fail(peg$c410); } } if (s7 !== peg$FAILED) { s8 = peg$parse__(); @@ -3832,12 +13499,12 @@ module.exports = (function() { if (s11 !== peg$FAILED) { s12 = peg$parse__(); if (s12 !== peg$FAILED) { - if (input.substr(peg$currPos, 10) === peg$c192) { - s13 = peg$c192; + if (input.substr(peg$currPos, 10) === peg$c411) { + s13 = peg$c411; peg$currPos += 10; } else { s13 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c193); } + if (peg$silentFails === 0) { peg$fail(peg$c412); } } if (s13 !== peg$FAILED) { s14 = peg$parse__(); @@ -3847,17 +13514,17 @@ module.exports = (function() { s16 = peg$parse__(); if (s16 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 125) { - s17 = peg$c184; + s17 = peg$c228; peg$currPos++; } else { s17 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c185); } + if (peg$silentFails === 0) { peg$fail(peg$c229); } } if (s17 !== peg$FAILED) { s18 = peg$parse__(); if (s18 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c194(s3, s10, s15); + s1 = peg$c413(s3, s10, s15); s0 = s1; } else { peg$currPos = s0; @@ -3968,7 +13635,7 @@ module.exports = (function() { if (s8 !== peg$FAILED) { s9 = peg$parse__(); if (s9 !== peg$FAILED) { - s10 = peg$parseWhereExpr(); + s10 = peg$parsePredicate(); if (s10 === peg$FAILED) { s10 = null; } @@ -3995,7 +13662,7 @@ module.exports = (function() { } if (s16 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c195(s4, s6, s8, s10, s12, s14, s16); + s1 = peg$c414(s4, s6, s8, s10, s12, s14, s16); s0 = s1; } else { peg$currPos = s0; @@ -4079,7 +13746,7 @@ module.exports = (function() { if (s4 !== peg$FAILED) { s5 = peg$parse__(); if (s5 !== peg$FAILED) { - s6 = peg$parseWhereExpr(); + s6 = peg$parsePredicate(); if (s6 === peg$FAILED) { s6 = null; } @@ -4106,7 +13773,7 @@ module.exports = (function() { } if (s12 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c196(s4, s6, s8, s10, s12); + s1 = peg$c415(s4, s6, s8, s10, s12); s0 = s1; } else { peg$currPos = s0; @@ -4182,7 +13849,7 @@ module.exports = (function() { s3 = peg$parsePlaceholder(); if (s3 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c197(s3); + s1 = peg$c416(s3); s0 = s1; } else { peg$currPos = s0; @@ -4217,7 +13884,7 @@ module.exports = (function() { } if (s3 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c197(s3); + s1 = peg$c416(s3); s0 = s1; } else { peg$currPos = s0; @@ -4257,7 +13924,7 @@ module.exports = (function() { s3 = peg$parsePlaceholder(); if (s3 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c198(s3); + s1 = peg$c417(s3); s0 = s1; } else { peg$currPos = s0; @@ -4292,7 +13959,7 @@ module.exports = (function() { } if (s3 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c198(s3); + s1 = peg$c417(s3); s0 = s1; } else { peg$currPos = s0; @@ -4317,7 +13984,7 @@ module.exports = (function() { s1 = peg$parseAscToken(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c199(); + s1 = peg$c418(); } s0 = s1; if (s0 === peg$FAILED) { @@ -4325,7 +13992,7 @@ module.exports = (function() { s1 = peg$parseDescToken(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c200(); + s1 = peg$c419(); } s0 = s1; } @@ -4342,7 +14009,7 @@ module.exports = (function() { s2 = peg$parseSort(); if (s2 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c201(s2); + s1 = peg$c420(s2); s0 = s1; } else { peg$currPos = s0; @@ -4403,7 +14070,7 @@ module.exports = (function() { } if (s7 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c202(s4, s6); + s1 = peg$c421(s4, s6); s0 = s1; } else { peg$currPos = s0; @@ -4442,17 +14109,17 @@ module.exports = (function() { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 44) { - s1 = peg$c203; + s1 = peg$c238; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c204); } + if (peg$silentFails === 0) { peg$fail(peg$c239); } } if (s1 !== peg$FAILED) { s2 = peg$parseSortSingleField(); if (s2 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c205(s2); + s1 = peg$c422(s2); s0 = s1; } else { peg$currPos = s0; @@ -4482,7 +14149,7 @@ module.exports = (function() { } if (s4 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c206(s2, s4); + s1 = peg$c423(s2, s4); s0 = s1; } else { peg$currPos = s0; @@ -4504,85 +14171,40 @@ module.exports = (function() { return s0; } - function peg$parseWhereExpr() { - var s0, s1, s2, s3, s4; + function peg$parsePredicate() { + var s0, s1, s2, s3, s4, s5, s6, s7, s8; - peg$silentFails++; s0 = peg$currPos; s1 = peg$parseWhereToken(); if (s1 !== peg$FAILED) { - s2 = peg$parseLogicExpr(); + s2 = peg$parse__(); if (s2 !== peg$FAILED) { - s3 = []; - s4 = peg$parseLogicExprRest(); - while (s4 !== peg$FAILED) { - s3.push(s4); - s4 = peg$parseLogicExprRest(); - } - if (s3 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c208(s2, s3); - s0 = s1; + if (input.charCodeAt(peg$currPos) === 40) { + s3 = peg$c231; + peg$currPos++; } else { - peg$currPos = s0; - s0 = peg$FAILED; + s3 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$c232); } } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - peg$silentFails--; - if (s0 === peg$FAILED) { - s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c207); } - } - - return s0; - } - - function peg$parseLogicExpr() { - var s0, s1, s2, s3, s4, s5, s6, s7, s8; - - s0 = peg$currPos; - s1 = peg$parse_(); - if (s1 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 40) { - s2 = peg$c209; - peg$currPos++; - } else { - s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c210); } - } - if (s2 !== peg$FAILED) { - s3 = peg$parse_(); if (s3 !== peg$FAILED) { - s4 = peg$parseLogicExpr(); + s4 = peg$parse__(); if (s4 !== peg$FAILED) { - s5 = []; - s6 = peg$parseLogicExprRest(); - while (s6 !== peg$FAILED) { - s5.push(s6); - s6 = peg$parseLogicExprRest(); - } + s5 = peg$parseExpression(); if (s5 !== peg$FAILED) { - s6 = peg$parse_(); + s6 = peg$parse__(); if (s6 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 41) { - s7 = peg$c211; + s7 = peg$c233; peg$currPos++; } else { s7 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c212); } + if (peg$silentFails === 0) { peg$fail(peg$c234); } } if (s7 !== peg$FAILED) { - s8 = peg$parse_(); + s8 = peg$parse__(); if (s8 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c213(s4, s5); + s1 = peg$c424(s5); s0 = s1; } else { peg$currPos = s0; @@ -4616,99 +14238,28 @@ module.exports = (function() { peg$currPos = s0; s0 = peg$FAILED; } - if (s0 === peg$FAILED) { - s0 = peg$currPos; - s1 = peg$parse_(); - if (s1 !== peg$FAILED) { - s2 = peg$parseExpr(); - if (s2 !== peg$FAILED) { - s3 = peg$parse_(); - if (s3 !== peg$FAILED) { - s4 = peg$parseOperator(); - if (s4 !== peg$FAILED) { - s5 = peg$parse_(); - if (s5 !== peg$FAILED) { - s6 = peg$parseExpr(); - if (s6 !== peg$FAILED) { - s7 = peg$parse_(); - if (s7 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c214(s2, s4, s6); - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } return s0; } - function peg$parseLogicExprRest() { - var s0, s1, s2, s3, s4; + function peg$parseJoiner() { + var s0, s1; s0 = peg$currPos; - s1 = peg$parse_(); + s1 = peg$parseOrToken(); if (s1 !== peg$FAILED) { - s2 = peg$parseJoiner(); - if (s2 !== peg$FAILED) { - s3 = peg$parse_(); - if (s3 !== peg$FAILED) { - s4 = peg$parseLogicExpr(); - if (s4 !== peg$FAILED) { - peg$savedPos = s0; - s1 = peg$c215(s2, s4); - s0 = s1; - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; - } - } else { - peg$currPos = s0; - s0 = peg$FAILED; + peg$savedPos = s0; + s1 = peg$c425(); } - - return s0; - } - - function peg$parseJoiner() { - var s0; - - s0 = peg$parseOrToken(); + s0 = s1; if (s0 === peg$FAILED) { - s0 = peg$parseAndToken(); + s0 = peg$currPos; + s1 = peg$parseAndToken(); + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$c426(); + } + s0 = s1; } return s0; @@ -4721,7 +14272,7 @@ module.exports = (function() { s1 = peg$parseNotEqualToken(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c216(); + s1 = peg$c427(); } s0 = s1; if (s0 === peg$FAILED) { @@ -4729,7 +14280,7 @@ module.exports = (function() { s1 = peg$parseEqualToken(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c217(); + s1 = peg$c428(); } s0 = s1; if (s0 === peg$FAILED) { @@ -4737,7 +14288,7 @@ module.exports = (function() { s1 = peg$parseLTToken(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c218(); + s1 = peg$c429(); } s0 = s1; if (s0 === peg$FAILED) { @@ -4745,7 +14296,7 @@ module.exports = (function() { s1 = peg$parseLTEToken(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c219(); + s1 = peg$c430(); } s0 = s1; if (s0 === peg$FAILED) { @@ -4753,7 +14304,7 @@ module.exports = (function() { s1 = peg$parseGTToken(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c220(); + s1 = peg$c431(); } s0 = s1; if (s0 === peg$FAILED) { @@ -4761,7 +14312,7 @@ module.exports = (function() { s1 = peg$parseGTEToken(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c221(); + s1 = peg$c432(); } s0 = s1; } @@ -4779,18 +14330,18 @@ module.exports = (function() { s0 = peg$currPos; s1 = peg$parse_(); if (s1 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 64) { - s2 = peg$c222; + if (input.charCodeAt(peg$currPos) === 36) { + s2 = peg$c38; peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c223); } + if (peg$silentFails === 0) { peg$fail(peg$c39); } } if (s2 !== peg$FAILED) { s3 = peg$parseIdentifier(); if (s3 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c224(s3); + s1 = peg$c433(s3); s0 = s1; } else { peg$currPos = s0; @@ -4835,7 +14386,7 @@ module.exports = (function() { } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c225(s1); + s1 = peg$c434(s1); } s0 = s1; peg$silentFails--; diff --git a/packages/composer-common/lib/query/parser.pegjs b/packages/composer-common/lib/query/parser.pegjs index 0bb7948eba..63b11351c2 100644 --- a/packages/composer-common/lib/query/parser.pegjs +++ b/packages/composer-common/lib/query/parser.pegjs @@ -167,11 +167,41 @@ ReservedWord / BooleanLiteral Keyword - = SelectToken - / WhereToken + = BreakToken + / CaseToken + / CatchToken + / ContinueToken + / DebuggerToken + / DefaultToken + / DeleteToken + / DoToken + / ElseToken + / FinallyToken + / ForToken + / FunctionToken + / IfToken + / InstanceofToken + / InToken + / NewToken + / ReturnToken + / SwitchToken + / ThisToken + / ThrowToken + / TryToken + / TypeofToken + / VarToken + / VoidToken + / WhileToken + / WithToken FutureReservedWord - = ImportToken + = ClassToken + / ConstToken + / EnumToken + / ExportToken + / ExtendsToken + / ImportToken + / SuperToken Literal = NullLiteral @@ -399,38 +429,50 @@ Pc = [\u005F\u203F-\u2040\u2054\uFE33-\uFE34\uFE4D-\uFE4F\uFF3F] Zs = [\u0020\u00A0\u1680\u2000-\u200A\u202F\u205F\u3000] /* Tokens */ -QueryToken = "query" !IdentifierPart + +BreakToken = "break" !IdentifierPart +CaseToken = "case" !IdentifierPart +CatchToken = "catch" !IdentifierPart +ClassToken = "class" !IdentifierPart +AssetToken = "asset" !IdentifierPart +TransactionToken = "transaction" !IdentifierPart +ParticipantToken = "participant" !IdentifierPart +ConstToken = "const" !IdentifierPart +ContinueToken = "continue" !IdentifierPart +DebuggerToken = "debugger" !IdentifierPart +DefaultToken = "default" !IdentifierPart +DeleteToken = "delete" !IdentifierPart +DoToken = "do" !IdentifierPart +ElseToken = "else" !IdentifierPart +EnumToken = "enum" !IdentifierPart +ExportToken = "export" !IdentifierPart +ExtendsToken = "extends" !IdentifierPart +FalseToken = "false" !IdentifierPart +FinallyToken = "finally" !IdentifierPart +ForToken = "for" !IdentifierPart +FunctionToken = "function" !IdentifierPart +GetToken = "get" !IdentifierPart +IfToken = "if" !IdentifierPart ImportToken = "import" !IdentifierPart +InstanceofToken = "instanceof" !IdentifierPart +InToken = "in" !IdentifierPart +NewToken = "new" !IdentifierPart NullToken = "null" !IdentifierPart +ReturnToken = "return" !IdentifierPart +SetToken = "set" !IdentifierPart +SuperToken = "super" !IdentifierPart +SwitchToken = "switch" !IdentifierPart +ThisToken = "this" !IdentifierPart +ThrowToken = "throw" !IdentifierPart TrueToken = "true" !IdentifierPart -FalseToken = "false" !IdentifierPart - -SelectToken = "SELECT" !IdentifierPart -FromToken = "FROM" !IdentifierPart -WhereToken = "WHERE" !IdentifierPart -OrToken = "OR" !IdentifierPart -AndToken = "AND" !IdentifierPart - -OrderByToken = "ORDER BY" !IdentifierPart -SkipToken = "SKIP" !IdentifierPart -LimitToken = "LIMIT" !IdentifierPart -AscToken = "ASC" !IdentifierPart -DescToken = "DESC" !IdentifierPart - -NotEqualToken = "!=" -EqualToken = "=" -LTToken = "<" !EqualToken -LTEToken = "<=" -GTToken = ">" !EqualToken -GTEToken = ">=" - -// Not yet implemented, but supported by CouchDB -// NotToken = "NOT" !IdentifierPart -// InToken = "IN" !IdentifierPart -// LikeToken = "LIKE" !IdentifierPart -// NotInToken = "NOT IN" !IdentifierPart -// ExistsToken = "EXISTS" !IdentifierPart -// SizeToken = "SIZE" !IdentifierPart +TryToken = "try" !IdentifierPart +TypeofToken = "typeof" !IdentifierPart +VarToken = "var" !IdentifierPart +VoidToken = "void" !IdentifierPart +WhileToken = "while" !IdentifierPart +WithToken = "with" !IdentifierPart +NamespaceToken = "namespace" !IdentifierPart +AbstractToken = "abstract" !IdentifierPart /* Skipped */ @@ -451,6 +493,815 @@ EOS EOF = !. +/* ----- A.2 Number Conversions ----- */ + +/* Irrelevant. */ + +/* ----- A.3 Expressions ----- */ + +PrimaryExpression + = ThisToken { return { type: "ThisExpression" }; } + / Identifier + / Literal + / ArrayLiteral + / ObjectLiteral + / "(" __ expression:Expression __ ")" { return expression; } + +ArrayLiteral + = "[" __ elision:(Elision __)? "]" { + return { + type: "ArrayExpression", + elements: optionalList(extractOptional(elision, 0)) + }; + } + / "[" __ elements:ElementList __ "]" { + return { + type: "ArrayExpression", + elements: elements + }; + } + / "[" __ elements:ElementList __ "," __ elision:(Elision __)? "]" { + return { + type: "ArrayExpression", + elements: elements.concat(optionalList(extractOptional(elision, 0))) + }; + } + +ElementList + = first:( + elision:(Elision __)? element:AssignmentExpression { + return optionalList(extractOptional(elision, 0)).concat(element); + } + ) + rest:( + __ "," __ elision:(Elision __)? element:AssignmentExpression { + return optionalList(extractOptional(elision, 0)).concat(element); + } + )* + { return Array.prototype.concat.apply(first, rest); } + +Elision + = "," commas:(__ ",")* { return filledArray(commas.length + 1, null); } + +ObjectLiteral + = "{" __ "}" { return { type: "ObjectExpression", properties: [] }; } + / "{" __ properties:PropertyNameAndValueList __ "}" { + return { type: "ObjectExpression", properties: properties }; + } + / "{" __ properties:PropertyNameAndValueList __ "," __ "}" { + return { type: "ObjectExpression", properties: properties }; + } +PropertyNameAndValueList + = first:PropertyAssignment rest:(__ "," __ PropertyAssignment)* { + return buildList(first, rest, 3); + } + +PropertyAssignment + = key:PropertyName __ ":" __ value:AssignmentExpression { + return { key: key, value: value, kind: "init" }; + } + / GetToken __ key:PropertyName __ + "(" __ ")" __ + "{" __ body:FunctionBody __ "}" + { + return { + key: key, + value: { + type: "FunctionExpression", + id: null, + params: [], + body: body + }, + kind: "get" + }; + } + / SetToken __ key:PropertyName __ + "(" __ params:PropertySetParameterList __ ")" __ + "{" __ body:FunctionBody __ "}" + { + return { + key: key, + value: { + type: "FunctionExpression", + id: null, + params: params, + body: body + }, + kind: "set" + }; + } + +PropertyName + = IdentifierName + / StringLiteral + / NumericLiteral + +PropertySetParameterList + = id:Identifier { return [id]; } + +MemberExpression + = first:( + PrimaryExpression + / FunctionExpression + / NewToken __ callee:MemberExpression __ args:Arguments { + return { type: "NewExpression", callee: callee, arguments: args }; + } + ) + rest:( + __ "[" __ property:Expression __ "]" { + return { property: property, computed: true }; + } + / __ "." __ property:IdentifierName { + return { property: property, computed: false }; + } + )* + { + return buildTree(first, rest, function(result, element) { + return { + type: "MemberExpression", + object: result, + property: element.property, + computed: element.computed + }; + }); + } + +NewExpression + = MemberExpression + / NewToken __ callee:NewExpression { + return { type: "NewExpression", callee: callee, arguments: [] }; + } + +CallExpression + = first:( + callee:MemberExpression __ args:Arguments { + return { type: "CallExpression", callee: callee, arguments: args }; + } + ) + rest:( + __ args:Arguments { + return { type: "CallExpression", arguments: args }; + } + / __ "[" __ property:Expression __ "]" { + return { + type: "MemberExpression", + property: property, + computed: true + }; + } + / __ "." __ property:IdentifierName { + return { + type: "MemberExpression", + property: property, + computed: false + }; + } + )* + { + return buildTree(first, rest, function(result, element) { + element[TYPES_TO_PROPERTY_NAMES[element.type]] = result; + + return element; + }); + } + +Arguments + = "(" __ args:(ArgumentList __)? ")" { + return optionalList(extractOptional(args, 0)); + } + +ArgumentList + = first:AssignmentExpression rest:(__ "," __ AssignmentExpression)* { + return buildList(first, rest, 3); + } + +LeftHandSideExpression + = MemberExpression + +UnaryExpression + = LeftHandSideExpression + / operator:UnaryOperator __ argument:UnaryExpression { + return { + type: "UnaryExpression", + operator: operator, + argument: argument, + prefix: true + }; + } + +UnaryOperator + = "!" + +MultiplicativeExpression + = first:UnaryExpression + rest:(__ MultiplicativeOperator __ UnaryExpression)* + { return buildBinaryExpression(first, rest); } + +MultiplicativeOperator + = $("*" !"=") + / $("/" !"=") + / $("%" !"=") + +AdditiveExpression + = first:MultiplicativeExpression + rest:(__ AdditiveOperator __ MultiplicativeExpression)* + { return buildBinaryExpression(first, rest); } + +AdditiveOperator + = $("+" ![+=]) + / $("-" ![-=]) + +ShiftExpression + = first:UnaryExpression + rest:(__ ShiftOperator __ UnaryExpression)* + { return buildBinaryExpression(first, rest); } + +ShiftOperator + = $("<<" !"=") + / $(">>>" !"=") + / $(">>" !"=") + +RelationalExpression + = first:ShiftExpression + rest:(__ RelationalOperator __ ShiftExpression)* + { return buildBinaryExpression(first, rest); } + +RelationalOperator + = "<=" + / ">=" + / $("<" !"<") + / $(">" !">") + +// / $InToken + +RelationalExpressionNoIn + = first:ShiftExpression + rest:(__ RelationalOperatorNoIn __ ShiftExpression)* + { return buildBinaryExpression(first, rest); } + +RelationalOperatorNoIn + = "<=" + / ">=" + / $("<" !"<") + / $(">" !">") + +EqualityExpression + = first:RelationalExpression + rest:(__ EqualityOperator __ RelationalExpression)* + { return buildBinaryExpression(first, rest); } + +EqualityExpressionNoIn + = first:RelationalExpressionNoIn + rest:(__ EqualityOperator __ RelationalExpressionNoIn)* + { return buildBinaryExpression(first, rest); } + +EqualityOperator + = "==" + / "!=" + +BitwiseANDExpression + = first:EqualityExpression + rest:(__ BitwiseANDOperator __ EqualityExpression)* + { return buildBinaryExpression(first, rest); } + +BitwiseANDExpressionNoIn + = first:EqualityExpressionNoIn + rest:(__ BitwiseANDOperator __ EqualityExpressionNoIn)* + { return buildBinaryExpression(first, rest); } + +BitwiseANDOperator + = $("&" ![&=]) + +BitwiseXORExpression + = first:BitwiseANDExpression + rest:(__ BitwiseXOROperator __ BitwiseANDExpression)* + { return buildBinaryExpression(first, rest); } + +BitwiseXORExpressionNoIn + = first:BitwiseANDExpressionNoIn + rest:(__ BitwiseXOROperator __ BitwiseANDExpressionNoIn)* + { return buildBinaryExpression(first, rest); } + +BitwiseXOROperator + = $("^" !"=") + +BitwiseORExpression + = first:BitwiseXORExpression + rest:(__ BitwiseOROperator __ BitwiseXORExpression)* + { return buildBinaryExpression(first, rest); } + +BitwiseORExpressionNoIn + = first:BitwiseXORExpressionNoIn + rest:(__ BitwiseOROperator __ BitwiseXORExpressionNoIn)* + { return buildBinaryExpression(first, rest); } + +BitwiseOROperator + = $("|" ![|=]) + +LogicalANDExpression + = first:BitwiseORExpression + rest:(__ LogicalANDOperator __ BitwiseORExpression)* + { return buildBinaryExpression(first, rest); } + +LogicalANDExpressionNoIn + = first:BitwiseORExpressionNoIn + rest:(__ LogicalANDOperator __ BitwiseORExpressionNoIn)* + { return buildBinaryExpression(first, rest); } + +LogicalANDOperator + = "AND" + +LogicalORExpression + = first:LogicalANDExpression + rest:(__ LogicalOROperator __ LogicalANDExpression)* + { return buildBinaryExpression(first, rest); } + +LogicalORExpressionNoIn + = first:LogicalANDExpressionNoIn + rest:(__ LogicalOROperator __ LogicalANDExpressionNoIn)* + { return buildBinaryExpression(first, rest); } + +LogicalOROperator + = "OR" + +ConditionalExpression + = test:LogicalORExpression __ + "?" __ consequent:AssignmentExpression __ + ":" __ alternate:AssignmentExpression + { + return { + type: "ConditionalExpression", + test: test, + consequent: consequent, + alternate: alternate + }; + } + / LogicalORExpression + +ConditionalExpressionNoIn + = test:LogicalORExpressionNoIn __ + "?" __ consequent:AssignmentExpression __ + ":" __ alternate:AssignmentExpressionNoIn + { + return { + type: "ConditionalExpression", + test: test, + consequent: consequent, + alternate: alternate + }; + } + / LogicalORExpressionNoIn + +AssignmentExpression + = left:LeftHandSideExpression __ + "=" !"=" __ + right:AssignmentExpression + { + return { + type: "AssignmentExpression", + operator: "=", + left: left, + right: right + }; + } + / left:LeftHandSideExpression __ + operator:AssignmentOperator __ + right:AssignmentExpression + { + return { + type: "AssignmentExpression", + operator: operator, + left: left, + right: right + }; + } + / ConditionalExpression + +AssignmentExpressionNoIn + = left:LeftHandSideExpression __ + "=" !"=" __ + right:AssignmentExpressionNoIn + { + return { + type: "AssignmentExpression", + operator: "=", + left: left, + right: right + }; + } + / left:LeftHandSideExpression __ + operator:AssignmentOperator __ + right:AssignmentExpressionNoIn + { + return { + type: "AssignmentExpression", + operator: operator, + left: left, + right: right + }; + } + / ConditionalExpressionNoIn + +AssignmentOperator + = "*=" + / "/=" + / "%=" + / "+=" + / "-=" + / "<<=" + / ">>=" + / ">>>=" + / "&=" + / "^=" + / "|=" + +Expression + = first:AssignmentExpression rest:(__ "," __ AssignmentExpression)* { + return rest.length > 0 + ? { type: "SequenceExpression", expressions: buildList(first, rest, 3) } + : first; + } + +ExpressionNoIn + = first:AssignmentExpressionNoIn rest:(__ "," __ AssignmentExpressionNoIn)* { + return rest.length > 0 + ? { type: "SequenceExpression", expressions: buildList(first, rest, 3) } + : first; + } + +/* ----- A.4 Statements ----- */ + +Statement + = Block + / VariableStatement + / EmptyStatement + / ExpressionStatement + / IfStatement + / IterationStatement + / ContinueStatement + / BreakStatement + / ReturnStatement + / WithStatement + / LabelledStatement + / SwitchStatement + / ThrowStatement + / TryStatement + / DebuggerStatement + +Block + = "{" __ body:(StatementList __)? "}" { + return { + type: "BlockStatement", + body: optionalList(extractOptional(body, 0)) + }; + } + +StatementList + = first:Statement rest:(__ Statement)* { return buildList(first, rest, 1); } + +VariableStatement + = VarToken __ declarations:VariableDeclarationList EOS { + return { + type: "VariableDeclaration", + declarations: declarations + }; + } + +VariableDeclarationList + = first:VariableDeclaration rest:(__ "," __ VariableDeclaration)* { + return buildList(first, rest, 3); + } + +VariableDeclarationListNoIn + = first:VariableDeclarationNoIn rest:(__ "," __ VariableDeclarationNoIn)* { + return buildList(first, rest, 3); + } + +VariableDeclaration + = id:Identifier init:(__ Initialiser)? { + return { + type: "VariableDeclarator", + id: id, + init: extractOptional(init, 1) + }; + } + +VariableDeclarationNoIn + = id:Identifier init:(__ InitialiserNoIn)? { + return { + type: "VariableDeclarator", + id: id, + init: extractOptional(init, 1) + }; + } + +Initialiser + = "=" !"=" __ expression:AssignmentExpression { return expression; } + +InitialiserNoIn + = "=" !"=" __ expression:AssignmentExpressionNoIn { return expression; } + +EmptyStatement + = ";" { return { type: "EmptyStatement" }; } + +ExpressionStatement + = !("{" / FunctionToken) expression:Expression EOS { + return { + type: "ExpressionStatement", + expression: expression + }; + } + +IfStatement + = IfToken __ "(" __ test:Expression __ ")" __ + consequent:Statement __ + ElseToken __ + alternate:Statement + { + return { + type: "IfStatement", + test: test, + consequent: consequent, + alternate: alternate + }; + } + / IfToken __ "(" __ test:Expression __ ")" __ + consequent:Statement { + return { + type: "IfStatement", + test: test, + consequent: consequent, + alternate: null + }; + } + +IterationStatement + = DoToken __ + body:Statement __ + WhileToken __ "(" __ test:Expression __ ")" EOS + { return { type: "DoWhileStatement", body: body, test: test }; } + / WhileToken __ "(" __ test:Expression __ ")" __ + body:Statement + { return { type: "WhileStatement", test: test, body: body }; } + / ForToken __ + "(" __ + init:(ExpressionNoIn __)? ";" __ + test:(Expression __)? ";" __ + update:(Expression __)? + ")" __ + body:Statement + { + return { + type: "ForStatement", + init: extractOptional(init, 0), + test: extractOptional(test, 0), + update: extractOptional(update, 0), + body: body + }; + } + / ForToken __ + "(" __ + VarToken __ declarations:VariableDeclarationListNoIn __ ";" __ + test:(Expression __)? ";" __ + update:(Expression __)? + ")" __ + body:Statement + { + return { + type: "ForStatement", + init: { + type: "VariableDeclaration", + declarations: declarations + }, + test: extractOptional(test, 0), + update: extractOptional(update, 0), + body: body + }; + } + / ForToken __ + "(" __ + left:LeftHandSideExpression __ + InToken __ + right:Expression __ + ")" __ + body:Statement + { + return { + type: "ForInStatement", + left: left, + right: right, + body: body + }; + } + / ForToken __ + "(" __ + VarToken __ declarations:VariableDeclarationListNoIn __ + InToken __ + right:Expression __ + ")" __ + body:Statement + { + return { + type: "ForInStatement", + left: { + type: "VariableDeclaration", + declarations: declarations + }, + right: right, + body: body + }; + } + +ContinueStatement + = ContinueToken EOS { + return { type: "ContinueStatement", label: null }; + } + / ContinueToken _ label:Identifier EOS { + return { type: "ContinueStatement", label: label }; + } + +BreakStatement + = BreakToken EOS { + return { type: "BreakStatement", label: null }; + } + / BreakToken _ label:Identifier EOS { + return { type: "BreakStatement", label: label }; + } + +ReturnStatement + = ReturnToken EOS { + return { type: "ReturnStatement", argument: null }; + } + / ReturnToken _ argument:Expression EOS { + return { type: "ReturnStatement", argument: argument }; + } + +WithStatement + = WithToken __ "(" __ object:Expression __ ")" __ + body:Statement + { return { type: "WithStatement", object: object, body: body }; } + +SwitchStatement + = SwitchToken __ "(" __ discriminant:Expression __ ")" __ + cases:CaseBlock + { + return { + type: "SwitchStatement", + discriminant: discriminant, + cases: cases + }; + } + +CaseBlock + = "{" __ clauses:(CaseClauses __)? "}" { + return optionalList(extractOptional(clauses, 0)); + } + / "{" __ + before:(CaseClauses __)? + default_:DefaultClause __ + after:(CaseClauses __)? "}" + { + return optionalList(extractOptional(before, 0)) + .concat(default_) + .concat(optionalList(extractOptional(after, 0))); + } + +CaseClauses + = first:CaseClause rest:(__ CaseClause)* { return buildList(first, rest, 1); } + +CaseClause + = CaseToken __ test:Expression __ ":" consequent:(__ StatementList)? { + return { + type: "SwitchCase", + test: test, + consequent: optionalList(extractOptional(consequent, 1)) + }; + } + +DefaultClause + = DefaultToken __ ":" consequent:(__ StatementList)? { + return { + type: "SwitchCase", + test: null, + consequent: optionalList(extractOptional(consequent, 1)) + }; + } + +LabelledStatement + = label:Identifier __ ":" __ body:Statement { + return { type: "LabeledStatement", label: label, body: body }; + } + +ThrowStatement + = ThrowToken _ argument:Expression EOS { + return { type: "ThrowStatement", argument: argument }; + } + +TryStatement + = TryToken __ block:Block __ handler:Catch __ finalizer:Finally { + return { + type: "TryStatement", + block: block, + handler: handler, + finalizer: finalizer + }; + } + / TryToken __ block:Block __ handler:Catch { + return { + type: "TryStatement", + block: block, + handler: handler, + finalizer: null + }; + } + / TryToken __ block:Block __ finalizer:Finally { + return { + type: "TryStatement", + block: block, + handler: null, + finalizer: finalizer + }; + } + +Catch + = CatchToken __ "(" __ param:Identifier __ ")" __ body:Block { + return { + type: "CatchClause", + param: param, + body: body + }; + } + +Finally + = FinallyToken __ block:Block { return block; } + +DebuggerStatement + = DebuggerToken EOS { return { type: "DebuggerStatement" }; } + +/* ----- A.5 Functions and Programs ----- */ + +FunctionDeclaration + = FunctionToken __ id:Identifier __ + "(" __ params:(FormalParameterList __)? ")" __ + "{" __ body:FunctionBody __ "}" + { + return { + type: "FunctionDeclaration", + id: id, + params: optionalList(extractOptional(params, 0)), + body: body + }; + } + +FunctionExpression + = FunctionToken __ id:(Identifier __)? + "(" __ params:(FormalParameterList __)? ")" __ + "{" __ body:FunctionBody __ "}" + { + return { + type: "FunctionExpression", + id: extractOptional(id, 0), + params: optionalList(extractOptional(params, 0)), + body: body + }; + } + +FormalParameterList + = first:Identifier rest:(__ "," __ Identifier)* { + return buildList(first, rest, 3); + } + +FunctionBody + = statementList:StatementList { + return { + type: "FunctionBody", + statementList: statementList + }; + } + +Validator + = "validator" __ "=" __ validator:StringLiteral { + return { + type: "Validator", + text: validator + }; + } + +Optional + = "optional"{ + return { + type: "Optional" + }; + } + +Default + = "default" __ "=" __ def:StringLiteral { + return { + type: "Default", + text: def + }; + } + QualifiedName = first:$Identifier rest:$('.' Identifier)* { return first.concat(JSON.stringify(rest).replace(/['"]+/g, '')); @@ -468,6 +1319,37 @@ QualifiedName /* Irrelevant. */ +/* Tokens */ +QueryToken = "query" !IdentifierPart + +SelectToken = "SELECT" !IdentifierPart +FromToken = "FROM" !IdentifierPart +WhereToken = "WHERE" !IdentifierPart +OrToken = "OR" !IdentifierPart +AndToken = "AND" !IdentifierPart + +OrderByToken = "ORDER BY" !IdentifierPart +SkipToken = "SKIP" !IdentifierPart +LimitToken = "LIMIT" !IdentifierPart +AscToken = "ASC" !IdentifierPart +DescToken = "DESC" !IdentifierPart + +NotEqualToken = "!=" +EqualToken = "=" +LTToken = "<" !EqualToken +LTEToken = "<=" +GTToken = ">" !EqualToken +GTEToken = ">=" + +// Not yet implemented, but supported by CouchDB +// NotToken = "NOT" !IdentifierPart +// InToken = "IN" !IdentifierPart +// LikeToken = "LIKE" !IdentifierPart +// NotInToken = "NOT IN" !IdentifierPart +// ExistsToken = "EXISTS" !IdentifierPart +// SizeToken = "SIZE" !IdentifierPart + + /* ROOT OF GRAMMAR */ Program = queries:Query+ @@ -501,7 +1383,7 @@ FromSelectStatement = __ SelectToken __ resource:QualifiedName __ from:FromToken __ registry:QualifiedName - __ where:WhereExpr? + __ where:Predicate? __ orderBy:OrderBy? __ limit:Limit? __ skip:Skip? { @@ -520,7 +1402,7 @@ FromSelectStatement SimpleSelectStatement = __ SelectToken __ resource:QualifiedName - __ where:WhereExpr? + __ where:Predicate? __ orderBy:OrderBy? __ limit:Limit? __ skip:Skip? { @@ -603,39 +1485,16 @@ SortSingleField direction: direction }; } - -WhereExpr "where expression" - = WhereToken x:LogicExpr xs:LogicExprRest* { - return { - conditions: [x].concat(xs), - location: location() - }; - } - -LogicExpr - = _ "(" _ x:LogicExpr xs:LogicExprRest* _ ")" _ { - return [x].concat(xs); - } - / _ left:Expr _ op:Operator _ right:Expr _ { - return { - left: left, - op: op, - right: right, - location: location() - }; - } - -LogicExprRest - = _ j:Joiner _ l:LogicExpr { - return { - joiner: j, - expression: l - }; - } +Predicate + = WhereToken __ "(" __ test:Expression __ ")" __ + { + return test; + } + Joiner - = OrToken - / AndToken + = OrToken { return "OR"; } + / AndToken { return "AND"; } Operator = NotEqualToken { return "!="; } @@ -646,7 +1505,7 @@ Operator / GTEToken { return ">="; } Placeholder - = _ "@" name:Identifier { + = _ "$" name:Identifier { return { type: "Placeholder", index: name, diff --git a/packages/composer-common/lib/query/queryfile.js b/packages/composer-common/lib/query/queryfile.js index 12d7a71a5a..5bead05481 100644 --- a/packages/composer-common/lib/query/queryfile.js +++ b/packages/composer-common/lib/query/queryfile.js @@ -46,6 +46,7 @@ class QueryFile { try { this.ast = parser.parse(definitions); + console.log(JSON.stringify(this.ast)); } catch(err) { if(err.location && err.location.start) { diff --git a/packages/composer-common/lib/query/sort.js b/packages/composer-common/lib/query/sort.js new file mode 100644 index 0000000000..6caf677bd5 --- /dev/null +++ b/packages/composer-common/lib/query/sort.js @@ -0,0 +1,125 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const IllegalModelException = require('../introspect/illegalmodelexception'); + +/** + * Defines a sort on a field for an ORDER BY clause + * + * @private + * @class + * @memberof module:composer-common + */ +class Sort { + + /** + * Create a Sort from an Abstract Syntax Tree. The AST is the + * result of parsing. + * + * @param {OrderBy} orderBy - the OrderBy for this sort by + * @param {string} ast - the AST created by the parser + * @throws {IllegalModelException} + */ + constructor(orderBy, ast) { + if(!orderBy || !ast) { + throw new IllegalModelException('Invalid OrderBy or AST'); + } + + this.ast = ast; + this.orderBy = orderBy; + this.process(); + } + + /** + * Visitor design pattern + * @param {Object} visitor - the visitor + * @param {Object} parameters - the parameter + * @return {Object} the result of visiting or null + * @private + */ + accept(visitor,parameters) { + return visitor.visit(this, parameters); + } + + /** + * Returns the OrderBy that owns this Sort. + * + * @return {OrderBy} the owning OrderBy + */ + getOrderBy() { + return this.orderBy; + } + + /** + * Process the AST and build the model + * + * @throws {IllegalModelException} + * @private + */ + process() { + this.propertyPath = this.ast.fieldName.name; + + this.direction = 'ASC'; + + if(this.ast.direction) { + this.direction = this.ast.direction; + } + this.direction = this.ast.direction; + } + + /** + * Semantic validation of the structure of this select. + * + * @throws {IllegalModelException} + * @private + */ + validate() { + } + + /** + * Returns the name of the property of the owning resource. This may be an dotted expression + * to navigate to sub-properties of the owning resource. E.g. x.y.z. + * + * @return {string} the navigation property + */ + getPropertyPath() { + return this.propertyPath; + } + + /** + * Returns the name of the property of the owning resource. This may be an dotted expression + * to navigate to sub-properties of the owning resource. E.g. x.y.z. + * + * @return {string} the navigation property + */ + getDirection() { + return this.direction; + } + + /** + * Returns a new object representing this Query that is + * suitable for serializing as JSON. + * @return {Object} A new object suitable for serializing as JSON. + */ + toJSON() { + let result = { + resouce: this.resource + }; + return result; + } +} + +module.exports = Sort; diff --git a/packages/composer-common/test/query/model.cto b/packages/composer-common/test/query/model.cto index 2f30c70566..505c03a97d 100644 --- a/packages/composer-common/test/query/model.cto +++ b/packages/composer-common/test/query/model.cto @@ -5,10 +5,15 @@ asset Car identified by id { -->Driver owner } +concept Address { + o String city +} + participant Driver identified by email { o String email o String firstName o String lastName + o Address address o Integer age } diff --git a/packages/composer-common/test/query/test.qry b/packages/composer-common/test/query/test.qry index e50b4a055a..efb71db69a 100644 --- a/packages/composer-common/test/query/test.qry +++ b/packages/composer-common/test/query/test.qry @@ -14,7 +14,7 @@ query Q3 { // single line comment query Q4 { description: "Select all Drivers called Dan" // inline comment - statement: SELECT org.acme.Driver WHERE firstName='Dan' + statement: SELECT org.acme.Driver WHERE (firstName=='Dan') } /** @@ -22,22 +22,22 @@ query Q4 { */ query Q5 { description: "Select all Drivers called Dan Selman" // inline comment - statement: SELECT org.acme.Driver WHERE firstName='Dan' AND lastName='Selman' + statement: SELECT org.acme.Driver WHERE (firstName=='Dan' AND lastName=='Selman') } query Q6 { description: "Select all Drivers called Dan Selman with parens" - statement: SELECT org.acme.Driver WHERE (firstName='Dan' AND lastName='Selman') + statement: SELECT org.acme.Driver WHERE (firstName=='Dan' AND lastName=='Selman') } query Q7 { description: "Select all Drivers called Dan Selman with parens limit" - statement: SELECT org.acme.Driver WHERE (firstName='Dan' AND lastName='Selman') LIMIT 5 + statement: SELECT org.acme.Driver WHERE (firstName=='Dan' AND lastName=='Selman') LIMIT 5 } query Q8 { description: "Select all Drivers called Dan Selman with parens skip" - statement: SELECT org.acme.Driver WHERE (firstName='Dan' AND lastName='Selman') SKIP 5 + statement: SELECT org.acme.Driver WHERE (firstName=='Dan' AND lastName=='Selman') SKIP 5 } // all on a single line @@ -49,58 +49,97 @@ query Q11 { description: "Select all drivers aged 44" statement: SELECT org.acme.Driver - WHERE age=44 + WHERE (age==44) } query Q12 { description: "Select all drivers aged less than 44" statement: SELECT org.acme.Driver - WHERE age<44 + WHERE (age<44) } query Q13 { description: "Select all drivers aged less than equal 44" statement: SELECT org.acme.Driver - WHERE age <= 44 + WHERE (age <= 44) } query Q14 { description: "Select all drivers aged older than 44" statement: SELECT org.acme.Driver - WHERE age >45 + WHERE (age >45) } query Q15 { description: "Select all drivers aged older than or equal to 44" statement: SELECT org.acme.Driver - WHERE age>= 45 + WHERE (age>= 45) } query Q16 { description: "Select all drivers aged older than or equal to PARAM" statement: SELECT org.acme.Driver - WHERE age>= @ageParam + WHERE (age>= $ageParam) } query Q17 { description: "Select all drivers aged older than PARAM" statement: SELECT org.acme.Driver - WHERE @ageParam < age + WHERE ($ageParam < age) } query Q18 { description: "Select all drivers aged older than PARAM" statement: SELECT org.acme.Driver - WHERE @ageParam < age + WHERE ($ageParam < age) ORDER BY [lastName ASC, firstName DESC] - LIMIT @limitParam - SKIP @skipParam + LIMIT $limitParam + SKIP $skipParam +} + +query Q19 { + description: "Select all drivers aged younger than 50 ordered by lastname, firstname" + statement: + SELECT org.acme.Driver + WHERE (age < 50) + ORDER BY [lastName ASC, firstName DESC] +} + +query Q20{ + description: "Select non Dan drivers aged younger than 50 ordered by lastname, firstname" + statement: + SELECT org.acme.Driver + WHERE (age < 50 AND firstName != 'Dan') + ORDER BY [lastName ASC, firstName DESC] +} + +query Q21{ + description: "Select non Dan drivers aged younger than 50 ordered by lastname, firstname" + statement: + SELECT org.acme.Driver + WHERE (age < 50 AND firstName != 'Dan') + ORDER BY [lastName ASC, firstName DESC] +} + +query Q22{ + description: "Select non Dan drivers or drivers aged younger than 50 ordered by lastname, firstname" + statement: + SELECT org.acme.Driver + WHERE ((age < 50 OR firstName != 'Dan') AND (lastName!='Selman')) + ORDER BY [lastName ASC, firstName DESC] +} + +query Q23{ + description: "Select by address property" + statement: + SELECT org.acme.Driver + WHERE ((age < 50 OR firstName != 'Dan') AND (address.city.postcode!='London')) } \ No newline at end of file From 66f2266db51d2f4e743c9f93edf761314029a470 Mon Sep 17 00:00:00 2001 From: Dan Selman Date: Sun, 11 Jun 2017 23:42:12 +0100 Subject: [PATCH 4/5] wip --- .../composer-common/lib/query/condition.js | 102 ------------------ packages/composer-common/lib/query/orderby.js | 38 ++----- packages/composer-common/lib/query/query.js | 5 +- .../composer-common/lib/query/queryfile.js | 6 +- packages/composer-common/lib/query/select.js | 10 +- packages/composer-common/lib/query/where.js | 16 +-- .../composer-common/test/query/queryfile.js | 2 +- 7 files changed, 24 insertions(+), 155 deletions(-) delete mode 100644 packages/composer-common/lib/query/condition.js diff --git a/packages/composer-common/lib/query/condition.js b/packages/composer-common/lib/query/condition.js deleted file mode 100644 index 2ec1486edd..0000000000 --- a/packages/composer-common/lib/query/condition.js +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const IllegalModelException = require('../introspect/illegalmodelexception'); - -/** - * Condition defines the left-hand-side, operator and right-hand-side - * for a conditional select in a Where clause. - * - * @private - * @class - * @memberof module:composer-common - */ -class Condition { - - /** - * Create a Condition for a Where clause - * - * @param {Where} where - the Where for this condition - * @param {string} ast - the AST created by the parser - * @throws {IllegalModelException} - */ - constructor(where, ast) { - if(!where || !ast) { - throw new IllegalModelException('Invalid Where or AST'); - } - - this.ast = ast; - this.where = where; - this.process(); - } - - /** - * Visitor design pattern - * @param {Object} visitor - the visitor - * @param {Object} parameters - the parameter - * @return {Object} the result of visiting or null - * @private - */ - accept(visitor,parameters) { - return visitor.visit(this, parameters); - } - - /** - * Returns the Where that owns this condition. - * - * @return {Where} the owning where clause - */ - getWhere() { - return this.where; - } - - /** - * Process the AST and build the model - * - * @throws {IllegalModelException} - * @private - */ - process() { - this.left = this.ast.left; - this.op = this.ast.op; - this.right = this.right.value; - } - - /** - * Semantic validation of the structure of this select. - * - * @throws {IllegalModelException} - * @private - */ - validate() { - } - - /** - * Returns a new object representing this Query that is - * suitable for serializing as JSON. - * @return {Object} A new object suitable for serializing as JSON. - */ - toJSON() { - let result = { - left: this.left, - op: this.op, - right: this.right - }; - return result; - } -} - -module.exports = Condition; diff --git a/packages/composer-common/lib/query/orderby.js b/packages/composer-common/lib/query/orderby.js index 03fc6e926d..d8334b7613 100644 --- a/packages/composer-common/lib/query/orderby.js +++ b/packages/composer-common/lib/query/orderby.js @@ -15,7 +15,7 @@ 'use strict'; const IllegalModelException = require('../introspect/illegalmodelexception'); -const Where = require('../where'); +const Sort = require('./sort'); /** * Defines the ORDER BY specification for a SELECT statement @@ -71,26 +71,14 @@ class OrderBy { * @private */ process() { - this.resource = this.ast.resource; + this.sortCriteria = null; - this.where = null; - if(this.ast.where) { - this.where = new Where(this.ast.where); - } - - this.limit = null; - if(this.ast.limit) { - this.limit = this.ast.limit; - } - - this.skip = null; - if(this.ast.skip) { - this.skip = this.ast.skip; - } + if(this.ast.sort) { + this.sortCriteria = []; - this.orderBy = null; - if(this.ast.orderBy) { - this.orderBy = new OrderBy(this.ast.orderBy); + for(let n=0; n < this.ast.sort.length; n++) { + this.sortCriteria.push( new Sort(this, this.ast.sort[n])); + } } } @@ -101,15 +89,7 @@ class OrderBy { * @private */ validate() { - } - - /** - * Returns the FQN of the resource of this select. - * - * @return {string} the fully qualified name of the select - */ - getResource() { - return this.resource; + // TODO (DCS) check that the fields we are sorting by exist! } /** @@ -119,7 +99,7 @@ class OrderBy { */ toJSON() { let result = { - resouce: this.resource + sortCriteria: this.sortCriteria.toJSON() }; return result; } diff --git a/packages/composer-common/lib/query/query.js b/packages/composer-common/lib/query/query.js index 21fe4b1e50..6c406db277 100644 --- a/packages/composer-common/lib/query/query.js +++ b/packages/composer-common/lib/query/query.js @@ -15,6 +15,7 @@ 'use strict'; const IllegalModelException = require('../introspect/illegalmodelexception'); +const Select = require('./select'); /** * Query defines a SELECT query over a resource (asset, transaction or participant) @@ -72,6 +73,7 @@ class Query { process() { this.name = this.ast.identifier.name; this.description = this.ast.description; + this.select = new Select(this, this.ast.select); } /** @@ -109,7 +111,8 @@ class Query { toJSON() { let result = { name: this.name, - description: this.description + description: this.description, + select: this.select.toJSON() }; return result; } diff --git a/packages/composer-common/lib/query/queryfile.js b/packages/composer-common/lib/query/queryfile.js index 5bead05481..1358b79d87 100644 --- a/packages/composer-common/lib/query/queryfile.js +++ b/packages/composer-common/lib/query/queryfile.js @@ -46,7 +46,6 @@ class QueryFile { try { this.ast = parser.parse(definitions); - console.log(JSON.stringify(this.ast)); } catch(err) { if(err.location && err.location.start) { @@ -59,11 +58,8 @@ class QueryFile { for(let n=0; n < this.ast.queries.length; n++ ) { let thing = this.ast.queries[n]; - const query = new Query(this, thing); - this.queries.push(query); + this.queries.push(new Query(this, thing)); } - - // console.log(JSON.stringify(this.ast)); } /** diff --git a/packages/composer-common/lib/query/select.js b/packages/composer-common/lib/query/select.js index 4cec098636..2e2f272970 100644 --- a/packages/composer-common/lib/query/select.js +++ b/packages/composer-common/lib/query/select.js @@ -76,7 +76,7 @@ class Select { this.where = null; if(this.ast.where) { - this.where = new Where(this.ast.where); + this.where = new Where(this, this.ast.where); } this.limit = null; @@ -91,7 +91,7 @@ class Select { this.orderBy = null; if(this.ast.orderBy) { - this.orderBy = new OrderBy(this.ast.orderBy); + this.orderBy = new OrderBy(this, this.ast.orderBy); } } @@ -137,7 +137,11 @@ class Select { */ toJSON() { let result = { - resouce: this.resource + resouce: this.resource, + where: this.where ? this.where.toJSON() : null, + limit: this.limit ? this.limit : null, + skip: this.skip ? this.skip : null, + orderBy: this.orderBy ? this.orderBy.toJSON() : null }; return result; } diff --git a/packages/composer-common/lib/query/where.js b/packages/composer-common/lib/query/where.js index 18300b02d3..1e21b66a2e 100644 --- a/packages/composer-common/lib/query/where.js +++ b/packages/composer-common/lib/query/where.js @@ -15,7 +15,6 @@ 'use strict'; const IllegalModelException = require('../introspect/illegalmodelexception'); -const Condition = require('./condition'); /** * Where defines the WHERE portion of a SELECT statement @@ -71,13 +70,6 @@ class Where { * @private */ process() { - this.conditions = null; - - if(this.ast.conditions) { - for(let n=0; n { it('should call the parser with the definitions and save the abstract syntax tree', () => { const ast = { - queries: [ {identifier: {name: 'fake'}, statement: 'org.acme'} ] + queries: [ {identifier: {name: 'fake'}, description: 'foo', select: {resource: 'org.acme.Driver', where: {} } } ] }; sandbox.stub(parser, 'parse').returns(ast); let mf = new QueryFile( 'test', modelManager, 'fake definitions'); From 9c20ce670f4d5c1af6dea7e73d0851265461d9a2 Mon Sep 17 00:00:00 2001 From: Dan Selman Date: Tue, 13 Jun 2017 22:08:49 +0100 Subject: [PATCH 5/5] unit testing --- packages/composer-common/lib/query/parser.js | 18 +- .../composer-common/lib/query/parser.pegjs | 2 +- packages/composer-common/lib/query/query.js | 1 + packages/composer-common/lib/query/select.js | 62 +++++- .../lib/tools/modelcollector.js | 187 ------------------ packages/composer-common/package.json | 1 + .../composer-common/test/query/queryfile.js | 1 + packages/composer-common/test/query/select.js | 129 ++++++++++++ packages/composer-common/test/query/test.qry | 10 +- 9 files changed, 201 insertions(+), 210 deletions(-) delete mode 100644 packages/composer-common/lib/tools/modelcollector.js create mode 100644 packages/composer-common/test/query/select.js diff --git a/packages/composer-common/lib/query/parser.js b/packages/composer-common/lib/query/parser.js index 49a0092589..8e5cf26edb 100644 --- a/packages/composer-common/lib/query/parser.js +++ b/packages/composer-common/lib/query/parser.js @@ -844,14 +844,16 @@ module.exports = (function() { peg$c430 = function() { return "<="; }, peg$c431 = function() { return ">"; }, peg$c432 = function() { return ">="; }, - peg$c433 = function(name) { + peg$c433 = "_$", + peg$c434 = { type: "literal", value: "_$", description: "\"_$\"" }, + peg$c435 = function(name) { return { type: "Placeholder", index: name, location: location() }; }, - peg$c434 = function(chars) { + peg$c436 = function(chars) { return chars.join(""); }, @@ -14330,18 +14332,18 @@ module.exports = (function() { s0 = peg$currPos; s1 = peg$parse_(); if (s1 !== peg$FAILED) { - if (input.charCodeAt(peg$currPos) === 36) { - s2 = peg$c38; - peg$currPos++; + if (input.substr(peg$currPos, 2) === peg$c433) { + s2 = peg$c433; + peg$currPos += 2; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$c39); } + if (peg$silentFails === 0) { peg$fail(peg$c434); } } if (s2 !== peg$FAILED) { s3 = peg$parseIdentifier(); if (s3 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c433(s3); + s1 = peg$c435(s3); s0 = s1; } else { peg$currPos = s0; @@ -14386,7 +14388,7 @@ module.exports = (function() { } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$c434(s1); + s1 = peg$c436(s1); } s0 = s1; peg$silentFails--; diff --git a/packages/composer-common/lib/query/parser.pegjs b/packages/composer-common/lib/query/parser.pegjs index 63b11351c2..d8e0b3c1ce 100644 --- a/packages/composer-common/lib/query/parser.pegjs +++ b/packages/composer-common/lib/query/parser.pegjs @@ -1505,7 +1505,7 @@ Operator / GTEToken { return ">="; } Placeholder - = _ "$" name:Identifier { + = _ "_$" name:Identifier { return { type: "Placeholder", index: name, diff --git a/packages/composer-common/lib/query/query.js b/packages/composer-common/lib/query/query.js index 6c406db277..61feff4348 100644 --- a/packages/composer-common/lib/query/query.js +++ b/packages/composer-common/lib/query/query.js @@ -83,6 +83,7 @@ class Query { * @private */ validate() { + this.select.validate(); } /** diff --git a/packages/composer-common/lib/query/select.js b/packages/composer-common/lib/query/select.js index 2e2f272970..0530255c34 100644 --- a/packages/composer-common/lib/query/select.js +++ b/packages/composer-common/lib/query/select.js @@ -59,7 +59,7 @@ class Select { /** * Returns the QueryFile that owns this Query. * - * @return {AclFile} the owning QueryFile + * @return {Query} the owning QueryFile */ getQuery() { return this.query; @@ -72,7 +72,12 @@ class Select { * @private */ process() { - this.resource = this.ast.resource; + + this.resource = null; + + if(this.ast.resource) { + this.resource = this.ast.resource; + } this.where = null; if(this.ast.where) { @@ -102,14 +107,17 @@ class Select { * @private */ validate() { - const mm = this.getQuery().getQueryFile().getModelManager(); - // checks the resource type exists - const resourceClassDeclaration = mm.getType(this.resource); + if(this.resource) { + const mm = this.getQuery().getQueryFile().getModelManager(); - // check that it is not an enum or concept - if(resourceClassDeclaration.isConcept() || resourceClassDeclaration.isEnum()) { - throw new Error('Can only select assets, participants and transactions.'); + // checks the resource type exists + const resourceClassDeclaration = mm.getType(this.resource); + + // check that it is not an enum or concept + if(resourceClassDeclaration.isConcept() || resourceClassDeclaration.isEnum()) { + throw new Error('Can only select assets, participants and transactions.'); + } } if(this.where) { @@ -122,7 +130,7 @@ class Select { } /** - * Returns the FQN of the resource of this select. + * Returns the FQN of the resource of this select or null if it does not have a resource. * * @return {string} the fully qualified name of the select */ @@ -130,6 +138,42 @@ class Select { return this.resource; } + /** + * Returns the Where clause for this query or null if it does not have a WHERE clause. + * + * @return {Where} the Where or null + */ + getWhere() { + return this.where; + } + + /** + * Returns the OrderBy clause for this query or null if it does not have an ORDER BY clause. + * + * @return {OrderBy} the OrderBy or null + */ + getOrderBy() { + return this.orderBy; + } + + /** + * Returns the LIMIT count for this query or null if it does not have a LIMIT + * + * @return {integer} the LIMIT count or null + */ + getLimit() { + return this.limit; + } + + /** + * Returns the SKIP count for this query or null if it does not have a SKIP + * + * @return {integer} the SKIP count or null + */ + getSkip() { + return this.skip; + } + /** * Returns a new object representing this Query that is * suitable for serializing as JSON. diff --git a/packages/composer-common/lib/tools/modelcollector.js b/packages/composer-common/lib/tools/modelcollector.js deleted file mode 100644 index de032b8006..0000000000 --- a/packages/composer-common/lib/tools/modelcollector.js +++ /dev/null @@ -1,187 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -'use strict'; - -const fs = require('fs'); -const fsPath = require('path'); -const Logger = require('../log/logger'); -const minimatch = require('minimatch'); - -const LOG = Logger.getLog('ModelCollector'); -const ENCODING = 'utf8'; - -/** - * ModelCollector collects all the CTO files for an npm module - * along with all its transitive dependencies declared in package.json - * - * @private - * @class - * @memberof module:composer-common - */ -class ModelCollector { - - /** - * Create a ModelCollector. Call the collect method to aggregate information - * about the model files in memory. - */ - constructor() { - } - - /** - * Collect - * - * @param {string} path - the path to process - * @param {Object} [options] - an optional set of options to configure the instance. - * @param {Object} [options.dependencyGlob] - specify the glob pattern used to match - * the npm dependencies to process. Defaults to ** - * @param {boolean} [options.modelFileGlob] - specify the glob pattern used to match - * the model files to include. Defaults to **\/models/**\/*.cto - * @param {boolean} [options.scriptGlob] - specify the glob pattern used to match - * the script files to include. Defaults to **\/lib/**\/*.js - * @return {Object[]} an array of objects that describe the models - * @private - */ - collect(path, options) { - const method = 'collect'; - - if (!options) { - options = {}; - } - - if (!options.dependencyGlob) { - options.dependencyGlob = '**'; - } - - if (!options.modelFileGlob) { - options.modelFileGlob = '**/models/**/*.cto'; - } - - // grab the package.json - let packageJsonContents = fs.readFileSync(fsPath.resolve(path, 'package.json'), ENCODING); - - if (!packageJsonContents) { - throw new Error('Failed to find package.json'); - } - - LOG.debug(method, 'Loaded package.json', packageJsonContents); - - // parse the package.json - let jsonObject = JSON.parse(packageJsonContents); - let packageName = jsonObject.name; - const modelFiles = []; - - // grab all the model files that are beneath the current directory - ModelCollector.processDirectory(path, { - accepts: function (file) { - return minimatch(file, options.modelFileGlob, { dot: true }); - }, - acceptsDir: function (dir) { - return true; - }, - process: function (pathToContents, contents) { - modelFiles.push({ - 'module': packageName, - 'file': fsPath.basename(pathToContents), - 'path': pathToContents, - 'relativePath' : fsPath.relative(path,pathToContents), - 'contents': contents - }); - LOG.debug(method, 'Found model file', pathToContents); - } - }); - - // we then process each of the dependencies - if (jsonObject.dependencies) { - LOG.debug(method, 'All dependencies', Object.keys(jsonObject.dependencies).toString()); - const dependencies = Object.keys(jsonObject.dependencies).filter(minimatch.filter(options.dependencyGlob, { dot: true })); - LOG.debug(method, 'Matched dependencies', dependencies); - - for (let dep of dependencies) { - let dependencyPath = fsPath.resolve(path, 'node_modules', dep); - LOG.debug(method, 'Checking dependency path', dependencyPath); - if (!fs.existsSync(dependencyPath)) { - // need to check to see if this is in a peer directory as well - LOG.debug(method, 'trying different path ' + path.replace(packageName, '')); - dependencyPath = fsPath.resolve(path.replace(packageName, ''), dep); - if (!fs.existsSync(dependencyPath)) { - throw new Error('npm dependency path ' + dependencyPath + ' does not exist. Did you run npm install?'); - } - } - - // collect everything in the dependency path - modelFiles.concat(this.collect(dependencyPath, options)); - } - } - - return modelFiles; - } - - /** - * @param {String} path - the path to process - * @param {Object} fileProcessor - the file processor. It must have - * accept and process methods. - * @private - */ - static processDirectory(path, fileProcessor) { - const items = ModelCollector.walkSync(path, [], fileProcessor); - items.sort(); - LOG.debug('processDirectory', 'Path ' + path, items); - items.forEach((item) => { - ModelCollector.processFile(item, fileProcessor); - }); - } - - /** - * @param {String} file - the file to process - * @param {Object} fileProcessor - the file processor. It must have - * accepts and process methods. - * @private - */ - static processFile(file, fileProcessor) { - - if (fileProcessor.accepts(file)) { - LOG.debug('processFile', 'FileProcessor accepted', file); - let fileContents = fs.readFileSync(file, ENCODING); - fileProcessor.process(file, fileContents); - } else { - LOG.debug('processFile', 'FileProcessor rejected', file); - } - } - - /** - * @param {String} dir - the dir to walk - * @param {Object[]} filelist - input files - * @param {Object} fileProcessor - the file processor. It must have - * accepts and process methods. - * @return {Object[]} filelist - output files - * @private - */ - static walkSync(dir, filelist, fileProcessor) { - let files = fs.readdirSync(dir); - files.forEach(function (file) { - let nestedPath = fsPath.join(dir, file); - if (fs.lstatSync(nestedPath).isDirectory()) { - if (fileProcessor.acceptsDir(nestedPath)) { - filelist = ModelCollector.walkSync(nestedPath, filelist, fileProcessor); - } - } else { - filelist.push(nestedPath); - } - }); - return filelist; - } -} - -module.exports = ModelCollector; diff --git a/packages/composer-common/package.json b/packages/composer-common/package.json index 8cec150097..e2924eff0c 100644 --- a/packages/composer-common/package.json +++ b/packages/composer-common/package.json @@ -102,6 +102,7 @@ "lib/tools/plantumltoimage.js", "lib/introspect/parser.js", "lib/acl/parser.js", + "lib/query/parser.js", "out/**", "scripts/**", "systest/**", diff --git a/packages/composer-common/test/query/queryfile.js b/packages/composer-common/test/query/queryfile.js index d0a44dd9cb..6ba46aa72f 100644 --- a/packages/composer-common/test/query/queryfile.js +++ b/packages/composer-common/test/query/queryfile.js @@ -87,6 +87,7 @@ describe('QueryFile', () => { statement: SELECT org.acme.Car }`; const queryFile = new QueryFile('test.qry', modelManager, queryContents); + queryFile.getIdentifier().should.equal('test.qry'); queryFile.getQueries().length.should.equal(1); queryFile.getDefinitions().should.equal(queryContents); const q1 = queryFile.getQueries()[0]; diff --git a/packages/composer-common/test/query/select.js b/packages/composer-common/test/query/select.js new file mode 100644 index 0000000000..11366368cd --- /dev/null +++ b/packages/composer-common/test/query/select.js @@ -0,0 +1,129 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +const Query = require('../../lib/query/query'); +const Select = require('../../lib/query/select'); +const ModelManager = require('../../lib/modelmanager'); +const fs = require('fs'); +const path = require('path'); + +require('chai').should(); +const sinon = require('sinon'); + +describe('Select', () => { + + const testModel = fs.readFileSync(path.resolve(__dirname, './model.cto'), 'utf8'); + + let modelManager; + let sandbox; + let mockQuery; + + const select = { + resource: 'org.acme.Driver' + }; + + const selectWhere = { + resource: 'org.acme.Driver', where: 'WHERE' + }; + + const selectWhereOrderBy = { + resource: 'org.acme.Driver', where: 'WHERE', orderBy: 'ORDER BY' + }; + + const selectWhereLimit = { + resource: 'org.acme.Driver', where: 'WHERE', limit: 10 + }; + + const selectWhereLimitSkip = { + resource: 'org.acme.Driver', where: 'WHERE', limit: 10, skip: 5 + }; + + beforeEach(() => { + modelManager = new ModelManager(); + modelManager.addModelFile(testModel); + sandbox = sinon.sandbox.create(); + mockQuery = sinon.createStubInstance(Query); + }); + + afterEach(() => { + sandbox.restore(); + }); + + describe('#constructor', () => { + + it('should throw when null query provided', () => { + (() => { + new Select(null, null); + }).should.throw(/Invalid Query or AST/); + }); + + it('should throw when null ast provided', () => { + (() => { + new Select(mockQuery, null); + }).should.throw(/Invalid Query or AST/); + }); + + it('should save a select query', () => { + let s = new Select( mockQuery, select ); + s.getQuery().should.equal(mockQuery); + s.getResource().should.equal('org.acme.Driver'); + (s.getWhere() === null).should.be.true; + }); + + it('should save a select where query', () => { + let s = new Select( mockQuery, selectWhere ); + s.getQuery().should.equal(mockQuery); + s.getWhere().getSelect().should.equal(s); + }); + + it('should save a select where order by query', () => { + let s = new Select( mockQuery, selectWhereOrderBy ); + s.getQuery().should.equal(mockQuery); + s.getWhere().getSelect().should.equal(s); + s.getOrderBy().getSelect().should.equal(s); + }); + + it('should save a select where limit', () => { + let s = new Select( mockQuery, selectWhereLimit ); + s.getQuery().should.equal(mockQuery); + s.getWhere().getSelect().should.equal(s); + s.getLimit().should.equal(10); + }); + + it('should save a select where skip', () => { + let s = new Select( mockQuery, selectWhereLimitSkip ); + s.getQuery().should.equal(mockQuery); + s.getWhere().getSelect().should.equal(s); + s.getLimit().should.equal(10); + s.getSkip().should.equal(5); + }); + + }); + + + describe('#accept', () => { + + it('should call the visitor', () => { + let s = new Select(mockQuery, select); + let visitor = { + visit: sinon.stub() + }; + s.accept(visitor, ['some', 'args']); + sinon.assert.calledOnce(visitor.visit); + sinon.assert.calledWith(visitor.visit, s, ['some', 'args']); + }); + }); +}); diff --git a/packages/composer-common/test/query/test.qry b/packages/composer-common/test/query/test.qry index efb71db69a..cc551dc31b 100644 --- a/packages/composer-common/test/query/test.qry +++ b/packages/composer-common/test/query/test.qry @@ -84,24 +84,24 @@ query Q16 { description: "Select all drivers aged older than or equal to PARAM" statement: SELECT org.acme.Driver - WHERE (age>= $ageParam) + WHERE (age>= _$ageParam) } query Q17 { description: "Select all drivers aged older than PARAM" statement: SELECT org.acme.Driver - WHERE ($ageParam < age) + WHERE (_$ageParam < age) } query Q18 { description: "Select all drivers aged older than PARAM" statement: SELECT org.acme.Driver - WHERE ($ageParam < age) + WHERE (_$ageParam < age) ORDER BY [lastName ASC, firstName DESC] - LIMIT $limitParam - SKIP $skipParam + LIMIT _$limitParam + SKIP _$skipParam }