diff --git a/.github/workflows/CD-build.yml b/.github/workflows/CD-build.yml new file mode 100644 index 0000000000..4fa4b54c59 --- /dev/null +++ b/.github/workflows/CD-build.yml @@ -0,0 +1,11 @@ +name: CD-build + +on: + workflow_dispatch: + workflow_call: + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 \ No newline at end of file diff --git a/.github/workflows/CD-create_release.yml b/.github/workflows/CD-create_release.yml new file mode 100644 index 0000000000..2b776f88b5 --- /dev/null +++ b/.github/workflows/CD-create_release.yml @@ -0,0 +1,53 @@ +name: Create release file +'on': + workflow_dispatch: null +jobs: + gradle: + name: Run Gradle + runs-on: + - ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + distribution: temurin + java-version: 17 + - name: Setup and execute Gradle 'build' task + uses: gradle/gradle-build-action@v2 + id: build + with: + arguments: build --scan + - run: 'echo "${{steps.build.outputs.build}}"' + - uses: actions/upload-artifact@v3 + with: + name: ThetaJars + path: subprojects/**/*-all.jar + publish: + name: Publish Release + needs: gradle + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Creating version number + run: >- + echo "version=v$(grep "version" build.gradle.kts | tail -n 1 | cut -d + "=" -f2 | xargs echo )" >> $GITHUB_OUTPUT + id: value + shell: bash + - run: 'echo "${{steps.value.outputs.version}}"' + - uses: actions/download-artifact@v3 + with: + name: ThetaJars + path: jar/ + - name: Display structure of downloaded files + run: ls -R + - run: find jar + - run: for i in $(find jar -name "*-all.jar"); do mv $i jar/$(basename ${i%-${{steps.value.outputs.version}}-all.jar}.jar); done + - name: Release + uses: softprops/action-gh-release@v1 + with: + files: jar/**/*.jar + body: "Auto-generated release" + name: ${{steps.value.outputs.version}} + tag_name: ${{steps.value.outputs.version}} + diff --git a/.github/workflows/CD-publish.yml b/.github/workflows/CD-publish.yml new file mode 100644 index 0000000000..cdeac91075 --- /dev/null +++ b/.github/workflows/CD-publish.yml @@ -0,0 +1,11 @@ +name: CD-publish + +on: + workflow_dispatch: + workflow_call: + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 \ No newline at end of file diff --git a/.github/workflows/CI-build.yml b/.github/workflows/CI-build.yml new file mode 100644 index 0000000000..0e0286c3cd --- /dev/null +++ b/.github/workflows/CI-build.yml @@ -0,0 +1,11 @@ +name: CI-build + +on: + workflow_dispatch: + workflow_call: + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 \ No newline at end of file diff --git a/.github/workflows/CI-docs.yml b/.github/workflows/CI-docs.yml new file mode 100644 index 0000000000..defeb5de60 --- /dev/null +++ b/.github/workflows/CI-docs.yml @@ -0,0 +1,25 @@ +name: CI-docs + +on: + push: + branches: + - master + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: 3.x + - run: pip install mkdocs-material==8.3.9 + - run: pip install python-markdown-math==0.8 + - run: pip install mkdocs==1.3.0 + - run: mkdocs build --site-dir wiki + working-directory: doc/wiki + - uses: JamesIves/github-pages-deploy-action@3.7.1 + with: + branch: gh-pages + folder: doc/wiki/wiki + target_folder: wiki diff --git a/.github/workflows/CI-sonar.yml b/.github/workflows/CI-sonar.yml index 16c143b5d0..9724c19ae0 100644 --- a/.github/workflows/CI-sonar.yml +++ b/.github/workflows/CI-sonar.yml @@ -1,11 +1,11 @@ name: CI-sonar on: - push: - branches: - - master - pull_request: - types: [opened, synchronize, reopened] workflow_dispatch: + workflow_call: jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 \ No newline at end of file diff --git a/.github/workflows/CI-static.yml b/.github/workflows/CI-static.yml index e31ad67bbd..6250e73c96 100644 --- a/.github/workflows/CI-static.yml +++ b/.github/workflows/CI-static.yml @@ -1,6 +1,11 @@ -name: CI +name: CI-static on: workflow_dispatch: + workflow_call: jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 \ No newline at end of file diff --git a/.github/workflows/CI-test.yml b/.github/workflows/CI-test.yml new file mode 100644 index 0000000000..7032f086e8 --- /dev/null +++ b/.github/workflows/CI-test.yml @@ -0,0 +1,11 @@ +name: CI-test + +on: + workflow_dispatch: + workflow_call: + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 \ No newline at end of file diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index e31ad67bbd..e187877666 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -4,3 +4,7 @@ on: workflow_dispatch: jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 \ No newline at end of file diff --git a/.github/workflows/CT-xcfa-sv-benchmarks.yml b/.github/workflows/CT-xcfa-sv-benchmarks.yml new file mode 100644 index 0000000000..ad670f7efa --- /dev/null +++ b/.github/workflows/CT-xcfa-sv-benchmarks.yml @@ -0,0 +1,10 @@ +name: Test xcfa-cli on software verification tasks. +'on': + workflow_dispatch: null +jobs: + build: + name: Build theta-xcfa-cli + runs-on: + - ubuntu-latest + steps: + - uses: actions/checkout@v3 diff --git a/.github/workflows/TR-master.yml b/.github/workflows/TR-master.yml new file mode 100644 index 0000000000..13120f4df4 --- /dev/null +++ b/.github/workflows/TR-master.yml @@ -0,0 +1,13 @@ +name: TR-master + +on: + push: + branches: + - master + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 \ No newline at end of file diff --git a/.github/workflows/TR-pr.yml b/.github/workflows/TR-pr.yml new file mode 100644 index 0000000000..eaf192f93f --- /dev/null +++ b/.github/workflows/TR-pr.yml @@ -0,0 +1,12 @@ +name: TR-pr + +on: + pull_request: + types: [ opened, synchronize, reopened ] + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 \ No newline at end of file diff --git a/.github/workflows/TR-push.yml b/.github/workflows/TR-push.yml new file mode 100644 index 0000000000..5aa7dbaa92 --- /dev/null +++ b/.github/workflows/TR-push.yml @@ -0,0 +1,11 @@ +name: TR-push + +on: + push: + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 \ No newline at end of file diff --git a/.github/workflows/TR-release.yml b/.github/workflows/TR-release.yml new file mode 100644 index 0000000000..ed2209fd4e --- /dev/null +++ b/.github/workflows/TR-release.yml @@ -0,0 +1,30 @@ +name: TR-release + +on: + workflow_dispatch: + inputs: + mode: + description: 'The type of version bump' + required: true + type: choice + options: + - major + - minor + - patch + - 'custom_override' + default: patch + custom_override: + description: The custom version to override the current version with + required: false + type: string + deploy_docs: + description: Whether to deploy the documentation as well + required: true + type: boolean + default: true + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 \ No newline at end of file diff --git a/.github/workflows/build-linux.yml b/.github/workflows/build-linux.yml index 34f218944b..f745005503 100644 --- a/.github/workflows/build-linux.yml +++ b/.github/workflows/build-linux.yml @@ -15,8 +15,6 @@ jobs: uses: actions/setup-java@v1 with: java-version: 1.17 - - name: Grant execute permission for gradlew - run: chmod +x gradlew - name: Build with Gradle run: ./gradlew build - name: Send test coverage to Codacy diff --git a/.github/workflows/publish-maven.yml b/.github/workflows/publish-maven.yml new file mode 100644 index 0000000000..8f5f575597 --- /dev/null +++ b/.github/workflows/publish-maven.yml @@ -0,0 +1,32 @@ +name: Publish release to Maven Central +on: + workflow_dispatch: +jobs: + gradle: + name: Run Gradle + runs-on: + - ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + distribution: temurin + java-version: 17 + - name: Publish to Maven Staging + uses: gradle/gradle-build-action@v2 + env: + OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} + PGP_KEY: ${{ secrets.PGP_KEY }} + PGP_KEY_ID: ${{ secrets.PGP_KEY_ID }} + PGP_PWD: ${{ secrets.PGP_PWD }} + with: + arguments: publish + - name: Close staging and publish release + uses: gradle/gradle-build-action@v2 + env: + OSSRH_PASSWORD: ${{ secrets.OSSRH_PASSWORD }} + OSSRH_USERNAME: ${{ secrets.OSSRH_USERNAME }} + with: + arguments: closeAndReleaseRepository + diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index d06a9f39e7..95d30caf1a 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -10,5 +10,7 @@ Contributors: * [Milán Mondok](https://github.com/mondokm) * [Dániel Szekeres](https://github.com/szdan97) * [László Radnai](https://github.com/radl97) -* [Zsófia Ádam](https://github.com/AdamZsofi) +* [Zsófia Ádám](https://github.com/AdamZsofi) * [Vince Molnár](https://github.com/vincemolnar) +* [Márk Somorjai](https://github.com/s0mark) +* [Csanád Telbisz](https://github.com/csanadtelbisz) diff --git a/build.gradle.kts b/build.gradle.kts index 8c70a92e68..4c4802c7ba 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,6 +2,7 @@ plugins { base id("jacoco-common") id("io.freefair.aggregate-javadoc") version "5.2" + id("io.codearte.nexus-staging") version "0.30.0" apply true } buildscript { @@ -10,8 +11,8 @@ buildscript { } allprojects { - group = "hu.bme.mit.inf.theta" - version = "4.0.0" + group = "hu.bme.mit.theta" + version = "4.2.5" apply(from = rootDir.resolve("gradle/shared-with-buildSrc/mirrors.gradle.kts")) } @@ -51,4 +52,10 @@ tasks { check { dependsOn(test) } + + nexusStaging { + serverUrl = "https://s01.oss.sonatype.org/service/local/" + username = System.getenv("OSSRH_USERNAME") + password = System.getenv("OSSRH_PASSWORD") + } } diff --git a/buildSrc/src/main/kotlin/java-common.gradle.kts b/buildSrc/src/main/kotlin/java-common.gradle.kts index e97953fe18..9f59135fdf 100644 --- a/buildSrc/src/main/kotlin/java-common.gradle.kts +++ b/buildSrc/src/main/kotlin/java-common.gradle.kts @@ -1,5 +1,6 @@ apply() apply(plugin = "jacoco-common") +apply(plugin = "maven-artifact") dependencies { val implementation: Configuration by configurations diff --git a/buildSrc/src/main/kotlin/maven-artifact.gradle.kts b/buildSrc/src/main/kotlin/maven-artifact.gradle.kts new file mode 100644 index 0000000000..5bd350ce48 --- /dev/null +++ b/buildSrc/src/main/kotlin/maven-artifact.gradle.kts @@ -0,0 +1,95 @@ +plugins { + `java-library` + `maven-publish` + signing +} + +open class MavenArtifactExtension(project: Project) { + var artifactId: String = project.name + var name: String = project.name.split("-").joinToString(" ", transform = String::capitalize) + var description: String = project.name.split("-").let{ it.subList(1, it.size).joinToString(" ", transform = String::capitalize) } + " subproject in the Theta model checking framework" + var url: String = "https://theta.mit.bme.hu/" + var licenseName: String = "The Apache License, Version 2.0" + var licenseUrl: String = "http://www.apache.org/licenses/LICENSE-2.0.txt" + var connection: String = "scm:git:git://github.com/ftsrg/theta.git" + var developerConnection: String = "scm:git:ssh://github.com:ftsrg/theta.git" +} + +val artifactConfig = extensions.create("maven-artifact", project) + +java { + withJavadocJar() + withSourcesJar() +} +tasks { + publishing { + publications { + create("mavenJava") { + artifactId = artifactConfig.artifactId + from(components["java"]) + versionMapping { + usage("java-api") { + fromResolutionOf("runtimeClasspath") + } + usage("java-runtime") { + fromResolutionResult() + } + } + pom { + name.set(artifactConfig.name) + description.set(artifactConfig.description) + url.set(artifactConfig.url) + licenses { + license { + name.set(artifactConfig.licenseName) + url.set(artifactConfig.licenseUrl) + } + } + developers { + val contribFile = project.rootProject.rootDir.toPath().resolve("CONTRIBUTORS.md").toFile() + if (contribFile.exists()) { + contribFile.readLines().forEach { line -> + "\\* \\[(.*)]\\((.*)\\)".toRegex().matchEntire(line)?.let { matchResult -> + val (parsedName, parsedUrl) = matchResult.destructured + developer { + name.set(parsedName) + url.set(parsedUrl) + } + } + } + } + } + scm { + connection.set(artifactConfig.connection) + developerConnection.set(artifactConfig.developerConnection) + url.set(artifactConfig.url) + } + } + } + } + repositories { + maven { + val releasesRepoUrl = uri("https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/") + val snapshotsRepoUrl = uri("https://s01.oss.sonatype.org/content/repositories/snapshots/") + url = if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl + credentials{ + username = System.getenv("OSSRH_USERNAME") + password = System.getenv("OSSRH_PASSWORD") + } + } + } + } +} + +signing { + val key = System.getenv("PGP_KEY") + val pwd = System.getenv("PGP_PWD") + useInMemoryPgpKeys(key, pwd) + sign(publishing.publications["mavenJava"]) +} + +tasks.javadoc { + if (JavaVersion.current().isJava9Compatible) { + (options as StandardJavadocDocletOptions).addBooleanOption("html5", true) + } +} \ No newline at end of file diff --git a/doc/Build.md b/doc/Build.md index 129cfcf174..47c6186650 100644 --- a/doc/Build.md +++ b/doc/Build.md @@ -2,8 +2,8 @@ Theta uses Java (JDK) 17 with [Gradle 7.4](https://gradle.org/) as a build system. Currently, we use [OpenJDK 17](https://openjdk.java.net/projects/jdk/17/) (see instructions for [Windows](https://java.tutorials24x7.com/blog/how-to-install-openjdk-17-on-windows) and [Ubuntu](https://www.linuxuprising.com/2019/04/install-latest-openjdk-12-11-or-8-in.html)). -We are developing Theta both on Linux and Windows. -Currently, floating point types are only fully supported on Linux. Windows support is experimental and can cause cryptic exceptions to occur in native code. +We are developing Theta on Linux, Windows and MacOS _(10.15.7)_. +Currently, floating point types are only fully supported on Linux and MacOS. Windows support is experimental and can cause cryptic exceptions to occur in native code. Theta can be built from the command line, but you can also import it into [IntelliJ IDEA](https://www.jetbrains.com/idea/). Unfortunately, Eclipse [does not support](https://github.com/eclipse/buildship/issues/222) Gradle projects with Kotlin build scripts (yet). @@ -12,15 +12,19 @@ Unfortunately, Eclipse [does not support](https://github.com/eclipse/buildship/i Theta has some external dependencies that may need to be obtained/installed depending on what parts of the framework you are working with. **Z3 SMT Solver:** -The libraries for the Z3 solver (version 4.5.0) are included in the _lib_ directory, both for Windows and Ubuntu (64 bit). +The libraries for the Z3 solver (version 4.5.0) are included in the _lib_ directory, for Windows, Ubuntu (64 bit) and MacOS. However, on Windows, _libz3.dll_ also requires some libraries from the [Microsoft Visual C++ Redistributable package](https://www.microsoft.com/en-us/download/details.aspx?id=48145) that we could not include due to licensing. Install it, or just execute `Download-VCredist.ps1`, which will download the required libraries. +On MacOS, _libz3.dylib_ and _libz3java.dylib_ need to be on `DYLD_LIBRARY_PATH`. If you have a different OS, you should download the appropriate [Z3 binary for version 4.5.0](https://github.com/Z3Prover/z3/releases/tag/z3-4.5.0). These libraries should be available on `PATH` for the executable tools. *Troubleshooting*: * If Z3 gives an assertion error (unreachable code reached), your Z3 version may not be correct. +**MPFR:** +For floating point support on MacOS, _libmpfr_java-1.4.jnilib_ and _libmpfr.dylib_ (as _libmpfr.4.dylib_) need to be on `DYLD_LIBRARY_PATH`. Additionally, _libmpfr_java-1.4.jnilib_ needs to linked as _libmpfr_java.jnilib_ onto both `DYLD_LIBRARY_PATH` and `java.library.path`. + **GraphViz:** Theta can export graphs in _dot_ format and automatically convert them to images. For this, [GraphViz](http://www.graphviz.org/) has to be installed and _dot_ (or _dot.exe_ on Windows) has to be on the `PATH`. diff --git a/doc/wiki/docs/index.md b/doc/wiki/docs/index.md new file mode 100644 index 0000000000..36d18a60f8 --- /dev/null +++ b/doc/wiki/docs/index.md @@ -0,0 +1 @@ +Welcome to the theta wiki! diff --git a/doc/wiki/mkdocs.yml b/doc/wiki/mkdocs.yml new file mode 100644 index 0000000000..396dff97a6 --- /dev/null +++ b/doc/wiki/mkdocs.yml @@ -0,0 +1,10 @@ +site_name: Theta +docs_dir: 'docs' + +markdown_extensions: + - mdx_math: + enable_dollar_delimiter: True + +theme: material +extra_javascript: + - https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML diff --git a/lib/libmpfr.dylib b/lib/libmpfr.dylib new file mode 100755 index 0000000000..f912692741 Binary files /dev/null and b/lib/libmpfr.dylib differ diff --git a/lib/libmpfr_java-1.4.jnilib b/lib/libmpfr_java-1.4.jnilib new file mode 100755 index 0000000000..ae1d1aebdf Binary files /dev/null and b/lib/libmpfr_java-1.4.jnilib differ diff --git a/lib/libz3.dylib b/lib/libz3.dylib new file mode 100755 index 0000000000..8b9b1c4a59 Binary files /dev/null and b/lib/libz3.dylib differ diff --git a/lib/libz3java.dylib b/lib/libz3java.dylib new file mode 100755 index 0000000000..c3744990e2 Binary files /dev/null and b/lib/libz3java.dylib differ diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/PorLts.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/PorLts.java new file mode 100644 index 0000000000..34787ca6ad --- /dev/null +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/algorithm/PorLts.java @@ -0,0 +1,268 @@ +/* + * Copyright 2022 Budapest University of Technology and Economics + * + * 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. + */ + +package hu.bme.mit.theta.analysis.algorithm; + +import hu.bme.mit.theta.analysis.Action; +import hu.bme.mit.theta.analysis.LTS; +import hu.bme.mit.theta.analysis.State; +import hu.bme.mit.theta.core.decl.Decl; +import hu.bme.mit.theta.core.type.Type; + +import java.util.*; +import java.util.function.Predicate; + +/** + * LTS with a POR (Partial Order Reduction) algorithm applied as a filter when returning enabled actions. + * + * @param the type of the state + * @param the type of the action (transition in the state space) + * @param the type of the transition in the original formalism + */ +public abstract class PorLts implements LTS { + + /* CACHE COLLECTIONS */ + + /** + * Shared objects (~global variables) used by a transition. + */ + private final HashMap>> usedSharedObjects = new HashMap<>(); + + /** + * Shared objects (~global variables) that are used by the key transition or by transitions reachable from the + * current state via a given transition. + */ + private final HashMap>> influencedSharedObjects = new HashMap<>(); + + /** + * Backward transitions in the transition system (a transition of a loop). + */ + protected final Set backwardTransitions = new HashSet<>(); + + + /** + * Returns the enabled actions in the ARG from the given state filtered with a POR algorithm. + * + * @param state the state whose enabled actions we would like to know + * @return the enabled actions + */ + @Override + public Collection getEnabledActionsFor(S state) { + // Collecting enabled actions + Collection allEnabledActions = getAllEnabledActionsFor(state); + + // Calculating the persistent set starting from every (or some of the) enabled transition; the minimal persistent set is stored + Collection minimalPersistentSet = new HashSet<>(); + Collection persistentSetFirstActions = getPersistentSetFirstActions(allEnabledActions); + for (A firstAction : persistentSetFirstActions) { + Collection persistentSet = calculatePersistentSet(allEnabledActions, firstAction); + if (minimalPersistentSet.size() == 0 || persistentSet.size() < minimalPersistentSet.size()) { + minimalPersistentSet = persistentSet; + } + } + + return minimalPersistentSet; + } + + /** + * Calculates a persistent set of enabled actions starting from a particular action. + * + * @param enabledActions the enabled actions in the present state + * @param firstAction the action who will be added to the persistent set as the first action + * @return the persistent set of enabled actions + */ + protected Collection calculatePersistentSet(Collection enabledActions, A firstAction) { + if (isBackwardAction(firstAction)) { + return new HashSet<>(enabledActions); + } + + Set persistentSet = new HashSet<>(); + Set otherActions = new HashSet<>(enabledActions); // actions not in the persistent set + persistentSet.add(firstAction); + otherActions.remove(firstAction); + + boolean addedNewAction = true; + while (addedNewAction) { + addedNewAction = false; + Set actionsToRemove = new HashSet<>(); + for (A action : otherActions) { + // for every action that is not in the persistent set it is checked whether it should be added to the persistent set + // (because it is dependent with an action already in the persistent set) + if (persistentSet.stream().anyMatch(persistentSetAction -> areDependents(persistentSetAction, action))) { + if (isBackwardAction(action)) { + return new HashSet<>(enabledActions); // see POR algorithm for the reason of removing backward transitions + } + + persistentSet.add(action); + actionsToRemove.add(action); + addedNewAction = true; + } + } + actionsToRemove.forEach(otherActions::remove); + } + + return persistentSet; + } + + /** + * Returns all the enabled actions in a state. + * + * @param state the state whose enabled actions are to be returned + * @return the enabled actions in the state + */ + protected abstract Collection getAllEnabledActionsFor(S state); + + /** + * Returns the actions from where persistent sets will be calculated (a subset of the given enabled actions). + * The default implementation returns all enabled actions. + * + * @param allEnabledActions all the enabled actions in the present state + * @return the actions from where persistent sets will be calculated + */ + protected Collection getPersistentSetFirstActions(Collection allEnabledActions) { + return allEnabledActions; + } + + /** + * Determines whether an action is dependent with another one (based on the notions introduced for the POR + * algorithm) already in the persistent set. + * + * @param persistentSetAction the action in the persistent set + * @param action the other action (not in the persistent set) + * @return true, if the two actions are dependent in the context of persistent sets + */ + protected boolean areDependents(A persistentSetAction, A action) { + return canEnOrDisableEachOther(persistentSetAction, action) || + getInfluencedSharedObjects(getTransitionOf(action)).stream().anyMatch(varDecl -> + getCachedUsedSharedObjects(getTransitionOf(persistentSetAction)).contains(varDecl)); + } + + /** + * Determines whether two actions can enable or disable each other (if true, the two actions are dependent). + * + * @param action1 action 1 + * @param action2 action 2 + * @return true, if the two actions can enable or disable each other + */ + protected abstract boolean canEnOrDisableEachOther(A action1, A action2); + + /** + * Determines whether the given action is a backward action. + * + * @param action the action to be classified as backward action or non-backward action + * @return true, if the action is a backward action + */ + protected boolean isBackwardAction(A action) { + return backwardTransitions.contains(getTransitionOf(action)); + } + + /** + * Get the original transition of an action (from which the action has been created). + * + * @param action whose original transition is to be returned + * @return the original transition + */ + protected abstract T getTransitionOf(A action); + + /** + * Returns the successive transitions of a transition (transitions whose source is the target of the given + * parameter). + * + * @param transition whose successive transitions is to be returned + * @return the successive transitions of the transition given as the parameter + */ + protected abstract Set getSuccessiveTransitions(T transition); + + + /** + * Returns the shared objects (~global variables) that an action uses (it is present in one of its labels). + * + * @param transition whose shared objects are to be returned + * @return the set of used shared objects + */ + protected abstract Set> getDirectlyUsedSharedObjects(T transition); + + /** + * Returns the shared objects (~global variables) that an action uses. + * + * @param transition whose shared objects are to be returned + * @return the set of directly or indirectly used shared objects + */ + protected Set> getUsedSharedObjects(T transition) { + return getDirectlyUsedSharedObjects(transition); + } + + /** + * Same as {@link PorLts#getUsedSharedObjects(T transition)} with an additional cache layer. + * + * @param transition whose shared objects are to be returned + * @return the set of directly or indirectly used shared objects + */ + private Set> getCachedUsedSharedObjects(T transition) { + if (!usedSharedObjects.containsKey(transition)) { + Set> vars = getUsedSharedObjects(transition); + usedSharedObjects.put(transition, vars); + } + return usedSharedObjects.get(transition); + } + + /** + * Returns the shared objects (~global variables) used by the given transition or by transitions that are reachable + * via the given transition ("influenced shared objects"). + * + * @param transition whose successor transitions' shared objects are to be returned. + * @return the set of influenced shared objects + */ + protected Set> getInfluencedSharedObjects(T transition) { + if (!influencedSharedObjects.containsKey(transition)) { + influencedSharedObjects.put(transition, getSharedObjectsWithBFS(transition, t -> true)); + } + return influencedSharedObjects.get(transition); + } + + /** + * Returns shared objects (~global variables) encountered in a search starting from a given transition. + * + * @param startTransition the start point (transition) of the search + * @param visitTransition the predicate that tells whether a transition has to be explored + * @return the set of encountered shared objects + */ + protected Set> getSharedObjectsWithBFS(T startTransition, Predicate visitTransition) { + Set> vars = new HashSet<>(); + List exploredTransitions = new ArrayList<>(); + List transitionsToExplore = new ArrayList<>(); + transitionsToExplore.add(startTransition); + + while (!transitionsToExplore.isEmpty()) { + T exploring = transitionsToExplore.remove(0); + vars.addAll(getDirectlyUsedSharedObjects(exploring)); + Set successiveTransitions = getSuccessiveTransitions(exploring); + + for (var newTransition : successiveTransitions) { + if (!exploredTransitions.contains(newTransition) && visitTransition.test(newTransition)) { + transitionsToExplore.add(newTransition); + } + } + exploredTransitions.add(exploring); + } + return vars; + } + + /** + * Collects backward transitions of the transition system. + */ + protected abstract void collectBackwardTransitions(); +} diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod2/Prod2Prec.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod2/Prod2Prec.java index 14edf62a89..b6815b9649 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod2/Prod2Prec.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod2/Prod2Prec.java @@ -56,7 +56,7 @@ public int hashCode() { result = HASH_SEED; result = 37 * result + prec1.hashCode(); result = 37 * result + prec2.hashCode(); - result = hashCode; + hashCode = result; } return result; } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod2/Prod2State.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod2/Prod2State.java index 37c327c4b4..0f4ac114bd 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod2/Prod2State.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod2/Prod2State.java @@ -157,7 +157,7 @@ public int hashCode() { result = HASH_SEED; result = 37 * result + state1.hashCode(); result = 37 * result + state2.hashCode(); - result = hashCode; + hashCode = result; } return result; } @@ -214,7 +214,7 @@ public final int hashCode() { result = HASH_SEED; result = 37 * result + getIndex(); result = 37 * result + getState().hashCode(); - result = hashCode; + hashCode = result; } return result; } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod3/Prod3Prec.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod3/Prod3Prec.java index 1d76aa852a..75757c4380 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod3/Prod3Prec.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod3/Prod3Prec.java @@ -64,7 +64,7 @@ public int hashCode() { result = 37 * result + prec1.hashCode(); result = 37 * result + prec2.hashCode(); result = 37 * result + prec3.hashCode(); - result = hashCode; + hashCode = result; } return result; } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod3/Prod3State.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod3/Prod3State.java index 1074c027a4..f1d4eb4375 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod3/Prod3State.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod3/Prod3State.java @@ -204,7 +204,7 @@ public int hashCode() { result = 37 * result + state1.hashCode(); result = 37 * result + state2.hashCode(); result = 37 * result + state3.hashCode(); - result = hashCode; + hashCode = result; } return result; } @@ -264,7 +264,7 @@ public final int hashCode() { result = HASH_SEED; result = 37 * result + getIndex(); result = 37 * result + getState().hashCode(); - result = hashCode; + hashCode = result; } return result; } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod4/Prod4Prec.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod4/Prod4Prec.java index fdb691461e..f9106a1def 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod4/Prod4Prec.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod4/Prod4Prec.java @@ -71,7 +71,7 @@ public int hashCode() { result = 37 * result + prec2.hashCode(); result = 37 * result + prec3.hashCode(); result = 37 * result + prec4.hashCode(); - result = hashCode; + hashCode = result; } return result; } diff --git a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod4/Prod4State.java b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod4/Prod4State.java index b603e01692..7795f12227 100644 --- a/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod4/Prod4State.java +++ b/subprojects/common/analysis/src/main/java/hu/bme/mit/theta/analysis/prod4/Prod4State.java @@ -246,7 +246,7 @@ public int hashCode() { result = 37 * result + state2.hashCode(); result = 37 * result + state3.hashCode(); result = 37 * result + state4.hashCode(); - result = hashCode; + hashCode = result; } return result; } @@ -306,7 +306,7 @@ public final int hashCode() { result = HASH_SEED; result = 37 * result + getIndex(); result = 37 * result + getState().hashCode(); - result = hashCode; + hashCode = result; } return result; } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.java index 05b307a406..bb09e4e7ca 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.java +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/type/UnaryExpr.java @@ -64,7 +64,7 @@ public final int hashCode() { if (result == 0) { result = getHashSeed(); result = 37 * result + getOp().hashCode(); - result = hashCode; + hashCode = result; } return result; } diff --git a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java index 16c42d6fdc..b449c6579e 100644 --- a/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java +++ b/subprojects/common/core/src/main/java/hu/bme/mit/theta/core/utils/ExprSimplifier.java @@ -1174,7 +1174,7 @@ private static Expr simplifyBvConcat(final BvConcatExpr expr, final Valu } else { value = value.concat(litOp); } - iterator.remove(); +// iterator.remove(); } else { return expr.withOps(ops); } diff --git a/subprojects/common/grammar/src/main/gen/CommonTokens.interp b/subprojects/common/grammar/src/main/gen/CommonTokens.interp new file mode 100644 index 0000000000..4d5136f69e --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/CommonTokens.interp @@ -0,0 +1,365 @@ +token literal names: +null +null +null +null +null +null +null +null +'if' +'then' +'else' +'iff' +'ite' +'=>' +'forall' +'exists' +'or' +'and' +'xor' +'not' +'=' +'/=' +'<' +'<=' +'>' +'>=' +'+' +'-' +'*' +'div' +'mod' +'rem' +'%' +null +'bv_zero_extend' +'bv_sign_extend' +'bvadd' +'bvsub' +'bvpos' +'bvneg' +'bvmul' +'bvudiv' +'bvsdiv' +'bvsmod' +'bvurem' +'bvsrem' +'bvor' +'bvand' +'bvxor' +'bvnot' +'bvshl' +'bvashr' +'bvlshr' +'bvrol' +'bvror' +'bvult' +'bvule' +'bvugt' +'bvuge' +'bvslt' +'bvsle' +'bvsgt' +'bvsge' +'fpabs' +null +'fpisnan' +'fpmax' +'fpmin' +'fprem' +null +null +null +null +'fpsub' +null +'fpmul' +null +'fppos' +'fpneg' +'true' +'read' +'write' +'prime' +'extract' +null +null +null +'false' +'default' +'assign' +'havoc' +'assume' +'return' +null +null +null +null +'.' +null +'_' +null +null +'(' +')' +'[' +']' +'{' +'}' +',' +':' +';' +'\'' +'<-' +'->' +null +null +null + +token symbolic names: +null +BOOLTYPE +INTTYPE +RATTYPE +BVTYPE +FPTYPE +FUNC +ARRAY +IF +THEN +ELSE +IFF +ITE +IMPLY +FORALL +EXISTS +OR +AND +XOR +NOT +EQ +NEQ +LT +LEQ +GT +GEQ +PLUS +MINUS +MUL +DIV +MOD +REM +PERCENT +BV_CONCAT +BV_ZERO_EXTEND +BV_SIGN_EXTEND +BV_ADD +BV_SUB +BV_POS +BV_NEG +BV_MUL +BV_UDIV +BV_SDIV +BV_SMOD +BV_UREM +BV_SREM +BV_OR +BV_AND +BV_XOR +BV_NOT +BV_SHL +BV_ASHR +BV_LSHR +BV_ROL +BV_ROR +BV_ULT +BV_ULE +BV_UGT +BV_UGE +BV_SLT +BV_SLE +BV_SGT +BV_SGE +FP_ABS +FP_FROM_BV +FP_IS_NAN +FPMAX +FPMIN +FPREM +FPROUNDTOINT +FPSQRT +FPTOBV +FPTOFP +FPSUB +FPADD +FPMUL +FPDIV +FPPOS +FPNEG +TRUE +READ +WRITE +PRIME +EXTRACT +BV_TYPE_DECL +FP_TYPE_DECL +FP_ROUNDINGMODE +FALSE +DEFAULT +ASSIGN +HAVOC +ASSUME +RETURN +BV +INT +NAT +SIGN +DOT +ID +UNDERSCORE +DIGIT +LETTER +LPAREN +RPAREN +LBRACK +RBRACK +LBRAC +RBRAC +COMMA +COLON +SEMICOLON +QUOT +LARROW +RARROW +WS +COMMENT +LINE_COMMENT + +rule names: +BOOLTYPE +INTTYPE +RATTYPE +BVTYPE +FPTYPE +FUNC +ARRAY +IF +THEN +ELSE +IFF +ITE +IMPLY +FORALL +EXISTS +OR +AND +XOR +NOT +EQ +NEQ +LT +LEQ +GT +GEQ +PLUS +MINUS +MUL +DIV +MOD +REM +PERCENT +BV_CONCAT +BV_ZERO_EXTEND +BV_SIGN_EXTEND +BV_ADD +BV_SUB +BV_POS +BV_NEG +BV_MUL +BV_UDIV +BV_SDIV +BV_SMOD +BV_UREM +BV_SREM +BV_OR +BV_AND +BV_XOR +BV_NOT +BV_SHL +BV_ASHR +BV_LSHR +BV_ROL +BV_ROR +BV_ULT +BV_ULE +BV_UGT +BV_UGE +BV_SLT +BV_SLE +BV_SGT +BV_SGE +FP_ABS +FP_FROM_BV +FP_IS_NAN +FPMAX +FPMIN +FPREM +FPROUNDTOINT +FPSQRT +FPTOBV +FPTOFP +FPSUB +FPADD +FPMUL +FPDIV +FPPOS +FPNEG +TRUE +READ +WRITE +PRIME +EXTRACT +BV_TYPE_DECL +FP_TYPE_DECL +FP_ROUNDINGMODE +FALSE +DEFAULT +ASSIGN +HAVOC +ASSUME +RETURN +BV +INT +NAT +SIGN +DOT +ID +UNDERSCORE +DIGIT +LETTER +LPAREN +RPAREN +LBRACK +RBRACK +LBRAC +RBRAC +COMMA +COLON +SEMICOLON +QUOT +LARROW +RARROW +WS +COMMENT +LINE_COMMENT + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[4, 0, 116, 993, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 246, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 257, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 268, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 276, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 284, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 298, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 315, 8, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 627, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 669, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 679, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 690, 8, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 701, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 716, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 811, 8, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 859, 8, 92, 11, 92, 12, 92, 860, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 867, 8, 92, 11, 92, 12, 92, 868, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 875, 8, 92, 11, 92, 12, 92, 876, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 3, 92, 885, 8, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 894, 8, 92, 11, 92, 12, 92, 895, 3, 92, 898, 8, 92, 1, 93, 3, 93, 901, 8, 93, 1, 93, 1, 93, 1, 94, 4, 94, 906, 8, 94, 11, 94, 12, 94, 907, 1, 95, 1, 95, 3, 95, 912, 8, 95, 1, 96, 1, 96, 1, 97, 1, 97, 3, 97, 918, 8, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 5, 97, 925, 8, 97, 10, 97, 12, 97, 928, 9, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 108, 1, 108, 1, 109, 1, 109, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 113, 4, 113, 963, 8, 113, 11, 113, 12, 113, 964, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 5, 114, 973, 8, 114, 10, 114, 12, 114, 976, 9, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 5, 115, 987, 8, 115, 10, 115, 12, 115, 990, 9, 115, 1, 115, 1, 115, 1, 974, 0, 116, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 1, 0, 7, 2, 0, 115, 115, 117, 117, 1, 0, 48, 49, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 3, 0, 9, 10, 12, 13, 32, 32, 2, 0, 10, 10, 13, 13, 1038, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 1, 245, 1, 0, 0, 0, 3, 256, 1, 0, 0, 0, 5, 267, 1, 0, 0, 0, 7, 275, 1, 0, 0, 0, 9, 283, 1, 0, 0, 0, 11, 297, 1, 0, 0, 0, 13, 314, 1, 0, 0, 0, 15, 316, 1, 0, 0, 0, 17, 319, 1, 0, 0, 0, 19, 324, 1, 0, 0, 0, 21, 329, 1, 0, 0, 0, 23, 333, 1, 0, 0, 0, 25, 337, 1, 0, 0, 0, 27, 340, 1, 0, 0, 0, 29, 347, 1, 0, 0, 0, 31, 354, 1, 0, 0, 0, 33, 357, 1, 0, 0, 0, 35, 361, 1, 0, 0, 0, 37, 365, 1, 0, 0, 0, 39, 369, 1, 0, 0, 0, 41, 371, 1, 0, 0, 0, 43, 374, 1, 0, 0, 0, 45, 376, 1, 0, 0, 0, 47, 379, 1, 0, 0, 0, 49, 381, 1, 0, 0, 0, 51, 384, 1, 0, 0, 0, 53, 386, 1, 0, 0, 0, 55, 388, 1, 0, 0, 0, 57, 390, 1, 0, 0, 0, 59, 394, 1, 0, 0, 0, 61, 398, 1, 0, 0, 0, 63, 402, 1, 0, 0, 0, 65, 404, 1, 0, 0, 0, 67, 407, 1, 0, 0, 0, 69, 422, 1, 0, 0, 0, 71, 437, 1, 0, 0, 0, 73, 443, 1, 0, 0, 0, 75, 449, 1, 0, 0, 0, 77, 455, 1, 0, 0, 0, 79, 461, 1, 0, 0, 0, 81, 467, 1, 0, 0, 0, 83, 474, 1, 0, 0, 0, 85, 481, 1, 0, 0, 0, 87, 488, 1, 0, 0, 0, 89, 495, 1, 0, 0, 0, 91, 502, 1, 0, 0, 0, 93, 507, 1, 0, 0, 0, 95, 513, 1, 0, 0, 0, 97, 519, 1, 0, 0, 0, 99, 525, 1, 0, 0, 0, 101, 531, 1, 0, 0, 0, 103, 538, 1, 0, 0, 0, 105, 545, 1, 0, 0, 0, 107, 551, 1, 0, 0, 0, 109, 557, 1, 0, 0, 0, 111, 563, 1, 0, 0, 0, 113, 569, 1, 0, 0, 0, 115, 575, 1, 0, 0, 0, 117, 581, 1, 0, 0, 0, 119, 587, 1, 0, 0, 0, 121, 593, 1, 0, 0, 0, 123, 599, 1, 0, 0, 0, 125, 605, 1, 0, 0, 0, 127, 611, 1, 0, 0, 0, 129, 628, 1, 0, 0, 0, 131, 636, 1, 0, 0, 0, 133, 642, 1, 0, 0, 0, 135, 648, 1, 0, 0, 0, 137, 654, 1, 0, 0, 0, 139, 670, 1, 0, 0, 0, 141, 680, 1, 0, 0, 0, 143, 691, 1, 0, 0, 0, 145, 702, 1, 0, 0, 0, 147, 708, 1, 0, 0, 0, 149, 717, 1, 0, 0, 0, 151, 723, 1, 0, 0, 0, 153, 731, 1, 0, 0, 0, 155, 737, 1, 0, 0, 0, 157, 743, 1, 0, 0, 0, 159, 748, 1, 0, 0, 0, 161, 753, 1, 0, 0, 0, 163, 759, 1, 0, 0, 0, 165, 765, 1, 0, 0, 0, 167, 773, 1, 0, 0, 0, 169, 779, 1, 0, 0, 0, 171, 810, 1, 0, 0, 0, 173, 812, 1, 0, 0, 0, 175, 818, 1, 0, 0, 0, 177, 826, 1, 0, 0, 0, 179, 833, 1, 0, 0, 0, 181, 839, 1, 0, 0, 0, 183, 846, 1, 0, 0, 0, 185, 897, 1, 0, 0, 0, 187, 900, 1, 0, 0, 0, 189, 905, 1, 0, 0, 0, 191, 911, 1, 0, 0, 0, 193, 913, 1, 0, 0, 0, 195, 917, 1, 0, 0, 0, 197, 929, 1, 0, 0, 0, 199, 931, 1, 0, 0, 0, 201, 933, 1, 0, 0, 0, 203, 935, 1, 0, 0, 0, 205, 937, 1, 0, 0, 0, 207, 939, 1, 0, 0, 0, 209, 941, 1, 0, 0, 0, 211, 943, 1, 0, 0, 0, 213, 945, 1, 0, 0, 0, 215, 947, 1, 0, 0, 0, 217, 949, 1, 0, 0, 0, 219, 951, 1, 0, 0, 0, 221, 953, 1, 0, 0, 0, 223, 955, 1, 0, 0, 0, 225, 958, 1, 0, 0, 0, 227, 962, 1, 0, 0, 0, 229, 968, 1, 0, 0, 0, 231, 982, 1, 0, 0, 0, 233, 234, 5, 98, 0, 0, 234, 235, 5, 111, 0, 0, 235, 236, 5, 111, 0, 0, 236, 246, 5, 108, 0, 0, 237, 238, 5, 66, 0, 0, 238, 239, 5, 111, 0, 0, 239, 240, 5, 111, 0, 0, 240, 246, 5, 108, 0, 0, 241, 242, 5, 66, 0, 0, 242, 243, 5, 79, 0, 0, 243, 244, 5, 79, 0, 0, 244, 246, 5, 76, 0, 0, 245, 233, 1, 0, 0, 0, 245, 237, 1, 0, 0, 0, 245, 241, 1, 0, 0, 0, 246, 2, 1, 0, 0, 0, 247, 248, 5, 105, 0, 0, 248, 249, 5, 110, 0, 0, 249, 257, 5, 116, 0, 0, 250, 251, 5, 73, 0, 0, 251, 252, 5, 110, 0, 0, 252, 257, 5, 116, 0, 0, 253, 254, 5, 73, 0, 0, 254, 255, 5, 78, 0, 0, 255, 257, 5, 84, 0, 0, 256, 247, 1, 0, 0, 0, 256, 250, 1, 0, 0, 0, 256, 253, 1, 0, 0, 0, 257, 4, 1, 0, 0, 0, 258, 259, 5, 114, 0, 0, 259, 260, 5, 97, 0, 0, 260, 268, 5, 116, 0, 0, 261, 262, 5, 82, 0, 0, 262, 263, 5, 97, 0, 0, 263, 268, 5, 116, 0, 0, 264, 265, 5, 82, 0, 0, 265, 266, 5, 65, 0, 0, 266, 268, 5, 84, 0, 0, 267, 258, 1, 0, 0, 0, 267, 261, 1, 0, 0, 0, 267, 264, 1, 0, 0, 0, 268, 6, 1, 0, 0, 0, 269, 270, 5, 98, 0, 0, 270, 276, 5, 118, 0, 0, 271, 272, 5, 66, 0, 0, 272, 276, 5, 118, 0, 0, 273, 274, 5, 66, 0, 0, 274, 276, 5, 86, 0, 0, 275, 269, 1, 0, 0, 0, 275, 271, 1, 0, 0, 0, 275, 273, 1, 0, 0, 0, 276, 8, 1, 0, 0, 0, 277, 278, 5, 102, 0, 0, 278, 284, 5, 112, 0, 0, 279, 280, 5, 70, 0, 0, 280, 284, 5, 112, 0, 0, 281, 282, 5, 70, 0, 0, 282, 284, 5, 80, 0, 0, 283, 277, 1, 0, 0, 0, 283, 279, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 284, 10, 1, 0, 0, 0, 285, 286, 5, 102, 0, 0, 286, 287, 5, 117, 0, 0, 287, 288, 5, 110, 0, 0, 288, 298, 5, 99, 0, 0, 289, 290, 5, 70, 0, 0, 290, 291, 5, 117, 0, 0, 291, 292, 5, 110, 0, 0, 292, 298, 5, 99, 0, 0, 293, 294, 5, 70, 0, 0, 294, 295, 5, 85, 0, 0, 295, 296, 5, 78, 0, 0, 296, 298, 5, 67, 0, 0, 297, 285, 1, 0, 0, 0, 297, 289, 1, 0, 0, 0, 297, 293, 1, 0, 0, 0, 298, 12, 1, 0, 0, 0, 299, 300, 5, 97, 0, 0, 300, 301, 5, 114, 0, 0, 301, 302, 5, 114, 0, 0, 302, 303, 5, 97, 0, 0, 303, 315, 5, 121, 0, 0, 304, 305, 5, 65, 0, 0, 305, 306, 5, 114, 0, 0, 306, 307, 5, 114, 0, 0, 307, 308, 5, 97, 0, 0, 308, 315, 5, 121, 0, 0, 309, 310, 5, 65, 0, 0, 310, 311, 5, 82, 0, 0, 311, 312, 5, 82, 0, 0, 312, 313, 5, 65, 0, 0, 313, 315, 5, 89, 0, 0, 314, 299, 1, 0, 0, 0, 314, 304, 1, 0, 0, 0, 314, 309, 1, 0, 0, 0, 315, 14, 1, 0, 0, 0, 316, 317, 5, 105, 0, 0, 317, 318, 5, 102, 0, 0, 318, 16, 1, 0, 0, 0, 319, 320, 5, 116, 0, 0, 320, 321, 5, 104, 0, 0, 321, 322, 5, 101, 0, 0, 322, 323, 5, 110, 0, 0, 323, 18, 1, 0, 0, 0, 324, 325, 5, 101, 0, 0, 325, 326, 5, 108, 0, 0, 326, 327, 5, 115, 0, 0, 327, 328, 5, 101, 0, 0, 328, 20, 1, 0, 0, 0, 329, 330, 5, 105, 0, 0, 330, 331, 5, 102, 0, 0, 331, 332, 5, 102, 0, 0, 332, 22, 1, 0, 0, 0, 333, 334, 5, 105, 0, 0, 334, 335, 5, 116, 0, 0, 335, 336, 5, 101, 0, 0, 336, 24, 1, 0, 0, 0, 337, 338, 5, 61, 0, 0, 338, 339, 5, 62, 0, 0, 339, 26, 1, 0, 0, 0, 340, 341, 5, 102, 0, 0, 341, 342, 5, 111, 0, 0, 342, 343, 5, 114, 0, 0, 343, 344, 5, 97, 0, 0, 344, 345, 5, 108, 0, 0, 345, 346, 5, 108, 0, 0, 346, 28, 1, 0, 0, 0, 347, 348, 5, 101, 0, 0, 348, 349, 5, 120, 0, 0, 349, 350, 5, 105, 0, 0, 350, 351, 5, 115, 0, 0, 351, 352, 5, 116, 0, 0, 352, 353, 5, 115, 0, 0, 353, 30, 1, 0, 0, 0, 354, 355, 5, 111, 0, 0, 355, 356, 5, 114, 0, 0, 356, 32, 1, 0, 0, 0, 357, 358, 5, 97, 0, 0, 358, 359, 5, 110, 0, 0, 359, 360, 5, 100, 0, 0, 360, 34, 1, 0, 0, 0, 361, 362, 5, 120, 0, 0, 362, 363, 5, 111, 0, 0, 363, 364, 5, 114, 0, 0, 364, 36, 1, 0, 0, 0, 365, 366, 5, 110, 0, 0, 366, 367, 5, 111, 0, 0, 367, 368, 5, 116, 0, 0, 368, 38, 1, 0, 0, 0, 369, 370, 5, 61, 0, 0, 370, 40, 1, 0, 0, 0, 371, 372, 5, 47, 0, 0, 372, 373, 5, 61, 0, 0, 373, 42, 1, 0, 0, 0, 374, 375, 5, 60, 0, 0, 375, 44, 1, 0, 0, 0, 376, 377, 5, 60, 0, 0, 377, 378, 5, 61, 0, 0, 378, 46, 1, 0, 0, 0, 379, 380, 5, 62, 0, 0, 380, 48, 1, 0, 0, 0, 381, 382, 5, 62, 0, 0, 382, 383, 5, 61, 0, 0, 383, 50, 1, 0, 0, 0, 384, 385, 5, 43, 0, 0, 385, 52, 1, 0, 0, 0, 386, 387, 5, 45, 0, 0, 387, 54, 1, 0, 0, 0, 388, 389, 5, 42, 0, 0, 389, 56, 1, 0, 0, 0, 390, 391, 5, 100, 0, 0, 391, 392, 5, 105, 0, 0, 392, 393, 5, 118, 0, 0, 393, 58, 1, 0, 0, 0, 394, 395, 5, 109, 0, 0, 395, 396, 5, 111, 0, 0, 396, 397, 5, 100, 0, 0, 397, 60, 1, 0, 0, 0, 398, 399, 5, 114, 0, 0, 399, 400, 5, 101, 0, 0, 400, 401, 5, 109, 0, 0, 401, 62, 1, 0, 0, 0, 402, 403, 5, 37, 0, 0, 403, 64, 1, 0, 0, 0, 404, 405, 3, 51, 25, 0, 405, 406, 3, 51, 25, 0, 406, 66, 1, 0, 0, 0, 407, 408, 5, 98, 0, 0, 408, 409, 5, 118, 0, 0, 409, 410, 5, 95, 0, 0, 410, 411, 5, 122, 0, 0, 411, 412, 5, 101, 0, 0, 412, 413, 5, 114, 0, 0, 413, 414, 5, 111, 0, 0, 414, 415, 5, 95, 0, 0, 415, 416, 5, 101, 0, 0, 416, 417, 5, 120, 0, 0, 417, 418, 5, 116, 0, 0, 418, 419, 5, 101, 0, 0, 419, 420, 5, 110, 0, 0, 420, 421, 5, 100, 0, 0, 421, 68, 1, 0, 0, 0, 422, 423, 5, 98, 0, 0, 423, 424, 5, 118, 0, 0, 424, 425, 5, 95, 0, 0, 425, 426, 5, 115, 0, 0, 426, 427, 5, 105, 0, 0, 427, 428, 5, 103, 0, 0, 428, 429, 5, 110, 0, 0, 429, 430, 5, 95, 0, 0, 430, 431, 5, 101, 0, 0, 431, 432, 5, 120, 0, 0, 432, 433, 5, 116, 0, 0, 433, 434, 5, 101, 0, 0, 434, 435, 5, 110, 0, 0, 435, 436, 5, 100, 0, 0, 436, 70, 1, 0, 0, 0, 437, 438, 5, 98, 0, 0, 438, 439, 5, 118, 0, 0, 439, 440, 5, 97, 0, 0, 440, 441, 5, 100, 0, 0, 441, 442, 5, 100, 0, 0, 442, 72, 1, 0, 0, 0, 443, 444, 5, 98, 0, 0, 444, 445, 5, 118, 0, 0, 445, 446, 5, 115, 0, 0, 446, 447, 5, 117, 0, 0, 447, 448, 5, 98, 0, 0, 448, 74, 1, 0, 0, 0, 449, 450, 5, 98, 0, 0, 450, 451, 5, 118, 0, 0, 451, 452, 5, 112, 0, 0, 452, 453, 5, 111, 0, 0, 453, 454, 5, 115, 0, 0, 454, 76, 1, 0, 0, 0, 455, 456, 5, 98, 0, 0, 456, 457, 5, 118, 0, 0, 457, 458, 5, 110, 0, 0, 458, 459, 5, 101, 0, 0, 459, 460, 5, 103, 0, 0, 460, 78, 1, 0, 0, 0, 461, 462, 5, 98, 0, 0, 462, 463, 5, 118, 0, 0, 463, 464, 5, 109, 0, 0, 464, 465, 5, 117, 0, 0, 465, 466, 5, 108, 0, 0, 466, 80, 1, 0, 0, 0, 467, 468, 5, 98, 0, 0, 468, 469, 5, 118, 0, 0, 469, 470, 5, 117, 0, 0, 470, 471, 5, 100, 0, 0, 471, 472, 5, 105, 0, 0, 472, 473, 5, 118, 0, 0, 473, 82, 1, 0, 0, 0, 474, 475, 5, 98, 0, 0, 475, 476, 5, 118, 0, 0, 476, 477, 5, 115, 0, 0, 477, 478, 5, 100, 0, 0, 478, 479, 5, 105, 0, 0, 479, 480, 5, 118, 0, 0, 480, 84, 1, 0, 0, 0, 481, 482, 5, 98, 0, 0, 482, 483, 5, 118, 0, 0, 483, 484, 5, 115, 0, 0, 484, 485, 5, 109, 0, 0, 485, 486, 5, 111, 0, 0, 486, 487, 5, 100, 0, 0, 487, 86, 1, 0, 0, 0, 488, 489, 5, 98, 0, 0, 489, 490, 5, 118, 0, 0, 490, 491, 5, 117, 0, 0, 491, 492, 5, 114, 0, 0, 492, 493, 5, 101, 0, 0, 493, 494, 5, 109, 0, 0, 494, 88, 1, 0, 0, 0, 495, 496, 5, 98, 0, 0, 496, 497, 5, 118, 0, 0, 497, 498, 5, 115, 0, 0, 498, 499, 5, 114, 0, 0, 499, 500, 5, 101, 0, 0, 500, 501, 5, 109, 0, 0, 501, 90, 1, 0, 0, 0, 502, 503, 5, 98, 0, 0, 503, 504, 5, 118, 0, 0, 504, 505, 5, 111, 0, 0, 505, 506, 5, 114, 0, 0, 506, 92, 1, 0, 0, 0, 507, 508, 5, 98, 0, 0, 508, 509, 5, 118, 0, 0, 509, 510, 5, 97, 0, 0, 510, 511, 5, 110, 0, 0, 511, 512, 5, 100, 0, 0, 512, 94, 1, 0, 0, 0, 513, 514, 5, 98, 0, 0, 514, 515, 5, 118, 0, 0, 515, 516, 5, 120, 0, 0, 516, 517, 5, 111, 0, 0, 517, 518, 5, 114, 0, 0, 518, 96, 1, 0, 0, 0, 519, 520, 5, 98, 0, 0, 520, 521, 5, 118, 0, 0, 521, 522, 5, 110, 0, 0, 522, 523, 5, 111, 0, 0, 523, 524, 5, 116, 0, 0, 524, 98, 1, 0, 0, 0, 525, 526, 5, 98, 0, 0, 526, 527, 5, 118, 0, 0, 527, 528, 5, 115, 0, 0, 528, 529, 5, 104, 0, 0, 529, 530, 5, 108, 0, 0, 530, 100, 1, 0, 0, 0, 531, 532, 5, 98, 0, 0, 532, 533, 5, 118, 0, 0, 533, 534, 5, 97, 0, 0, 534, 535, 5, 115, 0, 0, 535, 536, 5, 104, 0, 0, 536, 537, 5, 114, 0, 0, 537, 102, 1, 0, 0, 0, 538, 539, 5, 98, 0, 0, 539, 540, 5, 118, 0, 0, 540, 541, 5, 108, 0, 0, 541, 542, 5, 115, 0, 0, 542, 543, 5, 104, 0, 0, 543, 544, 5, 114, 0, 0, 544, 104, 1, 0, 0, 0, 545, 546, 5, 98, 0, 0, 546, 547, 5, 118, 0, 0, 547, 548, 5, 114, 0, 0, 548, 549, 5, 111, 0, 0, 549, 550, 5, 108, 0, 0, 550, 106, 1, 0, 0, 0, 551, 552, 5, 98, 0, 0, 552, 553, 5, 118, 0, 0, 553, 554, 5, 114, 0, 0, 554, 555, 5, 111, 0, 0, 555, 556, 5, 114, 0, 0, 556, 108, 1, 0, 0, 0, 557, 558, 5, 98, 0, 0, 558, 559, 5, 118, 0, 0, 559, 560, 5, 117, 0, 0, 560, 561, 5, 108, 0, 0, 561, 562, 5, 116, 0, 0, 562, 110, 1, 0, 0, 0, 563, 564, 5, 98, 0, 0, 564, 565, 5, 118, 0, 0, 565, 566, 5, 117, 0, 0, 566, 567, 5, 108, 0, 0, 567, 568, 5, 101, 0, 0, 568, 112, 1, 0, 0, 0, 569, 570, 5, 98, 0, 0, 570, 571, 5, 118, 0, 0, 571, 572, 5, 117, 0, 0, 572, 573, 5, 103, 0, 0, 573, 574, 5, 116, 0, 0, 574, 114, 1, 0, 0, 0, 575, 576, 5, 98, 0, 0, 576, 577, 5, 118, 0, 0, 577, 578, 5, 117, 0, 0, 578, 579, 5, 103, 0, 0, 579, 580, 5, 101, 0, 0, 580, 116, 1, 0, 0, 0, 581, 582, 5, 98, 0, 0, 582, 583, 5, 118, 0, 0, 583, 584, 5, 115, 0, 0, 584, 585, 5, 108, 0, 0, 585, 586, 5, 116, 0, 0, 586, 118, 1, 0, 0, 0, 587, 588, 5, 98, 0, 0, 588, 589, 5, 118, 0, 0, 589, 590, 5, 115, 0, 0, 590, 591, 5, 108, 0, 0, 591, 592, 5, 101, 0, 0, 592, 120, 1, 0, 0, 0, 593, 594, 5, 98, 0, 0, 594, 595, 5, 118, 0, 0, 595, 596, 5, 115, 0, 0, 596, 597, 5, 103, 0, 0, 597, 598, 5, 116, 0, 0, 598, 122, 1, 0, 0, 0, 599, 600, 5, 98, 0, 0, 600, 601, 5, 118, 0, 0, 601, 602, 5, 115, 0, 0, 602, 603, 5, 103, 0, 0, 603, 604, 5, 101, 0, 0, 604, 124, 1, 0, 0, 0, 605, 606, 5, 102, 0, 0, 606, 607, 5, 112, 0, 0, 607, 608, 5, 97, 0, 0, 608, 609, 5, 98, 0, 0, 609, 610, 5, 115, 0, 0, 610, 126, 1, 0, 0, 0, 611, 612, 5, 102, 0, 0, 612, 613, 5, 112, 0, 0, 613, 614, 5, 102, 0, 0, 614, 615, 5, 114, 0, 0, 615, 616, 5, 111, 0, 0, 616, 617, 5, 109, 0, 0, 617, 618, 5, 98, 0, 0, 618, 619, 5, 118, 0, 0, 619, 620, 1, 0, 0, 0, 620, 621, 3, 169, 84, 0, 621, 622, 3, 207, 103, 0, 622, 623, 7, 0, 0, 0, 623, 624, 3, 209, 104, 0, 624, 626, 1, 0, 0, 0, 625, 627, 3, 171, 85, 0, 626, 625, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 128, 1, 0, 0, 0, 628, 629, 5, 102, 0, 0, 629, 630, 5, 112, 0, 0, 630, 631, 5, 105, 0, 0, 631, 632, 5, 115, 0, 0, 632, 633, 5, 110, 0, 0, 633, 634, 5, 97, 0, 0, 634, 635, 5, 110, 0, 0, 635, 130, 1, 0, 0, 0, 636, 637, 5, 102, 0, 0, 637, 638, 5, 112, 0, 0, 638, 639, 5, 109, 0, 0, 639, 640, 5, 97, 0, 0, 640, 641, 5, 120, 0, 0, 641, 132, 1, 0, 0, 0, 642, 643, 5, 102, 0, 0, 643, 644, 5, 112, 0, 0, 644, 645, 5, 109, 0, 0, 645, 646, 5, 105, 0, 0, 646, 647, 5, 110, 0, 0, 647, 134, 1, 0, 0, 0, 648, 649, 5, 102, 0, 0, 649, 650, 5, 112, 0, 0, 650, 651, 5, 114, 0, 0, 651, 652, 5, 101, 0, 0, 652, 653, 5, 109, 0, 0, 653, 136, 1, 0, 0, 0, 654, 655, 5, 102, 0, 0, 655, 656, 5, 112, 0, 0, 656, 657, 5, 114, 0, 0, 657, 658, 5, 111, 0, 0, 658, 659, 5, 117, 0, 0, 659, 660, 5, 110, 0, 0, 660, 661, 5, 100, 0, 0, 661, 662, 5, 116, 0, 0, 662, 663, 5, 111, 0, 0, 663, 664, 5, 105, 0, 0, 664, 665, 5, 110, 0, 0, 665, 666, 5, 116, 0, 0, 666, 668, 1, 0, 0, 0, 667, 669, 3, 171, 85, 0, 668, 667, 1, 0, 0, 0, 668, 669, 1, 0, 0, 0, 669, 138, 1, 0, 0, 0, 670, 671, 5, 102, 0, 0, 671, 672, 5, 112, 0, 0, 672, 673, 5, 115, 0, 0, 673, 674, 5, 113, 0, 0, 674, 675, 5, 114, 0, 0, 675, 676, 5, 116, 0, 0, 676, 678, 1, 0, 0, 0, 677, 679, 3, 171, 85, 0, 678, 677, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 140, 1, 0, 0, 0, 680, 681, 5, 102, 0, 0, 681, 682, 5, 112, 0, 0, 682, 683, 5, 116, 0, 0, 683, 684, 5, 111, 0, 0, 684, 685, 5, 98, 0, 0, 685, 686, 5, 118, 0, 0, 686, 687, 1, 0, 0, 0, 687, 689, 3, 167, 83, 0, 688, 690, 3, 171, 85, 0, 689, 688, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 690, 142, 1, 0, 0, 0, 691, 692, 5, 102, 0, 0, 692, 693, 5, 112, 0, 0, 693, 694, 5, 116, 0, 0, 694, 695, 5, 111, 0, 0, 695, 696, 5, 102, 0, 0, 696, 697, 5, 112, 0, 0, 697, 698, 1, 0, 0, 0, 698, 700, 3, 169, 84, 0, 699, 701, 3, 171, 85, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 144, 1, 0, 0, 0, 702, 703, 5, 102, 0, 0, 703, 704, 5, 112, 0, 0, 704, 705, 5, 115, 0, 0, 705, 706, 5, 117, 0, 0, 706, 707, 5, 98, 0, 0, 707, 146, 1, 0, 0, 0, 708, 709, 5, 102, 0, 0, 709, 710, 5, 112, 0, 0, 710, 711, 5, 97, 0, 0, 711, 712, 5, 100, 0, 0, 712, 713, 5, 100, 0, 0, 713, 715, 1, 0, 0, 0, 714, 716, 3, 171, 85, 0, 715, 714, 1, 0, 0, 0, 715, 716, 1, 0, 0, 0, 716, 148, 1, 0, 0, 0, 717, 718, 5, 102, 0, 0, 718, 719, 5, 112, 0, 0, 719, 720, 5, 109, 0, 0, 720, 721, 5, 117, 0, 0, 721, 722, 5, 108, 0, 0, 722, 150, 1, 0, 0, 0, 723, 724, 5, 102, 0, 0, 724, 725, 5, 112, 0, 0, 725, 726, 5, 100, 0, 0, 726, 727, 5, 105, 0, 0, 727, 728, 5, 118, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 3, 171, 85, 0, 730, 152, 1, 0, 0, 0, 731, 732, 5, 102, 0, 0, 732, 733, 5, 112, 0, 0, 733, 734, 5, 112, 0, 0, 734, 735, 5, 111, 0, 0, 735, 736, 5, 115, 0, 0, 736, 154, 1, 0, 0, 0, 737, 738, 5, 102, 0, 0, 738, 739, 5, 112, 0, 0, 739, 740, 5, 110, 0, 0, 740, 741, 5, 101, 0, 0, 741, 742, 5, 103, 0, 0, 742, 156, 1, 0, 0, 0, 743, 744, 5, 116, 0, 0, 744, 745, 5, 114, 0, 0, 745, 746, 5, 117, 0, 0, 746, 747, 5, 101, 0, 0, 747, 158, 1, 0, 0, 0, 748, 749, 5, 114, 0, 0, 749, 750, 5, 101, 0, 0, 750, 751, 5, 97, 0, 0, 751, 752, 5, 100, 0, 0, 752, 160, 1, 0, 0, 0, 753, 754, 5, 119, 0, 0, 754, 755, 5, 114, 0, 0, 755, 756, 5, 105, 0, 0, 756, 757, 5, 116, 0, 0, 757, 758, 5, 101, 0, 0, 758, 162, 1, 0, 0, 0, 759, 760, 5, 112, 0, 0, 760, 761, 5, 114, 0, 0, 761, 762, 5, 105, 0, 0, 762, 763, 5, 109, 0, 0, 763, 764, 5, 101, 0, 0, 764, 164, 1, 0, 0, 0, 765, 766, 5, 101, 0, 0, 766, 767, 5, 120, 0, 0, 767, 768, 5, 116, 0, 0, 768, 769, 5, 114, 0, 0, 769, 770, 5, 97, 0, 0, 770, 771, 5, 99, 0, 0, 771, 772, 5, 116, 0, 0, 772, 166, 1, 0, 0, 0, 773, 774, 3, 207, 103, 0, 774, 775, 3, 189, 94, 0, 775, 776, 5, 39, 0, 0, 776, 777, 7, 0, 0, 0, 777, 778, 3, 209, 104, 0, 778, 168, 1, 0, 0, 0, 779, 780, 3, 207, 103, 0, 780, 781, 3, 189, 94, 0, 781, 782, 3, 215, 107, 0, 782, 783, 3, 189, 94, 0, 783, 784, 3, 209, 104, 0, 784, 170, 1, 0, 0, 0, 785, 786, 5, 91, 0, 0, 786, 787, 5, 114, 0, 0, 787, 788, 5, 110, 0, 0, 788, 789, 5, 101, 0, 0, 789, 811, 5, 93, 0, 0, 790, 791, 5, 91, 0, 0, 791, 792, 5, 114, 0, 0, 792, 793, 5, 110, 0, 0, 793, 794, 5, 97, 0, 0, 794, 811, 5, 93, 0, 0, 795, 796, 5, 91, 0, 0, 796, 797, 5, 114, 0, 0, 797, 798, 5, 116, 0, 0, 798, 799, 5, 112, 0, 0, 799, 811, 5, 93, 0, 0, 800, 801, 5, 91, 0, 0, 801, 802, 5, 114, 0, 0, 802, 803, 5, 116, 0, 0, 803, 804, 5, 110, 0, 0, 804, 811, 5, 93, 0, 0, 805, 806, 5, 91, 0, 0, 806, 807, 5, 114, 0, 0, 807, 808, 5, 116, 0, 0, 808, 809, 5, 122, 0, 0, 809, 811, 5, 93, 0, 0, 810, 785, 1, 0, 0, 0, 810, 790, 1, 0, 0, 0, 810, 795, 1, 0, 0, 0, 810, 800, 1, 0, 0, 0, 810, 805, 1, 0, 0, 0, 811, 172, 1, 0, 0, 0, 812, 813, 5, 102, 0, 0, 813, 814, 5, 97, 0, 0, 814, 815, 5, 108, 0, 0, 815, 816, 5, 115, 0, 0, 816, 817, 5, 101, 0, 0, 817, 174, 1, 0, 0, 0, 818, 819, 5, 100, 0, 0, 819, 820, 5, 101, 0, 0, 820, 821, 5, 102, 0, 0, 821, 822, 5, 97, 0, 0, 822, 823, 5, 117, 0, 0, 823, 824, 5, 108, 0, 0, 824, 825, 5, 116, 0, 0, 825, 176, 1, 0, 0, 0, 826, 827, 5, 97, 0, 0, 827, 828, 5, 115, 0, 0, 828, 829, 5, 115, 0, 0, 829, 830, 5, 105, 0, 0, 830, 831, 5, 103, 0, 0, 831, 832, 5, 110, 0, 0, 832, 178, 1, 0, 0, 0, 833, 834, 5, 104, 0, 0, 834, 835, 5, 97, 0, 0, 835, 836, 5, 118, 0, 0, 836, 837, 5, 111, 0, 0, 837, 838, 5, 99, 0, 0, 838, 180, 1, 0, 0, 0, 839, 840, 5, 97, 0, 0, 840, 841, 5, 115, 0, 0, 841, 842, 5, 115, 0, 0, 842, 843, 5, 117, 0, 0, 843, 844, 5, 109, 0, 0, 844, 845, 5, 101, 0, 0, 845, 182, 1, 0, 0, 0, 846, 847, 5, 114, 0, 0, 847, 848, 5, 101, 0, 0, 848, 849, 5, 116, 0, 0, 849, 850, 5, 117, 0, 0, 850, 851, 5, 114, 0, 0, 851, 852, 5, 110, 0, 0, 852, 184, 1, 0, 0, 0, 853, 854, 3, 189, 94, 0, 854, 855, 5, 39, 0, 0, 855, 856, 5, 98, 0, 0, 856, 858, 1, 0, 0, 0, 857, 859, 7, 1, 0, 0, 858, 857, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 858, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 898, 1, 0, 0, 0, 862, 863, 5, 35, 0, 0, 863, 864, 5, 98, 0, 0, 864, 866, 1, 0, 0, 0, 865, 867, 7, 1, 0, 0, 866, 865, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 866, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 898, 1, 0, 0, 0, 870, 871, 5, 35, 0, 0, 871, 872, 5, 120, 0, 0, 872, 874, 1, 0, 0, 0, 873, 875, 7, 1, 0, 0, 874, 873, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 874, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 898, 1, 0, 0, 0, 878, 879, 3, 189, 94, 0, 879, 880, 5, 39, 0, 0, 880, 881, 5, 100, 0, 0, 881, 884, 1, 0, 0, 0, 882, 885, 3, 51, 25, 0, 883, 885, 3, 53, 26, 0, 884, 882, 1, 0, 0, 0, 884, 883, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 1, 0, 0, 0, 886, 887, 3, 187, 93, 0, 887, 898, 1, 0, 0, 0, 888, 889, 3, 189, 94, 0, 889, 890, 5, 39, 0, 0, 890, 891, 5, 120, 0, 0, 891, 893, 1, 0, 0, 0, 892, 894, 7, 2, 0, 0, 893, 892, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 893, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 898, 1, 0, 0, 0, 897, 853, 1, 0, 0, 0, 897, 862, 1, 0, 0, 0, 897, 870, 1, 0, 0, 0, 897, 878, 1, 0, 0, 0, 897, 888, 1, 0, 0, 0, 898, 186, 1, 0, 0, 0, 899, 901, 3, 191, 95, 0, 900, 899, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 1, 0, 0, 0, 902, 903, 3, 189, 94, 0, 903, 188, 1, 0, 0, 0, 904, 906, 3, 199, 99, 0, 905, 904, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 905, 1, 0, 0, 0, 907, 908, 1, 0, 0, 0, 908, 190, 1, 0, 0, 0, 909, 912, 3, 51, 25, 0, 910, 912, 3, 53, 26, 0, 911, 909, 1, 0, 0, 0, 911, 910, 1, 0, 0, 0, 912, 192, 1, 0, 0, 0, 913, 914, 5, 46, 0, 0, 914, 194, 1, 0, 0, 0, 915, 918, 3, 201, 100, 0, 916, 918, 3, 197, 98, 0, 917, 915, 1, 0, 0, 0, 917, 916, 1, 0, 0, 0, 918, 926, 1, 0, 0, 0, 919, 925, 3, 201, 100, 0, 920, 925, 3, 197, 98, 0, 921, 925, 5, 36, 0, 0, 922, 925, 3, 199, 99, 0, 923, 925, 3, 217, 108, 0, 924, 919, 1, 0, 0, 0, 924, 920, 1, 0, 0, 0, 924, 921, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 923, 1, 0, 0, 0, 925, 928, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 196, 1, 0, 0, 0, 928, 926, 1, 0, 0, 0, 929, 930, 5, 95, 0, 0, 930, 198, 1, 0, 0, 0, 931, 932, 7, 3, 0, 0, 932, 200, 1, 0, 0, 0, 933, 934, 7, 4, 0, 0, 934, 202, 1, 0, 0, 0, 935, 936, 5, 40, 0, 0, 936, 204, 1, 0, 0, 0, 937, 938, 5, 41, 0, 0, 938, 206, 1, 0, 0, 0, 939, 940, 5, 91, 0, 0, 940, 208, 1, 0, 0, 0, 941, 942, 5, 93, 0, 0, 942, 210, 1, 0, 0, 0, 943, 944, 5, 123, 0, 0, 944, 212, 1, 0, 0, 0, 945, 946, 5, 125, 0, 0, 946, 214, 1, 0, 0, 0, 947, 948, 5, 44, 0, 0, 948, 216, 1, 0, 0, 0, 949, 950, 5, 58, 0, 0, 950, 218, 1, 0, 0, 0, 951, 952, 5, 59, 0, 0, 952, 220, 1, 0, 0, 0, 953, 954, 5, 39, 0, 0, 954, 222, 1, 0, 0, 0, 955, 956, 5, 60, 0, 0, 956, 957, 5, 45, 0, 0, 957, 224, 1, 0, 0, 0, 958, 959, 5, 45, 0, 0, 959, 960, 5, 62, 0, 0, 960, 226, 1, 0, 0, 0, 961, 963, 7, 5, 0, 0, 962, 961, 1, 0, 0, 0, 963, 964, 1, 0, 0, 0, 964, 962, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 967, 6, 113, 0, 0, 967, 228, 1, 0, 0, 0, 968, 969, 5, 47, 0, 0, 969, 970, 5, 42, 0, 0, 970, 974, 1, 0, 0, 0, 971, 973, 9, 0, 0, 0, 972, 971, 1, 0, 0, 0, 973, 976, 1, 0, 0, 0, 974, 975, 1, 0, 0, 0, 974, 972, 1, 0, 0, 0, 975, 977, 1, 0, 0, 0, 976, 974, 1, 0, 0, 0, 977, 978, 5, 42, 0, 0, 978, 979, 5, 47, 0, 0, 979, 980, 1, 0, 0, 0, 980, 981, 6, 114, 0, 0, 981, 230, 1, 0, 0, 0, 982, 983, 5, 47, 0, 0, 983, 984, 5, 47, 0, 0, 984, 988, 1, 0, 0, 0, 985, 987, 8, 6, 0, 0, 986, 985, 1, 0, 0, 0, 987, 990, 1, 0, 0, 0, 988, 986, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 991, 1, 0, 0, 0, 990, 988, 1, 0, 0, 0, 991, 992, 6, 115, 0, 0, 992, 232, 1, 0, 0, 0, 30, 0, 245, 256, 267, 275, 283, 297, 314, 626, 668, 678, 689, 700, 715, 810, 860, 868, 876, 884, 895, 897, 900, 907, 911, 917, 924, 926, 964, 974, 988, 1, 6, 0, 0] \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/CommonTokens.java b/subprojects/common/grammar/src/main/gen/CommonTokens.java new file mode 100644 index 0000000000..eb04fb3e5c --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/CommonTokens.java @@ -0,0 +1,770 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/CommonTokens.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class CommonTokens extends Lexer { + static { RuntimeMetaData.checkVersion("4.10.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + BOOLTYPE=1, INTTYPE=2, RATTYPE=3, BVTYPE=4, FPTYPE=5, FUNC=6, ARRAY=7, + IF=8, THEN=9, ELSE=10, IFF=11, ITE=12, IMPLY=13, FORALL=14, EXISTS=15, + OR=16, AND=17, XOR=18, NOT=19, EQ=20, NEQ=21, LT=22, LEQ=23, GT=24, GEQ=25, + PLUS=26, MINUS=27, MUL=28, DIV=29, MOD=30, REM=31, PERCENT=32, BV_CONCAT=33, + BV_ZERO_EXTEND=34, BV_SIGN_EXTEND=35, BV_ADD=36, BV_SUB=37, BV_POS=38, + BV_NEG=39, BV_MUL=40, BV_UDIV=41, BV_SDIV=42, BV_SMOD=43, BV_UREM=44, + BV_SREM=45, BV_OR=46, BV_AND=47, BV_XOR=48, BV_NOT=49, BV_SHL=50, BV_ASHR=51, + BV_LSHR=52, BV_ROL=53, BV_ROR=54, BV_ULT=55, BV_ULE=56, BV_UGT=57, BV_UGE=58, + BV_SLT=59, BV_SLE=60, BV_SGT=61, BV_SGE=62, FP_ABS=63, FP_FROM_BV=64, + FP_IS_NAN=65, FPMAX=66, FPMIN=67, FPREM=68, FPROUNDTOINT=69, FPSQRT=70, + FPTOBV=71, FPTOFP=72, FPSUB=73, FPADD=74, FPMUL=75, FPDIV=76, FPPOS=77, + FPNEG=78, TRUE=79, READ=80, WRITE=81, PRIME=82, EXTRACT=83, BV_TYPE_DECL=84, + FP_TYPE_DECL=85, FP_ROUNDINGMODE=86, FALSE=87, DEFAULT=88, ASSIGN=89, + HAVOC=90, ASSUME=91, RETURN=92, BV=93, INT=94, NAT=95, SIGN=96, DOT=97, + ID=98, UNDERSCORE=99, DIGIT=100, LETTER=101, LPAREN=102, RPAREN=103, LBRACK=104, + RBRACK=105, LBRAC=106, RBRAC=107, COMMA=108, COLON=109, SEMICOLON=110, + QUOT=111, LARROW=112, RARROW=113, WS=114, COMMENT=115, LINE_COMMENT=116; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE" + }; + + private static String[] makeRuleNames() { + return new String[] { + "BOOLTYPE", "INTTYPE", "RATTYPE", "BVTYPE", "FPTYPE", "FUNC", "ARRAY", + "IF", "THEN", "ELSE", "IFF", "ITE", "IMPLY", "FORALL", "EXISTS", "OR", + "AND", "XOR", "NOT", "EQ", "NEQ", "LT", "LEQ", "GT", "GEQ", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "REM", "PERCENT", "BV_CONCAT", "BV_ZERO_EXTEND", + "BV_SIGN_EXTEND", "BV_ADD", "BV_SUB", "BV_POS", "BV_NEG", "BV_MUL", "BV_UDIV", + "BV_SDIV", "BV_SMOD", "BV_UREM", "BV_SREM", "BV_OR", "BV_AND", "BV_XOR", + "BV_NOT", "BV_SHL", "BV_ASHR", "BV_LSHR", "BV_ROL", "BV_ROR", "BV_ULT", + "BV_ULE", "BV_UGT", "BV_UGE", "BV_SLT", "BV_SLE", "BV_SGT", "BV_SGE", + "FP_ABS", "FP_FROM_BV", "FP_IS_NAN", "FPMAX", "FPMIN", "FPREM", "FPROUNDTOINT", + "FPSQRT", "FPTOBV", "FPTOFP", "FPSUB", "FPADD", "FPMUL", "FPDIV", "FPPOS", + "FPNEG", "TRUE", "READ", "WRITE", "PRIME", "EXTRACT", "BV_TYPE_DECL", + "FP_TYPE_DECL", "FP_ROUNDINGMODE", "FALSE", "DEFAULT", "ASSIGN", "HAVOC", + "ASSUME", "RETURN", "BV", "INT", "NAT", "SIGN", "DOT", "ID", "UNDERSCORE", + "DIGIT", "LETTER", "LPAREN", "RPAREN", "LBRACK", "RBRACK", "LBRAC", "RBRAC", + "COMMA", "COLON", "SEMICOLON", "QUOT", "LARROW", "RARROW", "WS", "COMMENT", + "LINE_COMMENT" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, "'if'", "'then'", "'else'", + "'iff'", "'ite'", "'=>'", "'forall'", "'exists'", "'or'", "'and'", "'xor'", + "'not'", "'='", "'/='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", + "'div'", "'mod'", "'rem'", "'%'", null, "'bv_zero_extend'", "'bv_sign_extend'", + "'bvadd'", "'bvsub'", "'bvpos'", "'bvneg'", "'bvmul'", "'bvudiv'", "'bvsdiv'", + "'bvsmod'", "'bvurem'", "'bvsrem'", "'bvor'", "'bvand'", "'bvxor'", "'bvnot'", + "'bvshl'", "'bvashr'", "'bvlshr'", "'bvrol'", "'bvror'", "'bvult'", "'bvule'", + "'bvugt'", "'bvuge'", "'bvslt'", "'bvsle'", "'bvsgt'", "'bvsge'", "'fpabs'", + null, "'fpisnan'", "'fpmax'", "'fpmin'", "'fprem'", null, null, null, + null, "'fpsub'", null, "'fpmul'", null, "'fppos'", "'fpneg'", "'true'", + "'read'", "'write'", "'prime'", "'extract'", null, null, null, "'false'", + "'default'", "'assign'", "'havoc'", "'assume'", "'return'", null, null, + null, null, "'.'", null, "'_'", null, null, "'('", "')'", "'['", "']'", + "'{'", "'}'", "','", "':'", "';'", "'''", "'<-'", "'->'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "BOOLTYPE", "INTTYPE", "RATTYPE", "BVTYPE", "FPTYPE", "FUNC", "ARRAY", + "IF", "THEN", "ELSE", "IFF", "ITE", "IMPLY", "FORALL", "EXISTS", "OR", + "AND", "XOR", "NOT", "EQ", "NEQ", "LT", "LEQ", "GT", "GEQ", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "REM", "PERCENT", "BV_CONCAT", "BV_ZERO_EXTEND", + "BV_SIGN_EXTEND", "BV_ADD", "BV_SUB", "BV_POS", "BV_NEG", "BV_MUL", "BV_UDIV", + "BV_SDIV", "BV_SMOD", "BV_UREM", "BV_SREM", "BV_OR", "BV_AND", "BV_XOR", + "BV_NOT", "BV_SHL", "BV_ASHR", "BV_LSHR", "BV_ROL", "BV_ROR", "BV_ULT", + "BV_ULE", "BV_UGT", "BV_UGE", "BV_SLT", "BV_SLE", "BV_SGT", "BV_SGE", + "FP_ABS", "FP_FROM_BV", "FP_IS_NAN", "FPMAX", "FPMIN", "FPREM", "FPROUNDTOINT", + "FPSQRT", "FPTOBV", "FPTOFP", "FPSUB", "FPADD", "FPMUL", "FPDIV", "FPPOS", + "FPNEG", "TRUE", "READ", "WRITE", "PRIME", "EXTRACT", "BV_TYPE_DECL", + "FP_TYPE_DECL", "FP_ROUNDINGMODE", "FALSE", "DEFAULT", "ASSIGN", "HAVOC", + "ASSUME", "RETURN", "BV", "INT", "NAT", "SIGN", "DOT", "ID", "UNDERSCORE", + "DIGIT", "LETTER", "LPAREN", "RPAREN", "LBRACK", "RBRACK", "LBRAC", "RBRAC", + "COMMA", "COLON", "SEMICOLON", "QUOT", "LARROW", "RARROW", "WS", "COMMENT", + "LINE_COMMENT" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public CommonTokens(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "CommonTokens.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + public static final String _serializedATN = + "\u0004\u0000t\u03e1\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001"+ + "\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004"+ + "\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007"+ + "\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b"+ + "\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+ + "\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+ + "\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+ + "\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+ + "\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002"+ + "\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002"+ + "\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007"+ + "!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007"+ + "&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007"+ + "+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u0007"+ + "0\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u0007"+ + "5\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007"+ + ":\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007"+ + "?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007"+ + "D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007"+ + "I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007"+ + "N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007"+ + "S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007"+ + "X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007"+ + "]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007"+ + "b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007"+ + "g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007"+ + "l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007"+ + "q\u0002r\u0007r\u0002s\u0007s\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u00f6\b\u0000\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0003\u0001\u0101\b\u0001\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0003\u0002\u010c\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0003\u0003\u0114\b\u0003\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u011c"+ + "\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0003\u0005\u012a\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ + "\u0006\u013b\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013"+ + "\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a"+ + "\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 "+ + "\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001"+ + "$\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ + "1\u00011\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u0001"+ + "2\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ + "4\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u00015\u00015\u0001"+ + "5\u00015\u00016\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u0001"+ + "7\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ + "9\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001"+ + ":\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001"+ + "<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0003?\u0273\b?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0003D\u029d\bD\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0003E\u02a7\bE\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ + "F\u0001F\u0001F\u0001F\u0003F\u02b2\bF\u0001G\u0001G\u0001G\u0001G\u0001"+ + "G\u0001G\u0001G\u0001G\u0001G\u0003G\u02bd\bG\u0001H\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0003"+ + "I\u02cc\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001"+ + "K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001"+ + "N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001"+ + "P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0003U\u032b\bU\u0001V\u0001V\u0001V\u0001"+ + "V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001"+ + "W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0004\\\u035b\b\\\u000b\\\f\\\u035c\u0001\\\u0001\\"+ + "\u0001\\\u0001\\\u0004\\\u0363\b\\\u000b\\\f\\\u0364\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0004\\\u036b\b\\\u000b\\\f\\\u036c\u0001\\\u0001\\\u0001\\"+ + "\u0001\\\u0001\\\u0001\\\u0003\\\u0375\b\\\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0004\\\u037e\b\\\u000b\\\f\\\u037f\u0003\\"+ + "\u0382\b\\\u0001]\u0003]\u0385\b]\u0001]\u0001]\u0001^\u0004^\u038a\b"+ + "^\u000b^\f^\u038b\u0001_\u0001_\u0003_\u0390\b_\u0001`\u0001`\u0001a\u0001"+ + "a\u0003a\u0396\ba\u0001a\u0001a\u0001a\u0001a\u0001a\u0005a\u039d\ba\n"+ + "a\fa\u03a0\ta\u0001b\u0001b\u0001c\u0001c\u0001d\u0001d\u0001e\u0001e"+ + "\u0001f\u0001f\u0001g\u0001g\u0001h\u0001h\u0001i\u0001i\u0001j\u0001"+ + "j\u0001k\u0001k\u0001l\u0001l\u0001m\u0001m\u0001n\u0001n\u0001o\u0001"+ + "o\u0001o\u0001p\u0001p\u0001p\u0001q\u0004q\u03c3\bq\u000bq\fq\u03c4\u0001"+ + "q\u0001q\u0001r\u0001r\u0001r\u0001r\u0005r\u03cd\br\nr\fr\u03d0\tr\u0001"+ + "r\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0005s\u03db"+ + "\bs\ns\fs\u03de\ts\u0001s\u0001s\u0001\u03ce\u0000t\u0001\u0001\u0003"+ + "\u0002\u0005\u0003\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f\b\u0011"+ + "\t\u0013\n\u0015\u000b\u0017\f\u0019\r\u001b\u000e\u001d\u000f\u001f\u0010"+ + "!\u0011#\u0012%\u0013\'\u0014)\u0015+\u0016-\u0017/\u00181\u00193\u001a"+ + "5\u001b7\u001c9\u001d;\u001e=\u001f? A!C\"E#G$I%K&M\'O(Q)S*U+W,Y-[.]/"+ + "_0a1c2e3g4i5k6m7o8q9s:u;w}?\u007f@\u0081A\u0083B\u0085C\u0087D\u0089"+ + "E\u008bF\u008dG\u008fH\u0091I\u0093J\u0095K\u0097L\u0099M\u009bN\u009d"+ + "O\u009fP\u00a1Q\u00a3R\u00a5S\u00a7T\u00a9U\u00abV\u00adW\u00afX\u00b1"+ + "Y\u00b3Z\u00b5[\u00b7\\\u00b9]\u00bb^\u00bd_\u00bf`\u00c1a\u00c3b\u00c5"+ + "c\u00c7d\u00c9e\u00cbf\u00cdg\u00cfh\u00d1i\u00d3j\u00d5k\u00d7l\u00d9"+ + "m\u00dbn\u00ddo\u00dfp\u00e1q\u00e3r\u00e5s\u00e7t\u0001\u0000\u0007\u0002"+ + "\u0000ssuu\u0001\u000001\u0003\u000009AFaf\u0001\u000009\u0002\u0000A"+ + "Zaz\u0003\u0000\t\n\f\r \u0002\u0000\n\n\r\r\u040e\u0000\u0001\u0001"+ + "\u0000\u0000\u0000\u0000\u0003\u0001\u0000\u0000\u0000\u0000\u0005\u0001"+ + "\u0000\u0000\u0000\u0000\u0007\u0001\u0000\u0000\u0000\u0000\t\u0001\u0000"+ + "\u0000\u0000\u0000\u000b\u0001\u0000\u0000\u0000\u0000\r\u0001\u0000\u0000"+ + "\u0000\u0000\u000f\u0001\u0000\u0000\u0000\u0000\u0011\u0001\u0000\u0000"+ + "\u0000\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015\u0001\u0000\u0000"+ + "\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019\u0001\u0000\u0000"+ + "\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d\u0001\u0000\u0000"+ + "\u0000\u0000\u001f\u0001\u0000\u0000\u0000\u0000!\u0001\u0000\u0000\u0000"+ + "\u0000#\u0001\u0000\u0000\u0000\u0000%\u0001\u0000\u0000\u0000\u0000\'"+ + "\u0001\u0000\u0000\u0000\u0000)\u0001\u0000\u0000\u0000\u0000+\u0001\u0000"+ + "\u0000\u0000\u0000-\u0001\u0000\u0000\u0000\u0000/\u0001\u0000\u0000\u0000"+ + "\u00001\u0001\u0000\u0000\u0000\u00003\u0001\u0000\u0000\u0000\u00005"+ + "\u0001\u0000\u0000\u0000\u00007\u0001\u0000\u0000\u0000\u00009\u0001\u0000"+ + "\u0000\u0000\u0000;\u0001\u0000\u0000\u0000\u0000=\u0001\u0000\u0000\u0000"+ + "\u0000?\u0001\u0000\u0000\u0000\u0000A\u0001\u0000\u0000\u0000\u0000C"+ + "\u0001\u0000\u0000\u0000\u0000E\u0001\u0000\u0000\u0000\u0000G\u0001\u0000"+ + "\u0000\u0000\u0000I\u0001\u0000\u0000\u0000\u0000K\u0001\u0000\u0000\u0000"+ + "\u0000M\u0001\u0000\u0000\u0000\u0000O\u0001\u0000\u0000\u0000\u0000Q"+ + "\u0001\u0000\u0000\u0000\u0000S\u0001\u0000\u0000\u0000\u0000U\u0001\u0000"+ + "\u0000\u0000\u0000W\u0001\u0000\u0000\u0000\u0000Y\u0001\u0000\u0000\u0000"+ + "\u0000[\u0001\u0000\u0000\u0000\u0000]\u0001\u0000\u0000\u0000\u0000_"+ + "\u0001\u0000\u0000\u0000\u0000a\u0001\u0000\u0000\u0000\u0000c\u0001\u0000"+ + "\u0000\u0000\u0000e\u0001\u0000\u0000\u0000\u0000g\u0001\u0000\u0000\u0000"+ + "\u0000i\u0001\u0000\u0000\u0000\u0000k\u0001\u0000\u0000\u0000\u0000m"+ + "\u0001\u0000\u0000\u0000\u0000o\u0001\u0000\u0000\u0000\u0000q\u0001\u0000"+ + "\u0000\u0000\u0000s\u0001\u0000\u0000\u0000\u0000u\u0001\u0000\u0000\u0000"+ + "\u0000w\u0001\u0000\u0000\u0000\u0000y\u0001\u0000\u0000\u0000\u0000{"+ + "\u0001\u0000\u0000\u0000\u0000}\u0001\u0000\u0000\u0000\u0000\u007f\u0001"+ + "\u0000\u0000\u0000\u0000\u0081\u0001\u0000\u0000\u0000\u0000\u0083\u0001"+ + "\u0000\u0000\u0000\u0000\u0085\u0001\u0000\u0000\u0000\u0000\u0087\u0001"+ + "\u0000\u0000\u0000\u0000\u0089\u0001\u0000\u0000\u0000\u0000\u008b\u0001"+ + "\u0000\u0000\u0000\u0000\u008d\u0001\u0000\u0000\u0000\u0000\u008f\u0001"+ + "\u0000\u0000\u0000\u0000\u0091\u0001\u0000\u0000\u0000\u0000\u0093\u0001"+ + "\u0000\u0000\u0000\u0000\u0095\u0001\u0000\u0000\u0000\u0000\u0097\u0001"+ + "\u0000\u0000\u0000\u0000\u0099\u0001\u0000\u0000\u0000\u0000\u009b\u0001"+ + "\u0000\u0000\u0000\u0000\u009d\u0001\u0000\u0000\u0000\u0000\u009f\u0001"+ + "\u0000\u0000\u0000\u0000\u00a1\u0001\u0000\u0000\u0000\u0000\u00a3\u0001"+ + "\u0000\u0000\u0000\u0000\u00a5\u0001\u0000\u0000\u0000\u0000\u00a7\u0001"+ + "\u0000\u0000\u0000\u0000\u00a9\u0001\u0000\u0000\u0000\u0000\u00ab\u0001"+ + "\u0000\u0000\u0000\u0000\u00ad\u0001\u0000\u0000\u0000\u0000\u00af\u0001"+ + "\u0000\u0000\u0000\u0000\u00b1\u0001\u0000\u0000\u0000\u0000\u00b3\u0001"+ + "\u0000\u0000\u0000\u0000\u00b5\u0001\u0000\u0000\u0000\u0000\u00b7\u0001"+ + "\u0000\u0000\u0000\u0000\u00b9\u0001\u0000\u0000\u0000\u0000\u00bb\u0001"+ + "\u0000\u0000\u0000\u0000\u00bd\u0001\u0000\u0000\u0000\u0000\u00bf\u0001"+ + "\u0000\u0000\u0000\u0000\u00c1\u0001\u0000\u0000\u0000\u0000\u00c3\u0001"+ + "\u0000\u0000\u0000\u0000\u00c5\u0001\u0000\u0000\u0000\u0000\u00c7\u0001"+ + "\u0000\u0000\u0000\u0000\u00c9\u0001\u0000\u0000\u0000\u0000\u00cb\u0001"+ + "\u0000\u0000\u0000\u0000\u00cd\u0001\u0000\u0000\u0000\u0000\u00cf\u0001"+ + "\u0000\u0000\u0000\u0000\u00d1\u0001\u0000\u0000\u0000\u0000\u00d3\u0001"+ + "\u0000\u0000\u0000\u0000\u00d5\u0001\u0000\u0000\u0000\u0000\u00d7\u0001"+ + "\u0000\u0000\u0000\u0000\u00d9\u0001\u0000\u0000\u0000\u0000\u00db\u0001"+ + "\u0000\u0000\u0000\u0000\u00dd\u0001\u0000\u0000\u0000\u0000\u00df\u0001"+ + "\u0000\u0000\u0000\u0000\u00e1\u0001\u0000\u0000\u0000\u0000\u00e3\u0001"+ + "\u0000\u0000\u0000\u0000\u00e5\u0001\u0000\u0000\u0000\u0000\u00e7\u0001"+ + "\u0000\u0000\u0000\u0001\u00f5\u0001\u0000\u0000\u0000\u0003\u0100\u0001"+ + "\u0000\u0000\u0000\u0005\u010b\u0001\u0000\u0000\u0000\u0007\u0113\u0001"+ + "\u0000\u0000\u0000\t\u011b\u0001\u0000\u0000\u0000\u000b\u0129\u0001\u0000"+ + "\u0000\u0000\r\u013a\u0001\u0000\u0000\u0000\u000f\u013c\u0001\u0000\u0000"+ + "\u0000\u0011\u013f\u0001\u0000\u0000\u0000\u0013\u0144\u0001\u0000\u0000"+ + "\u0000\u0015\u0149\u0001\u0000\u0000\u0000\u0017\u014d\u0001\u0000\u0000"+ + "\u0000\u0019\u0151\u0001\u0000\u0000\u0000\u001b\u0154\u0001\u0000\u0000"+ + "\u0000\u001d\u015b\u0001\u0000\u0000\u0000\u001f\u0162\u0001\u0000\u0000"+ + "\u0000!\u0165\u0001\u0000\u0000\u0000#\u0169\u0001\u0000\u0000\u0000%"+ + "\u016d\u0001\u0000\u0000\u0000\'\u0171\u0001\u0000\u0000\u0000)\u0173"+ + "\u0001\u0000\u0000\u0000+\u0176\u0001\u0000\u0000\u0000-\u0178\u0001\u0000"+ + "\u0000\u0000/\u017b\u0001\u0000\u0000\u00001\u017d\u0001\u0000\u0000\u0000"+ + "3\u0180\u0001\u0000\u0000\u00005\u0182\u0001\u0000\u0000\u00007\u0184"+ + "\u0001\u0000\u0000\u00009\u0186\u0001\u0000\u0000\u0000;\u018a\u0001\u0000"+ + "\u0000\u0000=\u018e\u0001\u0000\u0000\u0000?\u0192\u0001\u0000\u0000\u0000"+ + "A\u0194\u0001\u0000\u0000\u0000C\u0197\u0001\u0000\u0000\u0000E\u01a6"+ + "\u0001\u0000\u0000\u0000G\u01b5\u0001\u0000\u0000\u0000I\u01bb\u0001\u0000"+ + "\u0000\u0000K\u01c1\u0001\u0000\u0000\u0000M\u01c7\u0001\u0000\u0000\u0000"+ + "O\u01cd\u0001\u0000\u0000\u0000Q\u01d3\u0001\u0000\u0000\u0000S\u01da"+ + "\u0001\u0000\u0000\u0000U\u01e1\u0001\u0000\u0000\u0000W\u01e8\u0001\u0000"+ + "\u0000\u0000Y\u01ef\u0001\u0000\u0000\u0000[\u01f6\u0001\u0000\u0000\u0000"+ + "]\u01fb\u0001\u0000\u0000\u0000_\u0201\u0001\u0000\u0000\u0000a\u0207"+ + "\u0001\u0000\u0000\u0000c\u020d\u0001\u0000\u0000\u0000e\u0213\u0001\u0000"+ + "\u0000\u0000g\u021a\u0001\u0000\u0000\u0000i\u0221\u0001\u0000\u0000\u0000"+ + "k\u0227\u0001\u0000\u0000\u0000m\u022d\u0001\u0000\u0000\u0000o\u0233"+ + "\u0001\u0000\u0000\u0000q\u0239\u0001\u0000\u0000\u0000s\u023f\u0001\u0000"+ + "\u0000\u0000u\u0245\u0001\u0000\u0000\u0000w\u024b\u0001\u0000\u0000\u0000"+ + "y\u0251\u0001\u0000\u0000\u0000{\u0257\u0001\u0000\u0000\u0000}\u025d"+ + "\u0001\u0000\u0000\u0000\u007f\u0263\u0001\u0000\u0000\u0000\u0081\u0274"+ + "\u0001\u0000\u0000\u0000\u0083\u027c\u0001\u0000\u0000\u0000\u0085\u0282"+ + "\u0001\u0000\u0000\u0000\u0087\u0288\u0001\u0000\u0000\u0000\u0089\u028e"+ + "\u0001\u0000\u0000\u0000\u008b\u029e\u0001\u0000\u0000\u0000\u008d\u02a8"+ + "\u0001\u0000\u0000\u0000\u008f\u02b3\u0001\u0000\u0000\u0000\u0091\u02be"+ + "\u0001\u0000\u0000\u0000\u0093\u02c4\u0001\u0000\u0000\u0000\u0095\u02cd"+ + "\u0001\u0000\u0000\u0000\u0097\u02d3\u0001\u0000\u0000\u0000\u0099\u02db"+ + "\u0001\u0000\u0000\u0000\u009b\u02e1\u0001\u0000\u0000\u0000\u009d\u02e7"+ + "\u0001\u0000\u0000\u0000\u009f\u02ec\u0001\u0000\u0000\u0000\u00a1\u02f1"+ + "\u0001\u0000\u0000\u0000\u00a3\u02f7\u0001\u0000\u0000\u0000\u00a5\u02fd"+ + "\u0001\u0000\u0000\u0000\u00a7\u0305\u0001\u0000\u0000\u0000\u00a9\u030b"+ + "\u0001\u0000\u0000\u0000\u00ab\u032a\u0001\u0000\u0000\u0000\u00ad\u032c"+ + "\u0001\u0000\u0000\u0000\u00af\u0332\u0001\u0000\u0000\u0000\u00b1\u033a"+ + "\u0001\u0000\u0000\u0000\u00b3\u0341\u0001\u0000\u0000\u0000\u00b5\u0347"+ + "\u0001\u0000\u0000\u0000\u00b7\u034e\u0001\u0000\u0000\u0000\u00b9\u0381"+ + "\u0001\u0000\u0000\u0000\u00bb\u0384\u0001\u0000\u0000\u0000\u00bd\u0389"+ + "\u0001\u0000\u0000\u0000\u00bf\u038f\u0001\u0000\u0000\u0000\u00c1\u0391"+ + "\u0001\u0000\u0000\u0000\u00c3\u0395\u0001\u0000\u0000\u0000\u00c5\u03a1"+ + "\u0001\u0000\u0000\u0000\u00c7\u03a3\u0001\u0000\u0000\u0000\u00c9\u03a5"+ + "\u0001\u0000\u0000\u0000\u00cb\u03a7\u0001\u0000\u0000\u0000\u00cd\u03a9"+ + "\u0001\u0000\u0000\u0000\u00cf\u03ab\u0001\u0000\u0000\u0000\u00d1\u03ad"+ + "\u0001\u0000\u0000\u0000\u00d3\u03af\u0001\u0000\u0000\u0000\u00d5\u03b1"+ + "\u0001\u0000\u0000\u0000\u00d7\u03b3\u0001\u0000\u0000\u0000\u00d9\u03b5"+ + "\u0001\u0000\u0000\u0000\u00db\u03b7\u0001\u0000\u0000\u0000\u00dd\u03b9"+ + "\u0001\u0000\u0000\u0000\u00df\u03bb\u0001\u0000\u0000\u0000\u00e1\u03be"+ + "\u0001\u0000\u0000\u0000\u00e3\u03c2\u0001\u0000\u0000\u0000\u00e5\u03c8"+ + "\u0001\u0000\u0000\u0000\u00e7\u03d6\u0001\u0000\u0000\u0000\u00e9\u00ea"+ + "\u0005b\u0000\u0000\u00ea\u00eb\u0005o\u0000\u0000\u00eb\u00ec\u0005o"+ + "\u0000\u0000\u00ec\u00f6\u0005l\u0000\u0000\u00ed\u00ee\u0005B\u0000\u0000"+ + "\u00ee\u00ef\u0005o\u0000\u0000\u00ef\u00f0\u0005o\u0000\u0000\u00f0\u00f6"+ + "\u0005l\u0000\u0000\u00f1\u00f2\u0005B\u0000\u0000\u00f2\u00f3\u0005O"+ + "\u0000\u0000\u00f3\u00f4\u0005O\u0000\u0000\u00f4\u00f6\u0005L\u0000\u0000"+ + "\u00f5\u00e9\u0001\u0000\u0000\u0000\u00f5\u00ed\u0001\u0000\u0000\u0000"+ + "\u00f5\u00f1\u0001\u0000\u0000\u0000\u00f6\u0002\u0001\u0000\u0000\u0000"+ + "\u00f7\u00f8\u0005i\u0000\u0000\u00f8\u00f9\u0005n\u0000\u0000\u00f9\u0101"+ + "\u0005t\u0000\u0000\u00fa\u00fb\u0005I\u0000\u0000\u00fb\u00fc\u0005n"+ + "\u0000\u0000\u00fc\u0101\u0005t\u0000\u0000\u00fd\u00fe\u0005I\u0000\u0000"+ + "\u00fe\u00ff\u0005N\u0000\u0000\u00ff\u0101\u0005T\u0000\u0000\u0100\u00f7"+ + "\u0001\u0000\u0000\u0000\u0100\u00fa\u0001\u0000\u0000\u0000\u0100\u00fd"+ + "\u0001\u0000\u0000\u0000\u0101\u0004\u0001\u0000\u0000\u0000\u0102\u0103"+ + "\u0005r\u0000\u0000\u0103\u0104\u0005a\u0000\u0000\u0104\u010c\u0005t"+ + "\u0000\u0000\u0105\u0106\u0005R\u0000\u0000\u0106\u0107\u0005a\u0000\u0000"+ + "\u0107\u010c\u0005t\u0000\u0000\u0108\u0109\u0005R\u0000\u0000\u0109\u010a"+ + "\u0005A\u0000\u0000\u010a\u010c\u0005T\u0000\u0000\u010b\u0102\u0001\u0000"+ + "\u0000\u0000\u010b\u0105\u0001\u0000\u0000\u0000\u010b\u0108\u0001\u0000"+ + "\u0000\u0000\u010c\u0006\u0001\u0000\u0000\u0000\u010d\u010e\u0005b\u0000"+ + "\u0000\u010e\u0114\u0005v\u0000\u0000\u010f\u0110\u0005B\u0000\u0000\u0110"+ + "\u0114\u0005v\u0000\u0000\u0111\u0112\u0005B\u0000\u0000\u0112\u0114\u0005"+ + "V\u0000\u0000\u0113\u010d\u0001\u0000\u0000\u0000\u0113\u010f\u0001\u0000"+ + "\u0000\u0000\u0113\u0111\u0001\u0000\u0000\u0000\u0114\b\u0001\u0000\u0000"+ + "\u0000\u0115\u0116\u0005f\u0000\u0000\u0116\u011c\u0005p\u0000\u0000\u0117"+ + "\u0118\u0005F\u0000\u0000\u0118\u011c\u0005p\u0000\u0000\u0119\u011a\u0005"+ + "F\u0000\u0000\u011a\u011c\u0005P\u0000\u0000\u011b\u0115\u0001\u0000\u0000"+ + "\u0000\u011b\u0117\u0001\u0000\u0000\u0000\u011b\u0119\u0001\u0000\u0000"+ + "\u0000\u011c\n\u0001\u0000\u0000\u0000\u011d\u011e\u0005f\u0000\u0000"+ + "\u011e\u011f\u0005u\u0000\u0000\u011f\u0120\u0005n\u0000\u0000\u0120\u012a"+ + "\u0005c\u0000\u0000\u0121\u0122\u0005F\u0000\u0000\u0122\u0123\u0005u"+ + "\u0000\u0000\u0123\u0124\u0005n\u0000\u0000\u0124\u012a\u0005c\u0000\u0000"+ + "\u0125\u0126\u0005F\u0000\u0000\u0126\u0127\u0005U\u0000\u0000\u0127\u0128"+ + "\u0005N\u0000\u0000\u0128\u012a\u0005C\u0000\u0000\u0129\u011d\u0001\u0000"+ + "\u0000\u0000\u0129\u0121\u0001\u0000\u0000\u0000\u0129\u0125\u0001\u0000"+ + "\u0000\u0000\u012a\f\u0001\u0000\u0000\u0000\u012b\u012c\u0005a\u0000"+ + "\u0000\u012c\u012d\u0005r\u0000\u0000\u012d\u012e\u0005r\u0000\u0000\u012e"+ + "\u012f\u0005a\u0000\u0000\u012f\u013b\u0005y\u0000\u0000\u0130\u0131\u0005"+ + "A\u0000\u0000\u0131\u0132\u0005r\u0000\u0000\u0132\u0133\u0005r\u0000"+ + "\u0000\u0133\u0134\u0005a\u0000\u0000\u0134\u013b\u0005y\u0000\u0000\u0135"+ + "\u0136\u0005A\u0000\u0000\u0136\u0137\u0005R\u0000\u0000\u0137\u0138\u0005"+ + "R\u0000\u0000\u0138\u0139\u0005A\u0000\u0000\u0139\u013b\u0005Y\u0000"+ + "\u0000\u013a\u012b\u0001\u0000\u0000\u0000\u013a\u0130\u0001\u0000\u0000"+ + "\u0000\u013a\u0135\u0001\u0000\u0000\u0000\u013b\u000e\u0001\u0000\u0000"+ + "\u0000\u013c\u013d\u0005i\u0000\u0000\u013d\u013e\u0005f\u0000\u0000\u013e"+ + "\u0010\u0001\u0000\u0000\u0000\u013f\u0140\u0005t\u0000\u0000\u0140\u0141"+ + "\u0005h\u0000\u0000\u0141\u0142\u0005e\u0000\u0000\u0142\u0143\u0005n"+ + "\u0000\u0000\u0143\u0012\u0001\u0000\u0000\u0000\u0144\u0145\u0005e\u0000"+ + "\u0000\u0145\u0146\u0005l\u0000\u0000\u0146\u0147\u0005s\u0000\u0000\u0147"+ + "\u0148\u0005e\u0000\u0000\u0148\u0014\u0001\u0000\u0000\u0000\u0149\u014a"+ + "\u0005i\u0000\u0000\u014a\u014b\u0005f\u0000\u0000\u014b\u014c\u0005f"+ + "\u0000\u0000\u014c\u0016\u0001\u0000\u0000\u0000\u014d\u014e\u0005i\u0000"+ + "\u0000\u014e\u014f\u0005t\u0000\u0000\u014f\u0150\u0005e\u0000\u0000\u0150"+ + "\u0018\u0001\u0000\u0000\u0000\u0151\u0152\u0005=\u0000\u0000\u0152\u0153"+ + "\u0005>\u0000\u0000\u0153\u001a\u0001\u0000\u0000\u0000\u0154\u0155\u0005"+ + "f\u0000\u0000\u0155\u0156\u0005o\u0000\u0000\u0156\u0157\u0005r\u0000"+ + "\u0000\u0157\u0158\u0005a\u0000\u0000\u0158\u0159\u0005l\u0000\u0000\u0159"+ + "\u015a\u0005l\u0000\u0000\u015a\u001c\u0001\u0000\u0000\u0000\u015b\u015c"+ + "\u0005e\u0000\u0000\u015c\u015d\u0005x\u0000\u0000\u015d\u015e\u0005i"+ + "\u0000\u0000\u015e\u015f\u0005s\u0000\u0000\u015f\u0160\u0005t\u0000\u0000"+ + "\u0160\u0161\u0005s\u0000\u0000\u0161\u001e\u0001\u0000\u0000\u0000\u0162"+ + "\u0163\u0005o\u0000\u0000\u0163\u0164\u0005r\u0000\u0000\u0164 \u0001"+ + "\u0000\u0000\u0000\u0165\u0166\u0005a\u0000\u0000\u0166\u0167\u0005n\u0000"+ + "\u0000\u0167\u0168\u0005d\u0000\u0000\u0168\"\u0001\u0000\u0000\u0000"+ + "\u0169\u016a\u0005x\u0000\u0000\u016a\u016b\u0005o\u0000\u0000\u016b\u016c"+ + "\u0005r\u0000\u0000\u016c$\u0001\u0000\u0000\u0000\u016d\u016e\u0005n"+ + "\u0000\u0000\u016e\u016f\u0005o\u0000\u0000\u016f\u0170\u0005t\u0000\u0000"+ + "\u0170&\u0001\u0000\u0000\u0000\u0171\u0172\u0005=\u0000\u0000\u0172("+ + "\u0001\u0000\u0000\u0000\u0173\u0174\u0005/\u0000\u0000\u0174\u0175\u0005"+ + "=\u0000\u0000\u0175*\u0001\u0000\u0000\u0000\u0176\u0177\u0005<\u0000"+ + "\u0000\u0177,\u0001\u0000\u0000\u0000\u0178\u0179\u0005<\u0000\u0000\u0179"+ + "\u017a\u0005=\u0000\u0000\u017a.\u0001\u0000\u0000\u0000\u017b\u017c\u0005"+ + ">\u0000\u0000\u017c0\u0001\u0000\u0000\u0000\u017d\u017e\u0005>\u0000"+ + "\u0000\u017e\u017f\u0005=\u0000\u0000\u017f2\u0001\u0000\u0000\u0000\u0180"+ + "\u0181\u0005+\u0000\u0000\u01814\u0001\u0000\u0000\u0000\u0182\u0183\u0005"+ + "-\u0000\u0000\u01836\u0001\u0000\u0000\u0000\u0184\u0185\u0005*\u0000"+ + "\u0000\u01858\u0001\u0000\u0000\u0000\u0186\u0187\u0005d\u0000\u0000\u0187"+ + "\u0188\u0005i\u0000\u0000\u0188\u0189\u0005v\u0000\u0000\u0189:\u0001"+ + "\u0000\u0000\u0000\u018a\u018b\u0005m\u0000\u0000\u018b\u018c\u0005o\u0000"+ + "\u0000\u018c\u018d\u0005d\u0000\u0000\u018d<\u0001\u0000\u0000\u0000\u018e"+ + "\u018f\u0005r\u0000\u0000\u018f\u0190\u0005e\u0000\u0000\u0190\u0191\u0005"+ + "m\u0000\u0000\u0191>\u0001\u0000\u0000\u0000\u0192\u0193\u0005%\u0000"+ + "\u0000\u0193@\u0001\u0000\u0000\u0000\u0194\u0195\u00033\u0019\u0000\u0195"+ + "\u0196\u00033\u0019\u0000\u0196B\u0001\u0000\u0000\u0000\u0197\u0198\u0005"+ + "b\u0000\u0000\u0198\u0199\u0005v\u0000\u0000\u0199\u019a\u0005_\u0000"+ + "\u0000\u019a\u019b\u0005z\u0000\u0000\u019b\u019c\u0005e\u0000\u0000\u019c"+ + "\u019d\u0005r\u0000\u0000\u019d\u019e\u0005o\u0000\u0000\u019e\u019f\u0005"+ + "_\u0000\u0000\u019f\u01a0\u0005e\u0000\u0000\u01a0\u01a1\u0005x\u0000"+ + "\u0000\u01a1\u01a2\u0005t\u0000\u0000\u01a2\u01a3\u0005e\u0000\u0000\u01a3"+ + "\u01a4\u0005n\u0000\u0000\u01a4\u01a5\u0005d\u0000\u0000\u01a5D\u0001"+ + "\u0000\u0000\u0000\u01a6\u01a7\u0005b\u0000\u0000\u01a7\u01a8\u0005v\u0000"+ + "\u0000\u01a8\u01a9\u0005_\u0000\u0000\u01a9\u01aa\u0005s\u0000\u0000\u01aa"+ + "\u01ab\u0005i\u0000\u0000\u01ab\u01ac\u0005g\u0000\u0000\u01ac\u01ad\u0005"+ + "n\u0000\u0000\u01ad\u01ae\u0005_\u0000\u0000\u01ae\u01af\u0005e\u0000"+ + "\u0000\u01af\u01b0\u0005x\u0000\u0000\u01b0\u01b1\u0005t\u0000\u0000\u01b1"+ + "\u01b2\u0005e\u0000\u0000\u01b2\u01b3\u0005n\u0000\u0000\u01b3\u01b4\u0005"+ + "d\u0000\u0000\u01b4F\u0001\u0000\u0000\u0000\u01b5\u01b6\u0005b\u0000"+ + "\u0000\u01b6\u01b7\u0005v\u0000\u0000\u01b7\u01b8\u0005a\u0000\u0000\u01b8"+ + "\u01b9\u0005d\u0000\u0000\u01b9\u01ba\u0005d\u0000\u0000\u01baH\u0001"+ + "\u0000\u0000\u0000\u01bb\u01bc\u0005b\u0000\u0000\u01bc\u01bd\u0005v\u0000"+ + "\u0000\u01bd\u01be\u0005s\u0000\u0000\u01be\u01bf\u0005u\u0000\u0000\u01bf"+ + "\u01c0\u0005b\u0000\u0000\u01c0J\u0001\u0000\u0000\u0000\u01c1\u01c2\u0005"+ + "b\u0000\u0000\u01c2\u01c3\u0005v\u0000\u0000\u01c3\u01c4\u0005p\u0000"+ + "\u0000\u01c4\u01c5\u0005o\u0000\u0000\u01c5\u01c6\u0005s\u0000\u0000\u01c6"+ + "L\u0001\u0000\u0000\u0000\u01c7\u01c8\u0005b\u0000\u0000\u01c8\u01c9\u0005"+ + "v\u0000\u0000\u01c9\u01ca\u0005n\u0000\u0000\u01ca\u01cb\u0005e\u0000"+ + "\u0000\u01cb\u01cc\u0005g\u0000\u0000\u01ccN\u0001\u0000\u0000\u0000\u01cd"+ + "\u01ce\u0005b\u0000\u0000\u01ce\u01cf\u0005v\u0000\u0000\u01cf\u01d0\u0005"+ + "m\u0000\u0000\u01d0\u01d1\u0005u\u0000\u0000\u01d1\u01d2\u0005l\u0000"+ + "\u0000\u01d2P\u0001\u0000\u0000\u0000\u01d3\u01d4\u0005b\u0000\u0000\u01d4"+ + "\u01d5\u0005v\u0000\u0000\u01d5\u01d6\u0005u\u0000\u0000\u01d6\u01d7\u0005"+ + "d\u0000\u0000\u01d7\u01d8\u0005i\u0000\u0000\u01d8\u01d9\u0005v\u0000"+ + "\u0000\u01d9R\u0001\u0000\u0000\u0000\u01da\u01db\u0005b\u0000\u0000\u01db"+ + "\u01dc\u0005v\u0000\u0000\u01dc\u01dd\u0005s\u0000\u0000\u01dd\u01de\u0005"+ + "d\u0000\u0000\u01de\u01df\u0005i\u0000\u0000\u01df\u01e0\u0005v\u0000"+ + "\u0000\u01e0T\u0001\u0000\u0000\u0000\u01e1\u01e2\u0005b\u0000\u0000\u01e2"+ + "\u01e3\u0005v\u0000\u0000\u01e3\u01e4\u0005s\u0000\u0000\u01e4\u01e5\u0005"+ + "m\u0000\u0000\u01e5\u01e6\u0005o\u0000\u0000\u01e6\u01e7\u0005d\u0000"+ + "\u0000\u01e7V\u0001\u0000\u0000\u0000\u01e8\u01e9\u0005b\u0000\u0000\u01e9"+ + "\u01ea\u0005v\u0000\u0000\u01ea\u01eb\u0005u\u0000\u0000\u01eb\u01ec\u0005"+ + "r\u0000\u0000\u01ec\u01ed\u0005e\u0000\u0000\u01ed\u01ee\u0005m\u0000"+ + "\u0000\u01eeX\u0001\u0000\u0000\u0000\u01ef\u01f0\u0005b\u0000\u0000\u01f0"+ + "\u01f1\u0005v\u0000\u0000\u01f1\u01f2\u0005s\u0000\u0000\u01f2\u01f3\u0005"+ + "r\u0000\u0000\u01f3\u01f4\u0005e\u0000\u0000\u01f4\u01f5\u0005m\u0000"+ + "\u0000\u01f5Z\u0001\u0000\u0000\u0000\u01f6\u01f7\u0005b\u0000\u0000\u01f7"+ + "\u01f8\u0005v\u0000\u0000\u01f8\u01f9\u0005o\u0000\u0000\u01f9\u01fa\u0005"+ + "r\u0000\u0000\u01fa\\\u0001\u0000\u0000\u0000\u01fb\u01fc\u0005b\u0000"+ + "\u0000\u01fc\u01fd\u0005v\u0000\u0000\u01fd\u01fe\u0005a\u0000\u0000\u01fe"+ + "\u01ff\u0005n\u0000\u0000\u01ff\u0200\u0005d\u0000\u0000\u0200^\u0001"+ + "\u0000\u0000\u0000\u0201\u0202\u0005b\u0000\u0000\u0202\u0203\u0005v\u0000"+ + "\u0000\u0203\u0204\u0005x\u0000\u0000\u0204\u0205\u0005o\u0000\u0000\u0205"+ + "\u0206\u0005r\u0000\u0000\u0206`\u0001\u0000\u0000\u0000\u0207\u0208\u0005"+ + "b\u0000\u0000\u0208\u0209\u0005v\u0000\u0000\u0209\u020a\u0005n\u0000"+ + "\u0000\u020a\u020b\u0005o\u0000\u0000\u020b\u020c\u0005t\u0000\u0000\u020c"+ + "b\u0001\u0000\u0000\u0000\u020d\u020e\u0005b\u0000\u0000\u020e\u020f\u0005"+ + "v\u0000\u0000\u020f\u0210\u0005s\u0000\u0000\u0210\u0211\u0005h\u0000"+ + "\u0000\u0211\u0212\u0005l\u0000\u0000\u0212d\u0001\u0000\u0000\u0000\u0213"+ + "\u0214\u0005b\u0000\u0000\u0214\u0215\u0005v\u0000\u0000\u0215\u0216\u0005"+ + "a\u0000\u0000\u0216\u0217\u0005s\u0000\u0000\u0217\u0218\u0005h\u0000"+ + "\u0000\u0218\u0219\u0005r\u0000\u0000\u0219f\u0001\u0000\u0000\u0000\u021a"+ + "\u021b\u0005b\u0000\u0000\u021b\u021c\u0005v\u0000\u0000\u021c\u021d\u0005"+ + "l\u0000\u0000\u021d\u021e\u0005s\u0000\u0000\u021e\u021f\u0005h\u0000"+ + "\u0000\u021f\u0220\u0005r\u0000\u0000\u0220h\u0001\u0000\u0000\u0000\u0221"+ + "\u0222\u0005b\u0000\u0000\u0222\u0223\u0005v\u0000\u0000\u0223\u0224\u0005"+ + "r\u0000\u0000\u0224\u0225\u0005o\u0000\u0000\u0225\u0226\u0005l\u0000"+ + "\u0000\u0226j\u0001\u0000\u0000\u0000\u0227\u0228\u0005b\u0000\u0000\u0228"+ + "\u0229\u0005v\u0000\u0000\u0229\u022a\u0005r\u0000\u0000\u022a\u022b\u0005"+ + "o\u0000\u0000\u022b\u022c\u0005r\u0000\u0000\u022cl\u0001\u0000\u0000"+ + "\u0000\u022d\u022e\u0005b\u0000\u0000\u022e\u022f\u0005v\u0000\u0000\u022f"+ + "\u0230\u0005u\u0000\u0000\u0230\u0231\u0005l\u0000\u0000\u0231\u0232\u0005"+ + "t\u0000\u0000\u0232n\u0001\u0000\u0000\u0000\u0233\u0234\u0005b\u0000"+ + "\u0000\u0234\u0235\u0005v\u0000\u0000\u0235\u0236\u0005u\u0000\u0000\u0236"+ + "\u0237\u0005l\u0000\u0000\u0237\u0238\u0005e\u0000\u0000\u0238p\u0001"+ + "\u0000\u0000\u0000\u0239\u023a\u0005b\u0000\u0000\u023a\u023b\u0005v\u0000"+ + "\u0000\u023b\u023c\u0005u\u0000\u0000\u023c\u023d\u0005g\u0000\u0000\u023d"+ + "\u023e\u0005t\u0000\u0000\u023er\u0001\u0000\u0000\u0000\u023f\u0240\u0005"+ + "b\u0000\u0000\u0240\u0241\u0005v\u0000\u0000\u0241\u0242\u0005u\u0000"+ + "\u0000\u0242\u0243\u0005g\u0000\u0000\u0243\u0244\u0005e\u0000\u0000\u0244"+ + "t\u0001\u0000\u0000\u0000\u0245\u0246\u0005b\u0000\u0000\u0246\u0247\u0005"+ + "v\u0000\u0000\u0247\u0248\u0005s\u0000\u0000\u0248\u0249\u0005l\u0000"+ + "\u0000\u0249\u024a\u0005t\u0000\u0000\u024av\u0001\u0000\u0000\u0000\u024b"+ + "\u024c\u0005b\u0000\u0000\u024c\u024d\u0005v\u0000\u0000\u024d\u024e\u0005"+ + "s\u0000\u0000\u024e\u024f\u0005l\u0000\u0000\u024f\u0250\u0005e\u0000"+ + "\u0000\u0250x\u0001\u0000\u0000\u0000\u0251\u0252\u0005b\u0000\u0000\u0252"+ + "\u0253\u0005v\u0000\u0000\u0253\u0254\u0005s\u0000\u0000\u0254\u0255\u0005"+ + "g\u0000\u0000\u0255\u0256\u0005t\u0000\u0000\u0256z\u0001\u0000\u0000"+ + "\u0000\u0257\u0258\u0005b\u0000\u0000\u0258\u0259\u0005v\u0000\u0000\u0259"+ + "\u025a\u0005s\u0000\u0000\u025a\u025b\u0005g\u0000\u0000\u025b\u025c\u0005"+ + "e\u0000\u0000\u025c|\u0001\u0000\u0000\u0000\u025d\u025e\u0005f\u0000"+ + "\u0000\u025e\u025f\u0005p\u0000\u0000\u025f\u0260\u0005a\u0000\u0000\u0260"+ + "\u0261\u0005b\u0000\u0000\u0261\u0262\u0005s\u0000\u0000\u0262~\u0001"+ + "\u0000\u0000\u0000\u0263\u0264\u0005f\u0000\u0000\u0264\u0265\u0005p\u0000"+ + "\u0000\u0265\u0266\u0005f\u0000\u0000\u0266\u0267\u0005r\u0000\u0000\u0267"+ + "\u0268\u0005o\u0000\u0000\u0268\u0269\u0005m\u0000\u0000\u0269\u026a\u0005"+ + "b\u0000\u0000\u026a\u026b\u0005v\u0000\u0000\u026b\u026c\u0001\u0000\u0000"+ + "\u0000\u026c\u026d\u0003\u00a9T\u0000\u026d\u026e\u0003\u00cfg\u0000\u026e"+ + "\u026f\u0007\u0000\u0000\u0000\u026f\u0270\u0003\u00d1h\u0000\u0270\u0272"+ + "\u0001\u0000\u0000\u0000\u0271\u0273\u0003\u00abU\u0000\u0272\u0271\u0001"+ + "\u0000\u0000\u0000\u0272\u0273\u0001\u0000\u0000\u0000\u0273\u0080\u0001"+ + "\u0000\u0000\u0000\u0274\u0275\u0005f\u0000\u0000\u0275\u0276\u0005p\u0000"+ + "\u0000\u0276\u0277\u0005i\u0000\u0000\u0277\u0278\u0005s\u0000\u0000\u0278"+ + "\u0279\u0005n\u0000\u0000\u0279\u027a\u0005a\u0000\u0000\u027a\u027b\u0005"+ + "n\u0000\u0000\u027b\u0082\u0001\u0000\u0000\u0000\u027c\u027d\u0005f\u0000"+ + "\u0000\u027d\u027e\u0005p\u0000\u0000\u027e\u027f\u0005m\u0000\u0000\u027f"+ + "\u0280\u0005a\u0000\u0000\u0280\u0281\u0005x\u0000\u0000\u0281\u0084\u0001"+ + "\u0000\u0000\u0000\u0282\u0283\u0005f\u0000\u0000\u0283\u0284\u0005p\u0000"+ + "\u0000\u0284\u0285\u0005m\u0000\u0000\u0285\u0286\u0005i\u0000\u0000\u0286"+ + "\u0287\u0005n\u0000\u0000\u0287\u0086\u0001\u0000\u0000\u0000\u0288\u0289"+ + "\u0005f\u0000\u0000\u0289\u028a\u0005p\u0000\u0000\u028a\u028b\u0005r"+ + "\u0000\u0000\u028b\u028c\u0005e\u0000\u0000\u028c\u028d\u0005m\u0000\u0000"+ + "\u028d\u0088\u0001\u0000\u0000\u0000\u028e\u028f\u0005f\u0000\u0000\u028f"+ + "\u0290\u0005p\u0000\u0000\u0290\u0291\u0005r\u0000\u0000\u0291\u0292\u0005"+ + "o\u0000\u0000\u0292\u0293\u0005u\u0000\u0000\u0293\u0294\u0005n\u0000"+ + "\u0000\u0294\u0295\u0005d\u0000\u0000\u0295\u0296\u0005t\u0000\u0000\u0296"+ + "\u0297\u0005o\u0000\u0000\u0297\u0298\u0005i\u0000\u0000\u0298\u0299\u0005"+ + "n\u0000\u0000\u0299\u029a\u0005t\u0000\u0000\u029a\u029c\u0001\u0000\u0000"+ + "\u0000\u029b\u029d\u0003\u00abU\u0000\u029c\u029b\u0001\u0000\u0000\u0000"+ + "\u029c\u029d\u0001\u0000\u0000\u0000\u029d\u008a\u0001\u0000\u0000\u0000"+ + "\u029e\u029f\u0005f\u0000\u0000\u029f\u02a0\u0005p\u0000\u0000\u02a0\u02a1"+ + "\u0005s\u0000\u0000\u02a1\u02a2\u0005q\u0000\u0000\u02a2\u02a3\u0005r"+ + "\u0000\u0000\u02a3\u02a4\u0005t\u0000\u0000\u02a4\u02a6\u0001\u0000\u0000"+ + "\u0000\u02a5\u02a7\u0003\u00abU\u0000\u02a6\u02a5\u0001\u0000\u0000\u0000"+ + "\u02a6\u02a7\u0001\u0000\u0000\u0000\u02a7\u008c\u0001\u0000\u0000\u0000"+ + "\u02a8\u02a9\u0005f\u0000\u0000\u02a9\u02aa\u0005p\u0000\u0000\u02aa\u02ab"+ + "\u0005t\u0000\u0000\u02ab\u02ac\u0005o\u0000\u0000\u02ac\u02ad\u0005b"+ + "\u0000\u0000\u02ad\u02ae\u0005v\u0000\u0000\u02ae\u02af\u0001\u0000\u0000"+ + "\u0000\u02af\u02b1\u0003\u00a7S\u0000\u02b0\u02b2\u0003\u00abU\u0000\u02b1"+ + "\u02b0\u0001\u0000\u0000\u0000\u02b1\u02b2\u0001\u0000\u0000\u0000\u02b2"+ + "\u008e\u0001\u0000\u0000\u0000\u02b3\u02b4\u0005f\u0000\u0000\u02b4\u02b5"+ + "\u0005p\u0000\u0000\u02b5\u02b6\u0005t\u0000\u0000\u02b6\u02b7\u0005o"+ + "\u0000\u0000\u02b7\u02b8\u0005f\u0000\u0000\u02b8\u02b9\u0005p\u0000\u0000"+ + "\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u02bc\u0003\u00a9T\u0000\u02bb"+ + "\u02bd\u0003\u00abU\u0000\u02bc\u02bb\u0001\u0000\u0000\u0000\u02bc\u02bd"+ + "\u0001\u0000\u0000\u0000\u02bd\u0090\u0001\u0000\u0000\u0000\u02be\u02bf"+ + "\u0005f\u0000\u0000\u02bf\u02c0\u0005p\u0000\u0000\u02c0\u02c1\u0005s"+ + "\u0000\u0000\u02c1\u02c2\u0005u\u0000\u0000\u02c2\u02c3\u0005b\u0000\u0000"+ + "\u02c3\u0092\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005f\u0000\u0000\u02c5"+ + "\u02c6\u0005p\u0000\u0000\u02c6\u02c7\u0005a\u0000\u0000\u02c7\u02c8\u0005"+ + "d\u0000\u0000\u02c8\u02c9\u0005d\u0000\u0000\u02c9\u02cb\u0001\u0000\u0000"+ + "\u0000\u02ca\u02cc\u0003\u00abU\u0000\u02cb\u02ca\u0001\u0000\u0000\u0000"+ + "\u02cb\u02cc\u0001\u0000\u0000\u0000\u02cc\u0094\u0001\u0000\u0000\u0000"+ + "\u02cd\u02ce\u0005f\u0000\u0000\u02ce\u02cf\u0005p\u0000\u0000\u02cf\u02d0"+ + "\u0005m\u0000\u0000\u02d0\u02d1\u0005u\u0000\u0000\u02d1\u02d2\u0005l"+ + "\u0000\u0000\u02d2\u0096\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005f\u0000"+ + "\u0000\u02d4\u02d5\u0005p\u0000\u0000\u02d5\u02d6\u0005d\u0000\u0000\u02d6"+ + "\u02d7\u0005i\u0000\u0000\u02d7\u02d8\u0005v\u0000\u0000\u02d8\u02d9\u0001"+ + "\u0000\u0000\u0000\u02d9\u02da\u0003\u00abU\u0000\u02da\u0098\u0001\u0000"+ + "\u0000\u0000\u02db\u02dc\u0005f\u0000\u0000\u02dc\u02dd\u0005p\u0000\u0000"+ + "\u02dd\u02de\u0005p\u0000\u0000\u02de\u02df\u0005o\u0000\u0000\u02df\u02e0"+ + "\u0005s\u0000\u0000\u02e0\u009a\u0001\u0000\u0000\u0000\u02e1\u02e2\u0005"+ + "f\u0000\u0000\u02e2\u02e3\u0005p\u0000\u0000\u02e3\u02e4\u0005n\u0000"+ + "\u0000\u02e4\u02e5\u0005e\u0000\u0000\u02e5\u02e6\u0005g\u0000\u0000\u02e6"+ + "\u009c\u0001\u0000\u0000\u0000\u02e7\u02e8\u0005t\u0000\u0000\u02e8\u02e9"+ + "\u0005r\u0000\u0000\u02e9\u02ea\u0005u\u0000\u0000\u02ea\u02eb\u0005e"+ + "\u0000\u0000\u02eb\u009e\u0001\u0000\u0000\u0000\u02ec\u02ed\u0005r\u0000"+ + "\u0000\u02ed\u02ee\u0005e\u0000\u0000\u02ee\u02ef\u0005a\u0000\u0000\u02ef"+ + "\u02f0\u0005d\u0000\u0000\u02f0\u00a0\u0001\u0000\u0000\u0000\u02f1\u02f2"+ + "\u0005w\u0000\u0000\u02f2\u02f3\u0005r\u0000\u0000\u02f3\u02f4\u0005i"+ + "\u0000\u0000\u02f4\u02f5\u0005t\u0000\u0000\u02f5\u02f6\u0005e\u0000\u0000"+ + "\u02f6\u00a2\u0001\u0000\u0000\u0000\u02f7\u02f8\u0005p\u0000\u0000\u02f8"+ + "\u02f9\u0005r\u0000\u0000\u02f9\u02fa\u0005i\u0000\u0000\u02fa\u02fb\u0005"+ + "m\u0000\u0000\u02fb\u02fc\u0005e\u0000\u0000\u02fc\u00a4\u0001\u0000\u0000"+ + "\u0000\u02fd\u02fe\u0005e\u0000\u0000\u02fe\u02ff\u0005x\u0000\u0000\u02ff"+ + "\u0300\u0005t\u0000\u0000\u0300\u0301\u0005r\u0000\u0000\u0301\u0302\u0005"+ + "a\u0000\u0000\u0302\u0303\u0005c\u0000\u0000\u0303\u0304\u0005t\u0000"+ + "\u0000\u0304\u00a6\u0001\u0000\u0000\u0000\u0305\u0306\u0003\u00cfg\u0000"+ + "\u0306\u0307\u0003\u00bd^\u0000\u0307\u0308\u0005\'\u0000\u0000\u0308"+ + "\u0309\u0007\u0000\u0000\u0000\u0309\u030a\u0003\u00d1h\u0000\u030a\u00a8"+ + "\u0001\u0000\u0000\u0000\u030b\u030c\u0003\u00cfg\u0000\u030c\u030d\u0003"+ + "\u00bd^\u0000\u030d\u030e\u0003\u00d7k\u0000\u030e\u030f\u0003\u00bd^"+ + "\u0000\u030f\u0310\u0003\u00d1h\u0000\u0310\u00aa\u0001\u0000\u0000\u0000"+ + "\u0311\u0312\u0005[\u0000\u0000\u0312\u0313\u0005r\u0000\u0000\u0313\u0314"+ + "\u0005n\u0000\u0000\u0314\u0315\u0005e\u0000\u0000\u0315\u032b\u0005]"+ + "\u0000\u0000\u0316\u0317\u0005[\u0000\u0000\u0317\u0318\u0005r\u0000\u0000"+ + "\u0318\u0319\u0005n\u0000\u0000\u0319\u031a\u0005a\u0000\u0000\u031a\u032b"+ + "\u0005]\u0000\u0000\u031b\u031c\u0005[\u0000\u0000\u031c\u031d\u0005r"+ + "\u0000\u0000\u031d\u031e\u0005t\u0000\u0000\u031e\u031f\u0005p\u0000\u0000"+ + "\u031f\u032b\u0005]\u0000\u0000\u0320\u0321\u0005[\u0000\u0000\u0321\u0322"+ + "\u0005r\u0000\u0000\u0322\u0323\u0005t\u0000\u0000\u0323\u0324\u0005n"+ + "\u0000\u0000\u0324\u032b\u0005]\u0000\u0000\u0325\u0326\u0005[\u0000\u0000"+ + "\u0326\u0327\u0005r\u0000\u0000\u0327\u0328\u0005t\u0000\u0000\u0328\u0329"+ + "\u0005z\u0000\u0000\u0329\u032b\u0005]\u0000\u0000\u032a\u0311\u0001\u0000"+ + "\u0000\u0000\u032a\u0316\u0001\u0000\u0000\u0000\u032a\u031b\u0001\u0000"+ + "\u0000\u0000\u032a\u0320\u0001\u0000\u0000\u0000\u032a\u0325\u0001\u0000"+ + "\u0000\u0000\u032b\u00ac\u0001\u0000\u0000\u0000\u032c\u032d\u0005f\u0000"+ + "\u0000\u032d\u032e\u0005a\u0000\u0000\u032e\u032f\u0005l\u0000\u0000\u032f"+ + "\u0330\u0005s\u0000\u0000\u0330\u0331\u0005e\u0000\u0000\u0331\u00ae\u0001"+ + "\u0000\u0000\u0000\u0332\u0333\u0005d\u0000\u0000\u0333\u0334\u0005e\u0000"+ + "\u0000\u0334\u0335\u0005f\u0000\u0000\u0335\u0336\u0005a\u0000\u0000\u0336"+ + "\u0337\u0005u\u0000\u0000\u0337\u0338\u0005l\u0000\u0000\u0338\u0339\u0005"+ + "t\u0000\u0000\u0339\u00b0\u0001\u0000\u0000\u0000\u033a\u033b\u0005a\u0000"+ + "\u0000\u033b\u033c\u0005s\u0000\u0000\u033c\u033d\u0005s\u0000\u0000\u033d"+ + "\u033e\u0005i\u0000\u0000\u033e\u033f\u0005g\u0000\u0000\u033f\u0340\u0005"+ + "n\u0000\u0000\u0340\u00b2\u0001\u0000\u0000\u0000\u0341\u0342\u0005h\u0000"+ + "\u0000\u0342\u0343\u0005a\u0000\u0000\u0343\u0344\u0005v\u0000\u0000\u0344"+ + "\u0345\u0005o\u0000\u0000\u0345\u0346\u0005c\u0000\u0000\u0346\u00b4\u0001"+ + "\u0000\u0000\u0000\u0347\u0348\u0005a\u0000\u0000\u0348\u0349\u0005s\u0000"+ + "\u0000\u0349\u034a\u0005s\u0000\u0000\u034a\u034b\u0005u\u0000\u0000\u034b"+ + "\u034c\u0005m\u0000\u0000\u034c\u034d\u0005e\u0000\u0000\u034d\u00b6\u0001"+ + "\u0000\u0000\u0000\u034e\u034f\u0005r\u0000\u0000\u034f\u0350\u0005e\u0000"+ + "\u0000\u0350\u0351\u0005t\u0000\u0000\u0351\u0352\u0005u\u0000\u0000\u0352"+ + "\u0353\u0005r\u0000\u0000\u0353\u0354\u0005n\u0000\u0000\u0354\u00b8\u0001"+ + "\u0000\u0000\u0000\u0355\u0356\u0003\u00bd^\u0000\u0356\u0357\u0005\'"+ + "\u0000\u0000\u0357\u0358\u0005b\u0000\u0000\u0358\u035a\u0001\u0000\u0000"+ + "\u0000\u0359\u035b\u0007\u0001\u0000\u0000\u035a\u0359\u0001\u0000\u0000"+ + "\u0000\u035b\u035c\u0001\u0000\u0000\u0000\u035c\u035a\u0001\u0000\u0000"+ + "\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u0382\u0001\u0000\u0000"+ + "\u0000\u035e\u035f\u0005#\u0000\u0000\u035f\u0360\u0005b\u0000\u0000\u0360"+ + "\u0362\u0001\u0000\u0000\u0000\u0361\u0363\u0007\u0001\u0000\u0000\u0362"+ + "\u0361\u0001\u0000\u0000\u0000\u0363\u0364\u0001\u0000\u0000\u0000\u0364"+ + "\u0362\u0001\u0000\u0000\u0000\u0364\u0365\u0001\u0000\u0000\u0000\u0365"+ + "\u0382\u0001\u0000\u0000\u0000\u0366\u0367\u0005#\u0000\u0000\u0367\u0368"+ + "\u0005x\u0000\u0000\u0368\u036a\u0001\u0000\u0000\u0000\u0369\u036b\u0007"+ + "\u0001\u0000\u0000\u036a\u0369\u0001\u0000\u0000\u0000\u036b\u036c\u0001"+ + "\u0000\u0000\u0000\u036c\u036a\u0001\u0000\u0000\u0000\u036c\u036d\u0001"+ + "\u0000\u0000\u0000\u036d\u0382\u0001\u0000\u0000\u0000\u036e\u036f\u0003"+ + "\u00bd^\u0000\u036f\u0370\u0005\'\u0000\u0000\u0370\u0371\u0005d\u0000"+ + "\u0000\u0371\u0374\u0001\u0000\u0000\u0000\u0372\u0375\u00033\u0019\u0000"+ + "\u0373\u0375\u00035\u001a\u0000\u0374\u0372\u0001\u0000\u0000\u0000\u0374"+ + "\u0373\u0001\u0000\u0000\u0000\u0374\u0375\u0001\u0000\u0000\u0000\u0375"+ + "\u0376\u0001\u0000\u0000\u0000\u0376\u0377\u0003\u00bb]\u0000\u0377\u0382"+ + "\u0001\u0000\u0000\u0000\u0378\u0379\u0003\u00bd^\u0000\u0379\u037a\u0005"+ + "\'\u0000\u0000\u037a\u037b\u0005x\u0000\u0000\u037b\u037d\u0001\u0000"+ + "\u0000\u0000\u037c\u037e\u0007\u0002\u0000\u0000\u037d\u037c\u0001\u0000"+ + "\u0000\u0000\u037e\u037f\u0001\u0000\u0000\u0000\u037f\u037d\u0001\u0000"+ + "\u0000\u0000\u037f\u0380\u0001\u0000\u0000\u0000\u0380\u0382\u0001\u0000"+ + "\u0000\u0000\u0381\u0355\u0001\u0000\u0000\u0000\u0381\u035e\u0001\u0000"+ + "\u0000\u0000\u0381\u0366\u0001\u0000\u0000\u0000\u0381\u036e\u0001\u0000"+ + "\u0000\u0000\u0381\u0378\u0001\u0000\u0000\u0000\u0382\u00ba\u0001\u0000"+ + "\u0000\u0000\u0383\u0385\u0003\u00bf_\u0000\u0384\u0383\u0001\u0000\u0000"+ + "\u0000\u0384\u0385\u0001\u0000\u0000\u0000\u0385\u0386\u0001\u0000\u0000"+ + "\u0000\u0386\u0387\u0003\u00bd^\u0000\u0387\u00bc\u0001\u0000\u0000\u0000"+ + "\u0388\u038a\u0003\u00c7c\u0000\u0389\u0388\u0001\u0000\u0000\u0000\u038a"+ + "\u038b\u0001\u0000\u0000\u0000\u038b\u0389\u0001\u0000\u0000\u0000\u038b"+ + "\u038c\u0001\u0000\u0000\u0000\u038c\u00be\u0001\u0000\u0000\u0000\u038d"+ + "\u0390\u00033\u0019\u0000\u038e\u0390\u00035\u001a\u0000\u038f\u038d\u0001"+ + "\u0000\u0000\u0000\u038f\u038e\u0001\u0000\u0000\u0000\u0390\u00c0\u0001"+ + "\u0000\u0000\u0000\u0391\u0392\u0005.\u0000\u0000\u0392\u00c2\u0001\u0000"+ + "\u0000\u0000\u0393\u0396\u0003\u00c9d\u0000\u0394\u0396\u0003\u00c5b\u0000"+ + "\u0395\u0393\u0001\u0000\u0000\u0000\u0395\u0394\u0001\u0000\u0000\u0000"+ + "\u0396\u039e\u0001\u0000\u0000\u0000\u0397\u039d\u0003\u00c9d\u0000\u0398"+ + "\u039d\u0003\u00c5b\u0000\u0399\u039d\u0005$\u0000\u0000\u039a\u039d\u0003"+ + "\u00c7c\u0000\u039b\u039d\u0003\u00d9l\u0000\u039c\u0397\u0001\u0000\u0000"+ + "\u0000\u039c\u0398\u0001\u0000\u0000\u0000\u039c\u0399\u0001\u0000\u0000"+ + "\u0000\u039c\u039a\u0001\u0000\u0000\u0000\u039c\u039b\u0001\u0000\u0000"+ + "\u0000\u039d\u03a0\u0001\u0000\u0000\u0000\u039e\u039c\u0001\u0000\u0000"+ + "\u0000\u039e\u039f\u0001\u0000\u0000\u0000\u039f\u00c4\u0001\u0000\u0000"+ + "\u0000\u03a0\u039e\u0001\u0000\u0000\u0000\u03a1\u03a2\u0005_\u0000\u0000"+ + "\u03a2\u00c6\u0001\u0000\u0000\u0000\u03a3\u03a4\u0007\u0003\u0000\u0000"+ + "\u03a4\u00c8\u0001\u0000\u0000\u0000\u03a5\u03a6\u0007\u0004\u0000\u0000"+ + "\u03a6\u00ca\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005(\u0000\u0000\u03a8"+ + "\u00cc\u0001\u0000\u0000\u0000\u03a9\u03aa\u0005)\u0000\u0000\u03aa\u00ce"+ + "\u0001\u0000\u0000\u0000\u03ab\u03ac\u0005[\u0000\u0000\u03ac\u00d0\u0001"+ + "\u0000\u0000\u0000\u03ad\u03ae\u0005]\u0000\u0000\u03ae\u00d2\u0001\u0000"+ + "\u0000\u0000\u03af\u03b0\u0005{\u0000\u0000\u03b0\u00d4\u0001\u0000\u0000"+ + "\u0000\u03b1\u03b2\u0005}\u0000\u0000\u03b2\u00d6\u0001\u0000\u0000\u0000"+ + "\u03b3\u03b4\u0005,\u0000\u0000\u03b4\u00d8\u0001\u0000\u0000\u0000\u03b5"+ + "\u03b6\u0005:\u0000\u0000\u03b6\u00da\u0001\u0000\u0000\u0000\u03b7\u03b8"+ + "\u0005;\u0000\u0000\u03b8\u00dc\u0001\u0000\u0000\u0000\u03b9\u03ba\u0005"+ + "\'\u0000\u0000\u03ba\u00de\u0001\u0000\u0000\u0000\u03bb\u03bc\u0005<"+ + "\u0000\u0000\u03bc\u03bd\u0005-\u0000\u0000\u03bd\u00e0\u0001\u0000\u0000"+ + "\u0000\u03be\u03bf\u0005-\u0000\u0000\u03bf\u03c0\u0005>\u0000\u0000\u03c0"+ + "\u00e2\u0001\u0000\u0000\u0000\u03c1\u03c3\u0007\u0005\u0000\u0000\u03c2"+ + "\u03c1\u0001\u0000\u0000\u0000\u03c3\u03c4\u0001\u0000\u0000\u0000\u03c4"+ + "\u03c2\u0001\u0000\u0000\u0000\u03c4\u03c5\u0001\u0000\u0000\u0000\u03c5"+ + "\u03c6\u0001\u0000\u0000\u0000\u03c6\u03c7\u0006q\u0000\u0000\u03c7\u00e4"+ + "\u0001\u0000\u0000\u0000\u03c8\u03c9\u0005/\u0000\u0000\u03c9\u03ca\u0005"+ + "*\u0000\u0000\u03ca\u03ce\u0001\u0000\u0000\u0000\u03cb\u03cd\t\u0000"+ + "\u0000\u0000\u03cc\u03cb\u0001\u0000\u0000\u0000\u03cd\u03d0\u0001\u0000"+ + "\u0000\u0000\u03ce\u03cf\u0001\u0000\u0000\u0000\u03ce\u03cc\u0001\u0000"+ + "\u0000\u0000\u03cf\u03d1\u0001\u0000\u0000\u0000\u03d0\u03ce\u0001\u0000"+ + "\u0000\u0000\u03d1\u03d2\u0005*\u0000\u0000\u03d2\u03d3\u0005/\u0000\u0000"+ + "\u03d3\u03d4\u0001\u0000\u0000\u0000\u03d4\u03d5\u0006r\u0000\u0000\u03d5"+ + "\u00e6\u0001\u0000\u0000\u0000\u03d6\u03d7\u0005/\u0000\u0000\u03d7\u03d8"+ + "\u0005/\u0000\u0000\u03d8\u03dc\u0001\u0000\u0000\u0000\u03d9\u03db\b"+ + "\u0006\u0000\u0000\u03da\u03d9\u0001\u0000\u0000\u0000\u03db\u03de\u0001"+ + "\u0000\u0000\u0000\u03dc\u03da\u0001\u0000\u0000\u0000\u03dc\u03dd\u0001"+ + "\u0000\u0000\u0000\u03dd\u03df\u0001\u0000\u0000\u0000\u03de\u03dc\u0001"+ + "\u0000\u0000\u0000\u03df\u03e0\u0006s\u0000\u0000\u03e0\u00e8\u0001\u0000"+ + "\u0000\u0000\u001e\u0000\u00f5\u0100\u010b\u0113\u011b\u0129\u013a\u0272"+ + "\u029c\u02a6\u02b1\u02bc\u02cb\u032a\u035c\u0364\u036c\u0374\u037f\u0381"+ + "\u0384\u038b\u038f\u0395\u039c\u039e\u03c4\u03ce\u03dc\u0001\u0006\u0000"+ + "\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/CommonTokens.tokens b/subprojects/common/grammar/src/main/gen/CommonTokens.tokens new file mode 100644 index 0000000000..9531176830 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/CommonTokens.tokens @@ -0,0 +1,204 @@ +BOOLTYPE=1 +INTTYPE=2 +RATTYPE=3 +BVTYPE=4 +FPTYPE=5 +FUNC=6 +ARRAY=7 +IF=8 +THEN=9 +ELSE=10 +IFF=11 +ITE=12 +IMPLY=13 +FORALL=14 +EXISTS=15 +OR=16 +AND=17 +XOR=18 +NOT=19 +EQ=20 +NEQ=21 +LT=22 +LEQ=23 +GT=24 +GEQ=25 +PLUS=26 +MINUS=27 +MUL=28 +DIV=29 +MOD=30 +REM=31 +PERCENT=32 +BV_CONCAT=33 +BV_ZERO_EXTEND=34 +BV_SIGN_EXTEND=35 +BV_ADD=36 +BV_SUB=37 +BV_POS=38 +BV_NEG=39 +BV_MUL=40 +BV_UDIV=41 +BV_SDIV=42 +BV_SMOD=43 +BV_UREM=44 +BV_SREM=45 +BV_OR=46 +BV_AND=47 +BV_XOR=48 +BV_NOT=49 +BV_SHL=50 +BV_ASHR=51 +BV_LSHR=52 +BV_ROL=53 +BV_ROR=54 +BV_ULT=55 +BV_ULE=56 +BV_UGT=57 +BV_UGE=58 +BV_SLT=59 +BV_SLE=60 +BV_SGT=61 +BV_SGE=62 +FP_ABS=63 +FP_FROM_BV=64 +FP_IS_NAN=65 +FPMAX=66 +FPMIN=67 +FPREM=68 +FPROUNDTOINT=69 +FPSQRT=70 +FPTOBV=71 +FPTOFP=72 +FPSUB=73 +FPADD=74 +FPMUL=75 +FPDIV=76 +FPPOS=77 +FPNEG=78 +TRUE=79 +READ=80 +WRITE=81 +PRIME=82 +EXTRACT=83 +BV_TYPE_DECL=84 +FP_TYPE_DECL=85 +FP_ROUNDINGMODE=86 +FALSE=87 +DEFAULT=88 +ASSIGN=89 +HAVOC=90 +ASSUME=91 +RETURN=92 +BV=93 +INT=94 +NAT=95 +SIGN=96 +DOT=97 +ID=98 +UNDERSCORE=99 +DIGIT=100 +LETTER=101 +LPAREN=102 +RPAREN=103 +LBRACK=104 +RBRACK=105 +LBRAC=106 +RBRAC=107 +COMMA=108 +COLON=109 +SEMICOLON=110 +QUOT=111 +LARROW=112 +RARROW=113 +WS=114 +COMMENT=115 +LINE_COMMENT=116 +'if'=8 +'then'=9 +'else'=10 +'iff'=11 +'ite'=12 +'=>'=13 +'forall'=14 +'exists'=15 +'or'=16 +'and'=17 +'xor'=18 +'not'=19 +'='=20 +'/='=21 +'<'=22 +'<='=23 +'>'=24 +'>='=25 +'+'=26 +'-'=27 +'*'=28 +'div'=29 +'mod'=30 +'rem'=31 +'%'=32 +'bv_zero_extend'=34 +'bv_sign_extend'=35 +'bvadd'=36 +'bvsub'=37 +'bvpos'=38 +'bvneg'=39 +'bvmul'=40 +'bvudiv'=41 +'bvsdiv'=42 +'bvsmod'=43 +'bvurem'=44 +'bvsrem'=45 +'bvor'=46 +'bvand'=47 +'bvxor'=48 +'bvnot'=49 +'bvshl'=50 +'bvashr'=51 +'bvlshr'=52 +'bvrol'=53 +'bvror'=54 +'bvult'=55 +'bvule'=56 +'bvugt'=57 +'bvuge'=58 +'bvslt'=59 +'bvsle'=60 +'bvsgt'=61 +'bvsge'=62 +'fpabs'=63 +'fpisnan'=65 +'fpmax'=66 +'fpmin'=67 +'fprem'=68 +'fpsub'=73 +'fpmul'=75 +'fppos'=77 +'fpneg'=78 +'true'=79 +'read'=80 +'write'=81 +'prime'=82 +'extract'=83 +'false'=87 +'default'=88 +'assign'=89 +'havoc'=90 +'assume'=91 +'return'=92 +'.'=97 +'_'=99 +'('=102 +')'=103 +'['=104 +']'=105 +'{'=106 +'}'=107 +','=108 +':'=109 +';'=110 +'\''=111 +'<-'=112 +'->'=113 diff --git a/subprojects/common/grammar/src/main/gen/Declarations.interp b/subprojects/common/grammar/src/main/gen/Declarations.interp new file mode 100644 index 0000000000..5f3e28a6b2 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/Declarations.interp @@ -0,0 +1,254 @@ +token literal names: +null +null +null +null +null +null +null +null +'if' +'then' +'else' +'iff' +'ite' +'=>' +'forall' +'exists' +'or' +'and' +'xor' +'not' +'=' +'/=' +'<' +'<=' +'>' +'>=' +'+' +'-' +'*' +'div' +'mod' +'rem' +'%' +null +'bv_zero_extend' +'bv_sign_extend' +'bvadd' +'bvsub' +'bvpos' +'bvneg' +'bvmul' +'bvudiv' +'bvsdiv' +'bvsmod' +'bvurem' +'bvsrem' +'bvor' +'bvand' +'bvxor' +'bvnot' +'bvshl' +'bvashr' +'bvlshr' +'bvrol' +'bvror' +'bvult' +'bvule' +'bvugt' +'bvuge' +'bvslt' +'bvsle' +'bvsgt' +'bvsge' +'fpabs' +null +'fpisnan' +'fpmax' +'fpmin' +'fprem' +null +null +null +null +'fpsub' +null +'fpmul' +null +'fppos' +'fpneg' +'true' +'read' +'write' +'prime' +'extract' +null +null +null +'false' +'default' +'assign' +'havoc' +'assume' +'return' +null +null +null +null +'.' +null +'_' +null +null +'(' +')' +'[' +']' +'{' +'}' +',' +':' +';' +'\'' +'<-' +'->' +null +null +null + +token symbolic names: +null +BOOLTYPE +INTTYPE +RATTYPE +BVTYPE +FPTYPE +FUNC +ARRAY +IF +THEN +ELSE +IFF +ITE +IMPLY +FORALL +EXISTS +OR +AND +XOR +NOT +EQ +NEQ +LT +LEQ +GT +GEQ +PLUS +MINUS +MUL +DIV +MOD +REM +PERCENT +BV_CONCAT +BV_ZERO_EXTEND +BV_SIGN_EXTEND +BV_ADD +BV_SUB +BV_POS +BV_NEG +BV_MUL +BV_UDIV +BV_SDIV +BV_SMOD +BV_UREM +BV_SREM +BV_OR +BV_AND +BV_XOR +BV_NOT +BV_SHL +BV_ASHR +BV_LSHR +BV_ROL +BV_ROR +BV_ULT +BV_ULE +BV_UGT +BV_UGE +BV_SLT +BV_SLE +BV_SGT +BV_SGE +FP_ABS +FP_FROM_BV +FP_IS_NAN +FPMAX +FPMIN +FPREM +FPROUNDTOINT +FPSQRT +FPTOBV +FPTOFP +FPSUB +FPADD +FPMUL +FPDIV +FPPOS +FPNEG +TRUE +READ +WRITE +PRIME +EXTRACT +BV_TYPE_DECL +FP_TYPE_DECL +FP_ROUNDINGMODE +FALSE +DEFAULT +ASSIGN +HAVOC +ASSUME +RETURN +BV +INT +NAT +SIGN +DOT +ID +UNDERSCORE +DIGIT +LETTER +LPAREN +RPAREN +LBRACK +RBRACK +LBRAC +RBRAC +COMMA +COLON +SEMICOLON +QUOT +LARROW +RARROW +WS +COMMENT +LINE_COMMENT + +rule names: +decl +declList +type +typeList +boolType +intType +ratType +funcType +arrayType +bvType +fpType + + +atn: +[4, 1, 116, 87, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 5, 1, 31, 8, 1, 10, 1, 12, 1, 34, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 43, 8, 2, 1, 3, 1, 3, 1, 3, 5, 3, 48, 8, 3, 10, 3, 12, 3, 51, 9, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 0, 0, 11, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 0, 0, 83, 0, 22, 1, 0, 0, 0, 2, 27, 1, 0, 0, 0, 4, 42, 1, 0, 0, 0, 6, 44, 1, 0, 0, 0, 8, 52, 1, 0, 0, 0, 10, 54, 1, 0, 0, 0, 12, 56, 1, 0, 0, 0, 14, 58, 1, 0, 0, 0, 16, 64, 1, 0, 0, 0, 18, 75, 1, 0, 0, 0, 20, 80, 1, 0, 0, 0, 22, 23, 5, 102, 0, 0, 23, 24, 5, 98, 0, 0, 24, 25, 3, 4, 2, 0, 25, 26, 5, 103, 0, 0, 26, 1, 1, 0, 0, 0, 27, 32, 3, 0, 0, 0, 28, 29, 5, 108, 0, 0, 29, 31, 3, 0, 0, 0, 30, 28, 1, 0, 0, 0, 31, 34, 1, 0, 0, 0, 32, 30, 1, 0, 0, 0, 32, 33, 1, 0, 0, 0, 33, 3, 1, 0, 0, 0, 34, 32, 1, 0, 0, 0, 35, 43, 3, 8, 4, 0, 36, 43, 3, 10, 5, 0, 37, 43, 3, 12, 6, 0, 38, 43, 3, 14, 7, 0, 39, 43, 3, 16, 8, 0, 40, 43, 3, 18, 9, 0, 41, 43, 3, 20, 10, 0, 42, 35, 1, 0, 0, 0, 42, 36, 1, 0, 0, 0, 42, 37, 1, 0, 0, 0, 42, 38, 1, 0, 0, 0, 42, 39, 1, 0, 0, 0, 42, 40, 1, 0, 0, 0, 42, 41, 1, 0, 0, 0, 43, 5, 1, 0, 0, 0, 44, 49, 3, 4, 2, 0, 45, 46, 5, 108, 0, 0, 46, 48, 3, 4, 2, 0, 47, 45, 1, 0, 0, 0, 48, 51, 1, 0, 0, 0, 49, 47, 1, 0, 0, 0, 49, 50, 1, 0, 0, 0, 50, 7, 1, 0, 0, 0, 51, 49, 1, 0, 0, 0, 52, 53, 5, 1, 0, 0, 53, 9, 1, 0, 0, 0, 54, 55, 5, 2, 0, 0, 55, 11, 1, 0, 0, 0, 56, 57, 5, 3, 0, 0, 57, 13, 1, 0, 0, 0, 58, 59, 5, 102, 0, 0, 59, 60, 5, 6, 0, 0, 60, 61, 3, 4, 2, 0, 61, 62, 3, 4, 2, 0, 62, 63, 5, 103, 0, 0, 63, 15, 1, 0, 0, 0, 64, 65, 5, 102, 0, 0, 65, 66, 5, 7, 0, 0, 66, 67, 5, 102, 0, 0, 67, 68, 5, 104, 0, 0, 68, 69, 3, 4, 2, 0, 69, 70, 5, 105, 0, 0, 70, 71, 5, 113, 0, 0, 71, 72, 3, 4, 2, 0, 72, 73, 5, 103, 0, 0, 73, 74, 5, 103, 0, 0, 74, 17, 1, 0, 0, 0, 75, 76, 5, 102, 0, 0, 76, 77, 5, 4, 0, 0, 77, 78, 5, 94, 0, 0, 78, 79, 5, 103, 0, 0, 79, 19, 1, 0, 0, 0, 80, 81, 5, 102, 0, 0, 81, 82, 5, 5, 0, 0, 82, 83, 5, 94, 0, 0, 83, 84, 5, 94, 0, 0, 84, 85, 5, 103, 0, 0, 85, 21, 1, 0, 0, 0, 3, 32, 42, 49] \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/Declarations.tokens b/subprojects/common/grammar/src/main/gen/Declarations.tokens new file mode 100644 index 0000000000..9531176830 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/Declarations.tokens @@ -0,0 +1,204 @@ +BOOLTYPE=1 +INTTYPE=2 +RATTYPE=3 +BVTYPE=4 +FPTYPE=5 +FUNC=6 +ARRAY=7 +IF=8 +THEN=9 +ELSE=10 +IFF=11 +ITE=12 +IMPLY=13 +FORALL=14 +EXISTS=15 +OR=16 +AND=17 +XOR=18 +NOT=19 +EQ=20 +NEQ=21 +LT=22 +LEQ=23 +GT=24 +GEQ=25 +PLUS=26 +MINUS=27 +MUL=28 +DIV=29 +MOD=30 +REM=31 +PERCENT=32 +BV_CONCAT=33 +BV_ZERO_EXTEND=34 +BV_SIGN_EXTEND=35 +BV_ADD=36 +BV_SUB=37 +BV_POS=38 +BV_NEG=39 +BV_MUL=40 +BV_UDIV=41 +BV_SDIV=42 +BV_SMOD=43 +BV_UREM=44 +BV_SREM=45 +BV_OR=46 +BV_AND=47 +BV_XOR=48 +BV_NOT=49 +BV_SHL=50 +BV_ASHR=51 +BV_LSHR=52 +BV_ROL=53 +BV_ROR=54 +BV_ULT=55 +BV_ULE=56 +BV_UGT=57 +BV_UGE=58 +BV_SLT=59 +BV_SLE=60 +BV_SGT=61 +BV_SGE=62 +FP_ABS=63 +FP_FROM_BV=64 +FP_IS_NAN=65 +FPMAX=66 +FPMIN=67 +FPREM=68 +FPROUNDTOINT=69 +FPSQRT=70 +FPTOBV=71 +FPTOFP=72 +FPSUB=73 +FPADD=74 +FPMUL=75 +FPDIV=76 +FPPOS=77 +FPNEG=78 +TRUE=79 +READ=80 +WRITE=81 +PRIME=82 +EXTRACT=83 +BV_TYPE_DECL=84 +FP_TYPE_DECL=85 +FP_ROUNDINGMODE=86 +FALSE=87 +DEFAULT=88 +ASSIGN=89 +HAVOC=90 +ASSUME=91 +RETURN=92 +BV=93 +INT=94 +NAT=95 +SIGN=96 +DOT=97 +ID=98 +UNDERSCORE=99 +DIGIT=100 +LETTER=101 +LPAREN=102 +RPAREN=103 +LBRACK=104 +RBRACK=105 +LBRAC=106 +RBRAC=107 +COMMA=108 +COLON=109 +SEMICOLON=110 +QUOT=111 +LARROW=112 +RARROW=113 +WS=114 +COMMENT=115 +LINE_COMMENT=116 +'if'=8 +'then'=9 +'else'=10 +'iff'=11 +'ite'=12 +'=>'=13 +'forall'=14 +'exists'=15 +'or'=16 +'and'=17 +'xor'=18 +'not'=19 +'='=20 +'/='=21 +'<'=22 +'<='=23 +'>'=24 +'>='=25 +'+'=26 +'-'=27 +'*'=28 +'div'=29 +'mod'=30 +'rem'=31 +'%'=32 +'bv_zero_extend'=34 +'bv_sign_extend'=35 +'bvadd'=36 +'bvsub'=37 +'bvpos'=38 +'bvneg'=39 +'bvmul'=40 +'bvudiv'=41 +'bvsdiv'=42 +'bvsmod'=43 +'bvurem'=44 +'bvsrem'=45 +'bvor'=46 +'bvand'=47 +'bvxor'=48 +'bvnot'=49 +'bvshl'=50 +'bvashr'=51 +'bvlshr'=52 +'bvrol'=53 +'bvror'=54 +'bvult'=55 +'bvule'=56 +'bvugt'=57 +'bvuge'=58 +'bvslt'=59 +'bvsle'=60 +'bvsgt'=61 +'bvsge'=62 +'fpabs'=63 +'fpisnan'=65 +'fpmax'=66 +'fpmin'=67 +'fprem'=68 +'fpsub'=73 +'fpmul'=75 +'fppos'=77 +'fpneg'=78 +'true'=79 +'read'=80 +'write'=81 +'prime'=82 +'extract'=83 +'false'=87 +'default'=88 +'assign'=89 +'havoc'=90 +'assume'=91 +'return'=92 +'.'=97 +'_'=99 +'('=102 +')'=103 +'['=104 +']'=105 +'{'=106 +'}'=107 +','=108 +':'=109 +';'=110 +'\''=111 +'<-'=112 +'->'=113 diff --git a/subprojects/common/grammar/src/main/gen/DeclarationsBaseListener.java b/subprojects/common/grammar/src/main/gen/DeclarationsBaseListener.java new file mode 100644 index 0000000000..b8df0d580b --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/DeclarationsBaseListener.java @@ -0,0 +1,170 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Declarations.g4 by ANTLR 4.10.1 + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link DeclarationsListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +public class DeclarationsBaseListener implements DeclarationsListener { + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDecl(DeclarationsParser.DeclContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDecl(DeclarationsParser.DeclContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDeclList(DeclarationsParser.DeclListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDeclList(DeclarationsParser.DeclListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterType(DeclarationsParser.TypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitType(DeclarationsParser.TypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTypeList(DeclarationsParser.TypeListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTypeList(DeclarationsParser.TypeListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBoolType(DeclarationsParser.BoolTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBoolType(DeclarationsParser.BoolTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIntType(DeclarationsParser.IntTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIntType(DeclarationsParser.IntTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRatType(DeclarationsParser.RatTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRatType(DeclarationsParser.RatTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFuncType(DeclarationsParser.FuncTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFuncType(DeclarationsParser.FuncTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArrayType(DeclarationsParser.ArrayTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArrayType(DeclarationsParser.ArrayTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBvType(DeclarationsParser.BvTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBvType(DeclarationsParser.BvTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFpType(DeclarationsParser.FpTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFpType(DeclarationsParser.FpTypeContext ctx) { } + + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/DeclarationsBaseVisitor.java b/subprojects/common/grammar/src/main/gen/DeclarationsBaseVisitor.java new file mode 100644 index 0000000000..20506ad7d4 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/DeclarationsBaseVisitor.java @@ -0,0 +1,90 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Declarations.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; + +/** + * This class provides an empty implementation of {@link DeclarationsVisitor}, + * which can be extended to create a visitor which only needs to handle a subset + * of the available methods. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +public class DeclarationsBaseVisitor extends AbstractParseTreeVisitor implements DeclarationsVisitor { + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDecl(DeclarationsParser.DeclContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDeclList(DeclarationsParser.DeclListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitType(DeclarationsParser.TypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeList(DeclarationsParser.TypeListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBoolType(DeclarationsParser.BoolTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIntType(DeclarationsParser.IntTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRatType(DeclarationsParser.RatTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFuncType(DeclarationsParser.FuncTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArrayType(DeclarationsParser.ArrayTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBvType(DeclarationsParser.BvTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFpType(DeclarationsParser.FpTypeContext ctx) { return visitChildren(ctx); } +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/DeclarationsLexer.interp b/subprojects/common/grammar/src/main/gen/DeclarationsLexer.interp new file mode 100644 index 0000000000..4d5136f69e --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/DeclarationsLexer.interp @@ -0,0 +1,365 @@ +token literal names: +null +null +null +null +null +null +null +null +'if' +'then' +'else' +'iff' +'ite' +'=>' +'forall' +'exists' +'or' +'and' +'xor' +'not' +'=' +'/=' +'<' +'<=' +'>' +'>=' +'+' +'-' +'*' +'div' +'mod' +'rem' +'%' +null +'bv_zero_extend' +'bv_sign_extend' +'bvadd' +'bvsub' +'bvpos' +'bvneg' +'bvmul' +'bvudiv' +'bvsdiv' +'bvsmod' +'bvurem' +'bvsrem' +'bvor' +'bvand' +'bvxor' +'bvnot' +'bvshl' +'bvashr' +'bvlshr' +'bvrol' +'bvror' +'bvult' +'bvule' +'bvugt' +'bvuge' +'bvslt' +'bvsle' +'bvsgt' +'bvsge' +'fpabs' +null +'fpisnan' +'fpmax' +'fpmin' +'fprem' +null +null +null +null +'fpsub' +null +'fpmul' +null +'fppos' +'fpneg' +'true' +'read' +'write' +'prime' +'extract' +null +null +null +'false' +'default' +'assign' +'havoc' +'assume' +'return' +null +null +null +null +'.' +null +'_' +null +null +'(' +')' +'[' +']' +'{' +'}' +',' +':' +';' +'\'' +'<-' +'->' +null +null +null + +token symbolic names: +null +BOOLTYPE +INTTYPE +RATTYPE +BVTYPE +FPTYPE +FUNC +ARRAY +IF +THEN +ELSE +IFF +ITE +IMPLY +FORALL +EXISTS +OR +AND +XOR +NOT +EQ +NEQ +LT +LEQ +GT +GEQ +PLUS +MINUS +MUL +DIV +MOD +REM +PERCENT +BV_CONCAT +BV_ZERO_EXTEND +BV_SIGN_EXTEND +BV_ADD +BV_SUB +BV_POS +BV_NEG +BV_MUL +BV_UDIV +BV_SDIV +BV_SMOD +BV_UREM +BV_SREM +BV_OR +BV_AND +BV_XOR +BV_NOT +BV_SHL +BV_ASHR +BV_LSHR +BV_ROL +BV_ROR +BV_ULT +BV_ULE +BV_UGT +BV_UGE +BV_SLT +BV_SLE +BV_SGT +BV_SGE +FP_ABS +FP_FROM_BV +FP_IS_NAN +FPMAX +FPMIN +FPREM +FPROUNDTOINT +FPSQRT +FPTOBV +FPTOFP +FPSUB +FPADD +FPMUL +FPDIV +FPPOS +FPNEG +TRUE +READ +WRITE +PRIME +EXTRACT +BV_TYPE_DECL +FP_TYPE_DECL +FP_ROUNDINGMODE +FALSE +DEFAULT +ASSIGN +HAVOC +ASSUME +RETURN +BV +INT +NAT +SIGN +DOT +ID +UNDERSCORE +DIGIT +LETTER +LPAREN +RPAREN +LBRACK +RBRACK +LBRAC +RBRAC +COMMA +COLON +SEMICOLON +QUOT +LARROW +RARROW +WS +COMMENT +LINE_COMMENT + +rule names: +BOOLTYPE +INTTYPE +RATTYPE +BVTYPE +FPTYPE +FUNC +ARRAY +IF +THEN +ELSE +IFF +ITE +IMPLY +FORALL +EXISTS +OR +AND +XOR +NOT +EQ +NEQ +LT +LEQ +GT +GEQ +PLUS +MINUS +MUL +DIV +MOD +REM +PERCENT +BV_CONCAT +BV_ZERO_EXTEND +BV_SIGN_EXTEND +BV_ADD +BV_SUB +BV_POS +BV_NEG +BV_MUL +BV_UDIV +BV_SDIV +BV_SMOD +BV_UREM +BV_SREM +BV_OR +BV_AND +BV_XOR +BV_NOT +BV_SHL +BV_ASHR +BV_LSHR +BV_ROL +BV_ROR +BV_ULT +BV_ULE +BV_UGT +BV_UGE +BV_SLT +BV_SLE +BV_SGT +BV_SGE +FP_ABS +FP_FROM_BV +FP_IS_NAN +FPMAX +FPMIN +FPREM +FPROUNDTOINT +FPSQRT +FPTOBV +FPTOFP +FPSUB +FPADD +FPMUL +FPDIV +FPPOS +FPNEG +TRUE +READ +WRITE +PRIME +EXTRACT +BV_TYPE_DECL +FP_TYPE_DECL +FP_ROUNDINGMODE +FALSE +DEFAULT +ASSIGN +HAVOC +ASSUME +RETURN +BV +INT +NAT +SIGN +DOT +ID +UNDERSCORE +DIGIT +LETTER +LPAREN +RPAREN +LBRACK +RBRACK +LBRAC +RBRAC +COMMA +COLON +SEMICOLON +QUOT +LARROW +RARROW +WS +COMMENT +LINE_COMMENT + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[4, 0, 116, 993, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 246, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 257, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 268, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 276, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 284, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 298, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 315, 8, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 627, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 669, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 679, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 690, 8, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 701, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 716, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 811, 8, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 859, 8, 92, 11, 92, 12, 92, 860, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 867, 8, 92, 11, 92, 12, 92, 868, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 875, 8, 92, 11, 92, 12, 92, 876, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 3, 92, 885, 8, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 894, 8, 92, 11, 92, 12, 92, 895, 3, 92, 898, 8, 92, 1, 93, 3, 93, 901, 8, 93, 1, 93, 1, 93, 1, 94, 4, 94, 906, 8, 94, 11, 94, 12, 94, 907, 1, 95, 1, 95, 3, 95, 912, 8, 95, 1, 96, 1, 96, 1, 97, 1, 97, 3, 97, 918, 8, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 5, 97, 925, 8, 97, 10, 97, 12, 97, 928, 9, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 108, 1, 108, 1, 109, 1, 109, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 113, 4, 113, 963, 8, 113, 11, 113, 12, 113, 964, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 5, 114, 973, 8, 114, 10, 114, 12, 114, 976, 9, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 5, 115, 987, 8, 115, 10, 115, 12, 115, 990, 9, 115, 1, 115, 1, 115, 1, 974, 0, 116, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 1, 0, 7, 2, 0, 115, 115, 117, 117, 1, 0, 48, 49, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 3, 0, 9, 10, 12, 13, 32, 32, 2, 0, 10, 10, 13, 13, 1038, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 1, 245, 1, 0, 0, 0, 3, 256, 1, 0, 0, 0, 5, 267, 1, 0, 0, 0, 7, 275, 1, 0, 0, 0, 9, 283, 1, 0, 0, 0, 11, 297, 1, 0, 0, 0, 13, 314, 1, 0, 0, 0, 15, 316, 1, 0, 0, 0, 17, 319, 1, 0, 0, 0, 19, 324, 1, 0, 0, 0, 21, 329, 1, 0, 0, 0, 23, 333, 1, 0, 0, 0, 25, 337, 1, 0, 0, 0, 27, 340, 1, 0, 0, 0, 29, 347, 1, 0, 0, 0, 31, 354, 1, 0, 0, 0, 33, 357, 1, 0, 0, 0, 35, 361, 1, 0, 0, 0, 37, 365, 1, 0, 0, 0, 39, 369, 1, 0, 0, 0, 41, 371, 1, 0, 0, 0, 43, 374, 1, 0, 0, 0, 45, 376, 1, 0, 0, 0, 47, 379, 1, 0, 0, 0, 49, 381, 1, 0, 0, 0, 51, 384, 1, 0, 0, 0, 53, 386, 1, 0, 0, 0, 55, 388, 1, 0, 0, 0, 57, 390, 1, 0, 0, 0, 59, 394, 1, 0, 0, 0, 61, 398, 1, 0, 0, 0, 63, 402, 1, 0, 0, 0, 65, 404, 1, 0, 0, 0, 67, 407, 1, 0, 0, 0, 69, 422, 1, 0, 0, 0, 71, 437, 1, 0, 0, 0, 73, 443, 1, 0, 0, 0, 75, 449, 1, 0, 0, 0, 77, 455, 1, 0, 0, 0, 79, 461, 1, 0, 0, 0, 81, 467, 1, 0, 0, 0, 83, 474, 1, 0, 0, 0, 85, 481, 1, 0, 0, 0, 87, 488, 1, 0, 0, 0, 89, 495, 1, 0, 0, 0, 91, 502, 1, 0, 0, 0, 93, 507, 1, 0, 0, 0, 95, 513, 1, 0, 0, 0, 97, 519, 1, 0, 0, 0, 99, 525, 1, 0, 0, 0, 101, 531, 1, 0, 0, 0, 103, 538, 1, 0, 0, 0, 105, 545, 1, 0, 0, 0, 107, 551, 1, 0, 0, 0, 109, 557, 1, 0, 0, 0, 111, 563, 1, 0, 0, 0, 113, 569, 1, 0, 0, 0, 115, 575, 1, 0, 0, 0, 117, 581, 1, 0, 0, 0, 119, 587, 1, 0, 0, 0, 121, 593, 1, 0, 0, 0, 123, 599, 1, 0, 0, 0, 125, 605, 1, 0, 0, 0, 127, 611, 1, 0, 0, 0, 129, 628, 1, 0, 0, 0, 131, 636, 1, 0, 0, 0, 133, 642, 1, 0, 0, 0, 135, 648, 1, 0, 0, 0, 137, 654, 1, 0, 0, 0, 139, 670, 1, 0, 0, 0, 141, 680, 1, 0, 0, 0, 143, 691, 1, 0, 0, 0, 145, 702, 1, 0, 0, 0, 147, 708, 1, 0, 0, 0, 149, 717, 1, 0, 0, 0, 151, 723, 1, 0, 0, 0, 153, 731, 1, 0, 0, 0, 155, 737, 1, 0, 0, 0, 157, 743, 1, 0, 0, 0, 159, 748, 1, 0, 0, 0, 161, 753, 1, 0, 0, 0, 163, 759, 1, 0, 0, 0, 165, 765, 1, 0, 0, 0, 167, 773, 1, 0, 0, 0, 169, 779, 1, 0, 0, 0, 171, 810, 1, 0, 0, 0, 173, 812, 1, 0, 0, 0, 175, 818, 1, 0, 0, 0, 177, 826, 1, 0, 0, 0, 179, 833, 1, 0, 0, 0, 181, 839, 1, 0, 0, 0, 183, 846, 1, 0, 0, 0, 185, 897, 1, 0, 0, 0, 187, 900, 1, 0, 0, 0, 189, 905, 1, 0, 0, 0, 191, 911, 1, 0, 0, 0, 193, 913, 1, 0, 0, 0, 195, 917, 1, 0, 0, 0, 197, 929, 1, 0, 0, 0, 199, 931, 1, 0, 0, 0, 201, 933, 1, 0, 0, 0, 203, 935, 1, 0, 0, 0, 205, 937, 1, 0, 0, 0, 207, 939, 1, 0, 0, 0, 209, 941, 1, 0, 0, 0, 211, 943, 1, 0, 0, 0, 213, 945, 1, 0, 0, 0, 215, 947, 1, 0, 0, 0, 217, 949, 1, 0, 0, 0, 219, 951, 1, 0, 0, 0, 221, 953, 1, 0, 0, 0, 223, 955, 1, 0, 0, 0, 225, 958, 1, 0, 0, 0, 227, 962, 1, 0, 0, 0, 229, 968, 1, 0, 0, 0, 231, 982, 1, 0, 0, 0, 233, 234, 5, 98, 0, 0, 234, 235, 5, 111, 0, 0, 235, 236, 5, 111, 0, 0, 236, 246, 5, 108, 0, 0, 237, 238, 5, 66, 0, 0, 238, 239, 5, 111, 0, 0, 239, 240, 5, 111, 0, 0, 240, 246, 5, 108, 0, 0, 241, 242, 5, 66, 0, 0, 242, 243, 5, 79, 0, 0, 243, 244, 5, 79, 0, 0, 244, 246, 5, 76, 0, 0, 245, 233, 1, 0, 0, 0, 245, 237, 1, 0, 0, 0, 245, 241, 1, 0, 0, 0, 246, 2, 1, 0, 0, 0, 247, 248, 5, 105, 0, 0, 248, 249, 5, 110, 0, 0, 249, 257, 5, 116, 0, 0, 250, 251, 5, 73, 0, 0, 251, 252, 5, 110, 0, 0, 252, 257, 5, 116, 0, 0, 253, 254, 5, 73, 0, 0, 254, 255, 5, 78, 0, 0, 255, 257, 5, 84, 0, 0, 256, 247, 1, 0, 0, 0, 256, 250, 1, 0, 0, 0, 256, 253, 1, 0, 0, 0, 257, 4, 1, 0, 0, 0, 258, 259, 5, 114, 0, 0, 259, 260, 5, 97, 0, 0, 260, 268, 5, 116, 0, 0, 261, 262, 5, 82, 0, 0, 262, 263, 5, 97, 0, 0, 263, 268, 5, 116, 0, 0, 264, 265, 5, 82, 0, 0, 265, 266, 5, 65, 0, 0, 266, 268, 5, 84, 0, 0, 267, 258, 1, 0, 0, 0, 267, 261, 1, 0, 0, 0, 267, 264, 1, 0, 0, 0, 268, 6, 1, 0, 0, 0, 269, 270, 5, 98, 0, 0, 270, 276, 5, 118, 0, 0, 271, 272, 5, 66, 0, 0, 272, 276, 5, 118, 0, 0, 273, 274, 5, 66, 0, 0, 274, 276, 5, 86, 0, 0, 275, 269, 1, 0, 0, 0, 275, 271, 1, 0, 0, 0, 275, 273, 1, 0, 0, 0, 276, 8, 1, 0, 0, 0, 277, 278, 5, 102, 0, 0, 278, 284, 5, 112, 0, 0, 279, 280, 5, 70, 0, 0, 280, 284, 5, 112, 0, 0, 281, 282, 5, 70, 0, 0, 282, 284, 5, 80, 0, 0, 283, 277, 1, 0, 0, 0, 283, 279, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 284, 10, 1, 0, 0, 0, 285, 286, 5, 102, 0, 0, 286, 287, 5, 117, 0, 0, 287, 288, 5, 110, 0, 0, 288, 298, 5, 99, 0, 0, 289, 290, 5, 70, 0, 0, 290, 291, 5, 117, 0, 0, 291, 292, 5, 110, 0, 0, 292, 298, 5, 99, 0, 0, 293, 294, 5, 70, 0, 0, 294, 295, 5, 85, 0, 0, 295, 296, 5, 78, 0, 0, 296, 298, 5, 67, 0, 0, 297, 285, 1, 0, 0, 0, 297, 289, 1, 0, 0, 0, 297, 293, 1, 0, 0, 0, 298, 12, 1, 0, 0, 0, 299, 300, 5, 97, 0, 0, 300, 301, 5, 114, 0, 0, 301, 302, 5, 114, 0, 0, 302, 303, 5, 97, 0, 0, 303, 315, 5, 121, 0, 0, 304, 305, 5, 65, 0, 0, 305, 306, 5, 114, 0, 0, 306, 307, 5, 114, 0, 0, 307, 308, 5, 97, 0, 0, 308, 315, 5, 121, 0, 0, 309, 310, 5, 65, 0, 0, 310, 311, 5, 82, 0, 0, 311, 312, 5, 82, 0, 0, 312, 313, 5, 65, 0, 0, 313, 315, 5, 89, 0, 0, 314, 299, 1, 0, 0, 0, 314, 304, 1, 0, 0, 0, 314, 309, 1, 0, 0, 0, 315, 14, 1, 0, 0, 0, 316, 317, 5, 105, 0, 0, 317, 318, 5, 102, 0, 0, 318, 16, 1, 0, 0, 0, 319, 320, 5, 116, 0, 0, 320, 321, 5, 104, 0, 0, 321, 322, 5, 101, 0, 0, 322, 323, 5, 110, 0, 0, 323, 18, 1, 0, 0, 0, 324, 325, 5, 101, 0, 0, 325, 326, 5, 108, 0, 0, 326, 327, 5, 115, 0, 0, 327, 328, 5, 101, 0, 0, 328, 20, 1, 0, 0, 0, 329, 330, 5, 105, 0, 0, 330, 331, 5, 102, 0, 0, 331, 332, 5, 102, 0, 0, 332, 22, 1, 0, 0, 0, 333, 334, 5, 105, 0, 0, 334, 335, 5, 116, 0, 0, 335, 336, 5, 101, 0, 0, 336, 24, 1, 0, 0, 0, 337, 338, 5, 61, 0, 0, 338, 339, 5, 62, 0, 0, 339, 26, 1, 0, 0, 0, 340, 341, 5, 102, 0, 0, 341, 342, 5, 111, 0, 0, 342, 343, 5, 114, 0, 0, 343, 344, 5, 97, 0, 0, 344, 345, 5, 108, 0, 0, 345, 346, 5, 108, 0, 0, 346, 28, 1, 0, 0, 0, 347, 348, 5, 101, 0, 0, 348, 349, 5, 120, 0, 0, 349, 350, 5, 105, 0, 0, 350, 351, 5, 115, 0, 0, 351, 352, 5, 116, 0, 0, 352, 353, 5, 115, 0, 0, 353, 30, 1, 0, 0, 0, 354, 355, 5, 111, 0, 0, 355, 356, 5, 114, 0, 0, 356, 32, 1, 0, 0, 0, 357, 358, 5, 97, 0, 0, 358, 359, 5, 110, 0, 0, 359, 360, 5, 100, 0, 0, 360, 34, 1, 0, 0, 0, 361, 362, 5, 120, 0, 0, 362, 363, 5, 111, 0, 0, 363, 364, 5, 114, 0, 0, 364, 36, 1, 0, 0, 0, 365, 366, 5, 110, 0, 0, 366, 367, 5, 111, 0, 0, 367, 368, 5, 116, 0, 0, 368, 38, 1, 0, 0, 0, 369, 370, 5, 61, 0, 0, 370, 40, 1, 0, 0, 0, 371, 372, 5, 47, 0, 0, 372, 373, 5, 61, 0, 0, 373, 42, 1, 0, 0, 0, 374, 375, 5, 60, 0, 0, 375, 44, 1, 0, 0, 0, 376, 377, 5, 60, 0, 0, 377, 378, 5, 61, 0, 0, 378, 46, 1, 0, 0, 0, 379, 380, 5, 62, 0, 0, 380, 48, 1, 0, 0, 0, 381, 382, 5, 62, 0, 0, 382, 383, 5, 61, 0, 0, 383, 50, 1, 0, 0, 0, 384, 385, 5, 43, 0, 0, 385, 52, 1, 0, 0, 0, 386, 387, 5, 45, 0, 0, 387, 54, 1, 0, 0, 0, 388, 389, 5, 42, 0, 0, 389, 56, 1, 0, 0, 0, 390, 391, 5, 100, 0, 0, 391, 392, 5, 105, 0, 0, 392, 393, 5, 118, 0, 0, 393, 58, 1, 0, 0, 0, 394, 395, 5, 109, 0, 0, 395, 396, 5, 111, 0, 0, 396, 397, 5, 100, 0, 0, 397, 60, 1, 0, 0, 0, 398, 399, 5, 114, 0, 0, 399, 400, 5, 101, 0, 0, 400, 401, 5, 109, 0, 0, 401, 62, 1, 0, 0, 0, 402, 403, 5, 37, 0, 0, 403, 64, 1, 0, 0, 0, 404, 405, 3, 51, 25, 0, 405, 406, 3, 51, 25, 0, 406, 66, 1, 0, 0, 0, 407, 408, 5, 98, 0, 0, 408, 409, 5, 118, 0, 0, 409, 410, 5, 95, 0, 0, 410, 411, 5, 122, 0, 0, 411, 412, 5, 101, 0, 0, 412, 413, 5, 114, 0, 0, 413, 414, 5, 111, 0, 0, 414, 415, 5, 95, 0, 0, 415, 416, 5, 101, 0, 0, 416, 417, 5, 120, 0, 0, 417, 418, 5, 116, 0, 0, 418, 419, 5, 101, 0, 0, 419, 420, 5, 110, 0, 0, 420, 421, 5, 100, 0, 0, 421, 68, 1, 0, 0, 0, 422, 423, 5, 98, 0, 0, 423, 424, 5, 118, 0, 0, 424, 425, 5, 95, 0, 0, 425, 426, 5, 115, 0, 0, 426, 427, 5, 105, 0, 0, 427, 428, 5, 103, 0, 0, 428, 429, 5, 110, 0, 0, 429, 430, 5, 95, 0, 0, 430, 431, 5, 101, 0, 0, 431, 432, 5, 120, 0, 0, 432, 433, 5, 116, 0, 0, 433, 434, 5, 101, 0, 0, 434, 435, 5, 110, 0, 0, 435, 436, 5, 100, 0, 0, 436, 70, 1, 0, 0, 0, 437, 438, 5, 98, 0, 0, 438, 439, 5, 118, 0, 0, 439, 440, 5, 97, 0, 0, 440, 441, 5, 100, 0, 0, 441, 442, 5, 100, 0, 0, 442, 72, 1, 0, 0, 0, 443, 444, 5, 98, 0, 0, 444, 445, 5, 118, 0, 0, 445, 446, 5, 115, 0, 0, 446, 447, 5, 117, 0, 0, 447, 448, 5, 98, 0, 0, 448, 74, 1, 0, 0, 0, 449, 450, 5, 98, 0, 0, 450, 451, 5, 118, 0, 0, 451, 452, 5, 112, 0, 0, 452, 453, 5, 111, 0, 0, 453, 454, 5, 115, 0, 0, 454, 76, 1, 0, 0, 0, 455, 456, 5, 98, 0, 0, 456, 457, 5, 118, 0, 0, 457, 458, 5, 110, 0, 0, 458, 459, 5, 101, 0, 0, 459, 460, 5, 103, 0, 0, 460, 78, 1, 0, 0, 0, 461, 462, 5, 98, 0, 0, 462, 463, 5, 118, 0, 0, 463, 464, 5, 109, 0, 0, 464, 465, 5, 117, 0, 0, 465, 466, 5, 108, 0, 0, 466, 80, 1, 0, 0, 0, 467, 468, 5, 98, 0, 0, 468, 469, 5, 118, 0, 0, 469, 470, 5, 117, 0, 0, 470, 471, 5, 100, 0, 0, 471, 472, 5, 105, 0, 0, 472, 473, 5, 118, 0, 0, 473, 82, 1, 0, 0, 0, 474, 475, 5, 98, 0, 0, 475, 476, 5, 118, 0, 0, 476, 477, 5, 115, 0, 0, 477, 478, 5, 100, 0, 0, 478, 479, 5, 105, 0, 0, 479, 480, 5, 118, 0, 0, 480, 84, 1, 0, 0, 0, 481, 482, 5, 98, 0, 0, 482, 483, 5, 118, 0, 0, 483, 484, 5, 115, 0, 0, 484, 485, 5, 109, 0, 0, 485, 486, 5, 111, 0, 0, 486, 487, 5, 100, 0, 0, 487, 86, 1, 0, 0, 0, 488, 489, 5, 98, 0, 0, 489, 490, 5, 118, 0, 0, 490, 491, 5, 117, 0, 0, 491, 492, 5, 114, 0, 0, 492, 493, 5, 101, 0, 0, 493, 494, 5, 109, 0, 0, 494, 88, 1, 0, 0, 0, 495, 496, 5, 98, 0, 0, 496, 497, 5, 118, 0, 0, 497, 498, 5, 115, 0, 0, 498, 499, 5, 114, 0, 0, 499, 500, 5, 101, 0, 0, 500, 501, 5, 109, 0, 0, 501, 90, 1, 0, 0, 0, 502, 503, 5, 98, 0, 0, 503, 504, 5, 118, 0, 0, 504, 505, 5, 111, 0, 0, 505, 506, 5, 114, 0, 0, 506, 92, 1, 0, 0, 0, 507, 508, 5, 98, 0, 0, 508, 509, 5, 118, 0, 0, 509, 510, 5, 97, 0, 0, 510, 511, 5, 110, 0, 0, 511, 512, 5, 100, 0, 0, 512, 94, 1, 0, 0, 0, 513, 514, 5, 98, 0, 0, 514, 515, 5, 118, 0, 0, 515, 516, 5, 120, 0, 0, 516, 517, 5, 111, 0, 0, 517, 518, 5, 114, 0, 0, 518, 96, 1, 0, 0, 0, 519, 520, 5, 98, 0, 0, 520, 521, 5, 118, 0, 0, 521, 522, 5, 110, 0, 0, 522, 523, 5, 111, 0, 0, 523, 524, 5, 116, 0, 0, 524, 98, 1, 0, 0, 0, 525, 526, 5, 98, 0, 0, 526, 527, 5, 118, 0, 0, 527, 528, 5, 115, 0, 0, 528, 529, 5, 104, 0, 0, 529, 530, 5, 108, 0, 0, 530, 100, 1, 0, 0, 0, 531, 532, 5, 98, 0, 0, 532, 533, 5, 118, 0, 0, 533, 534, 5, 97, 0, 0, 534, 535, 5, 115, 0, 0, 535, 536, 5, 104, 0, 0, 536, 537, 5, 114, 0, 0, 537, 102, 1, 0, 0, 0, 538, 539, 5, 98, 0, 0, 539, 540, 5, 118, 0, 0, 540, 541, 5, 108, 0, 0, 541, 542, 5, 115, 0, 0, 542, 543, 5, 104, 0, 0, 543, 544, 5, 114, 0, 0, 544, 104, 1, 0, 0, 0, 545, 546, 5, 98, 0, 0, 546, 547, 5, 118, 0, 0, 547, 548, 5, 114, 0, 0, 548, 549, 5, 111, 0, 0, 549, 550, 5, 108, 0, 0, 550, 106, 1, 0, 0, 0, 551, 552, 5, 98, 0, 0, 552, 553, 5, 118, 0, 0, 553, 554, 5, 114, 0, 0, 554, 555, 5, 111, 0, 0, 555, 556, 5, 114, 0, 0, 556, 108, 1, 0, 0, 0, 557, 558, 5, 98, 0, 0, 558, 559, 5, 118, 0, 0, 559, 560, 5, 117, 0, 0, 560, 561, 5, 108, 0, 0, 561, 562, 5, 116, 0, 0, 562, 110, 1, 0, 0, 0, 563, 564, 5, 98, 0, 0, 564, 565, 5, 118, 0, 0, 565, 566, 5, 117, 0, 0, 566, 567, 5, 108, 0, 0, 567, 568, 5, 101, 0, 0, 568, 112, 1, 0, 0, 0, 569, 570, 5, 98, 0, 0, 570, 571, 5, 118, 0, 0, 571, 572, 5, 117, 0, 0, 572, 573, 5, 103, 0, 0, 573, 574, 5, 116, 0, 0, 574, 114, 1, 0, 0, 0, 575, 576, 5, 98, 0, 0, 576, 577, 5, 118, 0, 0, 577, 578, 5, 117, 0, 0, 578, 579, 5, 103, 0, 0, 579, 580, 5, 101, 0, 0, 580, 116, 1, 0, 0, 0, 581, 582, 5, 98, 0, 0, 582, 583, 5, 118, 0, 0, 583, 584, 5, 115, 0, 0, 584, 585, 5, 108, 0, 0, 585, 586, 5, 116, 0, 0, 586, 118, 1, 0, 0, 0, 587, 588, 5, 98, 0, 0, 588, 589, 5, 118, 0, 0, 589, 590, 5, 115, 0, 0, 590, 591, 5, 108, 0, 0, 591, 592, 5, 101, 0, 0, 592, 120, 1, 0, 0, 0, 593, 594, 5, 98, 0, 0, 594, 595, 5, 118, 0, 0, 595, 596, 5, 115, 0, 0, 596, 597, 5, 103, 0, 0, 597, 598, 5, 116, 0, 0, 598, 122, 1, 0, 0, 0, 599, 600, 5, 98, 0, 0, 600, 601, 5, 118, 0, 0, 601, 602, 5, 115, 0, 0, 602, 603, 5, 103, 0, 0, 603, 604, 5, 101, 0, 0, 604, 124, 1, 0, 0, 0, 605, 606, 5, 102, 0, 0, 606, 607, 5, 112, 0, 0, 607, 608, 5, 97, 0, 0, 608, 609, 5, 98, 0, 0, 609, 610, 5, 115, 0, 0, 610, 126, 1, 0, 0, 0, 611, 612, 5, 102, 0, 0, 612, 613, 5, 112, 0, 0, 613, 614, 5, 102, 0, 0, 614, 615, 5, 114, 0, 0, 615, 616, 5, 111, 0, 0, 616, 617, 5, 109, 0, 0, 617, 618, 5, 98, 0, 0, 618, 619, 5, 118, 0, 0, 619, 620, 1, 0, 0, 0, 620, 621, 3, 169, 84, 0, 621, 622, 3, 207, 103, 0, 622, 623, 7, 0, 0, 0, 623, 624, 3, 209, 104, 0, 624, 626, 1, 0, 0, 0, 625, 627, 3, 171, 85, 0, 626, 625, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 128, 1, 0, 0, 0, 628, 629, 5, 102, 0, 0, 629, 630, 5, 112, 0, 0, 630, 631, 5, 105, 0, 0, 631, 632, 5, 115, 0, 0, 632, 633, 5, 110, 0, 0, 633, 634, 5, 97, 0, 0, 634, 635, 5, 110, 0, 0, 635, 130, 1, 0, 0, 0, 636, 637, 5, 102, 0, 0, 637, 638, 5, 112, 0, 0, 638, 639, 5, 109, 0, 0, 639, 640, 5, 97, 0, 0, 640, 641, 5, 120, 0, 0, 641, 132, 1, 0, 0, 0, 642, 643, 5, 102, 0, 0, 643, 644, 5, 112, 0, 0, 644, 645, 5, 109, 0, 0, 645, 646, 5, 105, 0, 0, 646, 647, 5, 110, 0, 0, 647, 134, 1, 0, 0, 0, 648, 649, 5, 102, 0, 0, 649, 650, 5, 112, 0, 0, 650, 651, 5, 114, 0, 0, 651, 652, 5, 101, 0, 0, 652, 653, 5, 109, 0, 0, 653, 136, 1, 0, 0, 0, 654, 655, 5, 102, 0, 0, 655, 656, 5, 112, 0, 0, 656, 657, 5, 114, 0, 0, 657, 658, 5, 111, 0, 0, 658, 659, 5, 117, 0, 0, 659, 660, 5, 110, 0, 0, 660, 661, 5, 100, 0, 0, 661, 662, 5, 116, 0, 0, 662, 663, 5, 111, 0, 0, 663, 664, 5, 105, 0, 0, 664, 665, 5, 110, 0, 0, 665, 666, 5, 116, 0, 0, 666, 668, 1, 0, 0, 0, 667, 669, 3, 171, 85, 0, 668, 667, 1, 0, 0, 0, 668, 669, 1, 0, 0, 0, 669, 138, 1, 0, 0, 0, 670, 671, 5, 102, 0, 0, 671, 672, 5, 112, 0, 0, 672, 673, 5, 115, 0, 0, 673, 674, 5, 113, 0, 0, 674, 675, 5, 114, 0, 0, 675, 676, 5, 116, 0, 0, 676, 678, 1, 0, 0, 0, 677, 679, 3, 171, 85, 0, 678, 677, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 140, 1, 0, 0, 0, 680, 681, 5, 102, 0, 0, 681, 682, 5, 112, 0, 0, 682, 683, 5, 116, 0, 0, 683, 684, 5, 111, 0, 0, 684, 685, 5, 98, 0, 0, 685, 686, 5, 118, 0, 0, 686, 687, 1, 0, 0, 0, 687, 689, 3, 167, 83, 0, 688, 690, 3, 171, 85, 0, 689, 688, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 690, 142, 1, 0, 0, 0, 691, 692, 5, 102, 0, 0, 692, 693, 5, 112, 0, 0, 693, 694, 5, 116, 0, 0, 694, 695, 5, 111, 0, 0, 695, 696, 5, 102, 0, 0, 696, 697, 5, 112, 0, 0, 697, 698, 1, 0, 0, 0, 698, 700, 3, 169, 84, 0, 699, 701, 3, 171, 85, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 144, 1, 0, 0, 0, 702, 703, 5, 102, 0, 0, 703, 704, 5, 112, 0, 0, 704, 705, 5, 115, 0, 0, 705, 706, 5, 117, 0, 0, 706, 707, 5, 98, 0, 0, 707, 146, 1, 0, 0, 0, 708, 709, 5, 102, 0, 0, 709, 710, 5, 112, 0, 0, 710, 711, 5, 97, 0, 0, 711, 712, 5, 100, 0, 0, 712, 713, 5, 100, 0, 0, 713, 715, 1, 0, 0, 0, 714, 716, 3, 171, 85, 0, 715, 714, 1, 0, 0, 0, 715, 716, 1, 0, 0, 0, 716, 148, 1, 0, 0, 0, 717, 718, 5, 102, 0, 0, 718, 719, 5, 112, 0, 0, 719, 720, 5, 109, 0, 0, 720, 721, 5, 117, 0, 0, 721, 722, 5, 108, 0, 0, 722, 150, 1, 0, 0, 0, 723, 724, 5, 102, 0, 0, 724, 725, 5, 112, 0, 0, 725, 726, 5, 100, 0, 0, 726, 727, 5, 105, 0, 0, 727, 728, 5, 118, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 3, 171, 85, 0, 730, 152, 1, 0, 0, 0, 731, 732, 5, 102, 0, 0, 732, 733, 5, 112, 0, 0, 733, 734, 5, 112, 0, 0, 734, 735, 5, 111, 0, 0, 735, 736, 5, 115, 0, 0, 736, 154, 1, 0, 0, 0, 737, 738, 5, 102, 0, 0, 738, 739, 5, 112, 0, 0, 739, 740, 5, 110, 0, 0, 740, 741, 5, 101, 0, 0, 741, 742, 5, 103, 0, 0, 742, 156, 1, 0, 0, 0, 743, 744, 5, 116, 0, 0, 744, 745, 5, 114, 0, 0, 745, 746, 5, 117, 0, 0, 746, 747, 5, 101, 0, 0, 747, 158, 1, 0, 0, 0, 748, 749, 5, 114, 0, 0, 749, 750, 5, 101, 0, 0, 750, 751, 5, 97, 0, 0, 751, 752, 5, 100, 0, 0, 752, 160, 1, 0, 0, 0, 753, 754, 5, 119, 0, 0, 754, 755, 5, 114, 0, 0, 755, 756, 5, 105, 0, 0, 756, 757, 5, 116, 0, 0, 757, 758, 5, 101, 0, 0, 758, 162, 1, 0, 0, 0, 759, 760, 5, 112, 0, 0, 760, 761, 5, 114, 0, 0, 761, 762, 5, 105, 0, 0, 762, 763, 5, 109, 0, 0, 763, 764, 5, 101, 0, 0, 764, 164, 1, 0, 0, 0, 765, 766, 5, 101, 0, 0, 766, 767, 5, 120, 0, 0, 767, 768, 5, 116, 0, 0, 768, 769, 5, 114, 0, 0, 769, 770, 5, 97, 0, 0, 770, 771, 5, 99, 0, 0, 771, 772, 5, 116, 0, 0, 772, 166, 1, 0, 0, 0, 773, 774, 3, 207, 103, 0, 774, 775, 3, 189, 94, 0, 775, 776, 5, 39, 0, 0, 776, 777, 7, 0, 0, 0, 777, 778, 3, 209, 104, 0, 778, 168, 1, 0, 0, 0, 779, 780, 3, 207, 103, 0, 780, 781, 3, 189, 94, 0, 781, 782, 3, 215, 107, 0, 782, 783, 3, 189, 94, 0, 783, 784, 3, 209, 104, 0, 784, 170, 1, 0, 0, 0, 785, 786, 5, 91, 0, 0, 786, 787, 5, 114, 0, 0, 787, 788, 5, 110, 0, 0, 788, 789, 5, 101, 0, 0, 789, 811, 5, 93, 0, 0, 790, 791, 5, 91, 0, 0, 791, 792, 5, 114, 0, 0, 792, 793, 5, 110, 0, 0, 793, 794, 5, 97, 0, 0, 794, 811, 5, 93, 0, 0, 795, 796, 5, 91, 0, 0, 796, 797, 5, 114, 0, 0, 797, 798, 5, 116, 0, 0, 798, 799, 5, 112, 0, 0, 799, 811, 5, 93, 0, 0, 800, 801, 5, 91, 0, 0, 801, 802, 5, 114, 0, 0, 802, 803, 5, 116, 0, 0, 803, 804, 5, 110, 0, 0, 804, 811, 5, 93, 0, 0, 805, 806, 5, 91, 0, 0, 806, 807, 5, 114, 0, 0, 807, 808, 5, 116, 0, 0, 808, 809, 5, 122, 0, 0, 809, 811, 5, 93, 0, 0, 810, 785, 1, 0, 0, 0, 810, 790, 1, 0, 0, 0, 810, 795, 1, 0, 0, 0, 810, 800, 1, 0, 0, 0, 810, 805, 1, 0, 0, 0, 811, 172, 1, 0, 0, 0, 812, 813, 5, 102, 0, 0, 813, 814, 5, 97, 0, 0, 814, 815, 5, 108, 0, 0, 815, 816, 5, 115, 0, 0, 816, 817, 5, 101, 0, 0, 817, 174, 1, 0, 0, 0, 818, 819, 5, 100, 0, 0, 819, 820, 5, 101, 0, 0, 820, 821, 5, 102, 0, 0, 821, 822, 5, 97, 0, 0, 822, 823, 5, 117, 0, 0, 823, 824, 5, 108, 0, 0, 824, 825, 5, 116, 0, 0, 825, 176, 1, 0, 0, 0, 826, 827, 5, 97, 0, 0, 827, 828, 5, 115, 0, 0, 828, 829, 5, 115, 0, 0, 829, 830, 5, 105, 0, 0, 830, 831, 5, 103, 0, 0, 831, 832, 5, 110, 0, 0, 832, 178, 1, 0, 0, 0, 833, 834, 5, 104, 0, 0, 834, 835, 5, 97, 0, 0, 835, 836, 5, 118, 0, 0, 836, 837, 5, 111, 0, 0, 837, 838, 5, 99, 0, 0, 838, 180, 1, 0, 0, 0, 839, 840, 5, 97, 0, 0, 840, 841, 5, 115, 0, 0, 841, 842, 5, 115, 0, 0, 842, 843, 5, 117, 0, 0, 843, 844, 5, 109, 0, 0, 844, 845, 5, 101, 0, 0, 845, 182, 1, 0, 0, 0, 846, 847, 5, 114, 0, 0, 847, 848, 5, 101, 0, 0, 848, 849, 5, 116, 0, 0, 849, 850, 5, 117, 0, 0, 850, 851, 5, 114, 0, 0, 851, 852, 5, 110, 0, 0, 852, 184, 1, 0, 0, 0, 853, 854, 3, 189, 94, 0, 854, 855, 5, 39, 0, 0, 855, 856, 5, 98, 0, 0, 856, 858, 1, 0, 0, 0, 857, 859, 7, 1, 0, 0, 858, 857, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 858, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 898, 1, 0, 0, 0, 862, 863, 5, 35, 0, 0, 863, 864, 5, 98, 0, 0, 864, 866, 1, 0, 0, 0, 865, 867, 7, 1, 0, 0, 866, 865, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 866, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 898, 1, 0, 0, 0, 870, 871, 5, 35, 0, 0, 871, 872, 5, 120, 0, 0, 872, 874, 1, 0, 0, 0, 873, 875, 7, 1, 0, 0, 874, 873, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 874, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 898, 1, 0, 0, 0, 878, 879, 3, 189, 94, 0, 879, 880, 5, 39, 0, 0, 880, 881, 5, 100, 0, 0, 881, 884, 1, 0, 0, 0, 882, 885, 3, 51, 25, 0, 883, 885, 3, 53, 26, 0, 884, 882, 1, 0, 0, 0, 884, 883, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 1, 0, 0, 0, 886, 887, 3, 187, 93, 0, 887, 898, 1, 0, 0, 0, 888, 889, 3, 189, 94, 0, 889, 890, 5, 39, 0, 0, 890, 891, 5, 120, 0, 0, 891, 893, 1, 0, 0, 0, 892, 894, 7, 2, 0, 0, 893, 892, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 893, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 898, 1, 0, 0, 0, 897, 853, 1, 0, 0, 0, 897, 862, 1, 0, 0, 0, 897, 870, 1, 0, 0, 0, 897, 878, 1, 0, 0, 0, 897, 888, 1, 0, 0, 0, 898, 186, 1, 0, 0, 0, 899, 901, 3, 191, 95, 0, 900, 899, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 1, 0, 0, 0, 902, 903, 3, 189, 94, 0, 903, 188, 1, 0, 0, 0, 904, 906, 3, 199, 99, 0, 905, 904, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 905, 1, 0, 0, 0, 907, 908, 1, 0, 0, 0, 908, 190, 1, 0, 0, 0, 909, 912, 3, 51, 25, 0, 910, 912, 3, 53, 26, 0, 911, 909, 1, 0, 0, 0, 911, 910, 1, 0, 0, 0, 912, 192, 1, 0, 0, 0, 913, 914, 5, 46, 0, 0, 914, 194, 1, 0, 0, 0, 915, 918, 3, 201, 100, 0, 916, 918, 3, 197, 98, 0, 917, 915, 1, 0, 0, 0, 917, 916, 1, 0, 0, 0, 918, 926, 1, 0, 0, 0, 919, 925, 3, 201, 100, 0, 920, 925, 3, 197, 98, 0, 921, 925, 5, 36, 0, 0, 922, 925, 3, 199, 99, 0, 923, 925, 3, 217, 108, 0, 924, 919, 1, 0, 0, 0, 924, 920, 1, 0, 0, 0, 924, 921, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 923, 1, 0, 0, 0, 925, 928, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 196, 1, 0, 0, 0, 928, 926, 1, 0, 0, 0, 929, 930, 5, 95, 0, 0, 930, 198, 1, 0, 0, 0, 931, 932, 7, 3, 0, 0, 932, 200, 1, 0, 0, 0, 933, 934, 7, 4, 0, 0, 934, 202, 1, 0, 0, 0, 935, 936, 5, 40, 0, 0, 936, 204, 1, 0, 0, 0, 937, 938, 5, 41, 0, 0, 938, 206, 1, 0, 0, 0, 939, 940, 5, 91, 0, 0, 940, 208, 1, 0, 0, 0, 941, 942, 5, 93, 0, 0, 942, 210, 1, 0, 0, 0, 943, 944, 5, 123, 0, 0, 944, 212, 1, 0, 0, 0, 945, 946, 5, 125, 0, 0, 946, 214, 1, 0, 0, 0, 947, 948, 5, 44, 0, 0, 948, 216, 1, 0, 0, 0, 949, 950, 5, 58, 0, 0, 950, 218, 1, 0, 0, 0, 951, 952, 5, 59, 0, 0, 952, 220, 1, 0, 0, 0, 953, 954, 5, 39, 0, 0, 954, 222, 1, 0, 0, 0, 955, 956, 5, 60, 0, 0, 956, 957, 5, 45, 0, 0, 957, 224, 1, 0, 0, 0, 958, 959, 5, 45, 0, 0, 959, 960, 5, 62, 0, 0, 960, 226, 1, 0, 0, 0, 961, 963, 7, 5, 0, 0, 962, 961, 1, 0, 0, 0, 963, 964, 1, 0, 0, 0, 964, 962, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 967, 6, 113, 0, 0, 967, 228, 1, 0, 0, 0, 968, 969, 5, 47, 0, 0, 969, 970, 5, 42, 0, 0, 970, 974, 1, 0, 0, 0, 971, 973, 9, 0, 0, 0, 972, 971, 1, 0, 0, 0, 973, 976, 1, 0, 0, 0, 974, 975, 1, 0, 0, 0, 974, 972, 1, 0, 0, 0, 975, 977, 1, 0, 0, 0, 976, 974, 1, 0, 0, 0, 977, 978, 5, 42, 0, 0, 978, 979, 5, 47, 0, 0, 979, 980, 1, 0, 0, 0, 980, 981, 6, 114, 0, 0, 981, 230, 1, 0, 0, 0, 982, 983, 5, 47, 0, 0, 983, 984, 5, 47, 0, 0, 984, 988, 1, 0, 0, 0, 985, 987, 8, 6, 0, 0, 986, 985, 1, 0, 0, 0, 987, 990, 1, 0, 0, 0, 988, 986, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 991, 1, 0, 0, 0, 990, 988, 1, 0, 0, 0, 991, 992, 6, 115, 0, 0, 992, 232, 1, 0, 0, 0, 30, 0, 245, 256, 267, 275, 283, 297, 314, 626, 668, 678, 689, 700, 715, 810, 860, 868, 876, 884, 895, 897, 900, 907, 911, 917, 924, 926, 964, 974, 988, 1, 6, 0, 0] \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/DeclarationsLexer.java b/subprojects/common/grammar/src/main/gen/DeclarationsLexer.java new file mode 100644 index 0000000000..47269de890 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/DeclarationsLexer.java @@ -0,0 +1,770 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Declarations.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class DeclarationsLexer extends Lexer { + static { RuntimeMetaData.checkVersion("4.10.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + BOOLTYPE=1, INTTYPE=2, RATTYPE=3, BVTYPE=4, FPTYPE=5, FUNC=6, ARRAY=7, + IF=8, THEN=9, ELSE=10, IFF=11, ITE=12, IMPLY=13, FORALL=14, EXISTS=15, + OR=16, AND=17, XOR=18, NOT=19, EQ=20, NEQ=21, LT=22, LEQ=23, GT=24, GEQ=25, + PLUS=26, MINUS=27, MUL=28, DIV=29, MOD=30, REM=31, PERCENT=32, BV_CONCAT=33, + BV_ZERO_EXTEND=34, BV_SIGN_EXTEND=35, BV_ADD=36, BV_SUB=37, BV_POS=38, + BV_NEG=39, BV_MUL=40, BV_UDIV=41, BV_SDIV=42, BV_SMOD=43, BV_UREM=44, + BV_SREM=45, BV_OR=46, BV_AND=47, BV_XOR=48, BV_NOT=49, BV_SHL=50, BV_ASHR=51, + BV_LSHR=52, BV_ROL=53, BV_ROR=54, BV_ULT=55, BV_ULE=56, BV_UGT=57, BV_UGE=58, + BV_SLT=59, BV_SLE=60, BV_SGT=61, BV_SGE=62, FP_ABS=63, FP_FROM_BV=64, + FP_IS_NAN=65, FPMAX=66, FPMIN=67, FPREM=68, FPROUNDTOINT=69, FPSQRT=70, + FPTOBV=71, FPTOFP=72, FPSUB=73, FPADD=74, FPMUL=75, FPDIV=76, FPPOS=77, + FPNEG=78, TRUE=79, READ=80, WRITE=81, PRIME=82, EXTRACT=83, BV_TYPE_DECL=84, + FP_TYPE_DECL=85, FP_ROUNDINGMODE=86, FALSE=87, DEFAULT=88, ASSIGN=89, + HAVOC=90, ASSUME=91, RETURN=92, BV=93, INT=94, NAT=95, SIGN=96, DOT=97, + ID=98, UNDERSCORE=99, DIGIT=100, LETTER=101, LPAREN=102, RPAREN=103, LBRACK=104, + RBRACK=105, LBRAC=106, RBRAC=107, COMMA=108, COLON=109, SEMICOLON=110, + QUOT=111, LARROW=112, RARROW=113, WS=114, COMMENT=115, LINE_COMMENT=116; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE" + }; + + private static String[] makeRuleNames() { + return new String[] { + "BOOLTYPE", "INTTYPE", "RATTYPE", "BVTYPE", "FPTYPE", "FUNC", "ARRAY", + "IF", "THEN", "ELSE", "IFF", "ITE", "IMPLY", "FORALL", "EXISTS", "OR", + "AND", "XOR", "NOT", "EQ", "NEQ", "LT", "LEQ", "GT", "GEQ", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "REM", "PERCENT", "BV_CONCAT", "BV_ZERO_EXTEND", + "BV_SIGN_EXTEND", "BV_ADD", "BV_SUB", "BV_POS", "BV_NEG", "BV_MUL", "BV_UDIV", + "BV_SDIV", "BV_SMOD", "BV_UREM", "BV_SREM", "BV_OR", "BV_AND", "BV_XOR", + "BV_NOT", "BV_SHL", "BV_ASHR", "BV_LSHR", "BV_ROL", "BV_ROR", "BV_ULT", + "BV_ULE", "BV_UGT", "BV_UGE", "BV_SLT", "BV_SLE", "BV_SGT", "BV_SGE", + "FP_ABS", "FP_FROM_BV", "FP_IS_NAN", "FPMAX", "FPMIN", "FPREM", "FPROUNDTOINT", + "FPSQRT", "FPTOBV", "FPTOFP", "FPSUB", "FPADD", "FPMUL", "FPDIV", "FPPOS", + "FPNEG", "TRUE", "READ", "WRITE", "PRIME", "EXTRACT", "BV_TYPE_DECL", + "FP_TYPE_DECL", "FP_ROUNDINGMODE", "FALSE", "DEFAULT", "ASSIGN", "HAVOC", + "ASSUME", "RETURN", "BV", "INT", "NAT", "SIGN", "DOT", "ID", "UNDERSCORE", + "DIGIT", "LETTER", "LPAREN", "RPAREN", "LBRACK", "RBRACK", "LBRAC", "RBRAC", + "COMMA", "COLON", "SEMICOLON", "QUOT", "LARROW", "RARROW", "WS", "COMMENT", + "LINE_COMMENT" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, "'if'", "'then'", "'else'", + "'iff'", "'ite'", "'=>'", "'forall'", "'exists'", "'or'", "'and'", "'xor'", + "'not'", "'='", "'/='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", + "'div'", "'mod'", "'rem'", "'%'", null, "'bv_zero_extend'", "'bv_sign_extend'", + "'bvadd'", "'bvsub'", "'bvpos'", "'bvneg'", "'bvmul'", "'bvudiv'", "'bvsdiv'", + "'bvsmod'", "'bvurem'", "'bvsrem'", "'bvor'", "'bvand'", "'bvxor'", "'bvnot'", + "'bvshl'", "'bvashr'", "'bvlshr'", "'bvrol'", "'bvror'", "'bvult'", "'bvule'", + "'bvugt'", "'bvuge'", "'bvslt'", "'bvsle'", "'bvsgt'", "'bvsge'", "'fpabs'", + null, "'fpisnan'", "'fpmax'", "'fpmin'", "'fprem'", null, null, null, + null, "'fpsub'", null, "'fpmul'", null, "'fppos'", "'fpneg'", "'true'", + "'read'", "'write'", "'prime'", "'extract'", null, null, null, "'false'", + "'default'", "'assign'", "'havoc'", "'assume'", "'return'", null, null, + null, null, "'.'", null, "'_'", null, null, "'('", "')'", "'['", "']'", + "'{'", "'}'", "','", "':'", "';'", "'''", "'<-'", "'->'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "BOOLTYPE", "INTTYPE", "RATTYPE", "BVTYPE", "FPTYPE", "FUNC", "ARRAY", + "IF", "THEN", "ELSE", "IFF", "ITE", "IMPLY", "FORALL", "EXISTS", "OR", + "AND", "XOR", "NOT", "EQ", "NEQ", "LT", "LEQ", "GT", "GEQ", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "REM", "PERCENT", "BV_CONCAT", "BV_ZERO_EXTEND", + "BV_SIGN_EXTEND", "BV_ADD", "BV_SUB", "BV_POS", "BV_NEG", "BV_MUL", "BV_UDIV", + "BV_SDIV", "BV_SMOD", "BV_UREM", "BV_SREM", "BV_OR", "BV_AND", "BV_XOR", + "BV_NOT", "BV_SHL", "BV_ASHR", "BV_LSHR", "BV_ROL", "BV_ROR", "BV_ULT", + "BV_ULE", "BV_UGT", "BV_UGE", "BV_SLT", "BV_SLE", "BV_SGT", "BV_SGE", + "FP_ABS", "FP_FROM_BV", "FP_IS_NAN", "FPMAX", "FPMIN", "FPREM", "FPROUNDTOINT", + "FPSQRT", "FPTOBV", "FPTOFP", "FPSUB", "FPADD", "FPMUL", "FPDIV", "FPPOS", + "FPNEG", "TRUE", "READ", "WRITE", "PRIME", "EXTRACT", "BV_TYPE_DECL", + "FP_TYPE_DECL", "FP_ROUNDINGMODE", "FALSE", "DEFAULT", "ASSIGN", "HAVOC", + "ASSUME", "RETURN", "BV", "INT", "NAT", "SIGN", "DOT", "ID", "UNDERSCORE", + "DIGIT", "LETTER", "LPAREN", "RPAREN", "LBRACK", "RBRACK", "LBRAC", "RBRAC", + "COMMA", "COLON", "SEMICOLON", "QUOT", "LARROW", "RARROW", "WS", "COMMENT", + "LINE_COMMENT" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public DeclarationsLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "Declarations.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + public static final String _serializedATN = + "\u0004\u0000t\u03e1\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001"+ + "\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004"+ + "\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007"+ + "\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b"+ + "\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+ + "\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+ + "\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+ + "\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+ + "\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002"+ + "\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002"+ + "\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007"+ + "!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007"+ + "&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007"+ + "+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u0007"+ + "0\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u0007"+ + "5\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007"+ + ":\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007"+ + "?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007"+ + "D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007"+ + "I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007"+ + "N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007"+ + "S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007"+ + "X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007"+ + "]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007"+ + "b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007"+ + "g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007"+ + "l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007"+ + "q\u0002r\u0007r\u0002s\u0007s\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u00f6\b\u0000\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0003\u0001\u0101\b\u0001\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0003\u0002\u010c\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0003\u0003\u0114\b\u0003\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u011c"+ + "\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0003\u0005\u012a\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ + "\u0006\u013b\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013"+ + "\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a"+ + "\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 "+ + "\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001"+ + "$\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ + "1\u00011\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u0001"+ + "2\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ + "4\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u00015\u00015\u0001"+ + "5\u00015\u00016\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u0001"+ + "7\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ + "9\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001"+ + ":\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001"+ + "<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0003?\u0273\b?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0003D\u029d\bD\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0003E\u02a7\bE\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ + "F\u0001F\u0001F\u0001F\u0003F\u02b2\bF\u0001G\u0001G\u0001G\u0001G\u0001"+ + "G\u0001G\u0001G\u0001G\u0001G\u0003G\u02bd\bG\u0001H\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0003"+ + "I\u02cc\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001"+ + "K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001"+ + "N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001"+ + "P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0003U\u032b\bU\u0001V\u0001V\u0001V\u0001"+ + "V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001"+ + "W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0004\\\u035b\b\\\u000b\\\f\\\u035c\u0001\\\u0001\\"+ + "\u0001\\\u0001\\\u0004\\\u0363\b\\\u000b\\\f\\\u0364\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0004\\\u036b\b\\\u000b\\\f\\\u036c\u0001\\\u0001\\\u0001\\"+ + "\u0001\\\u0001\\\u0001\\\u0003\\\u0375\b\\\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0004\\\u037e\b\\\u000b\\\f\\\u037f\u0003\\"+ + "\u0382\b\\\u0001]\u0003]\u0385\b]\u0001]\u0001]\u0001^\u0004^\u038a\b"+ + "^\u000b^\f^\u038b\u0001_\u0001_\u0003_\u0390\b_\u0001`\u0001`\u0001a\u0001"+ + "a\u0003a\u0396\ba\u0001a\u0001a\u0001a\u0001a\u0001a\u0005a\u039d\ba\n"+ + "a\fa\u03a0\ta\u0001b\u0001b\u0001c\u0001c\u0001d\u0001d\u0001e\u0001e"+ + "\u0001f\u0001f\u0001g\u0001g\u0001h\u0001h\u0001i\u0001i\u0001j\u0001"+ + "j\u0001k\u0001k\u0001l\u0001l\u0001m\u0001m\u0001n\u0001n\u0001o\u0001"+ + "o\u0001o\u0001p\u0001p\u0001p\u0001q\u0004q\u03c3\bq\u000bq\fq\u03c4\u0001"+ + "q\u0001q\u0001r\u0001r\u0001r\u0001r\u0005r\u03cd\br\nr\fr\u03d0\tr\u0001"+ + "r\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0005s\u03db"+ + "\bs\ns\fs\u03de\ts\u0001s\u0001s\u0001\u03ce\u0000t\u0001\u0001\u0003"+ + "\u0002\u0005\u0003\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f\b\u0011"+ + "\t\u0013\n\u0015\u000b\u0017\f\u0019\r\u001b\u000e\u001d\u000f\u001f\u0010"+ + "!\u0011#\u0012%\u0013\'\u0014)\u0015+\u0016-\u0017/\u00181\u00193\u001a"+ + "5\u001b7\u001c9\u001d;\u001e=\u001f? A!C\"E#G$I%K&M\'O(Q)S*U+W,Y-[.]/"+ + "_0a1c2e3g4i5k6m7o8q9s:u;w}?\u007f@\u0081A\u0083B\u0085C\u0087D\u0089"+ + "E\u008bF\u008dG\u008fH\u0091I\u0093J\u0095K\u0097L\u0099M\u009bN\u009d"+ + "O\u009fP\u00a1Q\u00a3R\u00a5S\u00a7T\u00a9U\u00abV\u00adW\u00afX\u00b1"+ + "Y\u00b3Z\u00b5[\u00b7\\\u00b9]\u00bb^\u00bd_\u00bf`\u00c1a\u00c3b\u00c5"+ + "c\u00c7d\u00c9e\u00cbf\u00cdg\u00cfh\u00d1i\u00d3j\u00d5k\u00d7l\u00d9"+ + "m\u00dbn\u00ddo\u00dfp\u00e1q\u00e3r\u00e5s\u00e7t\u0001\u0000\u0007\u0002"+ + "\u0000ssuu\u0001\u000001\u0003\u000009AFaf\u0001\u000009\u0002\u0000A"+ + "Zaz\u0003\u0000\t\n\f\r \u0002\u0000\n\n\r\r\u040e\u0000\u0001\u0001"+ + "\u0000\u0000\u0000\u0000\u0003\u0001\u0000\u0000\u0000\u0000\u0005\u0001"+ + "\u0000\u0000\u0000\u0000\u0007\u0001\u0000\u0000\u0000\u0000\t\u0001\u0000"+ + "\u0000\u0000\u0000\u000b\u0001\u0000\u0000\u0000\u0000\r\u0001\u0000\u0000"+ + "\u0000\u0000\u000f\u0001\u0000\u0000\u0000\u0000\u0011\u0001\u0000\u0000"+ + "\u0000\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015\u0001\u0000\u0000"+ + "\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019\u0001\u0000\u0000"+ + "\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d\u0001\u0000\u0000"+ + "\u0000\u0000\u001f\u0001\u0000\u0000\u0000\u0000!\u0001\u0000\u0000\u0000"+ + "\u0000#\u0001\u0000\u0000\u0000\u0000%\u0001\u0000\u0000\u0000\u0000\'"+ + "\u0001\u0000\u0000\u0000\u0000)\u0001\u0000\u0000\u0000\u0000+\u0001\u0000"+ + "\u0000\u0000\u0000-\u0001\u0000\u0000\u0000\u0000/\u0001\u0000\u0000\u0000"+ + "\u00001\u0001\u0000\u0000\u0000\u00003\u0001\u0000\u0000\u0000\u00005"+ + "\u0001\u0000\u0000\u0000\u00007\u0001\u0000\u0000\u0000\u00009\u0001\u0000"+ + "\u0000\u0000\u0000;\u0001\u0000\u0000\u0000\u0000=\u0001\u0000\u0000\u0000"+ + "\u0000?\u0001\u0000\u0000\u0000\u0000A\u0001\u0000\u0000\u0000\u0000C"+ + "\u0001\u0000\u0000\u0000\u0000E\u0001\u0000\u0000\u0000\u0000G\u0001\u0000"+ + "\u0000\u0000\u0000I\u0001\u0000\u0000\u0000\u0000K\u0001\u0000\u0000\u0000"+ + "\u0000M\u0001\u0000\u0000\u0000\u0000O\u0001\u0000\u0000\u0000\u0000Q"+ + "\u0001\u0000\u0000\u0000\u0000S\u0001\u0000\u0000\u0000\u0000U\u0001\u0000"+ + "\u0000\u0000\u0000W\u0001\u0000\u0000\u0000\u0000Y\u0001\u0000\u0000\u0000"+ + "\u0000[\u0001\u0000\u0000\u0000\u0000]\u0001\u0000\u0000\u0000\u0000_"+ + "\u0001\u0000\u0000\u0000\u0000a\u0001\u0000\u0000\u0000\u0000c\u0001\u0000"+ + "\u0000\u0000\u0000e\u0001\u0000\u0000\u0000\u0000g\u0001\u0000\u0000\u0000"+ + "\u0000i\u0001\u0000\u0000\u0000\u0000k\u0001\u0000\u0000\u0000\u0000m"+ + "\u0001\u0000\u0000\u0000\u0000o\u0001\u0000\u0000\u0000\u0000q\u0001\u0000"+ + "\u0000\u0000\u0000s\u0001\u0000\u0000\u0000\u0000u\u0001\u0000\u0000\u0000"+ + "\u0000w\u0001\u0000\u0000\u0000\u0000y\u0001\u0000\u0000\u0000\u0000{"+ + "\u0001\u0000\u0000\u0000\u0000}\u0001\u0000\u0000\u0000\u0000\u007f\u0001"+ + "\u0000\u0000\u0000\u0000\u0081\u0001\u0000\u0000\u0000\u0000\u0083\u0001"+ + "\u0000\u0000\u0000\u0000\u0085\u0001\u0000\u0000\u0000\u0000\u0087\u0001"+ + "\u0000\u0000\u0000\u0000\u0089\u0001\u0000\u0000\u0000\u0000\u008b\u0001"+ + "\u0000\u0000\u0000\u0000\u008d\u0001\u0000\u0000\u0000\u0000\u008f\u0001"+ + "\u0000\u0000\u0000\u0000\u0091\u0001\u0000\u0000\u0000\u0000\u0093\u0001"+ + "\u0000\u0000\u0000\u0000\u0095\u0001\u0000\u0000\u0000\u0000\u0097\u0001"+ + "\u0000\u0000\u0000\u0000\u0099\u0001\u0000\u0000\u0000\u0000\u009b\u0001"+ + "\u0000\u0000\u0000\u0000\u009d\u0001\u0000\u0000\u0000\u0000\u009f\u0001"+ + "\u0000\u0000\u0000\u0000\u00a1\u0001\u0000\u0000\u0000\u0000\u00a3\u0001"+ + "\u0000\u0000\u0000\u0000\u00a5\u0001\u0000\u0000\u0000\u0000\u00a7\u0001"+ + "\u0000\u0000\u0000\u0000\u00a9\u0001\u0000\u0000\u0000\u0000\u00ab\u0001"+ + "\u0000\u0000\u0000\u0000\u00ad\u0001\u0000\u0000\u0000\u0000\u00af\u0001"+ + "\u0000\u0000\u0000\u0000\u00b1\u0001\u0000\u0000\u0000\u0000\u00b3\u0001"+ + "\u0000\u0000\u0000\u0000\u00b5\u0001\u0000\u0000\u0000\u0000\u00b7\u0001"+ + "\u0000\u0000\u0000\u0000\u00b9\u0001\u0000\u0000\u0000\u0000\u00bb\u0001"+ + "\u0000\u0000\u0000\u0000\u00bd\u0001\u0000\u0000\u0000\u0000\u00bf\u0001"+ + "\u0000\u0000\u0000\u0000\u00c1\u0001\u0000\u0000\u0000\u0000\u00c3\u0001"+ + "\u0000\u0000\u0000\u0000\u00c5\u0001\u0000\u0000\u0000\u0000\u00c7\u0001"+ + "\u0000\u0000\u0000\u0000\u00c9\u0001\u0000\u0000\u0000\u0000\u00cb\u0001"+ + "\u0000\u0000\u0000\u0000\u00cd\u0001\u0000\u0000\u0000\u0000\u00cf\u0001"+ + "\u0000\u0000\u0000\u0000\u00d1\u0001\u0000\u0000\u0000\u0000\u00d3\u0001"+ + "\u0000\u0000\u0000\u0000\u00d5\u0001\u0000\u0000\u0000\u0000\u00d7\u0001"+ + "\u0000\u0000\u0000\u0000\u00d9\u0001\u0000\u0000\u0000\u0000\u00db\u0001"+ + "\u0000\u0000\u0000\u0000\u00dd\u0001\u0000\u0000\u0000\u0000\u00df\u0001"+ + "\u0000\u0000\u0000\u0000\u00e1\u0001\u0000\u0000\u0000\u0000\u00e3\u0001"+ + "\u0000\u0000\u0000\u0000\u00e5\u0001\u0000\u0000\u0000\u0000\u00e7\u0001"+ + "\u0000\u0000\u0000\u0001\u00f5\u0001\u0000\u0000\u0000\u0003\u0100\u0001"+ + "\u0000\u0000\u0000\u0005\u010b\u0001\u0000\u0000\u0000\u0007\u0113\u0001"+ + "\u0000\u0000\u0000\t\u011b\u0001\u0000\u0000\u0000\u000b\u0129\u0001\u0000"+ + "\u0000\u0000\r\u013a\u0001\u0000\u0000\u0000\u000f\u013c\u0001\u0000\u0000"+ + "\u0000\u0011\u013f\u0001\u0000\u0000\u0000\u0013\u0144\u0001\u0000\u0000"+ + "\u0000\u0015\u0149\u0001\u0000\u0000\u0000\u0017\u014d\u0001\u0000\u0000"+ + "\u0000\u0019\u0151\u0001\u0000\u0000\u0000\u001b\u0154\u0001\u0000\u0000"+ + "\u0000\u001d\u015b\u0001\u0000\u0000\u0000\u001f\u0162\u0001\u0000\u0000"+ + "\u0000!\u0165\u0001\u0000\u0000\u0000#\u0169\u0001\u0000\u0000\u0000%"+ + "\u016d\u0001\u0000\u0000\u0000\'\u0171\u0001\u0000\u0000\u0000)\u0173"+ + "\u0001\u0000\u0000\u0000+\u0176\u0001\u0000\u0000\u0000-\u0178\u0001\u0000"+ + "\u0000\u0000/\u017b\u0001\u0000\u0000\u00001\u017d\u0001\u0000\u0000\u0000"+ + "3\u0180\u0001\u0000\u0000\u00005\u0182\u0001\u0000\u0000\u00007\u0184"+ + "\u0001\u0000\u0000\u00009\u0186\u0001\u0000\u0000\u0000;\u018a\u0001\u0000"+ + "\u0000\u0000=\u018e\u0001\u0000\u0000\u0000?\u0192\u0001\u0000\u0000\u0000"+ + "A\u0194\u0001\u0000\u0000\u0000C\u0197\u0001\u0000\u0000\u0000E\u01a6"+ + "\u0001\u0000\u0000\u0000G\u01b5\u0001\u0000\u0000\u0000I\u01bb\u0001\u0000"+ + "\u0000\u0000K\u01c1\u0001\u0000\u0000\u0000M\u01c7\u0001\u0000\u0000\u0000"+ + "O\u01cd\u0001\u0000\u0000\u0000Q\u01d3\u0001\u0000\u0000\u0000S\u01da"+ + "\u0001\u0000\u0000\u0000U\u01e1\u0001\u0000\u0000\u0000W\u01e8\u0001\u0000"+ + "\u0000\u0000Y\u01ef\u0001\u0000\u0000\u0000[\u01f6\u0001\u0000\u0000\u0000"+ + "]\u01fb\u0001\u0000\u0000\u0000_\u0201\u0001\u0000\u0000\u0000a\u0207"+ + "\u0001\u0000\u0000\u0000c\u020d\u0001\u0000\u0000\u0000e\u0213\u0001\u0000"+ + "\u0000\u0000g\u021a\u0001\u0000\u0000\u0000i\u0221\u0001\u0000\u0000\u0000"+ + "k\u0227\u0001\u0000\u0000\u0000m\u022d\u0001\u0000\u0000\u0000o\u0233"+ + "\u0001\u0000\u0000\u0000q\u0239\u0001\u0000\u0000\u0000s\u023f\u0001\u0000"+ + "\u0000\u0000u\u0245\u0001\u0000\u0000\u0000w\u024b\u0001\u0000\u0000\u0000"+ + "y\u0251\u0001\u0000\u0000\u0000{\u0257\u0001\u0000\u0000\u0000}\u025d"+ + "\u0001\u0000\u0000\u0000\u007f\u0263\u0001\u0000\u0000\u0000\u0081\u0274"+ + "\u0001\u0000\u0000\u0000\u0083\u027c\u0001\u0000\u0000\u0000\u0085\u0282"+ + "\u0001\u0000\u0000\u0000\u0087\u0288\u0001\u0000\u0000\u0000\u0089\u028e"+ + "\u0001\u0000\u0000\u0000\u008b\u029e\u0001\u0000\u0000\u0000\u008d\u02a8"+ + "\u0001\u0000\u0000\u0000\u008f\u02b3\u0001\u0000\u0000\u0000\u0091\u02be"+ + "\u0001\u0000\u0000\u0000\u0093\u02c4\u0001\u0000\u0000\u0000\u0095\u02cd"+ + "\u0001\u0000\u0000\u0000\u0097\u02d3\u0001\u0000\u0000\u0000\u0099\u02db"+ + "\u0001\u0000\u0000\u0000\u009b\u02e1\u0001\u0000\u0000\u0000\u009d\u02e7"+ + "\u0001\u0000\u0000\u0000\u009f\u02ec\u0001\u0000\u0000\u0000\u00a1\u02f1"+ + "\u0001\u0000\u0000\u0000\u00a3\u02f7\u0001\u0000\u0000\u0000\u00a5\u02fd"+ + "\u0001\u0000\u0000\u0000\u00a7\u0305\u0001\u0000\u0000\u0000\u00a9\u030b"+ + "\u0001\u0000\u0000\u0000\u00ab\u032a\u0001\u0000\u0000\u0000\u00ad\u032c"+ + "\u0001\u0000\u0000\u0000\u00af\u0332\u0001\u0000\u0000\u0000\u00b1\u033a"+ + "\u0001\u0000\u0000\u0000\u00b3\u0341\u0001\u0000\u0000\u0000\u00b5\u0347"+ + "\u0001\u0000\u0000\u0000\u00b7\u034e\u0001\u0000\u0000\u0000\u00b9\u0381"+ + "\u0001\u0000\u0000\u0000\u00bb\u0384\u0001\u0000\u0000\u0000\u00bd\u0389"+ + "\u0001\u0000\u0000\u0000\u00bf\u038f\u0001\u0000\u0000\u0000\u00c1\u0391"+ + "\u0001\u0000\u0000\u0000\u00c3\u0395\u0001\u0000\u0000\u0000\u00c5\u03a1"+ + "\u0001\u0000\u0000\u0000\u00c7\u03a3\u0001\u0000\u0000\u0000\u00c9\u03a5"+ + "\u0001\u0000\u0000\u0000\u00cb\u03a7\u0001\u0000\u0000\u0000\u00cd\u03a9"+ + "\u0001\u0000\u0000\u0000\u00cf\u03ab\u0001\u0000\u0000\u0000\u00d1\u03ad"+ + "\u0001\u0000\u0000\u0000\u00d3\u03af\u0001\u0000\u0000\u0000\u00d5\u03b1"+ + "\u0001\u0000\u0000\u0000\u00d7\u03b3\u0001\u0000\u0000\u0000\u00d9\u03b5"+ + "\u0001\u0000\u0000\u0000\u00db\u03b7\u0001\u0000\u0000\u0000\u00dd\u03b9"+ + "\u0001\u0000\u0000\u0000\u00df\u03bb\u0001\u0000\u0000\u0000\u00e1\u03be"+ + "\u0001\u0000\u0000\u0000\u00e3\u03c2\u0001\u0000\u0000\u0000\u00e5\u03c8"+ + "\u0001\u0000\u0000\u0000\u00e7\u03d6\u0001\u0000\u0000\u0000\u00e9\u00ea"+ + "\u0005b\u0000\u0000\u00ea\u00eb\u0005o\u0000\u0000\u00eb\u00ec\u0005o"+ + "\u0000\u0000\u00ec\u00f6\u0005l\u0000\u0000\u00ed\u00ee\u0005B\u0000\u0000"+ + "\u00ee\u00ef\u0005o\u0000\u0000\u00ef\u00f0\u0005o\u0000\u0000\u00f0\u00f6"+ + "\u0005l\u0000\u0000\u00f1\u00f2\u0005B\u0000\u0000\u00f2\u00f3\u0005O"+ + "\u0000\u0000\u00f3\u00f4\u0005O\u0000\u0000\u00f4\u00f6\u0005L\u0000\u0000"+ + "\u00f5\u00e9\u0001\u0000\u0000\u0000\u00f5\u00ed\u0001\u0000\u0000\u0000"+ + "\u00f5\u00f1\u0001\u0000\u0000\u0000\u00f6\u0002\u0001\u0000\u0000\u0000"+ + "\u00f7\u00f8\u0005i\u0000\u0000\u00f8\u00f9\u0005n\u0000\u0000\u00f9\u0101"+ + "\u0005t\u0000\u0000\u00fa\u00fb\u0005I\u0000\u0000\u00fb\u00fc\u0005n"+ + "\u0000\u0000\u00fc\u0101\u0005t\u0000\u0000\u00fd\u00fe\u0005I\u0000\u0000"+ + "\u00fe\u00ff\u0005N\u0000\u0000\u00ff\u0101\u0005T\u0000\u0000\u0100\u00f7"+ + "\u0001\u0000\u0000\u0000\u0100\u00fa\u0001\u0000\u0000\u0000\u0100\u00fd"+ + "\u0001\u0000\u0000\u0000\u0101\u0004\u0001\u0000\u0000\u0000\u0102\u0103"+ + "\u0005r\u0000\u0000\u0103\u0104\u0005a\u0000\u0000\u0104\u010c\u0005t"+ + "\u0000\u0000\u0105\u0106\u0005R\u0000\u0000\u0106\u0107\u0005a\u0000\u0000"+ + "\u0107\u010c\u0005t\u0000\u0000\u0108\u0109\u0005R\u0000\u0000\u0109\u010a"+ + "\u0005A\u0000\u0000\u010a\u010c\u0005T\u0000\u0000\u010b\u0102\u0001\u0000"+ + "\u0000\u0000\u010b\u0105\u0001\u0000\u0000\u0000\u010b\u0108\u0001\u0000"+ + "\u0000\u0000\u010c\u0006\u0001\u0000\u0000\u0000\u010d\u010e\u0005b\u0000"+ + "\u0000\u010e\u0114\u0005v\u0000\u0000\u010f\u0110\u0005B\u0000\u0000\u0110"+ + "\u0114\u0005v\u0000\u0000\u0111\u0112\u0005B\u0000\u0000\u0112\u0114\u0005"+ + "V\u0000\u0000\u0113\u010d\u0001\u0000\u0000\u0000\u0113\u010f\u0001\u0000"+ + "\u0000\u0000\u0113\u0111\u0001\u0000\u0000\u0000\u0114\b\u0001\u0000\u0000"+ + "\u0000\u0115\u0116\u0005f\u0000\u0000\u0116\u011c\u0005p\u0000\u0000\u0117"+ + "\u0118\u0005F\u0000\u0000\u0118\u011c\u0005p\u0000\u0000\u0119\u011a\u0005"+ + "F\u0000\u0000\u011a\u011c\u0005P\u0000\u0000\u011b\u0115\u0001\u0000\u0000"+ + "\u0000\u011b\u0117\u0001\u0000\u0000\u0000\u011b\u0119\u0001\u0000\u0000"+ + "\u0000\u011c\n\u0001\u0000\u0000\u0000\u011d\u011e\u0005f\u0000\u0000"+ + "\u011e\u011f\u0005u\u0000\u0000\u011f\u0120\u0005n\u0000\u0000\u0120\u012a"+ + "\u0005c\u0000\u0000\u0121\u0122\u0005F\u0000\u0000\u0122\u0123\u0005u"+ + "\u0000\u0000\u0123\u0124\u0005n\u0000\u0000\u0124\u012a\u0005c\u0000\u0000"+ + "\u0125\u0126\u0005F\u0000\u0000\u0126\u0127\u0005U\u0000\u0000\u0127\u0128"+ + "\u0005N\u0000\u0000\u0128\u012a\u0005C\u0000\u0000\u0129\u011d\u0001\u0000"+ + "\u0000\u0000\u0129\u0121\u0001\u0000\u0000\u0000\u0129\u0125\u0001\u0000"+ + "\u0000\u0000\u012a\f\u0001\u0000\u0000\u0000\u012b\u012c\u0005a\u0000"+ + "\u0000\u012c\u012d\u0005r\u0000\u0000\u012d\u012e\u0005r\u0000\u0000\u012e"+ + "\u012f\u0005a\u0000\u0000\u012f\u013b\u0005y\u0000\u0000\u0130\u0131\u0005"+ + "A\u0000\u0000\u0131\u0132\u0005r\u0000\u0000\u0132\u0133\u0005r\u0000"+ + "\u0000\u0133\u0134\u0005a\u0000\u0000\u0134\u013b\u0005y\u0000\u0000\u0135"+ + "\u0136\u0005A\u0000\u0000\u0136\u0137\u0005R\u0000\u0000\u0137\u0138\u0005"+ + "R\u0000\u0000\u0138\u0139\u0005A\u0000\u0000\u0139\u013b\u0005Y\u0000"+ + "\u0000\u013a\u012b\u0001\u0000\u0000\u0000\u013a\u0130\u0001\u0000\u0000"+ + "\u0000\u013a\u0135\u0001\u0000\u0000\u0000\u013b\u000e\u0001\u0000\u0000"+ + "\u0000\u013c\u013d\u0005i\u0000\u0000\u013d\u013e\u0005f\u0000\u0000\u013e"+ + "\u0010\u0001\u0000\u0000\u0000\u013f\u0140\u0005t\u0000\u0000\u0140\u0141"+ + "\u0005h\u0000\u0000\u0141\u0142\u0005e\u0000\u0000\u0142\u0143\u0005n"+ + "\u0000\u0000\u0143\u0012\u0001\u0000\u0000\u0000\u0144\u0145\u0005e\u0000"+ + "\u0000\u0145\u0146\u0005l\u0000\u0000\u0146\u0147\u0005s\u0000\u0000\u0147"+ + "\u0148\u0005e\u0000\u0000\u0148\u0014\u0001\u0000\u0000\u0000\u0149\u014a"+ + "\u0005i\u0000\u0000\u014a\u014b\u0005f\u0000\u0000\u014b\u014c\u0005f"+ + "\u0000\u0000\u014c\u0016\u0001\u0000\u0000\u0000\u014d\u014e\u0005i\u0000"+ + "\u0000\u014e\u014f\u0005t\u0000\u0000\u014f\u0150\u0005e\u0000\u0000\u0150"+ + "\u0018\u0001\u0000\u0000\u0000\u0151\u0152\u0005=\u0000\u0000\u0152\u0153"+ + "\u0005>\u0000\u0000\u0153\u001a\u0001\u0000\u0000\u0000\u0154\u0155\u0005"+ + "f\u0000\u0000\u0155\u0156\u0005o\u0000\u0000\u0156\u0157\u0005r\u0000"+ + "\u0000\u0157\u0158\u0005a\u0000\u0000\u0158\u0159\u0005l\u0000\u0000\u0159"+ + "\u015a\u0005l\u0000\u0000\u015a\u001c\u0001\u0000\u0000\u0000\u015b\u015c"+ + "\u0005e\u0000\u0000\u015c\u015d\u0005x\u0000\u0000\u015d\u015e\u0005i"+ + "\u0000\u0000\u015e\u015f\u0005s\u0000\u0000\u015f\u0160\u0005t\u0000\u0000"+ + "\u0160\u0161\u0005s\u0000\u0000\u0161\u001e\u0001\u0000\u0000\u0000\u0162"+ + "\u0163\u0005o\u0000\u0000\u0163\u0164\u0005r\u0000\u0000\u0164 \u0001"+ + "\u0000\u0000\u0000\u0165\u0166\u0005a\u0000\u0000\u0166\u0167\u0005n\u0000"+ + "\u0000\u0167\u0168\u0005d\u0000\u0000\u0168\"\u0001\u0000\u0000\u0000"+ + "\u0169\u016a\u0005x\u0000\u0000\u016a\u016b\u0005o\u0000\u0000\u016b\u016c"+ + "\u0005r\u0000\u0000\u016c$\u0001\u0000\u0000\u0000\u016d\u016e\u0005n"+ + "\u0000\u0000\u016e\u016f\u0005o\u0000\u0000\u016f\u0170\u0005t\u0000\u0000"+ + "\u0170&\u0001\u0000\u0000\u0000\u0171\u0172\u0005=\u0000\u0000\u0172("+ + "\u0001\u0000\u0000\u0000\u0173\u0174\u0005/\u0000\u0000\u0174\u0175\u0005"+ + "=\u0000\u0000\u0175*\u0001\u0000\u0000\u0000\u0176\u0177\u0005<\u0000"+ + "\u0000\u0177,\u0001\u0000\u0000\u0000\u0178\u0179\u0005<\u0000\u0000\u0179"+ + "\u017a\u0005=\u0000\u0000\u017a.\u0001\u0000\u0000\u0000\u017b\u017c\u0005"+ + ">\u0000\u0000\u017c0\u0001\u0000\u0000\u0000\u017d\u017e\u0005>\u0000"+ + "\u0000\u017e\u017f\u0005=\u0000\u0000\u017f2\u0001\u0000\u0000\u0000\u0180"+ + "\u0181\u0005+\u0000\u0000\u01814\u0001\u0000\u0000\u0000\u0182\u0183\u0005"+ + "-\u0000\u0000\u01836\u0001\u0000\u0000\u0000\u0184\u0185\u0005*\u0000"+ + "\u0000\u01858\u0001\u0000\u0000\u0000\u0186\u0187\u0005d\u0000\u0000\u0187"+ + "\u0188\u0005i\u0000\u0000\u0188\u0189\u0005v\u0000\u0000\u0189:\u0001"+ + "\u0000\u0000\u0000\u018a\u018b\u0005m\u0000\u0000\u018b\u018c\u0005o\u0000"+ + "\u0000\u018c\u018d\u0005d\u0000\u0000\u018d<\u0001\u0000\u0000\u0000\u018e"+ + "\u018f\u0005r\u0000\u0000\u018f\u0190\u0005e\u0000\u0000\u0190\u0191\u0005"+ + "m\u0000\u0000\u0191>\u0001\u0000\u0000\u0000\u0192\u0193\u0005%\u0000"+ + "\u0000\u0193@\u0001\u0000\u0000\u0000\u0194\u0195\u00033\u0019\u0000\u0195"+ + "\u0196\u00033\u0019\u0000\u0196B\u0001\u0000\u0000\u0000\u0197\u0198\u0005"+ + "b\u0000\u0000\u0198\u0199\u0005v\u0000\u0000\u0199\u019a\u0005_\u0000"+ + "\u0000\u019a\u019b\u0005z\u0000\u0000\u019b\u019c\u0005e\u0000\u0000\u019c"+ + "\u019d\u0005r\u0000\u0000\u019d\u019e\u0005o\u0000\u0000\u019e\u019f\u0005"+ + "_\u0000\u0000\u019f\u01a0\u0005e\u0000\u0000\u01a0\u01a1\u0005x\u0000"+ + "\u0000\u01a1\u01a2\u0005t\u0000\u0000\u01a2\u01a3\u0005e\u0000\u0000\u01a3"+ + "\u01a4\u0005n\u0000\u0000\u01a4\u01a5\u0005d\u0000\u0000\u01a5D\u0001"+ + "\u0000\u0000\u0000\u01a6\u01a7\u0005b\u0000\u0000\u01a7\u01a8\u0005v\u0000"+ + "\u0000\u01a8\u01a9\u0005_\u0000\u0000\u01a9\u01aa\u0005s\u0000\u0000\u01aa"+ + "\u01ab\u0005i\u0000\u0000\u01ab\u01ac\u0005g\u0000\u0000\u01ac\u01ad\u0005"+ + "n\u0000\u0000\u01ad\u01ae\u0005_\u0000\u0000\u01ae\u01af\u0005e\u0000"+ + "\u0000\u01af\u01b0\u0005x\u0000\u0000\u01b0\u01b1\u0005t\u0000\u0000\u01b1"+ + "\u01b2\u0005e\u0000\u0000\u01b2\u01b3\u0005n\u0000\u0000\u01b3\u01b4\u0005"+ + "d\u0000\u0000\u01b4F\u0001\u0000\u0000\u0000\u01b5\u01b6\u0005b\u0000"+ + "\u0000\u01b6\u01b7\u0005v\u0000\u0000\u01b7\u01b8\u0005a\u0000\u0000\u01b8"+ + "\u01b9\u0005d\u0000\u0000\u01b9\u01ba\u0005d\u0000\u0000\u01baH\u0001"+ + "\u0000\u0000\u0000\u01bb\u01bc\u0005b\u0000\u0000\u01bc\u01bd\u0005v\u0000"+ + "\u0000\u01bd\u01be\u0005s\u0000\u0000\u01be\u01bf\u0005u\u0000\u0000\u01bf"+ + "\u01c0\u0005b\u0000\u0000\u01c0J\u0001\u0000\u0000\u0000\u01c1\u01c2\u0005"+ + "b\u0000\u0000\u01c2\u01c3\u0005v\u0000\u0000\u01c3\u01c4\u0005p\u0000"+ + "\u0000\u01c4\u01c5\u0005o\u0000\u0000\u01c5\u01c6\u0005s\u0000\u0000\u01c6"+ + "L\u0001\u0000\u0000\u0000\u01c7\u01c8\u0005b\u0000\u0000\u01c8\u01c9\u0005"+ + "v\u0000\u0000\u01c9\u01ca\u0005n\u0000\u0000\u01ca\u01cb\u0005e\u0000"+ + "\u0000\u01cb\u01cc\u0005g\u0000\u0000\u01ccN\u0001\u0000\u0000\u0000\u01cd"+ + "\u01ce\u0005b\u0000\u0000\u01ce\u01cf\u0005v\u0000\u0000\u01cf\u01d0\u0005"+ + "m\u0000\u0000\u01d0\u01d1\u0005u\u0000\u0000\u01d1\u01d2\u0005l\u0000"+ + "\u0000\u01d2P\u0001\u0000\u0000\u0000\u01d3\u01d4\u0005b\u0000\u0000\u01d4"+ + "\u01d5\u0005v\u0000\u0000\u01d5\u01d6\u0005u\u0000\u0000\u01d6\u01d7\u0005"+ + "d\u0000\u0000\u01d7\u01d8\u0005i\u0000\u0000\u01d8\u01d9\u0005v\u0000"+ + "\u0000\u01d9R\u0001\u0000\u0000\u0000\u01da\u01db\u0005b\u0000\u0000\u01db"+ + "\u01dc\u0005v\u0000\u0000\u01dc\u01dd\u0005s\u0000\u0000\u01dd\u01de\u0005"+ + "d\u0000\u0000\u01de\u01df\u0005i\u0000\u0000\u01df\u01e0\u0005v\u0000"+ + "\u0000\u01e0T\u0001\u0000\u0000\u0000\u01e1\u01e2\u0005b\u0000\u0000\u01e2"+ + "\u01e3\u0005v\u0000\u0000\u01e3\u01e4\u0005s\u0000\u0000\u01e4\u01e5\u0005"+ + "m\u0000\u0000\u01e5\u01e6\u0005o\u0000\u0000\u01e6\u01e7\u0005d\u0000"+ + "\u0000\u01e7V\u0001\u0000\u0000\u0000\u01e8\u01e9\u0005b\u0000\u0000\u01e9"+ + "\u01ea\u0005v\u0000\u0000\u01ea\u01eb\u0005u\u0000\u0000\u01eb\u01ec\u0005"+ + "r\u0000\u0000\u01ec\u01ed\u0005e\u0000\u0000\u01ed\u01ee\u0005m\u0000"+ + "\u0000\u01eeX\u0001\u0000\u0000\u0000\u01ef\u01f0\u0005b\u0000\u0000\u01f0"+ + "\u01f1\u0005v\u0000\u0000\u01f1\u01f2\u0005s\u0000\u0000\u01f2\u01f3\u0005"+ + "r\u0000\u0000\u01f3\u01f4\u0005e\u0000\u0000\u01f4\u01f5\u0005m\u0000"+ + "\u0000\u01f5Z\u0001\u0000\u0000\u0000\u01f6\u01f7\u0005b\u0000\u0000\u01f7"+ + "\u01f8\u0005v\u0000\u0000\u01f8\u01f9\u0005o\u0000\u0000\u01f9\u01fa\u0005"+ + "r\u0000\u0000\u01fa\\\u0001\u0000\u0000\u0000\u01fb\u01fc\u0005b\u0000"+ + "\u0000\u01fc\u01fd\u0005v\u0000\u0000\u01fd\u01fe\u0005a\u0000\u0000\u01fe"+ + "\u01ff\u0005n\u0000\u0000\u01ff\u0200\u0005d\u0000\u0000\u0200^\u0001"+ + "\u0000\u0000\u0000\u0201\u0202\u0005b\u0000\u0000\u0202\u0203\u0005v\u0000"+ + "\u0000\u0203\u0204\u0005x\u0000\u0000\u0204\u0205\u0005o\u0000\u0000\u0205"+ + "\u0206\u0005r\u0000\u0000\u0206`\u0001\u0000\u0000\u0000\u0207\u0208\u0005"+ + "b\u0000\u0000\u0208\u0209\u0005v\u0000\u0000\u0209\u020a\u0005n\u0000"+ + "\u0000\u020a\u020b\u0005o\u0000\u0000\u020b\u020c\u0005t\u0000\u0000\u020c"+ + "b\u0001\u0000\u0000\u0000\u020d\u020e\u0005b\u0000\u0000\u020e\u020f\u0005"+ + "v\u0000\u0000\u020f\u0210\u0005s\u0000\u0000\u0210\u0211\u0005h\u0000"+ + "\u0000\u0211\u0212\u0005l\u0000\u0000\u0212d\u0001\u0000\u0000\u0000\u0213"+ + "\u0214\u0005b\u0000\u0000\u0214\u0215\u0005v\u0000\u0000\u0215\u0216\u0005"+ + "a\u0000\u0000\u0216\u0217\u0005s\u0000\u0000\u0217\u0218\u0005h\u0000"+ + "\u0000\u0218\u0219\u0005r\u0000\u0000\u0219f\u0001\u0000\u0000\u0000\u021a"+ + "\u021b\u0005b\u0000\u0000\u021b\u021c\u0005v\u0000\u0000\u021c\u021d\u0005"+ + "l\u0000\u0000\u021d\u021e\u0005s\u0000\u0000\u021e\u021f\u0005h\u0000"+ + "\u0000\u021f\u0220\u0005r\u0000\u0000\u0220h\u0001\u0000\u0000\u0000\u0221"+ + "\u0222\u0005b\u0000\u0000\u0222\u0223\u0005v\u0000\u0000\u0223\u0224\u0005"+ + "r\u0000\u0000\u0224\u0225\u0005o\u0000\u0000\u0225\u0226\u0005l\u0000"+ + "\u0000\u0226j\u0001\u0000\u0000\u0000\u0227\u0228\u0005b\u0000\u0000\u0228"+ + "\u0229\u0005v\u0000\u0000\u0229\u022a\u0005r\u0000\u0000\u022a\u022b\u0005"+ + "o\u0000\u0000\u022b\u022c\u0005r\u0000\u0000\u022cl\u0001\u0000\u0000"+ + "\u0000\u022d\u022e\u0005b\u0000\u0000\u022e\u022f\u0005v\u0000\u0000\u022f"+ + "\u0230\u0005u\u0000\u0000\u0230\u0231\u0005l\u0000\u0000\u0231\u0232\u0005"+ + "t\u0000\u0000\u0232n\u0001\u0000\u0000\u0000\u0233\u0234\u0005b\u0000"+ + "\u0000\u0234\u0235\u0005v\u0000\u0000\u0235\u0236\u0005u\u0000\u0000\u0236"+ + "\u0237\u0005l\u0000\u0000\u0237\u0238\u0005e\u0000\u0000\u0238p\u0001"+ + "\u0000\u0000\u0000\u0239\u023a\u0005b\u0000\u0000\u023a\u023b\u0005v\u0000"+ + "\u0000\u023b\u023c\u0005u\u0000\u0000\u023c\u023d\u0005g\u0000\u0000\u023d"+ + "\u023e\u0005t\u0000\u0000\u023er\u0001\u0000\u0000\u0000\u023f\u0240\u0005"+ + "b\u0000\u0000\u0240\u0241\u0005v\u0000\u0000\u0241\u0242\u0005u\u0000"+ + "\u0000\u0242\u0243\u0005g\u0000\u0000\u0243\u0244\u0005e\u0000\u0000\u0244"+ + "t\u0001\u0000\u0000\u0000\u0245\u0246\u0005b\u0000\u0000\u0246\u0247\u0005"+ + "v\u0000\u0000\u0247\u0248\u0005s\u0000\u0000\u0248\u0249\u0005l\u0000"+ + "\u0000\u0249\u024a\u0005t\u0000\u0000\u024av\u0001\u0000\u0000\u0000\u024b"+ + "\u024c\u0005b\u0000\u0000\u024c\u024d\u0005v\u0000\u0000\u024d\u024e\u0005"+ + "s\u0000\u0000\u024e\u024f\u0005l\u0000\u0000\u024f\u0250\u0005e\u0000"+ + "\u0000\u0250x\u0001\u0000\u0000\u0000\u0251\u0252\u0005b\u0000\u0000\u0252"+ + "\u0253\u0005v\u0000\u0000\u0253\u0254\u0005s\u0000\u0000\u0254\u0255\u0005"+ + "g\u0000\u0000\u0255\u0256\u0005t\u0000\u0000\u0256z\u0001\u0000\u0000"+ + "\u0000\u0257\u0258\u0005b\u0000\u0000\u0258\u0259\u0005v\u0000\u0000\u0259"+ + "\u025a\u0005s\u0000\u0000\u025a\u025b\u0005g\u0000\u0000\u025b\u025c\u0005"+ + "e\u0000\u0000\u025c|\u0001\u0000\u0000\u0000\u025d\u025e\u0005f\u0000"+ + "\u0000\u025e\u025f\u0005p\u0000\u0000\u025f\u0260\u0005a\u0000\u0000\u0260"+ + "\u0261\u0005b\u0000\u0000\u0261\u0262\u0005s\u0000\u0000\u0262~\u0001"+ + "\u0000\u0000\u0000\u0263\u0264\u0005f\u0000\u0000\u0264\u0265\u0005p\u0000"+ + "\u0000\u0265\u0266\u0005f\u0000\u0000\u0266\u0267\u0005r\u0000\u0000\u0267"+ + "\u0268\u0005o\u0000\u0000\u0268\u0269\u0005m\u0000\u0000\u0269\u026a\u0005"+ + "b\u0000\u0000\u026a\u026b\u0005v\u0000\u0000\u026b\u026c\u0001\u0000\u0000"+ + "\u0000\u026c\u026d\u0003\u00a9T\u0000\u026d\u026e\u0003\u00cfg\u0000\u026e"+ + "\u026f\u0007\u0000\u0000\u0000\u026f\u0270\u0003\u00d1h\u0000\u0270\u0272"+ + "\u0001\u0000\u0000\u0000\u0271\u0273\u0003\u00abU\u0000\u0272\u0271\u0001"+ + "\u0000\u0000\u0000\u0272\u0273\u0001\u0000\u0000\u0000\u0273\u0080\u0001"+ + "\u0000\u0000\u0000\u0274\u0275\u0005f\u0000\u0000\u0275\u0276\u0005p\u0000"+ + "\u0000\u0276\u0277\u0005i\u0000\u0000\u0277\u0278\u0005s\u0000\u0000\u0278"+ + "\u0279\u0005n\u0000\u0000\u0279\u027a\u0005a\u0000\u0000\u027a\u027b\u0005"+ + "n\u0000\u0000\u027b\u0082\u0001\u0000\u0000\u0000\u027c\u027d\u0005f\u0000"+ + "\u0000\u027d\u027e\u0005p\u0000\u0000\u027e\u027f\u0005m\u0000\u0000\u027f"+ + "\u0280\u0005a\u0000\u0000\u0280\u0281\u0005x\u0000\u0000\u0281\u0084\u0001"+ + "\u0000\u0000\u0000\u0282\u0283\u0005f\u0000\u0000\u0283\u0284\u0005p\u0000"+ + "\u0000\u0284\u0285\u0005m\u0000\u0000\u0285\u0286\u0005i\u0000\u0000\u0286"+ + "\u0287\u0005n\u0000\u0000\u0287\u0086\u0001\u0000\u0000\u0000\u0288\u0289"+ + "\u0005f\u0000\u0000\u0289\u028a\u0005p\u0000\u0000\u028a\u028b\u0005r"+ + "\u0000\u0000\u028b\u028c\u0005e\u0000\u0000\u028c\u028d\u0005m\u0000\u0000"+ + "\u028d\u0088\u0001\u0000\u0000\u0000\u028e\u028f\u0005f\u0000\u0000\u028f"+ + "\u0290\u0005p\u0000\u0000\u0290\u0291\u0005r\u0000\u0000\u0291\u0292\u0005"+ + "o\u0000\u0000\u0292\u0293\u0005u\u0000\u0000\u0293\u0294\u0005n\u0000"+ + "\u0000\u0294\u0295\u0005d\u0000\u0000\u0295\u0296\u0005t\u0000\u0000\u0296"+ + "\u0297\u0005o\u0000\u0000\u0297\u0298\u0005i\u0000\u0000\u0298\u0299\u0005"+ + "n\u0000\u0000\u0299\u029a\u0005t\u0000\u0000\u029a\u029c\u0001\u0000\u0000"+ + "\u0000\u029b\u029d\u0003\u00abU\u0000\u029c\u029b\u0001\u0000\u0000\u0000"+ + "\u029c\u029d\u0001\u0000\u0000\u0000\u029d\u008a\u0001\u0000\u0000\u0000"+ + "\u029e\u029f\u0005f\u0000\u0000\u029f\u02a0\u0005p\u0000\u0000\u02a0\u02a1"+ + "\u0005s\u0000\u0000\u02a1\u02a2\u0005q\u0000\u0000\u02a2\u02a3\u0005r"+ + "\u0000\u0000\u02a3\u02a4\u0005t\u0000\u0000\u02a4\u02a6\u0001\u0000\u0000"+ + "\u0000\u02a5\u02a7\u0003\u00abU\u0000\u02a6\u02a5\u0001\u0000\u0000\u0000"+ + "\u02a6\u02a7\u0001\u0000\u0000\u0000\u02a7\u008c\u0001\u0000\u0000\u0000"+ + "\u02a8\u02a9\u0005f\u0000\u0000\u02a9\u02aa\u0005p\u0000\u0000\u02aa\u02ab"+ + "\u0005t\u0000\u0000\u02ab\u02ac\u0005o\u0000\u0000\u02ac\u02ad\u0005b"+ + "\u0000\u0000\u02ad\u02ae\u0005v\u0000\u0000\u02ae\u02af\u0001\u0000\u0000"+ + "\u0000\u02af\u02b1\u0003\u00a7S\u0000\u02b0\u02b2\u0003\u00abU\u0000\u02b1"+ + "\u02b0\u0001\u0000\u0000\u0000\u02b1\u02b2\u0001\u0000\u0000\u0000\u02b2"+ + "\u008e\u0001\u0000\u0000\u0000\u02b3\u02b4\u0005f\u0000\u0000\u02b4\u02b5"+ + "\u0005p\u0000\u0000\u02b5\u02b6\u0005t\u0000\u0000\u02b6\u02b7\u0005o"+ + "\u0000\u0000\u02b7\u02b8\u0005f\u0000\u0000\u02b8\u02b9\u0005p\u0000\u0000"+ + "\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u02bc\u0003\u00a9T\u0000\u02bb"+ + "\u02bd\u0003\u00abU\u0000\u02bc\u02bb\u0001\u0000\u0000\u0000\u02bc\u02bd"+ + "\u0001\u0000\u0000\u0000\u02bd\u0090\u0001\u0000\u0000\u0000\u02be\u02bf"+ + "\u0005f\u0000\u0000\u02bf\u02c0\u0005p\u0000\u0000\u02c0\u02c1\u0005s"+ + "\u0000\u0000\u02c1\u02c2\u0005u\u0000\u0000\u02c2\u02c3\u0005b\u0000\u0000"+ + "\u02c3\u0092\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005f\u0000\u0000\u02c5"+ + "\u02c6\u0005p\u0000\u0000\u02c6\u02c7\u0005a\u0000\u0000\u02c7\u02c8\u0005"+ + "d\u0000\u0000\u02c8\u02c9\u0005d\u0000\u0000\u02c9\u02cb\u0001\u0000\u0000"+ + "\u0000\u02ca\u02cc\u0003\u00abU\u0000\u02cb\u02ca\u0001\u0000\u0000\u0000"+ + "\u02cb\u02cc\u0001\u0000\u0000\u0000\u02cc\u0094\u0001\u0000\u0000\u0000"+ + "\u02cd\u02ce\u0005f\u0000\u0000\u02ce\u02cf\u0005p\u0000\u0000\u02cf\u02d0"+ + "\u0005m\u0000\u0000\u02d0\u02d1\u0005u\u0000\u0000\u02d1\u02d2\u0005l"+ + "\u0000\u0000\u02d2\u0096\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005f\u0000"+ + "\u0000\u02d4\u02d5\u0005p\u0000\u0000\u02d5\u02d6\u0005d\u0000\u0000\u02d6"+ + "\u02d7\u0005i\u0000\u0000\u02d7\u02d8\u0005v\u0000\u0000\u02d8\u02d9\u0001"+ + "\u0000\u0000\u0000\u02d9\u02da\u0003\u00abU\u0000\u02da\u0098\u0001\u0000"+ + "\u0000\u0000\u02db\u02dc\u0005f\u0000\u0000\u02dc\u02dd\u0005p\u0000\u0000"+ + "\u02dd\u02de\u0005p\u0000\u0000\u02de\u02df\u0005o\u0000\u0000\u02df\u02e0"+ + "\u0005s\u0000\u0000\u02e0\u009a\u0001\u0000\u0000\u0000\u02e1\u02e2\u0005"+ + "f\u0000\u0000\u02e2\u02e3\u0005p\u0000\u0000\u02e3\u02e4\u0005n\u0000"+ + "\u0000\u02e4\u02e5\u0005e\u0000\u0000\u02e5\u02e6\u0005g\u0000\u0000\u02e6"+ + "\u009c\u0001\u0000\u0000\u0000\u02e7\u02e8\u0005t\u0000\u0000\u02e8\u02e9"+ + "\u0005r\u0000\u0000\u02e9\u02ea\u0005u\u0000\u0000\u02ea\u02eb\u0005e"+ + "\u0000\u0000\u02eb\u009e\u0001\u0000\u0000\u0000\u02ec\u02ed\u0005r\u0000"+ + "\u0000\u02ed\u02ee\u0005e\u0000\u0000\u02ee\u02ef\u0005a\u0000\u0000\u02ef"+ + "\u02f0\u0005d\u0000\u0000\u02f0\u00a0\u0001\u0000\u0000\u0000\u02f1\u02f2"+ + "\u0005w\u0000\u0000\u02f2\u02f3\u0005r\u0000\u0000\u02f3\u02f4\u0005i"+ + "\u0000\u0000\u02f4\u02f5\u0005t\u0000\u0000\u02f5\u02f6\u0005e\u0000\u0000"+ + "\u02f6\u00a2\u0001\u0000\u0000\u0000\u02f7\u02f8\u0005p\u0000\u0000\u02f8"+ + "\u02f9\u0005r\u0000\u0000\u02f9\u02fa\u0005i\u0000\u0000\u02fa\u02fb\u0005"+ + "m\u0000\u0000\u02fb\u02fc\u0005e\u0000\u0000\u02fc\u00a4\u0001\u0000\u0000"+ + "\u0000\u02fd\u02fe\u0005e\u0000\u0000\u02fe\u02ff\u0005x\u0000\u0000\u02ff"+ + "\u0300\u0005t\u0000\u0000\u0300\u0301\u0005r\u0000\u0000\u0301\u0302\u0005"+ + "a\u0000\u0000\u0302\u0303\u0005c\u0000\u0000\u0303\u0304\u0005t\u0000"+ + "\u0000\u0304\u00a6\u0001\u0000\u0000\u0000\u0305\u0306\u0003\u00cfg\u0000"+ + "\u0306\u0307\u0003\u00bd^\u0000\u0307\u0308\u0005\'\u0000\u0000\u0308"+ + "\u0309\u0007\u0000\u0000\u0000\u0309\u030a\u0003\u00d1h\u0000\u030a\u00a8"+ + "\u0001\u0000\u0000\u0000\u030b\u030c\u0003\u00cfg\u0000\u030c\u030d\u0003"+ + "\u00bd^\u0000\u030d\u030e\u0003\u00d7k\u0000\u030e\u030f\u0003\u00bd^"+ + "\u0000\u030f\u0310\u0003\u00d1h\u0000\u0310\u00aa\u0001\u0000\u0000\u0000"+ + "\u0311\u0312\u0005[\u0000\u0000\u0312\u0313\u0005r\u0000\u0000\u0313\u0314"+ + "\u0005n\u0000\u0000\u0314\u0315\u0005e\u0000\u0000\u0315\u032b\u0005]"+ + "\u0000\u0000\u0316\u0317\u0005[\u0000\u0000\u0317\u0318\u0005r\u0000\u0000"+ + "\u0318\u0319\u0005n\u0000\u0000\u0319\u031a\u0005a\u0000\u0000\u031a\u032b"+ + "\u0005]\u0000\u0000\u031b\u031c\u0005[\u0000\u0000\u031c\u031d\u0005r"+ + "\u0000\u0000\u031d\u031e\u0005t\u0000\u0000\u031e\u031f\u0005p\u0000\u0000"+ + "\u031f\u032b\u0005]\u0000\u0000\u0320\u0321\u0005[\u0000\u0000\u0321\u0322"+ + "\u0005r\u0000\u0000\u0322\u0323\u0005t\u0000\u0000\u0323\u0324\u0005n"+ + "\u0000\u0000\u0324\u032b\u0005]\u0000\u0000\u0325\u0326\u0005[\u0000\u0000"+ + "\u0326\u0327\u0005r\u0000\u0000\u0327\u0328\u0005t\u0000\u0000\u0328\u0329"+ + "\u0005z\u0000\u0000\u0329\u032b\u0005]\u0000\u0000\u032a\u0311\u0001\u0000"+ + "\u0000\u0000\u032a\u0316\u0001\u0000\u0000\u0000\u032a\u031b\u0001\u0000"+ + "\u0000\u0000\u032a\u0320\u0001\u0000\u0000\u0000\u032a\u0325\u0001\u0000"+ + "\u0000\u0000\u032b\u00ac\u0001\u0000\u0000\u0000\u032c\u032d\u0005f\u0000"+ + "\u0000\u032d\u032e\u0005a\u0000\u0000\u032e\u032f\u0005l\u0000\u0000\u032f"+ + "\u0330\u0005s\u0000\u0000\u0330\u0331\u0005e\u0000\u0000\u0331\u00ae\u0001"+ + "\u0000\u0000\u0000\u0332\u0333\u0005d\u0000\u0000\u0333\u0334\u0005e\u0000"+ + "\u0000\u0334\u0335\u0005f\u0000\u0000\u0335\u0336\u0005a\u0000\u0000\u0336"+ + "\u0337\u0005u\u0000\u0000\u0337\u0338\u0005l\u0000\u0000\u0338\u0339\u0005"+ + "t\u0000\u0000\u0339\u00b0\u0001\u0000\u0000\u0000\u033a\u033b\u0005a\u0000"+ + "\u0000\u033b\u033c\u0005s\u0000\u0000\u033c\u033d\u0005s\u0000\u0000\u033d"+ + "\u033e\u0005i\u0000\u0000\u033e\u033f\u0005g\u0000\u0000\u033f\u0340\u0005"+ + "n\u0000\u0000\u0340\u00b2\u0001\u0000\u0000\u0000\u0341\u0342\u0005h\u0000"+ + "\u0000\u0342\u0343\u0005a\u0000\u0000\u0343\u0344\u0005v\u0000\u0000\u0344"+ + "\u0345\u0005o\u0000\u0000\u0345\u0346\u0005c\u0000\u0000\u0346\u00b4\u0001"+ + "\u0000\u0000\u0000\u0347\u0348\u0005a\u0000\u0000\u0348\u0349\u0005s\u0000"+ + "\u0000\u0349\u034a\u0005s\u0000\u0000\u034a\u034b\u0005u\u0000\u0000\u034b"+ + "\u034c\u0005m\u0000\u0000\u034c\u034d\u0005e\u0000\u0000\u034d\u00b6\u0001"+ + "\u0000\u0000\u0000\u034e\u034f\u0005r\u0000\u0000\u034f\u0350\u0005e\u0000"+ + "\u0000\u0350\u0351\u0005t\u0000\u0000\u0351\u0352\u0005u\u0000\u0000\u0352"+ + "\u0353\u0005r\u0000\u0000\u0353\u0354\u0005n\u0000\u0000\u0354\u00b8\u0001"+ + "\u0000\u0000\u0000\u0355\u0356\u0003\u00bd^\u0000\u0356\u0357\u0005\'"+ + "\u0000\u0000\u0357\u0358\u0005b\u0000\u0000\u0358\u035a\u0001\u0000\u0000"+ + "\u0000\u0359\u035b\u0007\u0001\u0000\u0000\u035a\u0359\u0001\u0000\u0000"+ + "\u0000\u035b\u035c\u0001\u0000\u0000\u0000\u035c\u035a\u0001\u0000\u0000"+ + "\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u0382\u0001\u0000\u0000"+ + "\u0000\u035e\u035f\u0005#\u0000\u0000\u035f\u0360\u0005b\u0000\u0000\u0360"+ + "\u0362\u0001\u0000\u0000\u0000\u0361\u0363\u0007\u0001\u0000\u0000\u0362"+ + "\u0361\u0001\u0000\u0000\u0000\u0363\u0364\u0001\u0000\u0000\u0000\u0364"+ + "\u0362\u0001\u0000\u0000\u0000\u0364\u0365\u0001\u0000\u0000\u0000\u0365"+ + "\u0382\u0001\u0000\u0000\u0000\u0366\u0367\u0005#\u0000\u0000\u0367\u0368"+ + "\u0005x\u0000\u0000\u0368\u036a\u0001\u0000\u0000\u0000\u0369\u036b\u0007"+ + "\u0001\u0000\u0000\u036a\u0369\u0001\u0000\u0000\u0000\u036b\u036c\u0001"+ + "\u0000\u0000\u0000\u036c\u036a\u0001\u0000\u0000\u0000\u036c\u036d\u0001"+ + "\u0000\u0000\u0000\u036d\u0382\u0001\u0000\u0000\u0000\u036e\u036f\u0003"+ + "\u00bd^\u0000\u036f\u0370\u0005\'\u0000\u0000\u0370\u0371\u0005d\u0000"+ + "\u0000\u0371\u0374\u0001\u0000\u0000\u0000\u0372\u0375\u00033\u0019\u0000"+ + "\u0373\u0375\u00035\u001a\u0000\u0374\u0372\u0001\u0000\u0000\u0000\u0374"+ + "\u0373\u0001\u0000\u0000\u0000\u0374\u0375\u0001\u0000\u0000\u0000\u0375"+ + "\u0376\u0001\u0000\u0000\u0000\u0376\u0377\u0003\u00bb]\u0000\u0377\u0382"+ + "\u0001\u0000\u0000\u0000\u0378\u0379\u0003\u00bd^\u0000\u0379\u037a\u0005"+ + "\'\u0000\u0000\u037a\u037b\u0005x\u0000\u0000\u037b\u037d\u0001\u0000"+ + "\u0000\u0000\u037c\u037e\u0007\u0002\u0000\u0000\u037d\u037c\u0001\u0000"+ + "\u0000\u0000\u037e\u037f\u0001\u0000\u0000\u0000\u037f\u037d\u0001\u0000"+ + "\u0000\u0000\u037f\u0380\u0001\u0000\u0000\u0000\u0380\u0382\u0001\u0000"+ + "\u0000\u0000\u0381\u0355\u0001\u0000\u0000\u0000\u0381\u035e\u0001\u0000"+ + "\u0000\u0000\u0381\u0366\u0001\u0000\u0000\u0000\u0381\u036e\u0001\u0000"+ + "\u0000\u0000\u0381\u0378\u0001\u0000\u0000\u0000\u0382\u00ba\u0001\u0000"+ + "\u0000\u0000\u0383\u0385\u0003\u00bf_\u0000\u0384\u0383\u0001\u0000\u0000"+ + "\u0000\u0384\u0385\u0001\u0000\u0000\u0000\u0385\u0386\u0001\u0000\u0000"+ + "\u0000\u0386\u0387\u0003\u00bd^\u0000\u0387\u00bc\u0001\u0000\u0000\u0000"+ + "\u0388\u038a\u0003\u00c7c\u0000\u0389\u0388\u0001\u0000\u0000\u0000\u038a"+ + "\u038b\u0001\u0000\u0000\u0000\u038b\u0389\u0001\u0000\u0000\u0000\u038b"+ + "\u038c\u0001\u0000\u0000\u0000\u038c\u00be\u0001\u0000\u0000\u0000\u038d"+ + "\u0390\u00033\u0019\u0000\u038e\u0390\u00035\u001a\u0000\u038f\u038d\u0001"+ + "\u0000\u0000\u0000\u038f\u038e\u0001\u0000\u0000\u0000\u0390\u00c0\u0001"+ + "\u0000\u0000\u0000\u0391\u0392\u0005.\u0000\u0000\u0392\u00c2\u0001\u0000"+ + "\u0000\u0000\u0393\u0396\u0003\u00c9d\u0000\u0394\u0396\u0003\u00c5b\u0000"+ + "\u0395\u0393\u0001\u0000\u0000\u0000\u0395\u0394\u0001\u0000\u0000\u0000"+ + "\u0396\u039e\u0001\u0000\u0000\u0000\u0397\u039d\u0003\u00c9d\u0000\u0398"+ + "\u039d\u0003\u00c5b\u0000\u0399\u039d\u0005$\u0000\u0000\u039a\u039d\u0003"+ + "\u00c7c\u0000\u039b\u039d\u0003\u00d9l\u0000\u039c\u0397\u0001\u0000\u0000"+ + "\u0000\u039c\u0398\u0001\u0000\u0000\u0000\u039c\u0399\u0001\u0000\u0000"+ + "\u0000\u039c\u039a\u0001\u0000\u0000\u0000\u039c\u039b\u0001\u0000\u0000"+ + "\u0000\u039d\u03a0\u0001\u0000\u0000\u0000\u039e\u039c\u0001\u0000\u0000"+ + "\u0000\u039e\u039f\u0001\u0000\u0000\u0000\u039f\u00c4\u0001\u0000\u0000"+ + "\u0000\u03a0\u039e\u0001\u0000\u0000\u0000\u03a1\u03a2\u0005_\u0000\u0000"+ + "\u03a2\u00c6\u0001\u0000\u0000\u0000\u03a3\u03a4\u0007\u0003\u0000\u0000"+ + "\u03a4\u00c8\u0001\u0000\u0000\u0000\u03a5\u03a6\u0007\u0004\u0000\u0000"+ + "\u03a6\u00ca\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005(\u0000\u0000\u03a8"+ + "\u00cc\u0001\u0000\u0000\u0000\u03a9\u03aa\u0005)\u0000\u0000\u03aa\u00ce"+ + "\u0001\u0000\u0000\u0000\u03ab\u03ac\u0005[\u0000\u0000\u03ac\u00d0\u0001"+ + "\u0000\u0000\u0000\u03ad\u03ae\u0005]\u0000\u0000\u03ae\u00d2\u0001\u0000"+ + "\u0000\u0000\u03af\u03b0\u0005{\u0000\u0000\u03b0\u00d4\u0001\u0000\u0000"+ + "\u0000\u03b1\u03b2\u0005}\u0000\u0000\u03b2\u00d6\u0001\u0000\u0000\u0000"+ + "\u03b3\u03b4\u0005,\u0000\u0000\u03b4\u00d8\u0001\u0000\u0000\u0000\u03b5"+ + "\u03b6\u0005:\u0000\u0000\u03b6\u00da\u0001\u0000\u0000\u0000\u03b7\u03b8"+ + "\u0005;\u0000\u0000\u03b8\u00dc\u0001\u0000\u0000\u0000\u03b9\u03ba\u0005"+ + "\'\u0000\u0000\u03ba\u00de\u0001\u0000\u0000\u0000\u03bb\u03bc\u0005<"+ + "\u0000\u0000\u03bc\u03bd\u0005-\u0000\u0000\u03bd\u00e0\u0001\u0000\u0000"+ + "\u0000\u03be\u03bf\u0005-\u0000\u0000\u03bf\u03c0\u0005>\u0000\u0000\u03c0"+ + "\u00e2\u0001\u0000\u0000\u0000\u03c1\u03c3\u0007\u0005\u0000\u0000\u03c2"+ + "\u03c1\u0001\u0000\u0000\u0000\u03c3\u03c4\u0001\u0000\u0000\u0000\u03c4"+ + "\u03c2\u0001\u0000\u0000\u0000\u03c4\u03c5\u0001\u0000\u0000\u0000\u03c5"+ + "\u03c6\u0001\u0000\u0000\u0000\u03c6\u03c7\u0006q\u0000\u0000\u03c7\u00e4"+ + "\u0001\u0000\u0000\u0000\u03c8\u03c9\u0005/\u0000\u0000\u03c9\u03ca\u0005"+ + "*\u0000\u0000\u03ca\u03ce\u0001\u0000\u0000\u0000\u03cb\u03cd\t\u0000"+ + "\u0000\u0000\u03cc\u03cb\u0001\u0000\u0000\u0000\u03cd\u03d0\u0001\u0000"+ + "\u0000\u0000\u03ce\u03cf\u0001\u0000\u0000\u0000\u03ce\u03cc\u0001\u0000"+ + "\u0000\u0000\u03cf\u03d1\u0001\u0000\u0000\u0000\u03d0\u03ce\u0001\u0000"+ + "\u0000\u0000\u03d1\u03d2\u0005*\u0000\u0000\u03d2\u03d3\u0005/\u0000\u0000"+ + "\u03d3\u03d4\u0001\u0000\u0000\u0000\u03d4\u03d5\u0006r\u0000\u0000\u03d5"+ + "\u00e6\u0001\u0000\u0000\u0000\u03d6\u03d7\u0005/\u0000\u0000\u03d7\u03d8"+ + "\u0005/\u0000\u0000\u03d8\u03dc\u0001\u0000\u0000\u0000\u03d9\u03db\b"+ + "\u0006\u0000\u0000\u03da\u03d9\u0001\u0000\u0000\u0000\u03db\u03de\u0001"+ + "\u0000\u0000\u0000\u03dc\u03da\u0001\u0000\u0000\u0000\u03dc\u03dd\u0001"+ + "\u0000\u0000\u0000\u03dd\u03df\u0001\u0000\u0000\u0000\u03de\u03dc\u0001"+ + "\u0000\u0000\u0000\u03df\u03e0\u0006s\u0000\u0000\u03e0\u00e8\u0001\u0000"+ + "\u0000\u0000\u001e\u0000\u00f5\u0100\u010b\u0113\u011b\u0129\u013a\u0272"+ + "\u029c\u02a6\u02b1\u02bc\u02cb\u032a\u035c\u0364\u036c\u0374\u037f\u0381"+ + "\u0384\u038b\u038f\u0395\u039c\u039e\u03c4\u03ce\u03dc\u0001\u0006\u0000"+ + "\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/DeclarationsLexer.tokens b/subprojects/common/grammar/src/main/gen/DeclarationsLexer.tokens new file mode 100644 index 0000000000..9531176830 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/DeclarationsLexer.tokens @@ -0,0 +1,204 @@ +BOOLTYPE=1 +INTTYPE=2 +RATTYPE=3 +BVTYPE=4 +FPTYPE=5 +FUNC=6 +ARRAY=7 +IF=8 +THEN=9 +ELSE=10 +IFF=11 +ITE=12 +IMPLY=13 +FORALL=14 +EXISTS=15 +OR=16 +AND=17 +XOR=18 +NOT=19 +EQ=20 +NEQ=21 +LT=22 +LEQ=23 +GT=24 +GEQ=25 +PLUS=26 +MINUS=27 +MUL=28 +DIV=29 +MOD=30 +REM=31 +PERCENT=32 +BV_CONCAT=33 +BV_ZERO_EXTEND=34 +BV_SIGN_EXTEND=35 +BV_ADD=36 +BV_SUB=37 +BV_POS=38 +BV_NEG=39 +BV_MUL=40 +BV_UDIV=41 +BV_SDIV=42 +BV_SMOD=43 +BV_UREM=44 +BV_SREM=45 +BV_OR=46 +BV_AND=47 +BV_XOR=48 +BV_NOT=49 +BV_SHL=50 +BV_ASHR=51 +BV_LSHR=52 +BV_ROL=53 +BV_ROR=54 +BV_ULT=55 +BV_ULE=56 +BV_UGT=57 +BV_UGE=58 +BV_SLT=59 +BV_SLE=60 +BV_SGT=61 +BV_SGE=62 +FP_ABS=63 +FP_FROM_BV=64 +FP_IS_NAN=65 +FPMAX=66 +FPMIN=67 +FPREM=68 +FPROUNDTOINT=69 +FPSQRT=70 +FPTOBV=71 +FPTOFP=72 +FPSUB=73 +FPADD=74 +FPMUL=75 +FPDIV=76 +FPPOS=77 +FPNEG=78 +TRUE=79 +READ=80 +WRITE=81 +PRIME=82 +EXTRACT=83 +BV_TYPE_DECL=84 +FP_TYPE_DECL=85 +FP_ROUNDINGMODE=86 +FALSE=87 +DEFAULT=88 +ASSIGN=89 +HAVOC=90 +ASSUME=91 +RETURN=92 +BV=93 +INT=94 +NAT=95 +SIGN=96 +DOT=97 +ID=98 +UNDERSCORE=99 +DIGIT=100 +LETTER=101 +LPAREN=102 +RPAREN=103 +LBRACK=104 +RBRACK=105 +LBRAC=106 +RBRAC=107 +COMMA=108 +COLON=109 +SEMICOLON=110 +QUOT=111 +LARROW=112 +RARROW=113 +WS=114 +COMMENT=115 +LINE_COMMENT=116 +'if'=8 +'then'=9 +'else'=10 +'iff'=11 +'ite'=12 +'=>'=13 +'forall'=14 +'exists'=15 +'or'=16 +'and'=17 +'xor'=18 +'not'=19 +'='=20 +'/='=21 +'<'=22 +'<='=23 +'>'=24 +'>='=25 +'+'=26 +'-'=27 +'*'=28 +'div'=29 +'mod'=30 +'rem'=31 +'%'=32 +'bv_zero_extend'=34 +'bv_sign_extend'=35 +'bvadd'=36 +'bvsub'=37 +'bvpos'=38 +'bvneg'=39 +'bvmul'=40 +'bvudiv'=41 +'bvsdiv'=42 +'bvsmod'=43 +'bvurem'=44 +'bvsrem'=45 +'bvor'=46 +'bvand'=47 +'bvxor'=48 +'bvnot'=49 +'bvshl'=50 +'bvashr'=51 +'bvlshr'=52 +'bvrol'=53 +'bvror'=54 +'bvult'=55 +'bvule'=56 +'bvugt'=57 +'bvuge'=58 +'bvslt'=59 +'bvsle'=60 +'bvsgt'=61 +'bvsge'=62 +'fpabs'=63 +'fpisnan'=65 +'fpmax'=66 +'fpmin'=67 +'fprem'=68 +'fpsub'=73 +'fpmul'=75 +'fppos'=77 +'fpneg'=78 +'true'=79 +'read'=80 +'write'=81 +'prime'=82 +'extract'=83 +'false'=87 +'default'=88 +'assign'=89 +'havoc'=90 +'assume'=91 +'return'=92 +'.'=97 +'_'=99 +'('=102 +')'=103 +'['=104 +']'=105 +'{'=106 +'}'=107 +','=108 +':'=109 +';'=110 +'\''=111 +'<-'=112 +'->'=113 diff --git a/subprojects/common/grammar/src/main/gen/DeclarationsListener.java b/subprojects/common/grammar/src/main/gen/DeclarationsListener.java new file mode 100644 index 0000000000..e243d6f236 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/DeclarationsListener.java @@ -0,0 +1,119 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Declarations.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link DeclarationsParser}. + */ +public interface DeclarationsListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link DeclarationsParser#decl}. + * @param ctx the parse tree + */ + void enterDecl(DeclarationsParser.DeclContext ctx); + /** + * Exit a parse tree produced by {@link DeclarationsParser#decl}. + * @param ctx the parse tree + */ + void exitDecl(DeclarationsParser.DeclContext ctx); + /** + * Enter a parse tree produced by {@link DeclarationsParser#declList}. + * @param ctx the parse tree + */ + void enterDeclList(DeclarationsParser.DeclListContext ctx); + /** + * Exit a parse tree produced by {@link DeclarationsParser#declList}. + * @param ctx the parse tree + */ + void exitDeclList(DeclarationsParser.DeclListContext ctx); + /** + * Enter a parse tree produced by {@link DeclarationsParser#type}. + * @param ctx the parse tree + */ + void enterType(DeclarationsParser.TypeContext ctx); + /** + * Exit a parse tree produced by {@link DeclarationsParser#type}. + * @param ctx the parse tree + */ + void exitType(DeclarationsParser.TypeContext ctx); + /** + * Enter a parse tree produced by {@link DeclarationsParser#typeList}. + * @param ctx the parse tree + */ + void enterTypeList(DeclarationsParser.TypeListContext ctx); + /** + * Exit a parse tree produced by {@link DeclarationsParser#typeList}. + * @param ctx the parse tree + */ + void exitTypeList(DeclarationsParser.TypeListContext ctx); + /** + * Enter a parse tree produced by {@link DeclarationsParser#boolType}. + * @param ctx the parse tree + */ + void enterBoolType(DeclarationsParser.BoolTypeContext ctx); + /** + * Exit a parse tree produced by {@link DeclarationsParser#boolType}. + * @param ctx the parse tree + */ + void exitBoolType(DeclarationsParser.BoolTypeContext ctx); + /** + * Enter a parse tree produced by {@link DeclarationsParser#intType}. + * @param ctx the parse tree + */ + void enterIntType(DeclarationsParser.IntTypeContext ctx); + /** + * Exit a parse tree produced by {@link DeclarationsParser#intType}. + * @param ctx the parse tree + */ + void exitIntType(DeclarationsParser.IntTypeContext ctx); + /** + * Enter a parse tree produced by {@link DeclarationsParser#ratType}. + * @param ctx the parse tree + */ + void enterRatType(DeclarationsParser.RatTypeContext ctx); + /** + * Exit a parse tree produced by {@link DeclarationsParser#ratType}. + * @param ctx the parse tree + */ + void exitRatType(DeclarationsParser.RatTypeContext ctx); + /** + * Enter a parse tree produced by {@link DeclarationsParser#funcType}. + * @param ctx the parse tree + */ + void enterFuncType(DeclarationsParser.FuncTypeContext ctx); + /** + * Exit a parse tree produced by {@link DeclarationsParser#funcType}. + * @param ctx the parse tree + */ + void exitFuncType(DeclarationsParser.FuncTypeContext ctx); + /** + * Enter a parse tree produced by {@link DeclarationsParser#arrayType}. + * @param ctx the parse tree + */ + void enterArrayType(DeclarationsParser.ArrayTypeContext ctx); + /** + * Exit a parse tree produced by {@link DeclarationsParser#arrayType}. + * @param ctx the parse tree + */ + void exitArrayType(DeclarationsParser.ArrayTypeContext ctx); + /** + * Enter a parse tree produced by {@link DeclarationsParser#bvType}. + * @param ctx the parse tree + */ + void enterBvType(DeclarationsParser.BvTypeContext ctx); + /** + * Exit a parse tree produced by {@link DeclarationsParser#bvType}. + * @param ctx the parse tree + */ + void exitBvType(DeclarationsParser.BvTypeContext ctx); + /** + * Enter a parse tree produced by {@link DeclarationsParser#fpType}. + * @param ctx the parse tree + */ + void enterFpType(DeclarationsParser.FpTypeContext ctx); + /** + * Exit a parse tree produced by {@link DeclarationsParser#fpType}. + * @param ctx the parse tree + */ + void exitFpType(DeclarationsParser.FpTypeContext ctx); +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/DeclarationsParser.java b/subprojects/common/grammar/src/main/gen/DeclarationsParser.java new file mode 100644 index 0000000000..5d3492382a --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/DeclarationsParser.java @@ -0,0 +1,881 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Declarations.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class DeclarationsParser extends Parser { + static { RuntimeMetaData.checkVersion("4.10.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + BOOLTYPE=1, INTTYPE=2, RATTYPE=3, BVTYPE=4, FPTYPE=5, FUNC=6, ARRAY=7, + IF=8, THEN=9, ELSE=10, IFF=11, ITE=12, IMPLY=13, FORALL=14, EXISTS=15, + OR=16, AND=17, XOR=18, NOT=19, EQ=20, NEQ=21, LT=22, LEQ=23, GT=24, GEQ=25, + PLUS=26, MINUS=27, MUL=28, DIV=29, MOD=30, REM=31, PERCENT=32, BV_CONCAT=33, + BV_ZERO_EXTEND=34, BV_SIGN_EXTEND=35, BV_ADD=36, BV_SUB=37, BV_POS=38, + BV_NEG=39, BV_MUL=40, BV_UDIV=41, BV_SDIV=42, BV_SMOD=43, BV_UREM=44, + BV_SREM=45, BV_OR=46, BV_AND=47, BV_XOR=48, BV_NOT=49, BV_SHL=50, BV_ASHR=51, + BV_LSHR=52, BV_ROL=53, BV_ROR=54, BV_ULT=55, BV_ULE=56, BV_UGT=57, BV_UGE=58, + BV_SLT=59, BV_SLE=60, BV_SGT=61, BV_SGE=62, FP_ABS=63, FP_FROM_BV=64, + FP_IS_NAN=65, FPMAX=66, FPMIN=67, FPREM=68, FPROUNDTOINT=69, FPSQRT=70, + FPTOBV=71, FPTOFP=72, FPSUB=73, FPADD=74, FPMUL=75, FPDIV=76, FPPOS=77, + FPNEG=78, TRUE=79, READ=80, WRITE=81, PRIME=82, EXTRACT=83, BV_TYPE_DECL=84, + FP_TYPE_DECL=85, FP_ROUNDINGMODE=86, FALSE=87, DEFAULT=88, ASSIGN=89, + HAVOC=90, ASSUME=91, RETURN=92, BV=93, INT=94, NAT=95, SIGN=96, DOT=97, + ID=98, UNDERSCORE=99, DIGIT=100, LETTER=101, LPAREN=102, RPAREN=103, LBRACK=104, + RBRACK=105, LBRAC=106, RBRAC=107, COMMA=108, COLON=109, SEMICOLON=110, + QUOT=111, LARROW=112, RARROW=113, WS=114, COMMENT=115, LINE_COMMENT=116; + public static final int + RULE_decl = 0, RULE_declList = 1, RULE_type = 2, RULE_typeList = 3, RULE_boolType = 4, + RULE_intType = 5, RULE_ratType = 6, RULE_funcType = 7, RULE_arrayType = 8, + RULE_bvType = 9, RULE_fpType = 10; + private static String[] makeRuleNames() { + return new String[] { + "decl", "declList", "type", "typeList", "boolType", "intType", "ratType", + "funcType", "arrayType", "bvType", "fpType" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, "'if'", "'then'", "'else'", + "'iff'", "'ite'", "'=>'", "'forall'", "'exists'", "'or'", "'and'", "'xor'", + "'not'", "'='", "'/='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", + "'div'", "'mod'", "'rem'", "'%'", null, "'bv_zero_extend'", "'bv_sign_extend'", + "'bvadd'", "'bvsub'", "'bvpos'", "'bvneg'", "'bvmul'", "'bvudiv'", "'bvsdiv'", + "'bvsmod'", "'bvurem'", "'bvsrem'", "'bvor'", "'bvand'", "'bvxor'", "'bvnot'", + "'bvshl'", "'bvashr'", "'bvlshr'", "'bvrol'", "'bvror'", "'bvult'", "'bvule'", + "'bvugt'", "'bvuge'", "'bvslt'", "'bvsle'", "'bvsgt'", "'bvsge'", "'fpabs'", + null, "'fpisnan'", "'fpmax'", "'fpmin'", "'fprem'", null, null, null, + null, "'fpsub'", null, "'fpmul'", null, "'fppos'", "'fpneg'", "'true'", + "'read'", "'write'", "'prime'", "'extract'", null, null, null, "'false'", + "'default'", "'assign'", "'havoc'", "'assume'", "'return'", null, null, + null, null, "'.'", null, "'_'", null, null, "'('", "')'", "'['", "']'", + "'{'", "'}'", "','", "':'", "';'", "'''", "'<-'", "'->'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "BOOLTYPE", "INTTYPE", "RATTYPE", "BVTYPE", "FPTYPE", "FUNC", "ARRAY", + "IF", "THEN", "ELSE", "IFF", "ITE", "IMPLY", "FORALL", "EXISTS", "OR", + "AND", "XOR", "NOT", "EQ", "NEQ", "LT", "LEQ", "GT", "GEQ", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "REM", "PERCENT", "BV_CONCAT", "BV_ZERO_EXTEND", + "BV_SIGN_EXTEND", "BV_ADD", "BV_SUB", "BV_POS", "BV_NEG", "BV_MUL", "BV_UDIV", + "BV_SDIV", "BV_SMOD", "BV_UREM", "BV_SREM", "BV_OR", "BV_AND", "BV_XOR", + "BV_NOT", "BV_SHL", "BV_ASHR", "BV_LSHR", "BV_ROL", "BV_ROR", "BV_ULT", + "BV_ULE", "BV_UGT", "BV_UGE", "BV_SLT", "BV_SLE", "BV_SGT", "BV_SGE", + "FP_ABS", "FP_FROM_BV", "FP_IS_NAN", "FPMAX", "FPMIN", "FPREM", "FPROUNDTOINT", + "FPSQRT", "FPTOBV", "FPTOFP", "FPSUB", "FPADD", "FPMUL", "FPDIV", "FPPOS", + "FPNEG", "TRUE", "READ", "WRITE", "PRIME", "EXTRACT", "BV_TYPE_DECL", + "FP_TYPE_DECL", "FP_ROUNDINGMODE", "FALSE", "DEFAULT", "ASSIGN", "HAVOC", + "ASSUME", "RETURN", "BV", "INT", "NAT", "SIGN", "DOT", "ID", "UNDERSCORE", + "DIGIT", "LETTER", "LPAREN", "RPAREN", "LBRACK", "RBRACK", "LBRAC", "RBRAC", + "COMMA", "COLON", "SEMICOLON", "QUOT", "LARROW", "RARROW", "WS", "COMMENT", + "LINE_COMMENT" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "Declarations.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public DeclarationsParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + public static class DeclContext extends ParserRuleContext { + public Token name; + public TypeContext ttype; + public TerminalNode LPAREN() { return getToken(DeclarationsParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(DeclarationsParser.RPAREN, 0); } + public TerminalNode ID() { return getToken(DeclarationsParser.ID, 0); } + public TypeContext type() { + return getRuleContext(TypeContext.class,0); + } + public DeclContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_decl; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).enterDecl(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).exitDecl(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof DeclarationsVisitor ) return ((DeclarationsVisitor)visitor).visitDecl(this); + else return visitor.visitChildren(this); + } + } + + public final DeclContext decl() throws RecognitionException { + DeclContext _localctx = new DeclContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_decl); + try { + enterOuterAlt(_localctx, 1); + { + setState(22); + match(LPAREN); + setState(23); + ((DeclContext)_localctx).name = match(ID); + setState(24); + ((DeclContext)_localctx).ttype = type(); + setState(25); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class DeclListContext extends ParserRuleContext { + public DeclContext decl; + public List decls = new ArrayList(); + public List decl() { + return getRuleContexts(DeclContext.class); + } + public DeclContext decl(int i) { + return getRuleContext(DeclContext.class,i); + } + public List COMMA() { return getTokens(DeclarationsParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(DeclarationsParser.COMMA, i); + } + public DeclListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_declList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).enterDeclList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).exitDeclList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof DeclarationsVisitor ) return ((DeclarationsVisitor)visitor).visitDeclList(this); + else return visitor.visitChildren(this); + } + } + + public final DeclListContext declList() throws RecognitionException { + DeclListContext _localctx = new DeclListContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_declList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + { + setState(27); + ((DeclListContext)_localctx).decl = decl(); + ((DeclListContext)_localctx).decls.add(((DeclListContext)_localctx).decl); + } + setState(32); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(28); + match(COMMA); + setState(29); + ((DeclListContext)_localctx).decl = decl(); + ((DeclListContext)_localctx).decls.add(((DeclListContext)_localctx).decl); + } + } + setState(34); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TypeContext extends ParserRuleContext { + public BoolTypeContext boolType() { + return getRuleContext(BoolTypeContext.class,0); + } + public IntTypeContext intType() { + return getRuleContext(IntTypeContext.class,0); + } + public RatTypeContext ratType() { + return getRuleContext(RatTypeContext.class,0); + } + public FuncTypeContext funcType() { + return getRuleContext(FuncTypeContext.class,0); + } + public ArrayTypeContext arrayType() { + return getRuleContext(ArrayTypeContext.class,0); + } + public BvTypeContext bvType() { + return getRuleContext(BvTypeContext.class,0); + } + public FpTypeContext fpType() { + return getRuleContext(FpTypeContext.class,0); + } + public TypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).enterType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).exitType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof DeclarationsVisitor ) return ((DeclarationsVisitor)visitor).visitType(this); + else return visitor.visitChildren(this); + } + } + + public final TypeContext type() throws RecognitionException { + TypeContext _localctx = new TypeContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_type); + try { + setState(42); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(35); + boolType(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(36); + intType(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(37); + ratType(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(38); + funcType(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(39); + arrayType(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(40); + bvType(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(41); + fpType(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TypeListContext extends ParserRuleContext { + public TypeContext type; + public List types = new ArrayList(); + public List type() { + return getRuleContexts(TypeContext.class); + } + public TypeContext type(int i) { + return getRuleContext(TypeContext.class,i); + } + public List COMMA() { return getTokens(DeclarationsParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(DeclarationsParser.COMMA, i); + } + public TypeListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).enterTypeList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).exitTypeList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof DeclarationsVisitor ) return ((DeclarationsVisitor)visitor).visitTypeList(this); + else return visitor.visitChildren(this); + } + } + + public final TypeListContext typeList() throws RecognitionException { + TypeListContext _localctx = new TypeListContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_typeList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + { + setState(44); + ((TypeListContext)_localctx).type = type(); + ((TypeListContext)_localctx).types.add(((TypeListContext)_localctx).type); + } + setState(49); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(45); + match(COMMA); + setState(46); + ((TypeListContext)_localctx).type = type(); + ((TypeListContext)_localctx).types.add(((TypeListContext)_localctx).type); + } + } + setState(51); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BoolTypeContext extends ParserRuleContext { + public TerminalNode BOOLTYPE() { return getToken(DeclarationsParser.BOOLTYPE, 0); } + public BoolTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_boolType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).enterBoolType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).exitBoolType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof DeclarationsVisitor ) return ((DeclarationsVisitor)visitor).visitBoolType(this); + else return visitor.visitChildren(this); + } + } + + public final BoolTypeContext boolType() throws RecognitionException { + BoolTypeContext _localctx = new BoolTypeContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_boolType); + try { + enterOuterAlt(_localctx, 1); + { + setState(52); + match(BOOLTYPE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IntTypeContext extends ParserRuleContext { + public TerminalNode INTTYPE() { return getToken(DeclarationsParser.INTTYPE, 0); } + public IntTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_intType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).enterIntType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).exitIntType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof DeclarationsVisitor ) return ((DeclarationsVisitor)visitor).visitIntType(this); + else return visitor.visitChildren(this); + } + } + + public final IntTypeContext intType() throws RecognitionException { + IntTypeContext _localctx = new IntTypeContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_intType); + try { + enterOuterAlt(_localctx, 1); + { + setState(54); + match(INTTYPE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class RatTypeContext extends ParserRuleContext { + public TerminalNode RATTYPE() { return getToken(DeclarationsParser.RATTYPE, 0); } + public RatTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ratType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).enterRatType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).exitRatType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof DeclarationsVisitor ) return ((DeclarationsVisitor)visitor).visitRatType(this); + else return visitor.visitChildren(this); + } + } + + public final RatTypeContext ratType() throws RecognitionException { + RatTypeContext _localctx = new RatTypeContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_ratType); + try { + enterOuterAlt(_localctx, 1); + { + setState(56); + match(RATTYPE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FuncTypeContext extends ParserRuleContext { + public TypeContext from; + public TypeContext to; + public TerminalNode LPAREN() { return getToken(DeclarationsParser.LPAREN, 0); } + public TerminalNode FUNC() { return getToken(DeclarationsParser.FUNC, 0); } + public TerminalNode RPAREN() { return getToken(DeclarationsParser.RPAREN, 0); } + public List type() { + return getRuleContexts(TypeContext.class); + } + public TypeContext type(int i) { + return getRuleContext(TypeContext.class,i); + } + public FuncTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_funcType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).enterFuncType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).exitFuncType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof DeclarationsVisitor ) return ((DeclarationsVisitor)visitor).visitFuncType(this); + else return visitor.visitChildren(this); + } + } + + public final FuncTypeContext funcType() throws RecognitionException { + FuncTypeContext _localctx = new FuncTypeContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_funcType); + try { + enterOuterAlt(_localctx, 1); + { + setState(58); + match(LPAREN); + setState(59); + match(FUNC); + setState(60); + ((FuncTypeContext)_localctx).from = type(); + setState(61); + ((FuncTypeContext)_localctx).to = type(); + setState(62); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ArrayTypeContext extends ParserRuleContext { + public TypeContext indexType; + public TypeContext elemType; + public List LPAREN() { return getTokens(DeclarationsParser.LPAREN); } + public TerminalNode LPAREN(int i) { + return getToken(DeclarationsParser.LPAREN, i); + } + public TerminalNode ARRAY() { return getToken(DeclarationsParser.ARRAY, 0); } + public TerminalNode LBRACK() { return getToken(DeclarationsParser.LBRACK, 0); } + public TerminalNode RBRACK() { return getToken(DeclarationsParser.RBRACK, 0); } + public TerminalNode RARROW() { return getToken(DeclarationsParser.RARROW, 0); } + public List RPAREN() { return getTokens(DeclarationsParser.RPAREN); } + public TerminalNode RPAREN(int i) { + return getToken(DeclarationsParser.RPAREN, i); + } + public List type() { + return getRuleContexts(TypeContext.class); + } + public TypeContext type(int i) { + return getRuleContext(TypeContext.class,i); + } + public ArrayTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arrayType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).enterArrayType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).exitArrayType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof DeclarationsVisitor ) return ((DeclarationsVisitor)visitor).visitArrayType(this); + else return visitor.visitChildren(this); + } + } + + public final ArrayTypeContext arrayType() throws RecognitionException { + ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_arrayType); + try { + enterOuterAlt(_localctx, 1); + { + setState(64); + match(LPAREN); + setState(65); + match(ARRAY); + setState(66); + match(LPAREN); + setState(67); + match(LBRACK); + setState(68); + ((ArrayTypeContext)_localctx).indexType = type(); + setState(69); + match(RBRACK); + setState(70); + match(RARROW); + setState(71); + ((ArrayTypeContext)_localctx).elemType = type(); + setState(72); + match(RPAREN); + setState(73); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BvTypeContext extends ParserRuleContext { + public Token size; + public TerminalNode LPAREN() { return getToken(DeclarationsParser.LPAREN, 0); } + public TerminalNode BVTYPE() { return getToken(DeclarationsParser.BVTYPE, 0); } + public TerminalNode RPAREN() { return getToken(DeclarationsParser.RPAREN, 0); } + public TerminalNode INT() { return getToken(DeclarationsParser.INT, 0); } + public BvTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bvType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).enterBvType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).exitBvType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof DeclarationsVisitor ) return ((DeclarationsVisitor)visitor).visitBvType(this); + else return visitor.visitChildren(this); + } + } + + public final BvTypeContext bvType() throws RecognitionException { + BvTypeContext _localctx = new BvTypeContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_bvType); + try { + enterOuterAlt(_localctx, 1); + { + setState(75); + match(LPAREN); + setState(76); + match(BVTYPE); + setState(77); + ((BvTypeContext)_localctx).size = match(INT); + setState(78); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FpTypeContext extends ParserRuleContext { + public Token exponent; + public Token significand; + public TerminalNode LPAREN() { return getToken(DeclarationsParser.LPAREN, 0); } + public TerminalNode FPTYPE() { return getToken(DeclarationsParser.FPTYPE, 0); } + public TerminalNode RPAREN() { return getToken(DeclarationsParser.RPAREN, 0); } + public List INT() { return getTokens(DeclarationsParser.INT); } + public TerminalNode INT(int i) { + return getToken(DeclarationsParser.INT, i); + } + public FpTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fpType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).enterFpType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof DeclarationsListener ) ((DeclarationsListener)listener).exitFpType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof DeclarationsVisitor ) return ((DeclarationsVisitor)visitor).visitFpType(this); + else return visitor.visitChildren(this); + } + } + + public final FpTypeContext fpType() throws RecognitionException { + FpTypeContext _localctx = new FpTypeContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_fpType); + try { + enterOuterAlt(_localctx, 1); + { + setState(80); + match(LPAREN); + setState(81); + match(FPTYPE); + setState(82); + ((FpTypeContext)_localctx).exponent = match(INT); + setState(83); + ((FpTypeContext)_localctx).significand = match(INT); + setState(84); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static final String _serializedATN = + "\u0004\u0001tW\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002"+ + "\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005"+ + "\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007"+ + "\b\u0002\t\u0007\t\u0002\n\u0007\n\u0001\u0000\u0001\u0000\u0001\u0000"+ + "\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u0001"+ + "\u001f\b\u0001\n\u0001\f\u0001\"\t\u0001\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0003\u0002+\b"+ + "\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0005\u00030\b\u0003\n\u0003"+ + "\f\u00033\t\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001\u0005\u0001"+ + "\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\t\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0001\n\u0000\u0000"+ + "\u000b\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010\u0012\u0014\u0000\u0000"+ + "S\u0000\u0016\u0001\u0000\u0000\u0000\u0002\u001b\u0001\u0000\u0000\u0000"+ + "\u0004*\u0001\u0000\u0000\u0000\u0006,\u0001\u0000\u0000\u0000\b4\u0001"+ + "\u0000\u0000\u0000\n6\u0001\u0000\u0000\u0000\f8\u0001\u0000\u0000\u0000"+ + "\u000e:\u0001\u0000\u0000\u0000\u0010@\u0001\u0000\u0000\u0000\u0012K"+ + "\u0001\u0000\u0000\u0000\u0014P\u0001\u0000\u0000\u0000\u0016\u0017\u0005"+ + "f\u0000\u0000\u0017\u0018\u0005b\u0000\u0000\u0018\u0019\u0003\u0004\u0002"+ + "\u0000\u0019\u001a\u0005g\u0000\u0000\u001a\u0001\u0001\u0000\u0000\u0000"+ + "\u001b \u0003\u0000\u0000\u0000\u001c\u001d\u0005l\u0000\u0000\u001d\u001f"+ + "\u0003\u0000\u0000\u0000\u001e\u001c\u0001\u0000\u0000\u0000\u001f\"\u0001"+ + "\u0000\u0000\u0000 \u001e\u0001\u0000\u0000\u0000 !\u0001\u0000\u0000"+ + "\u0000!\u0003\u0001\u0000\u0000\u0000\" \u0001\u0000\u0000\u0000#+\u0003"+ + "\b\u0004\u0000$+\u0003\n\u0005\u0000%+\u0003\f\u0006\u0000&+\u0003\u000e"+ + "\u0007\u0000\'+\u0003\u0010\b\u0000(+\u0003\u0012\t\u0000)+\u0003\u0014"+ + "\n\u0000*#\u0001\u0000\u0000\u0000*$\u0001\u0000\u0000\u0000*%\u0001\u0000"+ + "\u0000\u0000*&\u0001\u0000\u0000\u0000*\'\u0001\u0000\u0000\u0000*(\u0001"+ + "\u0000\u0000\u0000*)\u0001\u0000\u0000\u0000+\u0005\u0001\u0000\u0000"+ + "\u0000,1\u0003\u0004\u0002\u0000-.\u0005l\u0000\u0000.0\u0003\u0004\u0002"+ + "\u0000/-\u0001\u0000\u0000\u000003\u0001\u0000\u0000\u00001/\u0001\u0000"+ + "\u0000\u000012\u0001\u0000\u0000\u00002\u0007\u0001\u0000\u0000\u0000"+ + "31\u0001\u0000\u0000\u000045\u0005\u0001\u0000\u00005\t\u0001\u0000\u0000"+ + "\u000067\u0005\u0002\u0000\u00007\u000b\u0001\u0000\u0000\u000089\u0005"+ + "\u0003\u0000\u00009\r\u0001\u0000\u0000\u0000:;\u0005f\u0000\u0000;<\u0005"+ + "\u0006\u0000\u0000<=\u0003\u0004\u0002\u0000=>\u0003\u0004\u0002\u0000"+ + ">?\u0005g\u0000\u0000?\u000f\u0001\u0000\u0000\u0000@A\u0005f\u0000\u0000"+ + "AB\u0005\u0007\u0000\u0000BC\u0005f\u0000\u0000CD\u0005h\u0000\u0000D"+ + "E\u0003\u0004\u0002\u0000EF\u0005i\u0000\u0000FG\u0005q\u0000\u0000GH"+ + "\u0003\u0004\u0002\u0000HI\u0005g\u0000\u0000IJ\u0005g\u0000\u0000J\u0011"+ + "\u0001\u0000\u0000\u0000KL\u0005f\u0000\u0000LM\u0005\u0004\u0000\u0000"+ + "MN\u0005^\u0000\u0000NO\u0005g\u0000\u0000O\u0013\u0001\u0000\u0000\u0000"+ + "PQ\u0005f\u0000\u0000QR\u0005\u0005\u0000\u0000RS\u0005^\u0000\u0000S"+ + "T\u0005^\u0000\u0000TU\u0005g\u0000\u0000U\u0015\u0001\u0000\u0000\u0000"+ + "\u0003 *1"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/DeclarationsVisitor.java b/subprojects/common/grammar/src/main/gen/DeclarationsVisitor.java new file mode 100644 index 0000000000..da3f1ef9de --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/DeclarationsVisitor.java @@ -0,0 +1,78 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Declarations.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.tree.ParseTreeVisitor; + +/** + * This interface defines a complete generic visitor for a parse tree produced + * by {@link DeclarationsParser}. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +public interface DeclarationsVisitor extends ParseTreeVisitor { + /** + * Visit a parse tree produced by {@link DeclarationsParser#decl}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDecl(DeclarationsParser.DeclContext ctx); + /** + * Visit a parse tree produced by {@link DeclarationsParser#declList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDeclList(DeclarationsParser.DeclListContext ctx); + /** + * Visit a parse tree produced by {@link DeclarationsParser#type}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitType(DeclarationsParser.TypeContext ctx); + /** + * Visit a parse tree produced by {@link DeclarationsParser#typeList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeList(DeclarationsParser.TypeListContext ctx); + /** + * Visit a parse tree produced by {@link DeclarationsParser#boolType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBoolType(DeclarationsParser.BoolTypeContext ctx); + /** + * Visit a parse tree produced by {@link DeclarationsParser#intType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIntType(DeclarationsParser.IntTypeContext ctx); + /** + * Visit a parse tree produced by {@link DeclarationsParser#ratType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRatType(DeclarationsParser.RatTypeContext ctx); + /** + * Visit a parse tree produced by {@link DeclarationsParser#funcType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFuncType(DeclarationsParser.FuncTypeContext ctx); + /** + * Visit a parse tree produced by {@link DeclarationsParser#arrayType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArrayType(DeclarationsParser.ArrayTypeContext ctx); + /** + * Visit a parse tree produced by {@link DeclarationsParser#bvType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBvType(DeclarationsParser.BvTypeContext ctx); + /** + * Visit a parse tree produced by {@link DeclarationsParser#fpType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFpType(DeclarationsParser.FpTypeContext ctx); +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/Expr.interp b/subprojects/common/grammar/src/main/gen/Expr.interp new file mode 100644 index 0000000000..02a988a178 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/Expr.interp @@ -0,0 +1,295 @@ +token literal names: +null +null +null +null +null +null +null +null +'if' +'then' +'else' +'iff' +'ite' +'=>' +'forall' +'exists' +'or' +'and' +'xor' +'not' +'=' +'/=' +'<' +'<=' +'>' +'>=' +'+' +'-' +'*' +'div' +'mod' +'rem' +'%' +null +'bv_zero_extend' +'bv_sign_extend' +'bvadd' +'bvsub' +'bvpos' +'bvneg' +'bvmul' +'bvudiv' +'bvsdiv' +'bvsmod' +'bvurem' +'bvsrem' +'bvor' +'bvand' +'bvxor' +'bvnot' +'bvshl' +'bvashr' +'bvlshr' +'bvrol' +'bvror' +'bvult' +'bvule' +'bvugt' +'bvuge' +'bvslt' +'bvsle' +'bvsgt' +'bvsge' +'fpabs' +null +'fpisnan' +'fpmax' +'fpmin' +'fprem' +null +null +null +null +'fpsub' +null +'fpmul' +null +'fppos' +'fpneg' +'true' +'read' +'write' +'prime' +'extract' +null +null +null +'false' +'default' +'assign' +'havoc' +'assume' +'return' +null +null +null +null +'.' +null +'_' +null +null +'(' +')' +'[' +']' +'{' +'}' +',' +':' +';' +'\'' +'<-' +'->' +null +null +null + +token symbolic names: +null +BOOLTYPE +INTTYPE +RATTYPE +BVTYPE +FPTYPE +FUNC +ARRAY +IF +THEN +ELSE +IFF +ITE +IMPLY +FORALL +EXISTS +OR +AND +XOR +NOT +EQ +NEQ +LT +LEQ +GT +GEQ +PLUS +MINUS +MUL +DIV +MOD +REM +PERCENT +BV_CONCAT +BV_ZERO_EXTEND +BV_SIGN_EXTEND +BV_ADD +BV_SUB +BV_POS +BV_NEG +BV_MUL +BV_UDIV +BV_SDIV +BV_SMOD +BV_UREM +BV_SREM +BV_OR +BV_AND +BV_XOR +BV_NOT +BV_SHL +BV_ASHR +BV_LSHR +BV_ROL +BV_ROR +BV_ULT +BV_ULE +BV_UGT +BV_UGE +BV_SLT +BV_SLE +BV_SGT +BV_SGE +FP_ABS +FP_FROM_BV +FP_IS_NAN +FPMAX +FPMIN +FPREM +FPROUNDTOINT +FPSQRT +FPTOBV +FPTOFP +FPSUB +FPADD +FPMUL +FPDIV +FPPOS +FPNEG +TRUE +READ +WRITE +PRIME +EXTRACT +BV_TYPE_DECL +FP_TYPE_DECL +FP_ROUNDINGMODE +FALSE +DEFAULT +ASSIGN +HAVOC +ASSUME +RETURN +BV +INT +NAT +SIGN +DOT +ID +UNDERSCORE +DIGIT +LETTER +LPAREN +RPAREN +LBRACK +RBRACK +LBRAC +RBRAC +COMMA +COLON +SEMICOLON +QUOT +LARROW +RARROW +WS +COMMENT +LINE_COMMENT + +rule names: +expr +exprList +funcLitExpr +iteExpr +iffExpr +implyExpr +quantifiedExpr +forallExpr +existsExpr +fpFuncExpr +orExpr +xorExpr +andExpr +notExpr +equalityExpr +relationExpr +bitwiseOrExpr +bitwiseXorExpr +bitwiseAndExpr +bitwiseShiftExpr +additiveExpr +multiplicativeExpr +bvConcatExpr +bvExtendExpr +unaryExpr +bitwiseNotExpr +functionCall +arrayRead +arrayWrite +primeExpr +bvExtract +primaryExpr +trueExpr +falseExpr +intLitExpr +ratLitExpr +arrLitExpr +bvLitExpr +fpLitExpr +idExpr +parenExpr +decl +declList +type +typeList +boolType +intType +ratType +funcType +arrayType +bvType +fpType + + +atn: +[4, 1, 116, 528, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 5, 1, 110, 8, 1, 10, 1, 12, 1, 113, 9, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 122, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 132, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 139, 8, 4, 1, 4, 1, 4, 3, 4, 143, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 150, 8, 5, 1, 5, 1, 5, 3, 5, 154, 8, 5, 1, 6, 1, 6, 1, 6, 3, 6, 159, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 3, 9, 184, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 191, 8, 10, 10, 10, 12, 10, 194, 9, 10, 1, 10, 1, 10, 3, 10, 198, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 207, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 5, 12, 214, 8, 12, 10, 12, 12, 12, 217, 9, 12, 1, 12, 1, 12, 3, 12, 221, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 229, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 238, 8, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 3, 15, 247, 8, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 5, 16, 254, 8, 16, 10, 16, 12, 16, 257, 9, 16, 1, 16, 1, 16, 3, 16, 261, 8, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 3, 17, 270, 8, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 5, 18, 277, 8, 18, 10, 18, 12, 18, 280, 9, 18, 1, 18, 1, 18, 3, 18, 284, 8, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 3, 19, 293, 8, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 20, 5, 20, 300, 8, 20, 10, 20, 12, 20, 303, 9, 20, 1, 20, 1, 20, 3, 20, 307, 8, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 5, 21, 314, 8, 21, 10, 21, 12, 21, 317, 9, 21, 1, 21, 1, 21, 3, 21, 321, 8, 21, 1, 22, 1, 22, 1, 22, 1, 22, 4, 22, 327, 8, 22, 11, 22, 12, 22, 328, 1, 22, 1, 22, 3, 22, 333, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 342, 8, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 3, 24, 350, 8, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 1, 25, 3, 25, 358, 8, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 5, 26, 365, 8, 26, 10, 26, 12, 26, 368, 9, 26, 1, 26, 1, 26, 3, 26, 372, 8, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 381, 8, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 3, 28, 391, 8, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 3, 29, 399, 8, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 3, 30, 409, 8, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 3, 31, 420, 8, 31, 1, 32, 1, 32, 1, 33, 1, 33, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 5, 36, 439, 8, 36, 10, 36, 12, 36, 442, 9, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 5, 42, 472, 8, 42, 10, 42, 12, 42, 475, 9, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 484, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 489, 8, 44, 10, 44, 12, 44, 492, 9, 44, 1, 45, 1, 45, 1, 46, 1, 46, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 0, 0, 52, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 0, 8, 1, 0, 66, 67, 1, 0, 20, 21, 2, 0, 22, 25, 55, 62, 1, 0, 50, 54, 3, 0, 26, 27, 36, 37, 73, 74, 4, 0, 28, 31, 40, 45, 68, 68, 75, 76, 1, 0, 34, 35, 5, 0, 26, 27, 38, 39, 63, 65, 69, 72, 77, 78, 531, 0, 104, 1, 0, 0, 0, 2, 106, 1, 0, 0, 0, 4, 121, 1, 0, 0, 0, 6, 131, 1, 0, 0, 0, 8, 142, 1, 0, 0, 0, 10, 153, 1, 0, 0, 0, 12, 158, 1, 0, 0, 0, 14, 160, 1, 0, 0, 0, 16, 168, 1, 0, 0, 0, 18, 183, 1, 0, 0, 0, 20, 197, 1, 0, 0, 0, 22, 206, 1, 0, 0, 0, 24, 220, 1, 0, 0, 0, 26, 228, 1, 0, 0, 0, 28, 237, 1, 0, 0, 0, 30, 246, 1, 0, 0, 0, 32, 260, 1, 0, 0, 0, 34, 269, 1, 0, 0, 0, 36, 283, 1, 0, 0, 0, 38, 292, 1, 0, 0, 0, 40, 306, 1, 0, 0, 0, 42, 320, 1, 0, 0, 0, 44, 332, 1, 0, 0, 0, 46, 341, 1, 0, 0, 0, 48, 349, 1, 0, 0, 0, 50, 357, 1, 0, 0, 0, 52, 371, 1, 0, 0, 0, 54, 380, 1, 0, 0, 0, 56, 390, 1, 0, 0, 0, 58, 398, 1, 0, 0, 0, 60, 408, 1, 0, 0, 0, 62, 419, 1, 0, 0, 0, 64, 421, 1, 0, 0, 0, 66, 423, 1, 0, 0, 0, 68, 425, 1, 0, 0, 0, 70, 427, 1, 0, 0, 0, 72, 431, 1, 0, 0, 0, 74, 449, 1, 0, 0, 0, 76, 451, 1, 0, 0, 0, 78, 457, 1, 0, 0, 0, 80, 459, 1, 0, 0, 0, 82, 463, 1, 0, 0, 0, 84, 468, 1, 0, 0, 0, 86, 483, 1, 0, 0, 0, 88, 485, 1, 0, 0, 0, 90, 493, 1, 0, 0, 0, 92, 495, 1, 0, 0, 0, 94, 497, 1, 0, 0, 0, 96, 499, 1, 0, 0, 0, 98, 505, 1, 0, 0, 0, 100, 516, 1, 0, 0, 0, 102, 521, 1, 0, 0, 0, 104, 105, 3, 4, 2, 0, 105, 1, 1, 0, 0, 0, 106, 111, 3, 0, 0, 0, 107, 108, 5, 108, 0, 0, 108, 110, 3, 0, 0, 0, 109, 107, 1, 0, 0, 0, 110, 113, 1, 0, 0, 0, 111, 109, 1, 0, 0, 0, 111, 112, 1, 0, 0, 0, 112, 3, 1, 0, 0, 0, 113, 111, 1, 0, 0, 0, 114, 122, 3, 6, 3, 0, 115, 116, 5, 102, 0, 0, 116, 117, 5, 6, 0, 0, 117, 118, 3, 82, 41, 0, 118, 119, 3, 0, 0, 0, 119, 120, 5, 103, 0, 0, 120, 122, 1, 0, 0, 0, 121, 114, 1, 0, 0, 0, 121, 115, 1, 0, 0, 0, 122, 5, 1, 0, 0, 0, 123, 132, 3, 8, 4, 0, 124, 125, 5, 102, 0, 0, 125, 126, 5, 12, 0, 0, 126, 127, 3, 0, 0, 0, 127, 128, 3, 0, 0, 0, 128, 129, 3, 0, 0, 0, 129, 130, 5, 103, 0, 0, 130, 132, 1, 0, 0, 0, 131, 123, 1, 0, 0, 0, 131, 124, 1, 0, 0, 0, 132, 7, 1, 0, 0, 0, 133, 143, 3, 10, 5, 0, 134, 135, 5, 102, 0, 0, 135, 136, 5, 11, 0, 0, 136, 138, 3, 0, 0, 0, 137, 139, 3, 0, 0, 0, 138, 137, 1, 0, 0, 0, 138, 139, 1, 0, 0, 0, 139, 140, 1, 0, 0, 0, 140, 141, 5, 103, 0, 0, 141, 143, 1, 0, 0, 0, 142, 133, 1, 0, 0, 0, 142, 134, 1, 0, 0, 0, 143, 9, 1, 0, 0, 0, 144, 154, 3, 12, 6, 0, 145, 146, 5, 102, 0, 0, 146, 147, 5, 13, 0, 0, 147, 149, 3, 0, 0, 0, 148, 150, 3, 0, 0, 0, 149, 148, 1, 0, 0, 0, 149, 150, 1, 0, 0, 0, 150, 151, 1, 0, 0, 0, 151, 152, 5, 103, 0, 0, 152, 154, 1, 0, 0, 0, 153, 144, 1, 0, 0, 0, 153, 145, 1, 0, 0, 0, 154, 11, 1, 0, 0, 0, 155, 159, 3, 18, 9, 0, 156, 159, 3, 14, 7, 0, 157, 159, 3, 16, 8, 0, 158, 155, 1, 0, 0, 0, 158, 156, 1, 0, 0, 0, 158, 157, 1, 0, 0, 0, 159, 13, 1, 0, 0, 0, 160, 161, 5, 102, 0, 0, 161, 162, 5, 14, 0, 0, 162, 163, 5, 102, 0, 0, 163, 164, 3, 84, 42, 0, 164, 165, 5, 103, 0, 0, 165, 166, 3, 0, 0, 0, 166, 167, 5, 103, 0, 0, 167, 15, 1, 0, 0, 0, 168, 169, 5, 102, 0, 0, 169, 170, 5, 15, 0, 0, 170, 171, 5, 102, 0, 0, 171, 172, 3, 84, 42, 0, 172, 173, 5, 103, 0, 0, 173, 174, 3, 0, 0, 0, 174, 175, 5, 103, 0, 0, 175, 17, 1, 0, 0, 0, 176, 184, 3, 20, 10, 0, 177, 178, 5, 102, 0, 0, 178, 179, 7, 0, 0, 0, 179, 180, 3, 0, 0, 0, 180, 181, 3, 0, 0, 0, 181, 182, 5, 103, 0, 0, 182, 184, 1, 0, 0, 0, 183, 176, 1, 0, 0, 0, 183, 177, 1, 0, 0, 0, 184, 19, 1, 0, 0, 0, 185, 198, 3, 22, 11, 0, 186, 187, 5, 102, 0, 0, 187, 188, 5, 16, 0, 0, 188, 192, 3, 0, 0, 0, 189, 191, 3, 0, 0, 0, 190, 189, 1, 0, 0, 0, 191, 194, 1, 0, 0, 0, 192, 190, 1, 0, 0, 0, 192, 193, 1, 0, 0, 0, 193, 195, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 195, 196, 5, 103, 0, 0, 196, 198, 1, 0, 0, 0, 197, 185, 1, 0, 0, 0, 197, 186, 1, 0, 0, 0, 198, 21, 1, 0, 0, 0, 199, 207, 3, 24, 12, 0, 200, 201, 5, 102, 0, 0, 201, 202, 5, 18, 0, 0, 202, 203, 3, 0, 0, 0, 203, 204, 3, 0, 0, 0, 204, 205, 5, 103, 0, 0, 205, 207, 1, 0, 0, 0, 206, 199, 1, 0, 0, 0, 206, 200, 1, 0, 0, 0, 207, 23, 1, 0, 0, 0, 208, 221, 3, 26, 13, 0, 209, 210, 5, 102, 0, 0, 210, 211, 5, 17, 0, 0, 211, 215, 3, 0, 0, 0, 212, 214, 3, 0, 0, 0, 213, 212, 1, 0, 0, 0, 214, 217, 1, 0, 0, 0, 215, 213, 1, 0, 0, 0, 215, 216, 1, 0, 0, 0, 216, 218, 1, 0, 0, 0, 217, 215, 1, 0, 0, 0, 218, 219, 5, 103, 0, 0, 219, 221, 1, 0, 0, 0, 220, 208, 1, 0, 0, 0, 220, 209, 1, 0, 0, 0, 221, 25, 1, 0, 0, 0, 222, 229, 3, 28, 14, 0, 223, 224, 5, 102, 0, 0, 224, 225, 5, 19, 0, 0, 225, 226, 3, 0, 0, 0, 226, 227, 5, 103, 0, 0, 227, 229, 1, 0, 0, 0, 228, 222, 1, 0, 0, 0, 228, 223, 1, 0, 0, 0, 229, 27, 1, 0, 0, 0, 230, 238, 3, 30, 15, 0, 231, 232, 5, 102, 0, 0, 232, 233, 7, 1, 0, 0, 233, 234, 3, 0, 0, 0, 234, 235, 3, 0, 0, 0, 235, 236, 5, 103, 0, 0, 236, 238, 1, 0, 0, 0, 237, 230, 1, 0, 0, 0, 237, 231, 1, 0, 0, 0, 238, 29, 1, 0, 0, 0, 239, 247, 3, 32, 16, 0, 240, 241, 5, 102, 0, 0, 241, 242, 7, 2, 0, 0, 242, 243, 3, 0, 0, 0, 243, 244, 3, 0, 0, 0, 244, 245, 5, 103, 0, 0, 245, 247, 1, 0, 0, 0, 246, 239, 1, 0, 0, 0, 246, 240, 1, 0, 0, 0, 247, 31, 1, 0, 0, 0, 248, 261, 3, 34, 17, 0, 249, 250, 5, 102, 0, 0, 250, 251, 5, 46, 0, 0, 251, 255, 3, 0, 0, 0, 252, 254, 3, 0, 0, 0, 253, 252, 1, 0, 0, 0, 254, 257, 1, 0, 0, 0, 255, 253, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 258, 1, 0, 0, 0, 257, 255, 1, 0, 0, 0, 258, 259, 5, 103, 0, 0, 259, 261, 1, 0, 0, 0, 260, 248, 1, 0, 0, 0, 260, 249, 1, 0, 0, 0, 261, 33, 1, 0, 0, 0, 262, 270, 3, 36, 18, 0, 263, 264, 5, 102, 0, 0, 264, 265, 5, 48, 0, 0, 265, 266, 3, 0, 0, 0, 266, 267, 3, 0, 0, 0, 267, 268, 5, 103, 0, 0, 268, 270, 1, 0, 0, 0, 269, 262, 1, 0, 0, 0, 269, 263, 1, 0, 0, 0, 270, 35, 1, 0, 0, 0, 271, 284, 3, 38, 19, 0, 272, 273, 5, 102, 0, 0, 273, 274, 5, 47, 0, 0, 274, 278, 3, 0, 0, 0, 275, 277, 3, 0, 0, 0, 276, 275, 1, 0, 0, 0, 277, 280, 1, 0, 0, 0, 278, 276, 1, 0, 0, 0, 278, 279, 1, 0, 0, 0, 279, 281, 1, 0, 0, 0, 280, 278, 1, 0, 0, 0, 281, 282, 5, 103, 0, 0, 282, 284, 1, 0, 0, 0, 283, 271, 1, 0, 0, 0, 283, 272, 1, 0, 0, 0, 284, 37, 1, 0, 0, 0, 285, 293, 3, 40, 20, 0, 286, 287, 5, 102, 0, 0, 287, 288, 7, 3, 0, 0, 288, 289, 3, 0, 0, 0, 289, 290, 3, 0, 0, 0, 290, 291, 5, 103, 0, 0, 291, 293, 1, 0, 0, 0, 292, 285, 1, 0, 0, 0, 292, 286, 1, 0, 0, 0, 293, 39, 1, 0, 0, 0, 294, 307, 3, 42, 21, 0, 295, 296, 5, 102, 0, 0, 296, 297, 7, 4, 0, 0, 297, 301, 3, 0, 0, 0, 298, 300, 3, 0, 0, 0, 299, 298, 1, 0, 0, 0, 300, 303, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 301, 302, 1, 0, 0, 0, 302, 304, 1, 0, 0, 0, 303, 301, 1, 0, 0, 0, 304, 305, 5, 103, 0, 0, 305, 307, 1, 0, 0, 0, 306, 294, 1, 0, 0, 0, 306, 295, 1, 0, 0, 0, 307, 41, 1, 0, 0, 0, 308, 321, 3, 44, 22, 0, 309, 310, 5, 102, 0, 0, 310, 311, 7, 5, 0, 0, 311, 315, 3, 0, 0, 0, 312, 314, 3, 0, 0, 0, 313, 312, 1, 0, 0, 0, 314, 317, 1, 0, 0, 0, 315, 313, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 318, 1, 0, 0, 0, 317, 315, 1, 0, 0, 0, 318, 319, 5, 103, 0, 0, 319, 321, 1, 0, 0, 0, 320, 308, 1, 0, 0, 0, 320, 309, 1, 0, 0, 0, 321, 43, 1, 0, 0, 0, 322, 333, 3, 46, 23, 0, 323, 324, 5, 102, 0, 0, 324, 326, 5, 33, 0, 0, 325, 327, 3, 0, 0, 0, 326, 325, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 326, 1, 0, 0, 0, 328, 329, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 331, 5, 103, 0, 0, 331, 333, 1, 0, 0, 0, 332, 322, 1, 0, 0, 0, 332, 323, 1, 0, 0, 0, 333, 45, 1, 0, 0, 0, 334, 342, 3, 48, 24, 0, 335, 336, 5, 102, 0, 0, 336, 337, 7, 6, 0, 0, 337, 338, 3, 0, 0, 0, 338, 339, 3, 100, 50, 0, 339, 340, 5, 103, 0, 0, 340, 342, 1, 0, 0, 0, 341, 334, 1, 0, 0, 0, 341, 335, 1, 0, 0, 0, 342, 47, 1, 0, 0, 0, 343, 350, 3, 50, 25, 0, 344, 345, 5, 102, 0, 0, 345, 346, 7, 7, 0, 0, 346, 347, 3, 0, 0, 0, 347, 348, 5, 103, 0, 0, 348, 350, 1, 0, 0, 0, 349, 343, 1, 0, 0, 0, 349, 344, 1, 0, 0, 0, 350, 49, 1, 0, 0, 0, 351, 358, 3, 52, 26, 0, 352, 353, 5, 102, 0, 0, 353, 354, 5, 49, 0, 0, 354, 355, 3, 0, 0, 0, 355, 356, 5, 103, 0, 0, 356, 358, 1, 0, 0, 0, 357, 351, 1, 0, 0, 0, 357, 352, 1, 0, 0, 0, 358, 51, 1, 0, 0, 0, 359, 372, 3, 54, 27, 0, 360, 361, 5, 102, 0, 0, 361, 362, 5, 6, 0, 0, 362, 366, 3, 0, 0, 0, 363, 365, 3, 0, 0, 0, 364, 363, 1, 0, 0, 0, 365, 368, 1, 0, 0, 0, 366, 364, 1, 0, 0, 0, 366, 367, 1, 0, 0, 0, 367, 369, 1, 0, 0, 0, 368, 366, 1, 0, 0, 0, 369, 370, 5, 103, 0, 0, 370, 372, 1, 0, 0, 0, 371, 359, 1, 0, 0, 0, 371, 360, 1, 0, 0, 0, 372, 53, 1, 0, 0, 0, 373, 381, 3, 56, 28, 0, 374, 375, 5, 102, 0, 0, 375, 376, 5, 80, 0, 0, 376, 377, 3, 0, 0, 0, 377, 378, 3, 0, 0, 0, 378, 379, 5, 103, 0, 0, 379, 381, 1, 0, 0, 0, 380, 373, 1, 0, 0, 0, 380, 374, 1, 0, 0, 0, 381, 55, 1, 0, 0, 0, 382, 391, 3, 58, 29, 0, 383, 384, 5, 102, 0, 0, 384, 385, 5, 81, 0, 0, 385, 386, 3, 0, 0, 0, 386, 387, 3, 0, 0, 0, 387, 388, 3, 0, 0, 0, 388, 389, 5, 103, 0, 0, 389, 391, 1, 0, 0, 0, 390, 382, 1, 0, 0, 0, 390, 383, 1, 0, 0, 0, 391, 57, 1, 0, 0, 0, 392, 399, 3, 60, 30, 0, 393, 394, 5, 102, 0, 0, 394, 395, 5, 82, 0, 0, 395, 396, 3, 0, 0, 0, 396, 397, 5, 103, 0, 0, 397, 399, 1, 0, 0, 0, 398, 392, 1, 0, 0, 0, 398, 393, 1, 0, 0, 0, 399, 59, 1, 0, 0, 0, 400, 409, 3, 62, 31, 0, 401, 402, 5, 102, 0, 0, 402, 403, 5, 83, 0, 0, 403, 404, 3, 0, 0, 0, 404, 405, 3, 0, 0, 0, 405, 406, 3, 0, 0, 0, 406, 407, 5, 103, 0, 0, 407, 409, 1, 0, 0, 0, 408, 400, 1, 0, 0, 0, 408, 401, 1, 0, 0, 0, 409, 61, 1, 0, 0, 0, 410, 420, 3, 64, 32, 0, 411, 420, 3, 66, 33, 0, 412, 420, 3, 68, 34, 0, 413, 420, 3, 70, 35, 0, 414, 420, 3, 72, 36, 0, 415, 420, 3, 76, 38, 0, 416, 420, 3, 74, 37, 0, 417, 420, 3, 78, 39, 0, 418, 420, 3, 80, 40, 0, 419, 410, 1, 0, 0, 0, 419, 411, 1, 0, 0, 0, 419, 412, 1, 0, 0, 0, 419, 413, 1, 0, 0, 0, 419, 414, 1, 0, 0, 0, 419, 415, 1, 0, 0, 0, 419, 416, 1, 0, 0, 0, 419, 417, 1, 0, 0, 0, 419, 418, 1, 0, 0, 0, 420, 63, 1, 0, 0, 0, 421, 422, 5, 79, 0, 0, 422, 65, 1, 0, 0, 0, 423, 424, 5, 87, 0, 0, 424, 67, 1, 0, 0, 0, 425, 426, 5, 94, 0, 0, 426, 69, 1, 0, 0, 0, 427, 428, 5, 94, 0, 0, 428, 429, 5, 32, 0, 0, 429, 430, 5, 94, 0, 0, 430, 71, 1, 0, 0, 0, 431, 432, 5, 102, 0, 0, 432, 440, 5, 7, 0, 0, 433, 434, 5, 102, 0, 0, 434, 435, 3, 0, 0, 0, 435, 436, 3, 0, 0, 0, 436, 437, 5, 103, 0, 0, 437, 439, 1, 0, 0, 0, 438, 433, 1, 0, 0, 0, 439, 442, 1, 0, 0, 0, 440, 438, 1, 0, 0, 0, 440, 441, 1, 0, 0, 0, 441, 443, 1, 0, 0, 0, 442, 440, 1, 0, 0, 0, 443, 444, 5, 102, 0, 0, 444, 445, 5, 88, 0, 0, 445, 446, 3, 0, 0, 0, 446, 447, 5, 103, 0, 0, 447, 448, 5, 103, 0, 0, 448, 73, 1, 0, 0, 0, 449, 450, 5, 93, 0, 0, 450, 75, 1, 0, 0, 0, 451, 452, 5, 102, 0, 0, 452, 453, 3, 74, 37, 0, 453, 454, 3, 74, 37, 0, 454, 455, 3, 74, 37, 0, 455, 456, 5, 103, 0, 0, 456, 77, 1, 0, 0, 0, 457, 458, 5, 98, 0, 0, 458, 79, 1, 0, 0, 0, 459, 460, 5, 102, 0, 0, 460, 461, 3, 0, 0, 0, 461, 462, 5, 103, 0, 0, 462, 81, 1, 0, 0, 0, 463, 464, 5, 102, 0, 0, 464, 465, 5, 98, 0, 0, 465, 466, 3, 86, 43, 0, 466, 467, 5, 103, 0, 0, 467, 83, 1, 0, 0, 0, 468, 473, 3, 82, 41, 0, 469, 470, 5, 108, 0, 0, 470, 472, 3, 82, 41, 0, 471, 469, 1, 0, 0, 0, 472, 475, 1, 0, 0, 0, 473, 471, 1, 0, 0, 0, 473, 474, 1, 0, 0, 0, 474, 85, 1, 0, 0, 0, 475, 473, 1, 0, 0, 0, 476, 484, 3, 90, 45, 0, 477, 484, 3, 92, 46, 0, 478, 484, 3, 94, 47, 0, 479, 484, 3, 96, 48, 0, 480, 484, 3, 98, 49, 0, 481, 484, 3, 100, 50, 0, 482, 484, 3, 102, 51, 0, 483, 476, 1, 0, 0, 0, 483, 477, 1, 0, 0, 0, 483, 478, 1, 0, 0, 0, 483, 479, 1, 0, 0, 0, 483, 480, 1, 0, 0, 0, 483, 481, 1, 0, 0, 0, 483, 482, 1, 0, 0, 0, 484, 87, 1, 0, 0, 0, 485, 490, 3, 86, 43, 0, 486, 487, 5, 108, 0, 0, 487, 489, 3, 86, 43, 0, 488, 486, 1, 0, 0, 0, 489, 492, 1, 0, 0, 0, 490, 488, 1, 0, 0, 0, 490, 491, 1, 0, 0, 0, 491, 89, 1, 0, 0, 0, 492, 490, 1, 0, 0, 0, 493, 494, 5, 1, 0, 0, 494, 91, 1, 0, 0, 0, 495, 496, 5, 2, 0, 0, 496, 93, 1, 0, 0, 0, 497, 498, 5, 3, 0, 0, 498, 95, 1, 0, 0, 0, 499, 500, 5, 102, 0, 0, 500, 501, 5, 6, 0, 0, 501, 502, 3, 86, 43, 0, 502, 503, 3, 86, 43, 0, 503, 504, 5, 103, 0, 0, 504, 97, 1, 0, 0, 0, 505, 506, 5, 102, 0, 0, 506, 507, 5, 7, 0, 0, 507, 508, 5, 102, 0, 0, 508, 509, 5, 104, 0, 0, 509, 510, 3, 86, 43, 0, 510, 511, 5, 105, 0, 0, 511, 512, 5, 113, 0, 0, 512, 513, 3, 86, 43, 0, 513, 514, 5, 103, 0, 0, 514, 515, 5, 103, 0, 0, 515, 99, 1, 0, 0, 0, 516, 517, 5, 102, 0, 0, 517, 518, 5, 4, 0, 0, 518, 519, 5, 94, 0, 0, 519, 520, 5, 103, 0, 0, 520, 101, 1, 0, 0, 0, 521, 522, 5, 102, 0, 0, 522, 523, 5, 5, 0, 0, 523, 524, 5, 94, 0, 0, 524, 525, 5, 94, 0, 0, 525, 526, 5, 103, 0, 0, 526, 103, 1, 0, 0, 0, 43, 111, 121, 131, 138, 142, 149, 153, 158, 183, 192, 197, 206, 215, 220, 228, 237, 246, 255, 260, 269, 278, 283, 292, 301, 306, 315, 320, 328, 332, 341, 349, 357, 366, 371, 380, 390, 398, 408, 419, 440, 473, 483, 490] \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/Expr.tokens b/subprojects/common/grammar/src/main/gen/Expr.tokens new file mode 100644 index 0000000000..9531176830 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/Expr.tokens @@ -0,0 +1,204 @@ +BOOLTYPE=1 +INTTYPE=2 +RATTYPE=3 +BVTYPE=4 +FPTYPE=5 +FUNC=6 +ARRAY=7 +IF=8 +THEN=9 +ELSE=10 +IFF=11 +ITE=12 +IMPLY=13 +FORALL=14 +EXISTS=15 +OR=16 +AND=17 +XOR=18 +NOT=19 +EQ=20 +NEQ=21 +LT=22 +LEQ=23 +GT=24 +GEQ=25 +PLUS=26 +MINUS=27 +MUL=28 +DIV=29 +MOD=30 +REM=31 +PERCENT=32 +BV_CONCAT=33 +BV_ZERO_EXTEND=34 +BV_SIGN_EXTEND=35 +BV_ADD=36 +BV_SUB=37 +BV_POS=38 +BV_NEG=39 +BV_MUL=40 +BV_UDIV=41 +BV_SDIV=42 +BV_SMOD=43 +BV_UREM=44 +BV_SREM=45 +BV_OR=46 +BV_AND=47 +BV_XOR=48 +BV_NOT=49 +BV_SHL=50 +BV_ASHR=51 +BV_LSHR=52 +BV_ROL=53 +BV_ROR=54 +BV_ULT=55 +BV_ULE=56 +BV_UGT=57 +BV_UGE=58 +BV_SLT=59 +BV_SLE=60 +BV_SGT=61 +BV_SGE=62 +FP_ABS=63 +FP_FROM_BV=64 +FP_IS_NAN=65 +FPMAX=66 +FPMIN=67 +FPREM=68 +FPROUNDTOINT=69 +FPSQRT=70 +FPTOBV=71 +FPTOFP=72 +FPSUB=73 +FPADD=74 +FPMUL=75 +FPDIV=76 +FPPOS=77 +FPNEG=78 +TRUE=79 +READ=80 +WRITE=81 +PRIME=82 +EXTRACT=83 +BV_TYPE_DECL=84 +FP_TYPE_DECL=85 +FP_ROUNDINGMODE=86 +FALSE=87 +DEFAULT=88 +ASSIGN=89 +HAVOC=90 +ASSUME=91 +RETURN=92 +BV=93 +INT=94 +NAT=95 +SIGN=96 +DOT=97 +ID=98 +UNDERSCORE=99 +DIGIT=100 +LETTER=101 +LPAREN=102 +RPAREN=103 +LBRACK=104 +RBRACK=105 +LBRAC=106 +RBRAC=107 +COMMA=108 +COLON=109 +SEMICOLON=110 +QUOT=111 +LARROW=112 +RARROW=113 +WS=114 +COMMENT=115 +LINE_COMMENT=116 +'if'=8 +'then'=9 +'else'=10 +'iff'=11 +'ite'=12 +'=>'=13 +'forall'=14 +'exists'=15 +'or'=16 +'and'=17 +'xor'=18 +'not'=19 +'='=20 +'/='=21 +'<'=22 +'<='=23 +'>'=24 +'>='=25 +'+'=26 +'-'=27 +'*'=28 +'div'=29 +'mod'=30 +'rem'=31 +'%'=32 +'bv_zero_extend'=34 +'bv_sign_extend'=35 +'bvadd'=36 +'bvsub'=37 +'bvpos'=38 +'bvneg'=39 +'bvmul'=40 +'bvudiv'=41 +'bvsdiv'=42 +'bvsmod'=43 +'bvurem'=44 +'bvsrem'=45 +'bvor'=46 +'bvand'=47 +'bvxor'=48 +'bvnot'=49 +'bvshl'=50 +'bvashr'=51 +'bvlshr'=52 +'bvrol'=53 +'bvror'=54 +'bvult'=55 +'bvule'=56 +'bvugt'=57 +'bvuge'=58 +'bvslt'=59 +'bvsle'=60 +'bvsgt'=61 +'bvsge'=62 +'fpabs'=63 +'fpisnan'=65 +'fpmax'=66 +'fpmin'=67 +'fprem'=68 +'fpsub'=73 +'fpmul'=75 +'fppos'=77 +'fpneg'=78 +'true'=79 +'read'=80 +'write'=81 +'prime'=82 +'extract'=83 +'false'=87 +'default'=88 +'assign'=89 +'havoc'=90 +'assume'=91 +'return'=92 +'.'=97 +'_'=99 +'('=102 +')'=103 +'['=104 +']'=105 +'{'=106 +'}'=107 +','=108 +':'=109 +';'=110 +'\''=111 +'<-'=112 +'->'=113 diff --git a/subprojects/common/grammar/src/main/gen/ExprBaseListener.java b/subprojects/common/grammar/src/main/gen/ExprBaseListener.java new file mode 100644 index 0000000000..5056affa4b --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/ExprBaseListener.java @@ -0,0 +1,662 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Expr.g4 by ANTLR 4.10.1 + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link ExprListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +public class ExprBaseListener implements ExprListener { + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExpr(ExprParser.ExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExpr(ExprParser.ExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExprList(ExprParser.ExprListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExprList(ExprParser.ExprListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFuncLitExpr(ExprParser.FuncLitExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFuncLitExpr(ExprParser.FuncLitExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIteExpr(ExprParser.IteExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIteExpr(ExprParser.IteExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIffExpr(ExprParser.IffExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIffExpr(ExprParser.IffExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterImplyExpr(ExprParser.ImplyExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitImplyExpr(ExprParser.ImplyExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQuantifiedExpr(ExprParser.QuantifiedExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQuantifiedExpr(ExprParser.QuantifiedExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterForallExpr(ExprParser.ForallExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitForallExpr(ExprParser.ForallExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExistsExpr(ExprParser.ExistsExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExistsExpr(ExprParser.ExistsExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFpFuncExpr(ExprParser.FpFuncExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFpFuncExpr(ExprParser.FpFuncExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOrExpr(ExprParser.OrExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOrExpr(ExprParser.OrExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterXorExpr(ExprParser.XorExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitXorExpr(ExprParser.XorExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAndExpr(ExprParser.AndExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAndExpr(ExprParser.AndExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNotExpr(ExprParser.NotExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNotExpr(ExprParser.NotExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEqualityExpr(ExprParser.EqualityExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEqualityExpr(ExprParser.EqualityExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRelationExpr(ExprParser.RelationExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRelationExpr(ExprParser.RelationExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBitwiseOrExpr(ExprParser.BitwiseOrExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBitwiseOrExpr(ExprParser.BitwiseOrExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBitwiseXorExpr(ExprParser.BitwiseXorExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBitwiseXorExpr(ExprParser.BitwiseXorExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBitwiseAndExpr(ExprParser.BitwiseAndExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBitwiseAndExpr(ExprParser.BitwiseAndExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBitwiseShiftExpr(ExprParser.BitwiseShiftExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBitwiseShiftExpr(ExprParser.BitwiseShiftExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAdditiveExpr(ExprParser.AdditiveExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAdditiveExpr(ExprParser.AdditiveExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMultiplicativeExpr(ExprParser.MultiplicativeExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMultiplicativeExpr(ExprParser.MultiplicativeExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBvConcatExpr(ExprParser.BvConcatExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBvConcatExpr(ExprParser.BvConcatExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBvExtendExpr(ExprParser.BvExtendExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBvExtendExpr(ExprParser.BvExtendExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUnaryExpr(ExprParser.UnaryExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUnaryExpr(ExprParser.UnaryExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBitwiseNotExpr(ExprParser.BitwiseNotExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBitwiseNotExpr(ExprParser.BitwiseNotExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFunctionCall(ExprParser.FunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFunctionCall(ExprParser.FunctionCallContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArrayRead(ExprParser.ArrayReadContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArrayRead(ExprParser.ArrayReadContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArrayWrite(ExprParser.ArrayWriteContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArrayWrite(ExprParser.ArrayWriteContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPrimeExpr(ExprParser.PrimeExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPrimeExpr(ExprParser.PrimeExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBvExtract(ExprParser.BvExtractContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBvExtract(ExprParser.BvExtractContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPrimaryExpr(ExprParser.PrimaryExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPrimaryExpr(ExprParser.PrimaryExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTrueExpr(ExprParser.TrueExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTrueExpr(ExprParser.TrueExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFalseExpr(ExprParser.FalseExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFalseExpr(ExprParser.FalseExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIntLitExpr(ExprParser.IntLitExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIntLitExpr(ExprParser.IntLitExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRatLitExpr(ExprParser.RatLitExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRatLitExpr(ExprParser.RatLitExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArrLitExpr(ExprParser.ArrLitExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArrLitExpr(ExprParser.ArrLitExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBvLitExpr(ExprParser.BvLitExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBvLitExpr(ExprParser.BvLitExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFpLitExpr(ExprParser.FpLitExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFpLitExpr(ExprParser.FpLitExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIdExpr(ExprParser.IdExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIdExpr(ExprParser.IdExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterParenExpr(ExprParser.ParenExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitParenExpr(ExprParser.ParenExprContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDecl(ExprParser.DeclContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDecl(ExprParser.DeclContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDeclList(ExprParser.DeclListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDeclList(ExprParser.DeclListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterType(ExprParser.TypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitType(ExprParser.TypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTypeList(ExprParser.TypeListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTypeList(ExprParser.TypeListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBoolType(ExprParser.BoolTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBoolType(ExprParser.BoolTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIntType(ExprParser.IntTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIntType(ExprParser.IntTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRatType(ExprParser.RatTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRatType(ExprParser.RatTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFuncType(ExprParser.FuncTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFuncType(ExprParser.FuncTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArrayType(ExprParser.ArrayTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArrayType(ExprParser.ArrayTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBvType(ExprParser.BvTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBvType(ExprParser.BvTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFpType(ExprParser.FpTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFpType(ExprParser.FpTypeContext ctx) { } + + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/ExprBaseVisitor.java b/subprojects/common/grammar/src/main/gen/ExprBaseVisitor.java new file mode 100644 index 0000000000..d4cc5bcb88 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/ExprBaseVisitor.java @@ -0,0 +1,377 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Expr.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; + +/** + * This class provides an empty implementation of {@link ExprVisitor}, + * which can be extended to create a visitor which only needs to handle a subset + * of the available methods. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +public class ExprBaseVisitor extends AbstractParseTreeVisitor implements ExprVisitor { + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExpr(ExprParser.ExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExprList(ExprParser.ExprListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFuncLitExpr(ExprParser.FuncLitExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIteExpr(ExprParser.IteExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIffExpr(ExprParser.IffExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitImplyExpr(ExprParser.ImplyExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitQuantifiedExpr(ExprParser.QuantifiedExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitForallExpr(ExprParser.ForallExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitExistsExpr(ExprParser.ExistsExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFpFuncExpr(ExprParser.FpFuncExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitOrExpr(ExprParser.OrExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitXorExpr(ExprParser.XorExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAndExpr(ExprParser.AndExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitNotExpr(ExprParser.NotExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitEqualityExpr(ExprParser.EqualityExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRelationExpr(ExprParser.RelationExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBitwiseOrExpr(ExprParser.BitwiseOrExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBitwiseXorExpr(ExprParser.BitwiseXorExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBitwiseAndExpr(ExprParser.BitwiseAndExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBitwiseShiftExpr(ExprParser.BitwiseShiftExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAdditiveExpr(ExprParser.AdditiveExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitMultiplicativeExpr(ExprParser.MultiplicativeExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBvConcatExpr(ExprParser.BvConcatExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBvExtendExpr(ExprParser.BvExtendExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitUnaryExpr(ExprParser.UnaryExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBitwiseNotExpr(ExprParser.BitwiseNotExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFunctionCall(ExprParser.FunctionCallContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArrayRead(ExprParser.ArrayReadContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArrayWrite(ExprParser.ArrayWriteContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPrimeExpr(ExprParser.PrimeExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBvExtract(ExprParser.BvExtractContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitPrimaryExpr(ExprParser.PrimaryExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTrueExpr(ExprParser.TrueExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFalseExpr(ExprParser.FalseExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIntLitExpr(ExprParser.IntLitExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRatLitExpr(ExprParser.RatLitExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArrLitExpr(ExprParser.ArrLitExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBvLitExpr(ExprParser.BvLitExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFpLitExpr(ExprParser.FpLitExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIdExpr(ExprParser.IdExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitParenExpr(ExprParser.ParenExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDecl(ExprParser.DeclContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDeclList(ExprParser.DeclListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitType(ExprParser.TypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeList(ExprParser.TypeListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBoolType(ExprParser.BoolTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIntType(ExprParser.IntTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRatType(ExprParser.RatTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFuncType(ExprParser.FuncTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArrayType(ExprParser.ArrayTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBvType(ExprParser.BvTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFpType(ExprParser.FpTypeContext ctx) { return visitChildren(ctx); } +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/ExprLexer.interp b/subprojects/common/grammar/src/main/gen/ExprLexer.interp new file mode 100644 index 0000000000..4d5136f69e --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/ExprLexer.interp @@ -0,0 +1,365 @@ +token literal names: +null +null +null +null +null +null +null +null +'if' +'then' +'else' +'iff' +'ite' +'=>' +'forall' +'exists' +'or' +'and' +'xor' +'not' +'=' +'/=' +'<' +'<=' +'>' +'>=' +'+' +'-' +'*' +'div' +'mod' +'rem' +'%' +null +'bv_zero_extend' +'bv_sign_extend' +'bvadd' +'bvsub' +'bvpos' +'bvneg' +'bvmul' +'bvudiv' +'bvsdiv' +'bvsmod' +'bvurem' +'bvsrem' +'bvor' +'bvand' +'bvxor' +'bvnot' +'bvshl' +'bvashr' +'bvlshr' +'bvrol' +'bvror' +'bvult' +'bvule' +'bvugt' +'bvuge' +'bvslt' +'bvsle' +'bvsgt' +'bvsge' +'fpabs' +null +'fpisnan' +'fpmax' +'fpmin' +'fprem' +null +null +null +null +'fpsub' +null +'fpmul' +null +'fppos' +'fpneg' +'true' +'read' +'write' +'prime' +'extract' +null +null +null +'false' +'default' +'assign' +'havoc' +'assume' +'return' +null +null +null +null +'.' +null +'_' +null +null +'(' +')' +'[' +']' +'{' +'}' +',' +':' +';' +'\'' +'<-' +'->' +null +null +null + +token symbolic names: +null +BOOLTYPE +INTTYPE +RATTYPE +BVTYPE +FPTYPE +FUNC +ARRAY +IF +THEN +ELSE +IFF +ITE +IMPLY +FORALL +EXISTS +OR +AND +XOR +NOT +EQ +NEQ +LT +LEQ +GT +GEQ +PLUS +MINUS +MUL +DIV +MOD +REM +PERCENT +BV_CONCAT +BV_ZERO_EXTEND +BV_SIGN_EXTEND +BV_ADD +BV_SUB +BV_POS +BV_NEG +BV_MUL +BV_UDIV +BV_SDIV +BV_SMOD +BV_UREM +BV_SREM +BV_OR +BV_AND +BV_XOR +BV_NOT +BV_SHL +BV_ASHR +BV_LSHR +BV_ROL +BV_ROR +BV_ULT +BV_ULE +BV_UGT +BV_UGE +BV_SLT +BV_SLE +BV_SGT +BV_SGE +FP_ABS +FP_FROM_BV +FP_IS_NAN +FPMAX +FPMIN +FPREM +FPROUNDTOINT +FPSQRT +FPTOBV +FPTOFP +FPSUB +FPADD +FPMUL +FPDIV +FPPOS +FPNEG +TRUE +READ +WRITE +PRIME +EXTRACT +BV_TYPE_DECL +FP_TYPE_DECL +FP_ROUNDINGMODE +FALSE +DEFAULT +ASSIGN +HAVOC +ASSUME +RETURN +BV +INT +NAT +SIGN +DOT +ID +UNDERSCORE +DIGIT +LETTER +LPAREN +RPAREN +LBRACK +RBRACK +LBRAC +RBRAC +COMMA +COLON +SEMICOLON +QUOT +LARROW +RARROW +WS +COMMENT +LINE_COMMENT + +rule names: +BOOLTYPE +INTTYPE +RATTYPE +BVTYPE +FPTYPE +FUNC +ARRAY +IF +THEN +ELSE +IFF +ITE +IMPLY +FORALL +EXISTS +OR +AND +XOR +NOT +EQ +NEQ +LT +LEQ +GT +GEQ +PLUS +MINUS +MUL +DIV +MOD +REM +PERCENT +BV_CONCAT +BV_ZERO_EXTEND +BV_SIGN_EXTEND +BV_ADD +BV_SUB +BV_POS +BV_NEG +BV_MUL +BV_UDIV +BV_SDIV +BV_SMOD +BV_UREM +BV_SREM +BV_OR +BV_AND +BV_XOR +BV_NOT +BV_SHL +BV_ASHR +BV_LSHR +BV_ROL +BV_ROR +BV_ULT +BV_ULE +BV_UGT +BV_UGE +BV_SLT +BV_SLE +BV_SGT +BV_SGE +FP_ABS +FP_FROM_BV +FP_IS_NAN +FPMAX +FPMIN +FPREM +FPROUNDTOINT +FPSQRT +FPTOBV +FPTOFP +FPSUB +FPADD +FPMUL +FPDIV +FPPOS +FPNEG +TRUE +READ +WRITE +PRIME +EXTRACT +BV_TYPE_DECL +FP_TYPE_DECL +FP_ROUNDINGMODE +FALSE +DEFAULT +ASSIGN +HAVOC +ASSUME +RETURN +BV +INT +NAT +SIGN +DOT +ID +UNDERSCORE +DIGIT +LETTER +LPAREN +RPAREN +LBRACK +RBRACK +LBRAC +RBRAC +COMMA +COLON +SEMICOLON +QUOT +LARROW +RARROW +WS +COMMENT +LINE_COMMENT + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[4, 0, 116, 993, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 246, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 257, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 268, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 276, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 284, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 298, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 315, 8, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 627, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 669, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 679, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 690, 8, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 701, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 716, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 811, 8, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 859, 8, 92, 11, 92, 12, 92, 860, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 867, 8, 92, 11, 92, 12, 92, 868, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 875, 8, 92, 11, 92, 12, 92, 876, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 3, 92, 885, 8, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 894, 8, 92, 11, 92, 12, 92, 895, 3, 92, 898, 8, 92, 1, 93, 3, 93, 901, 8, 93, 1, 93, 1, 93, 1, 94, 4, 94, 906, 8, 94, 11, 94, 12, 94, 907, 1, 95, 1, 95, 3, 95, 912, 8, 95, 1, 96, 1, 96, 1, 97, 1, 97, 3, 97, 918, 8, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 5, 97, 925, 8, 97, 10, 97, 12, 97, 928, 9, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 108, 1, 108, 1, 109, 1, 109, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 113, 4, 113, 963, 8, 113, 11, 113, 12, 113, 964, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 5, 114, 973, 8, 114, 10, 114, 12, 114, 976, 9, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 5, 115, 987, 8, 115, 10, 115, 12, 115, 990, 9, 115, 1, 115, 1, 115, 1, 974, 0, 116, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 1, 0, 7, 2, 0, 115, 115, 117, 117, 1, 0, 48, 49, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 3, 0, 9, 10, 12, 13, 32, 32, 2, 0, 10, 10, 13, 13, 1038, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 1, 245, 1, 0, 0, 0, 3, 256, 1, 0, 0, 0, 5, 267, 1, 0, 0, 0, 7, 275, 1, 0, 0, 0, 9, 283, 1, 0, 0, 0, 11, 297, 1, 0, 0, 0, 13, 314, 1, 0, 0, 0, 15, 316, 1, 0, 0, 0, 17, 319, 1, 0, 0, 0, 19, 324, 1, 0, 0, 0, 21, 329, 1, 0, 0, 0, 23, 333, 1, 0, 0, 0, 25, 337, 1, 0, 0, 0, 27, 340, 1, 0, 0, 0, 29, 347, 1, 0, 0, 0, 31, 354, 1, 0, 0, 0, 33, 357, 1, 0, 0, 0, 35, 361, 1, 0, 0, 0, 37, 365, 1, 0, 0, 0, 39, 369, 1, 0, 0, 0, 41, 371, 1, 0, 0, 0, 43, 374, 1, 0, 0, 0, 45, 376, 1, 0, 0, 0, 47, 379, 1, 0, 0, 0, 49, 381, 1, 0, 0, 0, 51, 384, 1, 0, 0, 0, 53, 386, 1, 0, 0, 0, 55, 388, 1, 0, 0, 0, 57, 390, 1, 0, 0, 0, 59, 394, 1, 0, 0, 0, 61, 398, 1, 0, 0, 0, 63, 402, 1, 0, 0, 0, 65, 404, 1, 0, 0, 0, 67, 407, 1, 0, 0, 0, 69, 422, 1, 0, 0, 0, 71, 437, 1, 0, 0, 0, 73, 443, 1, 0, 0, 0, 75, 449, 1, 0, 0, 0, 77, 455, 1, 0, 0, 0, 79, 461, 1, 0, 0, 0, 81, 467, 1, 0, 0, 0, 83, 474, 1, 0, 0, 0, 85, 481, 1, 0, 0, 0, 87, 488, 1, 0, 0, 0, 89, 495, 1, 0, 0, 0, 91, 502, 1, 0, 0, 0, 93, 507, 1, 0, 0, 0, 95, 513, 1, 0, 0, 0, 97, 519, 1, 0, 0, 0, 99, 525, 1, 0, 0, 0, 101, 531, 1, 0, 0, 0, 103, 538, 1, 0, 0, 0, 105, 545, 1, 0, 0, 0, 107, 551, 1, 0, 0, 0, 109, 557, 1, 0, 0, 0, 111, 563, 1, 0, 0, 0, 113, 569, 1, 0, 0, 0, 115, 575, 1, 0, 0, 0, 117, 581, 1, 0, 0, 0, 119, 587, 1, 0, 0, 0, 121, 593, 1, 0, 0, 0, 123, 599, 1, 0, 0, 0, 125, 605, 1, 0, 0, 0, 127, 611, 1, 0, 0, 0, 129, 628, 1, 0, 0, 0, 131, 636, 1, 0, 0, 0, 133, 642, 1, 0, 0, 0, 135, 648, 1, 0, 0, 0, 137, 654, 1, 0, 0, 0, 139, 670, 1, 0, 0, 0, 141, 680, 1, 0, 0, 0, 143, 691, 1, 0, 0, 0, 145, 702, 1, 0, 0, 0, 147, 708, 1, 0, 0, 0, 149, 717, 1, 0, 0, 0, 151, 723, 1, 0, 0, 0, 153, 731, 1, 0, 0, 0, 155, 737, 1, 0, 0, 0, 157, 743, 1, 0, 0, 0, 159, 748, 1, 0, 0, 0, 161, 753, 1, 0, 0, 0, 163, 759, 1, 0, 0, 0, 165, 765, 1, 0, 0, 0, 167, 773, 1, 0, 0, 0, 169, 779, 1, 0, 0, 0, 171, 810, 1, 0, 0, 0, 173, 812, 1, 0, 0, 0, 175, 818, 1, 0, 0, 0, 177, 826, 1, 0, 0, 0, 179, 833, 1, 0, 0, 0, 181, 839, 1, 0, 0, 0, 183, 846, 1, 0, 0, 0, 185, 897, 1, 0, 0, 0, 187, 900, 1, 0, 0, 0, 189, 905, 1, 0, 0, 0, 191, 911, 1, 0, 0, 0, 193, 913, 1, 0, 0, 0, 195, 917, 1, 0, 0, 0, 197, 929, 1, 0, 0, 0, 199, 931, 1, 0, 0, 0, 201, 933, 1, 0, 0, 0, 203, 935, 1, 0, 0, 0, 205, 937, 1, 0, 0, 0, 207, 939, 1, 0, 0, 0, 209, 941, 1, 0, 0, 0, 211, 943, 1, 0, 0, 0, 213, 945, 1, 0, 0, 0, 215, 947, 1, 0, 0, 0, 217, 949, 1, 0, 0, 0, 219, 951, 1, 0, 0, 0, 221, 953, 1, 0, 0, 0, 223, 955, 1, 0, 0, 0, 225, 958, 1, 0, 0, 0, 227, 962, 1, 0, 0, 0, 229, 968, 1, 0, 0, 0, 231, 982, 1, 0, 0, 0, 233, 234, 5, 98, 0, 0, 234, 235, 5, 111, 0, 0, 235, 236, 5, 111, 0, 0, 236, 246, 5, 108, 0, 0, 237, 238, 5, 66, 0, 0, 238, 239, 5, 111, 0, 0, 239, 240, 5, 111, 0, 0, 240, 246, 5, 108, 0, 0, 241, 242, 5, 66, 0, 0, 242, 243, 5, 79, 0, 0, 243, 244, 5, 79, 0, 0, 244, 246, 5, 76, 0, 0, 245, 233, 1, 0, 0, 0, 245, 237, 1, 0, 0, 0, 245, 241, 1, 0, 0, 0, 246, 2, 1, 0, 0, 0, 247, 248, 5, 105, 0, 0, 248, 249, 5, 110, 0, 0, 249, 257, 5, 116, 0, 0, 250, 251, 5, 73, 0, 0, 251, 252, 5, 110, 0, 0, 252, 257, 5, 116, 0, 0, 253, 254, 5, 73, 0, 0, 254, 255, 5, 78, 0, 0, 255, 257, 5, 84, 0, 0, 256, 247, 1, 0, 0, 0, 256, 250, 1, 0, 0, 0, 256, 253, 1, 0, 0, 0, 257, 4, 1, 0, 0, 0, 258, 259, 5, 114, 0, 0, 259, 260, 5, 97, 0, 0, 260, 268, 5, 116, 0, 0, 261, 262, 5, 82, 0, 0, 262, 263, 5, 97, 0, 0, 263, 268, 5, 116, 0, 0, 264, 265, 5, 82, 0, 0, 265, 266, 5, 65, 0, 0, 266, 268, 5, 84, 0, 0, 267, 258, 1, 0, 0, 0, 267, 261, 1, 0, 0, 0, 267, 264, 1, 0, 0, 0, 268, 6, 1, 0, 0, 0, 269, 270, 5, 98, 0, 0, 270, 276, 5, 118, 0, 0, 271, 272, 5, 66, 0, 0, 272, 276, 5, 118, 0, 0, 273, 274, 5, 66, 0, 0, 274, 276, 5, 86, 0, 0, 275, 269, 1, 0, 0, 0, 275, 271, 1, 0, 0, 0, 275, 273, 1, 0, 0, 0, 276, 8, 1, 0, 0, 0, 277, 278, 5, 102, 0, 0, 278, 284, 5, 112, 0, 0, 279, 280, 5, 70, 0, 0, 280, 284, 5, 112, 0, 0, 281, 282, 5, 70, 0, 0, 282, 284, 5, 80, 0, 0, 283, 277, 1, 0, 0, 0, 283, 279, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 284, 10, 1, 0, 0, 0, 285, 286, 5, 102, 0, 0, 286, 287, 5, 117, 0, 0, 287, 288, 5, 110, 0, 0, 288, 298, 5, 99, 0, 0, 289, 290, 5, 70, 0, 0, 290, 291, 5, 117, 0, 0, 291, 292, 5, 110, 0, 0, 292, 298, 5, 99, 0, 0, 293, 294, 5, 70, 0, 0, 294, 295, 5, 85, 0, 0, 295, 296, 5, 78, 0, 0, 296, 298, 5, 67, 0, 0, 297, 285, 1, 0, 0, 0, 297, 289, 1, 0, 0, 0, 297, 293, 1, 0, 0, 0, 298, 12, 1, 0, 0, 0, 299, 300, 5, 97, 0, 0, 300, 301, 5, 114, 0, 0, 301, 302, 5, 114, 0, 0, 302, 303, 5, 97, 0, 0, 303, 315, 5, 121, 0, 0, 304, 305, 5, 65, 0, 0, 305, 306, 5, 114, 0, 0, 306, 307, 5, 114, 0, 0, 307, 308, 5, 97, 0, 0, 308, 315, 5, 121, 0, 0, 309, 310, 5, 65, 0, 0, 310, 311, 5, 82, 0, 0, 311, 312, 5, 82, 0, 0, 312, 313, 5, 65, 0, 0, 313, 315, 5, 89, 0, 0, 314, 299, 1, 0, 0, 0, 314, 304, 1, 0, 0, 0, 314, 309, 1, 0, 0, 0, 315, 14, 1, 0, 0, 0, 316, 317, 5, 105, 0, 0, 317, 318, 5, 102, 0, 0, 318, 16, 1, 0, 0, 0, 319, 320, 5, 116, 0, 0, 320, 321, 5, 104, 0, 0, 321, 322, 5, 101, 0, 0, 322, 323, 5, 110, 0, 0, 323, 18, 1, 0, 0, 0, 324, 325, 5, 101, 0, 0, 325, 326, 5, 108, 0, 0, 326, 327, 5, 115, 0, 0, 327, 328, 5, 101, 0, 0, 328, 20, 1, 0, 0, 0, 329, 330, 5, 105, 0, 0, 330, 331, 5, 102, 0, 0, 331, 332, 5, 102, 0, 0, 332, 22, 1, 0, 0, 0, 333, 334, 5, 105, 0, 0, 334, 335, 5, 116, 0, 0, 335, 336, 5, 101, 0, 0, 336, 24, 1, 0, 0, 0, 337, 338, 5, 61, 0, 0, 338, 339, 5, 62, 0, 0, 339, 26, 1, 0, 0, 0, 340, 341, 5, 102, 0, 0, 341, 342, 5, 111, 0, 0, 342, 343, 5, 114, 0, 0, 343, 344, 5, 97, 0, 0, 344, 345, 5, 108, 0, 0, 345, 346, 5, 108, 0, 0, 346, 28, 1, 0, 0, 0, 347, 348, 5, 101, 0, 0, 348, 349, 5, 120, 0, 0, 349, 350, 5, 105, 0, 0, 350, 351, 5, 115, 0, 0, 351, 352, 5, 116, 0, 0, 352, 353, 5, 115, 0, 0, 353, 30, 1, 0, 0, 0, 354, 355, 5, 111, 0, 0, 355, 356, 5, 114, 0, 0, 356, 32, 1, 0, 0, 0, 357, 358, 5, 97, 0, 0, 358, 359, 5, 110, 0, 0, 359, 360, 5, 100, 0, 0, 360, 34, 1, 0, 0, 0, 361, 362, 5, 120, 0, 0, 362, 363, 5, 111, 0, 0, 363, 364, 5, 114, 0, 0, 364, 36, 1, 0, 0, 0, 365, 366, 5, 110, 0, 0, 366, 367, 5, 111, 0, 0, 367, 368, 5, 116, 0, 0, 368, 38, 1, 0, 0, 0, 369, 370, 5, 61, 0, 0, 370, 40, 1, 0, 0, 0, 371, 372, 5, 47, 0, 0, 372, 373, 5, 61, 0, 0, 373, 42, 1, 0, 0, 0, 374, 375, 5, 60, 0, 0, 375, 44, 1, 0, 0, 0, 376, 377, 5, 60, 0, 0, 377, 378, 5, 61, 0, 0, 378, 46, 1, 0, 0, 0, 379, 380, 5, 62, 0, 0, 380, 48, 1, 0, 0, 0, 381, 382, 5, 62, 0, 0, 382, 383, 5, 61, 0, 0, 383, 50, 1, 0, 0, 0, 384, 385, 5, 43, 0, 0, 385, 52, 1, 0, 0, 0, 386, 387, 5, 45, 0, 0, 387, 54, 1, 0, 0, 0, 388, 389, 5, 42, 0, 0, 389, 56, 1, 0, 0, 0, 390, 391, 5, 100, 0, 0, 391, 392, 5, 105, 0, 0, 392, 393, 5, 118, 0, 0, 393, 58, 1, 0, 0, 0, 394, 395, 5, 109, 0, 0, 395, 396, 5, 111, 0, 0, 396, 397, 5, 100, 0, 0, 397, 60, 1, 0, 0, 0, 398, 399, 5, 114, 0, 0, 399, 400, 5, 101, 0, 0, 400, 401, 5, 109, 0, 0, 401, 62, 1, 0, 0, 0, 402, 403, 5, 37, 0, 0, 403, 64, 1, 0, 0, 0, 404, 405, 3, 51, 25, 0, 405, 406, 3, 51, 25, 0, 406, 66, 1, 0, 0, 0, 407, 408, 5, 98, 0, 0, 408, 409, 5, 118, 0, 0, 409, 410, 5, 95, 0, 0, 410, 411, 5, 122, 0, 0, 411, 412, 5, 101, 0, 0, 412, 413, 5, 114, 0, 0, 413, 414, 5, 111, 0, 0, 414, 415, 5, 95, 0, 0, 415, 416, 5, 101, 0, 0, 416, 417, 5, 120, 0, 0, 417, 418, 5, 116, 0, 0, 418, 419, 5, 101, 0, 0, 419, 420, 5, 110, 0, 0, 420, 421, 5, 100, 0, 0, 421, 68, 1, 0, 0, 0, 422, 423, 5, 98, 0, 0, 423, 424, 5, 118, 0, 0, 424, 425, 5, 95, 0, 0, 425, 426, 5, 115, 0, 0, 426, 427, 5, 105, 0, 0, 427, 428, 5, 103, 0, 0, 428, 429, 5, 110, 0, 0, 429, 430, 5, 95, 0, 0, 430, 431, 5, 101, 0, 0, 431, 432, 5, 120, 0, 0, 432, 433, 5, 116, 0, 0, 433, 434, 5, 101, 0, 0, 434, 435, 5, 110, 0, 0, 435, 436, 5, 100, 0, 0, 436, 70, 1, 0, 0, 0, 437, 438, 5, 98, 0, 0, 438, 439, 5, 118, 0, 0, 439, 440, 5, 97, 0, 0, 440, 441, 5, 100, 0, 0, 441, 442, 5, 100, 0, 0, 442, 72, 1, 0, 0, 0, 443, 444, 5, 98, 0, 0, 444, 445, 5, 118, 0, 0, 445, 446, 5, 115, 0, 0, 446, 447, 5, 117, 0, 0, 447, 448, 5, 98, 0, 0, 448, 74, 1, 0, 0, 0, 449, 450, 5, 98, 0, 0, 450, 451, 5, 118, 0, 0, 451, 452, 5, 112, 0, 0, 452, 453, 5, 111, 0, 0, 453, 454, 5, 115, 0, 0, 454, 76, 1, 0, 0, 0, 455, 456, 5, 98, 0, 0, 456, 457, 5, 118, 0, 0, 457, 458, 5, 110, 0, 0, 458, 459, 5, 101, 0, 0, 459, 460, 5, 103, 0, 0, 460, 78, 1, 0, 0, 0, 461, 462, 5, 98, 0, 0, 462, 463, 5, 118, 0, 0, 463, 464, 5, 109, 0, 0, 464, 465, 5, 117, 0, 0, 465, 466, 5, 108, 0, 0, 466, 80, 1, 0, 0, 0, 467, 468, 5, 98, 0, 0, 468, 469, 5, 118, 0, 0, 469, 470, 5, 117, 0, 0, 470, 471, 5, 100, 0, 0, 471, 472, 5, 105, 0, 0, 472, 473, 5, 118, 0, 0, 473, 82, 1, 0, 0, 0, 474, 475, 5, 98, 0, 0, 475, 476, 5, 118, 0, 0, 476, 477, 5, 115, 0, 0, 477, 478, 5, 100, 0, 0, 478, 479, 5, 105, 0, 0, 479, 480, 5, 118, 0, 0, 480, 84, 1, 0, 0, 0, 481, 482, 5, 98, 0, 0, 482, 483, 5, 118, 0, 0, 483, 484, 5, 115, 0, 0, 484, 485, 5, 109, 0, 0, 485, 486, 5, 111, 0, 0, 486, 487, 5, 100, 0, 0, 487, 86, 1, 0, 0, 0, 488, 489, 5, 98, 0, 0, 489, 490, 5, 118, 0, 0, 490, 491, 5, 117, 0, 0, 491, 492, 5, 114, 0, 0, 492, 493, 5, 101, 0, 0, 493, 494, 5, 109, 0, 0, 494, 88, 1, 0, 0, 0, 495, 496, 5, 98, 0, 0, 496, 497, 5, 118, 0, 0, 497, 498, 5, 115, 0, 0, 498, 499, 5, 114, 0, 0, 499, 500, 5, 101, 0, 0, 500, 501, 5, 109, 0, 0, 501, 90, 1, 0, 0, 0, 502, 503, 5, 98, 0, 0, 503, 504, 5, 118, 0, 0, 504, 505, 5, 111, 0, 0, 505, 506, 5, 114, 0, 0, 506, 92, 1, 0, 0, 0, 507, 508, 5, 98, 0, 0, 508, 509, 5, 118, 0, 0, 509, 510, 5, 97, 0, 0, 510, 511, 5, 110, 0, 0, 511, 512, 5, 100, 0, 0, 512, 94, 1, 0, 0, 0, 513, 514, 5, 98, 0, 0, 514, 515, 5, 118, 0, 0, 515, 516, 5, 120, 0, 0, 516, 517, 5, 111, 0, 0, 517, 518, 5, 114, 0, 0, 518, 96, 1, 0, 0, 0, 519, 520, 5, 98, 0, 0, 520, 521, 5, 118, 0, 0, 521, 522, 5, 110, 0, 0, 522, 523, 5, 111, 0, 0, 523, 524, 5, 116, 0, 0, 524, 98, 1, 0, 0, 0, 525, 526, 5, 98, 0, 0, 526, 527, 5, 118, 0, 0, 527, 528, 5, 115, 0, 0, 528, 529, 5, 104, 0, 0, 529, 530, 5, 108, 0, 0, 530, 100, 1, 0, 0, 0, 531, 532, 5, 98, 0, 0, 532, 533, 5, 118, 0, 0, 533, 534, 5, 97, 0, 0, 534, 535, 5, 115, 0, 0, 535, 536, 5, 104, 0, 0, 536, 537, 5, 114, 0, 0, 537, 102, 1, 0, 0, 0, 538, 539, 5, 98, 0, 0, 539, 540, 5, 118, 0, 0, 540, 541, 5, 108, 0, 0, 541, 542, 5, 115, 0, 0, 542, 543, 5, 104, 0, 0, 543, 544, 5, 114, 0, 0, 544, 104, 1, 0, 0, 0, 545, 546, 5, 98, 0, 0, 546, 547, 5, 118, 0, 0, 547, 548, 5, 114, 0, 0, 548, 549, 5, 111, 0, 0, 549, 550, 5, 108, 0, 0, 550, 106, 1, 0, 0, 0, 551, 552, 5, 98, 0, 0, 552, 553, 5, 118, 0, 0, 553, 554, 5, 114, 0, 0, 554, 555, 5, 111, 0, 0, 555, 556, 5, 114, 0, 0, 556, 108, 1, 0, 0, 0, 557, 558, 5, 98, 0, 0, 558, 559, 5, 118, 0, 0, 559, 560, 5, 117, 0, 0, 560, 561, 5, 108, 0, 0, 561, 562, 5, 116, 0, 0, 562, 110, 1, 0, 0, 0, 563, 564, 5, 98, 0, 0, 564, 565, 5, 118, 0, 0, 565, 566, 5, 117, 0, 0, 566, 567, 5, 108, 0, 0, 567, 568, 5, 101, 0, 0, 568, 112, 1, 0, 0, 0, 569, 570, 5, 98, 0, 0, 570, 571, 5, 118, 0, 0, 571, 572, 5, 117, 0, 0, 572, 573, 5, 103, 0, 0, 573, 574, 5, 116, 0, 0, 574, 114, 1, 0, 0, 0, 575, 576, 5, 98, 0, 0, 576, 577, 5, 118, 0, 0, 577, 578, 5, 117, 0, 0, 578, 579, 5, 103, 0, 0, 579, 580, 5, 101, 0, 0, 580, 116, 1, 0, 0, 0, 581, 582, 5, 98, 0, 0, 582, 583, 5, 118, 0, 0, 583, 584, 5, 115, 0, 0, 584, 585, 5, 108, 0, 0, 585, 586, 5, 116, 0, 0, 586, 118, 1, 0, 0, 0, 587, 588, 5, 98, 0, 0, 588, 589, 5, 118, 0, 0, 589, 590, 5, 115, 0, 0, 590, 591, 5, 108, 0, 0, 591, 592, 5, 101, 0, 0, 592, 120, 1, 0, 0, 0, 593, 594, 5, 98, 0, 0, 594, 595, 5, 118, 0, 0, 595, 596, 5, 115, 0, 0, 596, 597, 5, 103, 0, 0, 597, 598, 5, 116, 0, 0, 598, 122, 1, 0, 0, 0, 599, 600, 5, 98, 0, 0, 600, 601, 5, 118, 0, 0, 601, 602, 5, 115, 0, 0, 602, 603, 5, 103, 0, 0, 603, 604, 5, 101, 0, 0, 604, 124, 1, 0, 0, 0, 605, 606, 5, 102, 0, 0, 606, 607, 5, 112, 0, 0, 607, 608, 5, 97, 0, 0, 608, 609, 5, 98, 0, 0, 609, 610, 5, 115, 0, 0, 610, 126, 1, 0, 0, 0, 611, 612, 5, 102, 0, 0, 612, 613, 5, 112, 0, 0, 613, 614, 5, 102, 0, 0, 614, 615, 5, 114, 0, 0, 615, 616, 5, 111, 0, 0, 616, 617, 5, 109, 0, 0, 617, 618, 5, 98, 0, 0, 618, 619, 5, 118, 0, 0, 619, 620, 1, 0, 0, 0, 620, 621, 3, 169, 84, 0, 621, 622, 3, 207, 103, 0, 622, 623, 7, 0, 0, 0, 623, 624, 3, 209, 104, 0, 624, 626, 1, 0, 0, 0, 625, 627, 3, 171, 85, 0, 626, 625, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 128, 1, 0, 0, 0, 628, 629, 5, 102, 0, 0, 629, 630, 5, 112, 0, 0, 630, 631, 5, 105, 0, 0, 631, 632, 5, 115, 0, 0, 632, 633, 5, 110, 0, 0, 633, 634, 5, 97, 0, 0, 634, 635, 5, 110, 0, 0, 635, 130, 1, 0, 0, 0, 636, 637, 5, 102, 0, 0, 637, 638, 5, 112, 0, 0, 638, 639, 5, 109, 0, 0, 639, 640, 5, 97, 0, 0, 640, 641, 5, 120, 0, 0, 641, 132, 1, 0, 0, 0, 642, 643, 5, 102, 0, 0, 643, 644, 5, 112, 0, 0, 644, 645, 5, 109, 0, 0, 645, 646, 5, 105, 0, 0, 646, 647, 5, 110, 0, 0, 647, 134, 1, 0, 0, 0, 648, 649, 5, 102, 0, 0, 649, 650, 5, 112, 0, 0, 650, 651, 5, 114, 0, 0, 651, 652, 5, 101, 0, 0, 652, 653, 5, 109, 0, 0, 653, 136, 1, 0, 0, 0, 654, 655, 5, 102, 0, 0, 655, 656, 5, 112, 0, 0, 656, 657, 5, 114, 0, 0, 657, 658, 5, 111, 0, 0, 658, 659, 5, 117, 0, 0, 659, 660, 5, 110, 0, 0, 660, 661, 5, 100, 0, 0, 661, 662, 5, 116, 0, 0, 662, 663, 5, 111, 0, 0, 663, 664, 5, 105, 0, 0, 664, 665, 5, 110, 0, 0, 665, 666, 5, 116, 0, 0, 666, 668, 1, 0, 0, 0, 667, 669, 3, 171, 85, 0, 668, 667, 1, 0, 0, 0, 668, 669, 1, 0, 0, 0, 669, 138, 1, 0, 0, 0, 670, 671, 5, 102, 0, 0, 671, 672, 5, 112, 0, 0, 672, 673, 5, 115, 0, 0, 673, 674, 5, 113, 0, 0, 674, 675, 5, 114, 0, 0, 675, 676, 5, 116, 0, 0, 676, 678, 1, 0, 0, 0, 677, 679, 3, 171, 85, 0, 678, 677, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 140, 1, 0, 0, 0, 680, 681, 5, 102, 0, 0, 681, 682, 5, 112, 0, 0, 682, 683, 5, 116, 0, 0, 683, 684, 5, 111, 0, 0, 684, 685, 5, 98, 0, 0, 685, 686, 5, 118, 0, 0, 686, 687, 1, 0, 0, 0, 687, 689, 3, 167, 83, 0, 688, 690, 3, 171, 85, 0, 689, 688, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 690, 142, 1, 0, 0, 0, 691, 692, 5, 102, 0, 0, 692, 693, 5, 112, 0, 0, 693, 694, 5, 116, 0, 0, 694, 695, 5, 111, 0, 0, 695, 696, 5, 102, 0, 0, 696, 697, 5, 112, 0, 0, 697, 698, 1, 0, 0, 0, 698, 700, 3, 169, 84, 0, 699, 701, 3, 171, 85, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 144, 1, 0, 0, 0, 702, 703, 5, 102, 0, 0, 703, 704, 5, 112, 0, 0, 704, 705, 5, 115, 0, 0, 705, 706, 5, 117, 0, 0, 706, 707, 5, 98, 0, 0, 707, 146, 1, 0, 0, 0, 708, 709, 5, 102, 0, 0, 709, 710, 5, 112, 0, 0, 710, 711, 5, 97, 0, 0, 711, 712, 5, 100, 0, 0, 712, 713, 5, 100, 0, 0, 713, 715, 1, 0, 0, 0, 714, 716, 3, 171, 85, 0, 715, 714, 1, 0, 0, 0, 715, 716, 1, 0, 0, 0, 716, 148, 1, 0, 0, 0, 717, 718, 5, 102, 0, 0, 718, 719, 5, 112, 0, 0, 719, 720, 5, 109, 0, 0, 720, 721, 5, 117, 0, 0, 721, 722, 5, 108, 0, 0, 722, 150, 1, 0, 0, 0, 723, 724, 5, 102, 0, 0, 724, 725, 5, 112, 0, 0, 725, 726, 5, 100, 0, 0, 726, 727, 5, 105, 0, 0, 727, 728, 5, 118, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 3, 171, 85, 0, 730, 152, 1, 0, 0, 0, 731, 732, 5, 102, 0, 0, 732, 733, 5, 112, 0, 0, 733, 734, 5, 112, 0, 0, 734, 735, 5, 111, 0, 0, 735, 736, 5, 115, 0, 0, 736, 154, 1, 0, 0, 0, 737, 738, 5, 102, 0, 0, 738, 739, 5, 112, 0, 0, 739, 740, 5, 110, 0, 0, 740, 741, 5, 101, 0, 0, 741, 742, 5, 103, 0, 0, 742, 156, 1, 0, 0, 0, 743, 744, 5, 116, 0, 0, 744, 745, 5, 114, 0, 0, 745, 746, 5, 117, 0, 0, 746, 747, 5, 101, 0, 0, 747, 158, 1, 0, 0, 0, 748, 749, 5, 114, 0, 0, 749, 750, 5, 101, 0, 0, 750, 751, 5, 97, 0, 0, 751, 752, 5, 100, 0, 0, 752, 160, 1, 0, 0, 0, 753, 754, 5, 119, 0, 0, 754, 755, 5, 114, 0, 0, 755, 756, 5, 105, 0, 0, 756, 757, 5, 116, 0, 0, 757, 758, 5, 101, 0, 0, 758, 162, 1, 0, 0, 0, 759, 760, 5, 112, 0, 0, 760, 761, 5, 114, 0, 0, 761, 762, 5, 105, 0, 0, 762, 763, 5, 109, 0, 0, 763, 764, 5, 101, 0, 0, 764, 164, 1, 0, 0, 0, 765, 766, 5, 101, 0, 0, 766, 767, 5, 120, 0, 0, 767, 768, 5, 116, 0, 0, 768, 769, 5, 114, 0, 0, 769, 770, 5, 97, 0, 0, 770, 771, 5, 99, 0, 0, 771, 772, 5, 116, 0, 0, 772, 166, 1, 0, 0, 0, 773, 774, 3, 207, 103, 0, 774, 775, 3, 189, 94, 0, 775, 776, 5, 39, 0, 0, 776, 777, 7, 0, 0, 0, 777, 778, 3, 209, 104, 0, 778, 168, 1, 0, 0, 0, 779, 780, 3, 207, 103, 0, 780, 781, 3, 189, 94, 0, 781, 782, 3, 215, 107, 0, 782, 783, 3, 189, 94, 0, 783, 784, 3, 209, 104, 0, 784, 170, 1, 0, 0, 0, 785, 786, 5, 91, 0, 0, 786, 787, 5, 114, 0, 0, 787, 788, 5, 110, 0, 0, 788, 789, 5, 101, 0, 0, 789, 811, 5, 93, 0, 0, 790, 791, 5, 91, 0, 0, 791, 792, 5, 114, 0, 0, 792, 793, 5, 110, 0, 0, 793, 794, 5, 97, 0, 0, 794, 811, 5, 93, 0, 0, 795, 796, 5, 91, 0, 0, 796, 797, 5, 114, 0, 0, 797, 798, 5, 116, 0, 0, 798, 799, 5, 112, 0, 0, 799, 811, 5, 93, 0, 0, 800, 801, 5, 91, 0, 0, 801, 802, 5, 114, 0, 0, 802, 803, 5, 116, 0, 0, 803, 804, 5, 110, 0, 0, 804, 811, 5, 93, 0, 0, 805, 806, 5, 91, 0, 0, 806, 807, 5, 114, 0, 0, 807, 808, 5, 116, 0, 0, 808, 809, 5, 122, 0, 0, 809, 811, 5, 93, 0, 0, 810, 785, 1, 0, 0, 0, 810, 790, 1, 0, 0, 0, 810, 795, 1, 0, 0, 0, 810, 800, 1, 0, 0, 0, 810, 805, 1, 0, 0, 0, 811, 172, 1, 0, 0, 0, 812, 813, 5, 102, 0, 0, 813, 814, 5, 97, 0, 0, 814, 815, 5, 108, 0, 0, 815, 816, 5, 115, 0, 0, 816, 817, 5, 101, 0, 0, 817, 174, 1, 0, 0, 0, 818, 819, 5, 100, 0, 0, 819, 820, 5, 101, 0, 0, 820, 821, 5, 102, 0, 0, 821, 822, 5, 97, 0, 0, 822, 823, 5, 117, 0, 0, 823, 824, 5, 108, 0, 0, 824, 825, 5, 116, 0, 0, 825, 176, 1, 0, 0, 0, 826, 827, 5, 97, 0, 0, 827, 828, 5, 115, 0, 0, 828, 829, 5, 115, 0, 0, 829, 830, 5, 105, 0, 0, 830, 831, 5, 103, 0, 0, 831, 832, 5, 110, 0, 0, 832, 178, 1, 0, 0, 0, 833, 834, 5, 104, 0, 0, 834, 835, 5, 97, 0, 0, 835, 836, 5, 118, 0, 0, 836, 837, 5, 111, 0, 0, 837, 838, 5, 99, 0, 0, 838, 180, 1, 0, 0, 0, 839, 840, 5, 97, 0, 0, 840, 841, 5, 115, 0, 0, 841, 842, 5, 115, 0, 0, 842, 843, 5, 117, 0, 0, 843, 844, 5, 109, 0, 0, 844, 845, 5, 101, 0, 0, 845, 182, 1, 0, 0, 0, 846, 847, 5, 114, 0, 0, 847, 848, 5, 101, 0, 0, 848, 849, 5, 116, 0, 0, 849, 850, 5, 117, 0, 0, 850, 851, 5, 114, 0, 0, 851, 852, 5, 110, 0, 0, 852, 184, 1, 0, 0, 0, 853, 854, 3, 189, 94, 0, 854, 855, 5, 39, 0, 0, 855, 856, 5, 98, 0, 0, 856, 858, 1, 0, 0, 0, 857, 859, 7, 1, 0, 0, 858, 857, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 858, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 898, 1, 0, 0, 0, 862, 863, 5, 35, 0, 0, 863, 864, 5, 98, 0, 0, 864, 866, 1, 0, 0, 0, 865, 867, 7, 1, 0, 0, 866, 865, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 866, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 898, 1, 0, 0, 0, 870, 871, 5, 35, 0, 0, 871, 872, 5, 120, 0, 0, 872, 874, 1, 0, 0, 0, 873, 875, 7, 1, 0, 0, 874, 873, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 874, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 898, 1, 0, 0, 0, 878, 879, 3, 189, 94, 0, 879, 880, 5, 39, 0, 0, 880, 881, 5, 100, 0, 0, 881, 884, 1, 0, 0, 0, 882, 885, 3, 51, 25, 0, 883, 885, 3, 53, 26, 0, 884, 882, 1, 0, 0, 0, 884, 883, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 1, 0, 0, 0, 886, 887, 3, 187, 93, 0, 887, 898, 1, 0, 0, 0, 888, 889, 3, 189, 94, 0, 889, 890, 5, 39, 0, 0, 890, 891, 5, 120, 0, 0, 891, 893, 1, 0, 0, 0, 892, 894, 7, 2, 0, 0, 893, 892, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 893, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 898, 1, 0, 0, 0, 897, 853, 1, 0, 0, 0, 897, 862, 1, 0, 0, 0, 897, 870, 1, 0, 0, 0, 897, 878, 1, 0, 0, 0, 897, 888, 1, 0, 0, 0, 898, 186, 1, 0, 0, 0, 899, 901, 3, 191, 95, 0, 900, 899, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 1, 0, 0, 0, 902, 903, 3, 189, 94, 0, 903, 188, 1, 0, 0, 0, 904, 906, 3, 199, 99, 0, 905, 904, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 905, 1, 0, 0, 0, 907, 908, 1, 0, 0, 0, 908, 190, 1, 0, 0, 0, 909, 912, 3, 51, 25, 0, 910, 912, 3, 53, 26, 0, 911, 909, 1, 0, 0, 0, 911, 910, 1, 0, 0, 0, 912, 192, 1, 0, 0, 0, 913, 914, 5, 46, 0, 0, 914, 194, 1, 0, 0, 0, 915, 918, 3, 201, 100, 0, 916, 918, 3, 197, 98, 0, 917, 915, 1, 0, 0, 0, 917, 916, 1, 0, 0, 0, 918, 926, 1, 0, 0, 0, 919, 925, 3, 201, 100, 0, 920, 925, 3, 197, 98, 0, 921, 925, 5, 36, 0, 0, 922, 925, 3, 199, 99, 0, 923, 925, 3, 217, 108, 0, 924, 919, 1, 0, 0, 0, 924, 920, 1, 0, 0, 0, 924, 921, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 923, 1, 0, 0, 0, 925, 928, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 196, 1, 0, 0, 0, 928, 926, 1, 0, 0, 0, 929, 930, 5, 95, 0, 0, 930, 198, 1, 0, 0, 0, 931, 932, 7, 3, 0, 0, 932, 200, 1, 0, 0, 0, 933, 934, 7, 4, 0, 0, 934, 202, 1, 0, 0, 0, 935, 936, 5, 40, 0, 0, 936, 204, 1, 0, 0, 0, 937, 938, 5, 41, 0, 0, 938, 206, 1, 0, 0, 0, 939, 940, 5, 91, 0, 0, 940, 208, 1, 0, 0, 0, 941, 942, 5, 93, 0, 0, 942, 210, 1, 0, 0, 0, 943, 944, 5, 123, 0, 0, 944, 212, 1, 0, 0, 0, 945, 946, 5, 125, 0, 0, 946, 214, 1, 0, 0, 0, 947, 948, 5, 44, 0, 0, 948, 216, 1, 0, 0, 0, 949, 950, 5, 58, 0, 0, 950, 218, 1, 0, 0, 0, 951, 952, 5, 59, 0, 0, 952, 220, 1, 0, 0, 0, 953, 954, 5, 39, 0, 0, 954, 222, 1, 0, 0, 0, 955, 956, 5, 60, 0, 0, 956, 957, 5, 45, 0, 0, 957, 224, 1, 0, 0, 0, 958, 959, 5, 45, 0, 0, 959, 960, 5, 62, 0, 0, 960, 226, 1, 0, 0, 0, 961, 963, 7, 5, 0, 0, 962, 961, 1, 0, 0, 0, 963, 964, 1, 0, 0, 0, 964, 962, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 967, 6, 113, 0, 0, 967, 228, 1, 0, 0, 0, 968, 969, 5, 47, 0, 0, 969, 970, 5, 42, 0, 0, 970, 974, 1, 0, 0, 0, 971, 973, 9, 0, 0, 0, 972, 971, 1, 0, 0, 0, 973, 976, 1, 0, 0, 0, 974, 975, 1, 0, 0, 0, 974, 972, 1, 0, 0, 0, 975, 977, 1, 0, 0, 0, 976, 974, 1, 0, 0, 0, 977, 978, 5, 42, 0, 0, 978, 979, 5, 47, 0, 0, 979, 980, 1, 0, 0, 0, 980, 981, 6, 114, 0, 0, 981, 230, 1, 0, 0, 0, 982, 983, 5, 47, 0, 0, 983, 984, 5, 47, 0, 0, 984, 988, 1, 0, 0, 0, 985, 987, 8, 6, 0, 0, 986, 985, 1, 0, 0, 0, 987, 990, 1, 0, 0, 0, 988, 986, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 991, 1, 0, 0, 0, 990, 988, 1, 0, 0, 0, 991, 992, 6, 115, 0, 0, 992, 232, 1, 0, 0, 0, 30, 0, 245, 256, 267, 275, 283, 297, 314, 626, 668, 678, 689, 700, 715, 810, 860, 868, 876, 884, 895, 897, 900, 907, 911, 917, 924, 926, 964, 974, 988, 1, 6, 0, 0] \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/ExprLexer.java b/subprojects/common/grammar/src/main/gen/ExprLexer.java new file mode 100644 index 0000000000..096b5c7027 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/ExprLexer.java @@ -0,0 +1,770 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Expr.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class ExprLexer extends Lexer { + static { RuntimeMetaData.checkVersion("4.10.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + BOOLTYPE=1, INTTYPE=2, RATTYPE=3, BVTYPE=4, FPTYPE=5, FUNC=6, ARRAY=7, + IF=8, THEN=9, ELSE=10, IFF=11, ITE=12, IMPLY=13, FORALL=14, EXISTS=15, + OR=16, AND=17, XOR=18, NOT=19, EQ=20, NEQ=21, LT=22, LEQ=23, GT=24, GEQ=25, + PLUS=26, MINUS=27, MUL=28, DIV=29, MOD=30, REM=31, PERCENT=32, BV_CONCAT=33, + BV_ZERO_EXTEND=34, BV_SIGN_EXTEND=35, BV_ADD=36, BV_SUB=37, BV_POS=38, + BV_NEG=39, BV_MUL=40, BV_UDIV=41, BV_SDIV=42, BV_SMOD=43, BV_UREM=44, + BV_SREM=45, BV_OR=46, BV_AND=47, BV_XOR=48, BV_NOT=49, BV_SHL=50, BV_ASHR=51, + BV_LSHR=52, BV_ROL=53, BV_ROR=54, BV_ULT=55, BV_ULE=56, BV_UGT=57, BV_UGE=58, + BV_SLT=59, BV_SLE=60, BV_SGT=61, BV_SGE=62, FP_ABS=63, FP_FROM_BV=64, + FP_IS_NAN=65, FPMAX=66, FPMIN=67, FPREM=68, FPROUNDTOINT=69, FPSQRT=70, + FPTOBV=71, FPTOFP=72, FPSUB=73, FPADD=74, FPMUL=75, FPDIV=76, FPPOS=77, + FPNEG=78, TRUE=79, READ=80, WRITE=81, PRIME=82, EXTRACT=83, BV_TYPE_DECL=84, + FP_TYPE_DECL=85, FP_ROUNDINGMODE=86, FALSE=87, DEFAULT=88, ASSIGN=89, + HAVOC=90, ASSUME=91, RETURN=92, BV=93, INT=94, NAT=95, SIGN=96, DOT=97, + ID=98, UNDERSCORE=99, DIGIT=100, LETTER=101, LPAREN=102, RPAREN=103, LBRACK=104, + RBRACK=105, LBRAC=106, RBRAC=107, COMMA=108, COLON=109, SEMICOLON=110, + QUOT=111, LARROW=112, RARROW=113, WS=114, COMMENT=115, LINE_COMMENT=116; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE" + }; + + private static String[] makeRuleNames() { + return new String[] { + "BOOLTYPE", "INTTYPE", "RATTYPE", "BVTYPE", "FPTYPE", "FUNC", "ARRAY", + "IF", "THEN", "ELSE", "IFF", "ITE", "IMPLY", "FORALL", "EXISTS", "OR", + "AND", "XOR", "NOT", "EQ", "NEQ", "LT", "LEQ", "GT", "GEQ", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "REM", "PERCENT", "BV_CONCAT", "BV_ZERO_EXTEND", + "BV_SIGN_EXTEND", "BV_ADD", "BV_SUB", "BV_POS", "BV_NEG", "BV_MUL", "BV_UDIV", + "BV_SDIV", "BV_SMOD", "BV_UREM", "BV_SREM", "BV_OR", "BV_AND", "BV_XOR", + "BV_NOT", "BV_SHL", "BV_ASHR", "BV_LSHR", "BV_ROL", "BV_ROR", "BV_ULT", + "BV_ULE", "BV_UGT", "BV_UGE", "BV_SLT", "BV_SLE", "BV_SGT", "BV_SGE", + "FP_ABS", "FP_FROM_BV", "FP_IS_NAN", "FPMAX", "FPMIN", "FPREM", "FPROUNDTOINT", + "FPSQRT", "FPTOBV", "FPTOFP", "FPSUB", "FPADD", "FPMUL", "FPDIV", "FPPOS", + "FPNEG", "TRUE", "READ", "WRITE", "PRIME", "EXTRACT", "BV_TYPE_DECL", + "FP_TYPE_DECL", "FP_ROUNDINGMODE", "FALSE", "DEFAULT", "ASSIGN", "HAVOC", + "ASSUME", "RETURN", "BV", "INT", "NAT", "SIGN", "DOT", "ID", "UNDERSCORE", + "DIGIT", "LETTER", "LPAREN", "RPAREN", "LBRACK", "RBRACK", "LBRAC", "RBRAC", + "COMMA", "COLON", "SEMICOLON", "QUOT", "LARROW", "RARROW", "WS", "COMMENT", + "LINE_COMMENT" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, "'if'", "'then'", "'else'", + "'iff'", "'ite'", "'=>'", "'forall'", "'exists'", "'or'", "'and'", "'xor'", + "'not'", "'='", "'/='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", + "'div'", "'mod'", "'rem'", "'%'", null, "'bv_zero_extend'", "'bv_sign_extend'", + "'bvadd'", "'bvsub'", "'bvpos'", "'bvneg'", "'bvmul'", "'bvudiv'", "'bvsdiv'", + "'bvsmod'", "'bvurem'", "'bvsrem'", "'bvor'", "'bvand'", "'bvxor'", "'bvnot'", + "'bvshl'", "'bvashr'", "'bvlshr'", "'bvrol'", "'bvror'", "'bvult'", "'bvule'", + "'bvugt'", "'bvuge'", "'bvslt'", "'bvsle'", "'bvsgt'", "'bvsge'", "'fpabs'", + null, "'fpisnan'", "'fpmax'", "'fpmin'", "'fprem'", null, null, null, + null, "'fpsub'", null, "'fpmul'", null, "'fppos'", "'fpneg'", "'true'", + "'read'", "'write'", "'prime'", "'extract'", null, null, null, "'false'", + "'default'", "'assign'", "'havoc'", "'assume'", "'return'", null, null, + null, null, "'.'", null, "'_'", null, null, "'('", "')'", "'['", "']'", + "'{'", "'}'", "','", "':'", "';'", "'''", "'<-'", "'->'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "BOOLTYPE", "INTTYPE", "RATTYPE", "BVTYPE", "FPTYPE", "FUNC", "ARRAY", + "IF", "THEN", "ELSE", "IFF", "ITE", "IMPLY", "FORALL", "EXISTS", "OR", + "AND", "XOR", "NOT", "EQ", "NEQ", "LT", "LEQ", "GT", "GEQ", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "REM", "PERCENT", "BV_CONCAT", "BV_ZERO_EXTEND", + "BV_SIGN_EXTEND", "BV_ADD", "BV_SUB", "BV_POS", "BV_NEG", "BV_MUL", "BV_UDIV", + "BV_SDIV", "BV_SMOD", "BV_UREM", "BV_SREM", "BV_OR", "BV_AND", "BV_XOR", + "BV_NOT", "BV_SHL", "BV_ASHR", "BV_LSHR", "BV_ROL", "BV_ROR", "BV_ULT", + "BV_ULE", "BV_UGT", "BV_UGE", "BV_SLT", "BV_SLE", "BV_SGT", "BV_SGE", + "FP_ABS", "FP_FROM_BV", "FP_IS_NAN", "FPMAX", "FPMIN", "FPREM", "FPROUNDTOINT", + "FPSQRT", "FPTOBV", "FPTOFP", "FPSUB", "FPADD", "FPMUL", "FPDIV", "FPPOS", + "FPNEG", "TRUE", "READ", "WRITE", "PRIME", "EXTRACT", "BV_TYPE_DECL", + "FP_TYPE_DECL", "FP_ROUNDINGMODE", "FALSE", "DEFAULT", "ASSIGN", "HAVOC", + "ASSUME", "RETURN", "BV", "INT", "NAT", "SIGN", "DOT", "ID", "UNDERSCORE", + "DIGIT", "LETTER", "LPAREN", "RPAREN", "LBRACK", "RBRACK", "LBRAC", "RBRAC", + "COMMA", "COLON", "SEMICOLON", "QUOT", "LARROW", "RARROW", "WS", "COMMENT", + "LINE_COMMENT" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public ExprLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "Expr.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + public static final String _serializedATN = + "\u0004\u0000t\u03e1\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001"+ + "\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004"+ + "\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007"+ + "\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b"+ + "\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+ + "\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+ + "\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+ + "\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+ + "\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002"+ + "\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002"+ + "\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007"+ + "!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007"+ + "&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007"+ + "+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u0007"+ + "0\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u0007"+ + "5\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007"+ + ":\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007"+ + "?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007"+ + "D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007"+ + "I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007"+ + "N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007"+ + "S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007"+ + "X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007"+ + "]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007"+ + "b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007"+ + "g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007"+ + "l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007"+ + "q\u0002r\u0007r\u0002s\u0007s\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u00f6\b\u0000\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0003\u0001\u0101\b\u0001\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0003\u0002\u010c\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0003\u0003\u0114\b\u0003\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u011c"+ + "\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0003\u0005\u012a\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ + "\u0006\u013b\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013"+ + "\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a"+ + "\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 "+ + "\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001"+ + "$\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ + "1\u00011\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u0001"+ + "2\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ + "4\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u00015\u00015\u0001"+ + "5\u00015\u00016\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u0001"+ + "7\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ + "9\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001"+ + ":\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001"+ + "<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0003?\u0273\b?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0003D\u029d\bD\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0003E\u02a7\bE\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ + "F\u0001F\u0001F\u0001F\u0003F\u02b2\bF\u0001G\u0001G\u0001G\u0001G\u0001"+ + "G\u0001G\u0001G\u0001G\u0001G\u0003G\u02bd\bG\u0001H\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0003"+ + "I\u02cc\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001"+ + "K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001"+ + "N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001"+ + "P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0003U\u032b\bU\u0001V\u0001V\u0001V\u0001"+ + "V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001"+ + "W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0004\\\u035b\b\\\u000b\\\f\\\u035c\u0001\\\u0001\\"+ + "\u0001\\\u0001\\\u0004\\\u0363\b\\\u000b\\\f\\\u0364\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0004\\\u036b\b\\\u000b\\\f\\\u036c\u0001\\\u0001\\\u0001\\"+ + "\u0001\\\u0001\\\u0001\\\u0003\\\u0375\b\\\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0004\\\u037e\b\\\u000b\\\f\\\u037f\u0003\\"+ + "\u0382\b\\\u0001]\u0003]\u0385\b]\u0001]\u0001]\u0001^\u0004^\u038a\b"+ + "^\u000b^\f^\u038b\u0001_\u0001_\u0003_\u0390\b_\u0001`\u0001`\u0001a\u0001"+ + "a\u0003a\u0396\ba\u0001a\u0001a\u0001a\u0001a\u0001a\u0005a\u039d\ba\n"+ + "a\fa\u03a0\ta\u0001b\u0001b\u0001c\u0001c\u0001d\u0001d\u0001e\u0001e"+ + "\u0001f\u0001f\u0001g\u0001g\u0001h\u0001h\u0001i\u0001i\u0001j\u0001"+ + "j\u0001k\u0001k\u0001l\u0001l\u0001m\u0001m\u0001n\u0001n\u0001o\u0001"+ + "o\u0001o\u0001p\u0001p\u0001p\u0001q\u0004q\u03c3\bq\u000bq\fq\u03c4\u0001"+ + "q\u0001q\u0001r\u0001r\u0001r\u0001r\u0005r\u03cd\br\nr\fr\u03d0\tr\u0001"+ + "r\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0005s\u03db"+ + "\bs\ns\fs\u03de\ts\u0001s\u0001s\u0001\u03ce\u0000t\u0001\u0001\u0003"+ + "\u0002\u0005\u0003\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f\b\u0011"+ + "\t\u0013\n\u0015\u000b\u0017\f\u0019\r\u001b\u000e\u001d\u000f\u001f\u0010"+ + "!\u0011#\u0012%\u0013\'\u0014)\u0015+\u0016-\u0017/\u00181\u00193\u001a"+ + "5\u001b7\u001c9\u001d;\u001e=\u001f? A!C\"E#G$I%K&M\'O(Q)S*U+W,Y-[.]/"+ + "_0a1c2e3g4i5k6m7o8q9s:u;w}?\u007f@\u0081A\u0083B\u0085C\u0087D\u0089"+ + "E\u008bF\u008dG\u008fH\u0091I\u0093J\u0095K\u0097L\u0099M\u009bN\u009d"+ + "O\u009fP\u00a1Q\u00a3R\u00a5S\u00a7T\u00a9U\u00abV\u00adW\u00afX\u00b1"+ + "Y\u00b3Z\u00b5[\u00b7\\\u00b9]\u00bb^\u00bd_\u00bf`\u00c1a\u00c3b\u00c5"+ + "c\u00c7d\u00c9e\u00cbf\u00cdg\u00cfh\u00d1i\u00d3j\u00d5k\u00d7l\u00d9"+ + "m\u00dbn\u00ddo\u00dfp\u00e1q\u00e3r\u00e5s\u00e7t\u0001\u0000\u0007\u0002"+ + "\u0000ssuu\u0001\u000001\u0003\u000009AFaf\u0001\u000009\u0002\u0000A"+ + "Zaz\u0003\u0000\t\n\f\r \u0002\u0000\n\n\r\r\u040e\u0000\u0001\u0001"+ + "\u0000\u0000\u0000\u0000\u0003\u0001\u0000\u0000\u0000\u0000\u0005\u0001"+ + "\u0000\u0000\u0000\u0000\u0007\u0001\u0000\u0000\u0000\u0000\t\u0001\u0000"+ + "\u0000\u0000\u0000\u000b\u0001\u0000\u0000\u0000\u0000\r\u0001\u0000\u0000"+ + "\u0000\u0000\u000f\u0001\u0000\u0000\u0000\u0000\u0011\u0001\u0000\u0000"+ + "\u0000\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015\u0001\u0000\u0000"+ + "\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019\u0001\u0000\u0000"+ + "\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d\u0001\u0000\u0000"+ + "\u0000\u0000\u001f\u0001\u0000\u0000\u0000\u0000!\u0001\u0000\u0000\u0000"+ + "\u0000#\u0001\u0000\u0000\u0000\u0000%\u0001\u0000\u0000\u0000\u0000\'"+ + "\u0001\u0000\u0000\u0000\u0000)\u0001\u0000\u0000\u0000\u0000+\u0001\u0000"+ + "\u0000\u0000\u0000-\u0001\u0000\u0000\u0000\u0000/\u0001\u0000\u0000\u0000"+ + "\u00001\u0001\u0000\u0000\u0000\u00003\u0001\u0000\u0000\u0000\u00005"+ + "\u0001\u0000\u0000\u0000\u00007\u0001\u0000\u0000\u0000\u00009\u0001\u0000"+ + "\u0000\u0000\u0000;\u0001\u0000\u0000\u0000\u0000=\u0001\u0000\u0000\u0000"+ + "\u0000?\u0001\u0000\u0000\u0000\u0000A\u0001\u0000\u0000\u0000\u0000C"+ + "\u0001\u0000\u0000\u0000\u0000E\u0001\u0000\u0000\u0000\u0000G\u0001\u0000"+ + "\u0000\u0000\u0000I\u0001\u0000\u0000\u0000\u0000K\u0001\u0000\u0000\u0000"+ + "\u0000M\u0001\u0000\u0000\u0000\u0000O\u0001\u0000\u0000\u0000\u0000Q"+ + "\u0001\u0000\u0000\u0000\u0000S\u0001\u0000\u0000\u0000\u0000U\u0001\u0000"+ + "\u0000\u0000\u0000W\u0001\u0000\u0000\u0000\u0000Y\u0001\u0000\u0000\u0000"+ + "\u0000[\u0001\u0000\u0000\u0000\u0000]\u0001\u0000\u0000\u0000\u0000_"+ + "\u0001\u0000\u0000\u0000\u0000a\u0001\u0000\u0000\u0000\u0000c\u0001\u0000"+ + "\u0000\u0000\u0000e\u0001\u0000\u0000\u0000\u0000g\u0001\u0000\u0000\u0000"+ + "\u0000i\u0001\u0000\u0000\u0000\u0000k\u0001\u0000\u0000\u0000\u0000m"+ + "\u0001\u0000\u0000\u0000\u0000o\u0001\u0000\u0000\u0000\u0000q\u0001\u0000"+ + "\u0000\u0000\u0000s\u0001\u0000\u0000\u0000\u0000u\u0001\u0000\u0000\u0000"+ + "\u0000w\u0001\u0000\u0000\u0000\u0000y\u0001\u0000\u0000\u0000\u0000{"+ + "\u0001\u0000\u0000\u0000\u0000}\u0001\u0000\u0000\u0000\u0000\u007f\u0001"+ + "\u0000\u0000\u0000\u0000\u0081\u0001\u0000\u0000\u0000\u0000\u0083\u0001"+ + "\u0000\u0000\u0000\u0000\u0085\u0001\u0000\u0000\u0000\u0000\u0087\u0001"+ + "\u0000\u0000\u0000\u0000\u0089\u0001\u0000\u0000\u0000\u0000\u008b\u0001"+ + "\u0000\u0000\u0000\u0000\u008d\u0001\u0000\u0000\u0000\u0000\u008f\u0001"+ + "\u0000\u0000\u0000\u0000\u0091\u0001\u0000\u0000\u0000\u0000\u0093\u0001"+ + "\u0000\u0000\u0000\u0000\u0095\u0001\u0000\u0000\u0000\u0000\u0097\u0001"+ + "\u0000\u0000\u0000\u0000\u0099\u0001\u0000\u0000\u0000\u0000\u009b\u0001"+ + "\u0000\u0000\u0000\u0000\u009d\u0001\u0000\u0000\u0000\u0000\u009f\u0001"+ + "\u0000\u0000\u0000\u0000\u00a1\u0001\u0000\u0000\u0000\u0000\u00a3\u0001"+ + "\u0000\u0000\u0000\u0000\u00a5\u0001\u0000\u0000\u0000\u0000\u00a7\u0001"+ + "\u0000\u0000\u0000\u0000\u00a9\u0001\u0000\u0000\u0000\u0000\u00ab\u0001"+ + "\u0000\u0000\u0000\u0000\u00ad\u0001\u0000\u0000\u0000\u0000\u00af\u0001"+ + "\u0000\u0000\u0000\u0000\u00b1\u0001\u0000\u0000\u0000\u0000\u00b3\u0001"+ + "\u0000\u0000\u0000\u0000\u00b5\u0001\u0000\u0000\u0000\u0000\u00b7\u0001"+ + "\u0000\u0000\u0000\u0000\u00b9\u0001\u0000\u0000\u0000\u0000\u00bb\u0001"+ + "\u0000\u0000\u0000\u0000\u00bd\u0001\u0000\u0000\u0000\u0000\u00bf\u0001"+ + "\u0000\u0000\u0000\u0000\u00c1\u0001\u0000\u0000\u0000\u0000\u00c3\u0001"+ + "\u0000\u0000\u0000\u0000\u00c5\u0001\u0000\u0000\u0000\u0000\u00c7\u0001"+ + "\u0000\u0000\u0000\u0000\u00c9\u0001\u0000\u0000\u0000\u0000\u00cb\u0001"+ + "\u0000\u0000\u0000\u0000\u00cd\u0001\u0000\u0000\u0000\u0000\u00cf\u0001"+ + "\u0000\u0000\u0000\u0000\u00d1\u0001\u0000\u0000\u0000\u0000\u00d3\u0001"+ + "\u0000\u0000\u0000\u0000\u00d5\u0001\u0000\u0000\u0000\u0000\u00d7\u0001"+ + "\u0000\u0000\u0000\u0000\u00d9\u0001\u0000\u0000\u0000\u0000\u00db\u0001"+ + "\u0000\u0000\u0000\u0000\u00dd\u0001\u0000\u0000\u0000\u0000\u00df\u0001"+ + "\u0000\u0000\u0000\u0000\u00e1\u0001\u0000\u0000\u0000\u0000\u00e3\u0001"+ + "\u0000\u0000\u0000\u0000\u00e5\u0001\u0000\u0000\u0000\u0000\u00e7\u0001"+ + "\u0000\u0000\u0000\u0001\u00f5\u0001\u0000\u0000\u0000\u0003\u0100\u0001"+ + "\u0000\u0000\u0000\u0005\u010b\u0001\u0000\u0000\u0000\u0007\u0113\u0001"+ + "\u0000\u0000\u0000\t\u011b\u0001\u0000\u0000\u0000\u000b\u0129\u0001\u0000"+ + "\u0000\u0000\r\u013a\u0001\u0000\u0000\u0000\u000f\u013c\u0001\u0000\u0000"+ + "\u0000\u0011\u013f\u0001\u0000\u0000\u0000\u0013\u0144\u0001\u0000\u0000"+ + "\u0000\u0015\u0149\u0001\u0000\u0000\u0000\u0017\u014d\u0001\u0000\u0000"+ + "\u0000\u0019\u0151\u0001\u0000\u0000\u0000\u001b\u0154\u0001\u0000\u0000"+ + "\u0000\u001d\u015b\u0001\u0000\u0000\u0000\u001f\u0162\u0001\u0000\u0000"+ + "\u0000!\u0165\u0001\u0000\u0000\u0000#\u0169\u0001\u0000\u0000\u0000%"+ + "\u016d\u0001\u0000\u0000\u0000\'\u0171\u0001\u0000\u0000\u0000)\u0173"+ + "\u0001\u0000\u0000\u0000+\u0176\u0001\u0000\u0000\u0000-\u0178\u0001\u0000"+ + "\u0000\u0000/\u017b\u0001\u0000\u0000\u00001\u017d\u0001\u0000\u0000\u0000"+ + "3\u0180\u0001\u0000\u0000\u00005\u0182\u0001\u0000\u0000\u00007\u0184"+ + "\u0001\u0000\u0000\u00009\u0186\u0001\u0000\u0000\u0000;\u018a\u0001\u0000"+ + "\u0000\u0000=\u018e\u0001\u0000\u0000\u0000?\u0192\u0001\u0000\u0000\u0000"+ + "A\u0194\u0001\u0000\u0000\u0000C\u0197\u0001\u0000\u0000\u0000E\u01a6"+ + "\u0001\u0000\u0000\u0000G\u01b5\u0001\u0000\u0000\u0000I\u01bb\u0001\u0000"+ + "\u0000\u0000K\u01c1\u0001\u0000\u0000\u0000M\u01c7\u0001\u0000\u0000\u0000"+ + "O\u01cd\u0001\u0000\u0000\u0000Q\u01d3\u0001\u0000\u0000\u0000S\u01da"+ + "\u0001\u0000\u0000\u0000U\u01e1\u0001\u0000\u0000\u0000W\u01e8\u0001\u0000"+ + "\u0000\u0000Y\u01ef\u0001\u0000\u0000\u0000[\u01f6\u0001\u0000\u0000\u0000"+ + "]\u01fb\u0001\u0000\u0000\u0000_\u0201\u0001\u0000\u0000\u0000a\u0207"+ + "\u0001\u0000\u0000\u0000c\u020d\u0001\u0000\u0000\u0000e\u0213\u0001\u0000"+ + "\u0000\u0000g\u021a\u0001\u0000\u0000\u0000i\u0221\u0001\u0000\u0000\u0000"+ + "k\u0227\u0001\u0000\u0000\u0000m\u022d\u0001\u0000\u0000\u0000o\u0233"+ + "\u0001\u0000\u0000\u0000q\u0239\u0001\u0000\u0000\u0000s\u023f\u0001\u0000"+ + "\u0000\u0000u\u0245\u0001\u0000\u0000\u0000w\u024b\u0001\u0000\u0000\u0000"+ + "y\u0251\u0001\u0000\u0000\u0000{\u0257\u0001\u0000\u0000\u0000}\u025d"+ + "\u0001\u0000\u0000\u0000\u007f\u0263\u0001\u0000\u0000\u0000\u0081\u0274"+ + "\u0001\u0000\u0000\u0000\u0083\u027c\u0001\u0000\u0000\u0000\u0085\u0282"+ + "\u0001\u0000\u0000\u0000\u0087\u0288\u0001\u0000\u0000\u0000\u0089\u028e"+ + "\u0001\u0000\u0000\u0000\u008b\u029e\u0001\u0000\u0000\u0000\u008d\u02a8"+ + "\u0001\u0000\u0000\u0000\u008f\u02b3\u0001\u0000\u0000\u0000\u0091\u02be"+ + "\u0001\u0000\u0000\u0000\u0093\u02c4\u0001\u0000\u0000\u0000\u0095\u02cd"+ + "\u0001\u0000\u0000\u0000\u0097\u02d3\u0001\u0000\u0000\u0000\u0099\u02db"+ + "\u0001\u0000\u0000\u0000\u009b\u02e1\u0001\u0000\u0000\u0000\u009d\u02e7"+ + "\u0001\u0000\u0000\u0000\u009f\u02ec\u0001\u0000\u0000\u0000\u00a1\u02f1"+ + "\u0001\u0000\u0000\u0000\u00a3\u02f7\u0001\u0000\u0000\u0000\u00a5\u02fd"+ + "\u0001\u0000\u0000\u0000\u00a7\u0305\u0001\u0000\u0000\u0000\u00a9\u030b"+ + "\u0001\u0000\u0000\u0000\u00ab\u032a\u0001\u0000\u0000\u0000\u00ad\u032c"+ + "\u0001\u0000\u0000\u0000\u00af\u0332\u0001\u0000\u0000\u0000\u00b1\u033a"+ + "\u0001\u0000\u0000\u0000\u00b3\u0341\u0001\u0000\u0000\u0000\u00b5\u0347"+ + "\u0001\u0000\u0000\u0000\u00b7\u034e\u0001\u0000\u0000\u0000\u00b9\u0381"+ + "\u0001\u0000\u0000\u0000\u00bb\u0384\u0001\u0000\u0000\u0000\u00bd\u0389"+ + "\u0001\u0000\u0000\u0000\u00bf\u038f\u0001\u0000\u0000\u0000\u00c1\u0391"+ + "\u0001\u0000\u0000\u0000\u00c3\u0395\u0001\u0000\u0000\u0000\u00c5\u03a1"+ + "\u0001\u0000\u0000\u0000\u00c7\u03a3\u0001\u0000\u0000\u0000\u00c9\u03a5"+ + "\u0001\u0000\u0000\u0000\u00cb\u03a7\u0001\u0000\u0000\u0000\u00cd\u03a9"+ + "\u0001\u0000\u0000\u0000\u00cf\u03ab\u0001\u0000\u0000\u0000\u00d1\u03ad"+ + "\u0001\u0000\u0000\u0000\u00d3\u03af\u0001\u0000\u0000\u0000\u00d5\u03b1"+ + "\u0001\u0000\u0000\u0000\u00d7\u03b3\u0001\u0000\u0000\u0000\u00d9\u03b5"+ + "\u0001\u0000\u0000\u0000\u00db\u03b7\u0001\u0000\u0000\u0000\u00dd\u03b9"+ + "\u0001\u0000\u0000\u0000\u00df\u03bb\u0001\u0000\u0000\u0000\u00e1\u03be"+ + "\u0001\u0000\u0000\u0000\u00e3\u03c2\u0001\u0000\u0000\u0000\u00e5\u03c8"+ + "\u0001\u0000\u0000\u0000\u00e7\u03d6\u0001\u0000\u0000\u0000\u00e9\u00ea"+ + "\u0005b\u0000\u0000\u00ea\u00eb\u0005o\u0000\u0000\u00eb\u00ec\u0005o"+ + "\u0000\u0000\u00ec\u00f6\u0005l\u0000\u0000\u00ed\u00ee\u0005B\u0000\u0000"+ + "\u00ee\u00ef\u0005o\u0000\u0000\u00ef\u00f0\u0005o\u0000\u0000\u00f0\u00f6"+ + "\u0005l\u0000\u0000\u00f1\u00f2\u0005B\u0000\u0000\u00f2\u00f3\u0005O"+ + "\u0000\u0000\u00f3\u00f4\u0005O\u0000\u0000\u00f4\u00f6\u0005L\u0000\u0000"+ + "\u00f5\u00e9\u0001\u0000\u0000\u0000\u00f5\u00ed\u0001\u0000\u0000\u0000"+ + "\u00f5\u00f1\u0001\u0000\u0000\u0000\u00f6\u0002\u0001\u0000\u0000\u0000"+ + "\u00f7\u00f8\u0005i\u0000\u0000\u00f8\u00f9\u0005n\u0000\u0000\u00f9\u0101"+ + "\u0005t\u0000\u0000\u00fa\u00fb\u0005I\u0000\u0000\u00fb\u00fc\u0005n"+ + "\u0000\u0000\u00fc\u0101\u0005t\u0000\u0000\u00fd\u00fe\u0005I\u0000\u0000"+ + "\u00fe\u00ff\u0005N\u0000\u0000\u00ff\u0101\u0005T\u0000\u0000\u0100\u00f7"+ + "\u0001\u0000\u0000\u0000\u0100\u00fa\u0001\u0000\u0000\u0000\u0100\u00fd"+ + "\u0001\u0000\u0000\u0000\u0101\u0004\u0001\u0000\u0000\u0000\u0102\u0103"+ + "\u0005r\u0000\u0000\u0103\u0104\u0005a\u0000\u0000\u0104\u010c\u0005t"+ + "\u0000\u0000\u0105\u0106\u0005R\u0000\u0000\u0106\u0107\u0005a\u0000\u0000"+ + "\u0107\u010c\u0005t\u0000\u0000\u0108\u0109\u0005R\u0000\u0000\u0109\u010a"+ + "\u0005A\u0000\u0000\u010a\u010c\u0005T\u0000\u0000\u010b\u0102\u0001\u0000"+ + "\u0000\u0000\u010b\u0105\u0001\u0000\u0000\u0000\u010b\u0108\u0001\u0000"+ + "\u0000\u0000\u010c\u0006\u0001\u0000\u0000\u0000\u010d\u010e\u0005b\u0000"+ + "\u0000\u010e\u0114\u0005v\u0000\u0000\u010f\u0110\u0005B\u0000\u0000\u0110"+ + "\u0114\u0005v\u0000\u0000\u0111\u0112\u0005B\u0000\u0000\u0112\u0114\u0005"+ + "V\u0000\u0000\u0113\u010d\u0001\u0000\u0000\u0000\u0113\u010f\u0001\u0000"+ + "\u0000\u0000\u0113\u0111\u0001\u0000\u0000\u0000\u0114\b\u0001\u0000\u0000"+ + "\u0000\u0115\u0116\u0005f\u0000\u0000\u0116\u011c\u0005p\u0000\u0000\u0117"+ + "\u0118\u0005F\u0000\u0000\u0118\u011c\u0005p\u0000\u0000\u0119\u011a\u0005"+ + "F\u0000\u0000\u011a\u011c\u0005P\u0000\u0000\u011b\u0115\u0001\u0000\u0000"+ + "\u0000\u011b\u0117\u0001\u0000\u0000\u0000\u011b\u0119\u0001\u0000\u0000"+ + "\u0000\u011c\n\u0001\u0000\u0000\u0000\u011d\u011e\u0005f\u0000\u0000"+ + "\u011e\u011f\u0005u\u0000\u0000\u011f\u0120\u0005n\u0000\u0000\u0120\u012a"+ + "\u0005c\u0000\u0000\u0121\u0122\u0005F\u0000\u0000\u0122\u0123\u0005u"+ + "\u0000\u0000\u0123\u0124\u0005n\u0000\u0000\u0124\u012a\u0005c\u0000\u0000"+ + "\u0125\u0126\u0005F\u0000\u0000\u0126\u0127\u0005U\u0000\u0000\u0127\u0128"+ + "\u0005N\u0000\u0000\u0128\u012a\u0005C\u0000\u0000\u0129\u011d\u0001\u0000"+ + "\u0000\u0000\u0129\u0121\u0001\u0000\u0000\u0000\u0129\u0125\u0001\u0000"+ + "\u0000\u0000\u012a\f\u0001\u0000\u0000\u0000\u012b\u012c\u0005a\u0000"+ + "\u0000\u012c\u012d\u0005r\u0000\u0000\u012d\u012e\u0005r\u0000\u0000\u012e"+ + "\u012f\u0005a\u0000\u0000\u012f\u013b\u0005y\u0000\u0000\u0130\u0131\u0005"+ + "A\u0000\u0000\u0131\u0132\u0005r\u0000\u0000\u0132\u0133\u0005r\u0000"+ + "\u0000\u0133\u0134\u0005a\u0000\u0000\u0134\u013b\u0005y\u0000\u0000\u0135"+ + "\u0136\u0005A\u0000\u0000\u0136\u0137\u0005R\u0000\u0000\u0137\u0138\u0005"+ + "R\u0000\u0000\u0138\u0139\u0005A\u0000\u0000\u0139\u013b\u0005Y\u0000"+ + "\u0000\u013a\u012b\u0001\u0000\u0000\u0000\u013a\u0130\u0001\u0000\u0000"+ + "\u0000\u013a\u0135\u0001\u0000\u0000\u0000\u013b\u000e\u0001\u0000\u0000"+ + "\u0000\u013c\u013d\u0005i\u0000\u0000\u013d\u013e\u0005f\u0000\u0000\u013e"+ + "\u0010\u0001\u0000\u0000\u0000\u013f\u0140\u0005t\u0000\u0000\u0140\u0141"+ + "\u0005h\u0000\u0000\u0141\u0142\u0005e\u0000\u0000\u0142\u0143\u0005n"+ + "\u0000\u0000\u0143\u0012\u0001\u0000\u0000\u0000\u0144\u0145\u0005e\u0000"+ + "\u0000\u0145\u0146\u0005l\u0000\u0000\u0146\u0147\u0005s\u0000\u0000\u0147"+ + "\u0148\u0005e\u0000\u0000\u0148\u0014\u0001\u0000\u0000\u0000\u0149\u014a"+ + "\u0005i\u0000\u0000\u014a\u014b\u0005f\u0000\u0000\u014b\u014c\u0005f"+ + "\u0000\u0000\u014c\u0016\u0001\u0000\u0000\u0000\u014d\u014e\u0005i\u0000"+ + "\u0000\u014e\u014f\u0005t\u0000\u0000\u014f\u0150\u0005e\u0000\u0000\u0150"+ + "\u0018\u0001\u0000\u0000\u0000\u0151\u0152\u0005=\u0000\u0000\u0152\u0153"+ + "\u0005>\u0000\u0000\u0153\u001a\u0001\u0000\u0000\u0000\u0154\u0155\u0005"+ + "f\u0000\u0000\u0155\u0156\u0005o\u0000\u0000\u0156\u0157\u0005r\u0000"+ + "\u0000\u0157\u0158\u0005a\u0000\u0000\u0158\u0159\u0005l\u0000\u0000\u0159"+ + "\u015a\u0005l\u0000\u0000\u015a\u001c\u0001\u0000\u0000\u0000\u015b\u015c"+ + "\u0005e\u0000\u0000\u015c\u015d\u0005x\u0000\u0000\u015d\u015e\u0005i"+ + "\u0000\u0000\u015e\u015f\u0005s\u0000\u0000\u015f\u0160\u0005t\u0000\u0000"+ + "\u0160\u0161\u0005s\u0000\u0000\u0161\u001e\u0001\u0000\u0000\u0000\u0162"+ + "\u0163\u0005o\u0000\u0000\u0163\u0164\u0005r\u0000\u0000\u0164 \u0001"+ + "\u0000\u0000\u0000\u0165\u0166\u0005a\u0000\u0000\u0166\u0167\u0005n\u0000"+ + "\u0000\u0167\u0168\u0005d\u0000\u0000\u0168\"\u0001\u0000\u0000\u0000"+ + "\u0169\u016a\u0005x\u0000\u0000\u016a\u016b\u0005o\u0000\u0000\u016b\u016c"+ + "\u0005r\u0000\u0000\u016c$\u0001\u0000\u0000\u0000\u016d\u016e\u0005n"+ + "\u0000\u0000\u016e\u016f\u0005o\u0000\u0000\u016f\u0170\u0005t\u0000\u0000"+ + "\u0170&\u0001\u0000\u0000\u0000\u0171\u0172\u0005=\u0000\u0000\u0172("+ + "\u0001\u0000\u0000\u0000\u0173\u0174\u0005/\u0000\u0000\u0174\u0175\u0005"+ + "=\u0000\u0000\u0175*\u0001\u0000\u0000\u0000\u0176\u0177\u0005<\u0000"+ + "\u0000\u0177,\u0001\u0000\u0000\u0000\u0178\u0179\u0005<\u0000\u0000\u0179"+ + "\u017a\u0005=\u0000\u0000\u017a.\u0001\u0000\u0000\u0000\u017b\u017c\u0005"+ + ">\u0000\u0000\u017c0\u0001\u0000\u0000\u0000\u017d\u017e\u0005>\u0000"+ + "\u0000\u017e\u017f\u0005=\u0000\u0000\u017f2\u0001\u0000\u0000\u0000\u0180"+ + "\u0181\u0005+\u0000\u0000\u01814\u0001\u0000\u0000\u0000\u0182\u0183\u0005"+ + "-\u0000\u0000\u01836\u0001\u0000\u0000\u0000\u0184\u0185\u0005*\u0000"+ + "\u0000\u01858\u0001\u0000\u0000\u0000\u0186\u0187\u0005d\u0000\u0000\u0187"+ + "\u0188\u0005i\u0000\u0000\u0188\u0189\u0005v\u0000\u0000\u0189:\u0001"+ + "\u0000\u0000\u0000\u018a\u018b\u0005m\u0000\u0000\u018b\u018c\u0005o\u0000"+ + "\u0000\u018c\u018d\u0005d\u0000\u0000\u018d<\u0001\u0000\u0000\u0000\u018e"+ + "\u018f\u0005r\u0000\u0000\u018f\u0190\u0005e\u0000\u0000\u0190\u0191\u0005"+ + "m\u0000\u0000\u0191>\u0001\u0000\u0000\u0000\u0192\u0193\u0005%\u0000"+ + "\u0000\u0193@\u0001\u0000\u0000\u0000\u0194\u0195\u00033\u0019\u0000\u0195"+ + "\u0196\u00033\u0019\u0000\u0196B\u0001\u0000\u0000\u0000\u0197\u0198\u0005"+ + "b\u0000\u0000\u0198\u0199\u0005v\u0000\u0000\u0199\u019a\u0005_\u0000"+ + "\u0000\u019a\u019b\u0005z\u0000\u0000\u019b\u019c\u0005e\u0000\u0000\u019c"+ + "\u019d\u0005r\u0000\u0000\u019d\u019e\u0005o\u0000\u0000\u019e\u019f\u0005"+ + "_\u0000\u0000\u019f\u01a0\u0005e\u0000\u0000\u01a0\u01a1\u0005x\u0000"+ + "\u0000\u01a1\u01a2\u0005t\u0000\u0000\u01a2\u01a3\u0005e\u0000\u0000\u01a3"+ + "\u01a4\u0005n\u0000\u0000\u01a4\u01a5\u0005d\u0000\u0000\u01a5D\u0001"+ + "\u0000\u0000\u0000\u01a6\u01a7\u0005b\u0000\u0000\u01a7\u01a8\u0005v\u0000"+ + "\u0000\u01a8\u01a9\u0005_\u0000\u0000\u01a9\u01aa\u0005s\u0000\u0000\u01aa"+ + "\u01ab\u0005i\u0000\u0000\u01ab\u01ac\u0005g\u0000\u0000\u01ac\u01ad\u0005"+ + "n\u0000\u0000\u01ad\u01ae\u0005_\u0000\u0000\u01ae\u01af\u0005e\u0000"+ + "\u0000\u01af\u01b0\u0005x\u0000\u0000\u01b0\u01b1\u0005t\u0000\u0000\u01b1"+ + "\u01b2\u0005e\u0000\u0000\u01b2\u01b3\u0005n\u0000\u0000\u01b3\u01b4\u0005"+ + "d\u0000\u0000\u01b4F\u0001\u0000\u0000\u0000\u01b5\u01b6\u0005b\u0000"+ + "\u0000\u01b6\u01b7\u0005v\u0000\u0000\u01b7\u01b8\u0005a\u0000\u0000\u01b8"+ + "\u01b9\u0005d\u0000\u0000\u01b9\u01ba\u0005d\u0000\u0000\u01baH\u0001"+ + "\u0000\u0000\u0000\u01bb\u01bc\u0005b\u0000\u0000\u01bc\u01bd\u0005v\u0000"+ + "\u0000\u01bd\u01be\u0005s\u0000\u0000\u01be\u01bf\u0005u\u0000\u0000\u01bf"+ + "\u01c0\u0005b\u0000\u0000\u01c0J\u0001\u0000\u0000\u0000\u01c1\u01c2\u0005"+ + "b\u0000\u0000\u01c2\u01c3\u0005v\u0000\u0000\u01c3\u01c4\u0005p\u0000"+ + "\u0000\u01c4\u01c5\u0005o\u0000\u0000\u01c5\u01c6\u0005s\u0000\u0000\u01c6"+ + "L\u0001\u0000\u0000\u0000\u01c7\u01c8\u0005b\u0000\u0000\u01c8\u01c9\u0005"+ + "v\u0000\u0000\u01c9\u01ca\u0005n\u0000\u0000\u01ca\u01cb\u0005e\u0000"+ + "\u0000\u01cb\u01cc\u0005g\u0000\u0000\u01ccN\u0001\u0000\u0000\u0000\u01cd"+ + "\u01ce\u0005b\u0000\u0000\u01ce\u01cf\u0005v\u0000\u0000\u01cf\u01d0\u0005"+ + "m\u0000\u0000\u01d0\u01d1\u0005u\u0000\u0000\u01d1\u01d2\u0005l\u0000"+ + "\u0000\u01d2P\u0001\u0000\u0000\u0000\u01d3\u01d4\u0005b\u0000\u0000\u01d4"+ + "\u01d5\u0005v\u0000\u0000\u01d5\u01d6\u0005u\u0000\u0000\u01d6\u01d7\u0005"+ + "d\u0000\u0000\u01d7\u01d8\u0005i\u0000\u0000\u01d8\u01d9\u0005v\u0000"+ + "\u0000\u01d9R\u0001\u0000\u0000\u0000\u01da\u01db\u0005b\u0000\u0000\u01db"+ + "\u01dc\u0005v\u0000\u0000\u01dc\u01dd\u0005s\u0000\u0000\u01dd\u01de\u0005"+ + "d\u0000\u0000\u01de\u01df\u0005i\u0000\u0000\u01df\u01e0\u0005v\u0000"+ + "\u0000\u01e0T\u0001\u0000\u0000\u0000\u01e1\u01e2\u0005b\u0000\u0000\u01e2"+ + "\u01e3\u0005v\u0000\u0000\u01e3\u01e4\u0005s\u0000\u0000\u01e4\u01e5\u0005"+ + "m\u0000\u0000\u01e5\u01e6\u0005o\u0000\u0000\u01e6\u01e7\u0005d\u0000"+ + "\u0000\u01e7V\u0001\u0000\u0000\u0000\u01e8\u01e9\u0005b\u0000\u0000\u01e9"+ + "\u01ea\u0005v\u0000\u0000\u01ea\u01eb\u0005u\u0000\u0000\u01eb\u01ec\u0005"+ + "r\u0000\u0000\u01ec\u01ed\u0005e\u0000\u0000\u01ed\u01ee\u0005m\u0000"+ + "\u0000\u01eeX\u0001\u0000\u0000\u0000\u01ef\u01f0\u0005b\u0000\u0000\u01f0"+ + "\u01f1\u0005v\u0000\u0000\u01f1\u01f2\u0005s\u0000\u0000\u01f2\u01f3\u0005"+ + "r\u0000\u0000\u01f3\u01f4\u0005e\u0000\u0000\u01f4\u01f5\u0005m\u0000"+ + "\u0000\u01f5Z\u0001\u0000\u0000\u0000\u01f6\u01f7\u0005b\u0000\u0000\u01f7"+ + "\u01f8\u0005v\u0000\u0000\u01f8\u01f9\u0005o\u0000\u0000\u01f9\u01fa\u0005"+ + "r\u0000\u0000\u01fa\\\u0001\u0000\u0000\u0000\u01fb\u01fc\u0005b\u0000"+ + "\u0000\u01fc\u01fd\u0005v\u0000\u0000\u01fd\u01fe\u0005a\u0000\u0000\u01fe"+ + "\u01ff\u0005n\u0000\u0000\u01ff\u0200\u0005d\u0000\u0000\u0200^\u0001"+ + "\u0000\u0000\u0000\u0201\u0202\u0005b\u0000\u0000\u0202\u0203\u0005v\u0000"+ + "\u0000\u0203\u0204\u0005x\u0000\u0000\u0204\u0205\u0005o\u0000\u0000\u0205"+ + "\u0206\u0005r\u0000\u0000\u0206`\u0001\u0000\u0000\u0000\u0207\u0208\u0005"+ + "b\u0000\u0000\u0208\u0209\u0005v\u0000\u0000\u0209\u020a\u0005n\u0000"+ + "\u0000\u020a\u020b\u0005o\u0000\u0000\u020b\u020c\u0005t\u0000\u0000\u020c"+ + "b\u0001\u0000\u0000\u0000\u020d\u020e\u0005b\u0000\u0000\u020e\u020f\u0005"+ + "v\u0000\u0000\u020f\u0210\u0005s\u0000\u0000\u0210\u0211\u0005h\u0000"+ + "\u0000\u0211\u0212\u0005l\u0000\u0000\u0212d\u0001\u0000\u0000\u0000\u0213"+ + "\u0214\u0005b\u0000\u0000\u0214\u0215\u0005v\u0000\u0000\u0215\u0216\u0005"+ + "a\u0000\u0000\u0216\u0217\u0005s\u0000\u0000\u0217\u0218\u0005h\u0000"+ + "\u0000\u0218\u0219\u0005r\u0000\u0000\u0219f\u0001\u0000\u0000\u0000\u021a"+ + "\u021b\u0005b\u0000\u0000\u021b\u021c\u0005v\u0000\u0000\u021c\u021d\u0005"+ + "l\u0000\u0000\u021d\u021e\u0005s\u0000\u0000\u021e\u021f\u0005h\u0000"+ + "\u0000\u021f\u0220\u0005r\u0000\u0000\u0220h\u0001\u0000\u0000\u0000\u0221"+ + "\u0222\u0005b\u0000\u0000\u0222\u0223\u0005v\u0000\u0000\u0223\u0224\u0005"+ + "r\u0000\u0000\u0224\u0225\u0005o\u0000\u0000\u0225\u0226\u0005l\u0000"+ + "\u0000\u0226j\u0001\u0000\u0000\u0000\u0227\u0228\u0005b\u0000\u0000\u0228"+ + "\u0229\u0005v\u0000\u0000\u0229\u022a\u0005r\u0000\u0000\u022a\u022b\u0005"+ + "o\u0000\u0000\u022b\u022c\u0005r\u0000\u0000\u022cl\u0001\u0000\u0000"+ + "\u0000\u022d\u022e\u0005b\u0000\u0000\u022e\u022f\u0005v\u0000\u0000\u022f"+ + "\u0230\u0005u\u0000\u0000\u0230\u0231\u0005l\u0000\u0000\u0231\u0232\u0005"+ + "t\u0000\u0000\u0232n\u0001\u0000\u0000\u0000\u0233\u0234\u0005b\u0000"+ + "\u0000\u0234\u0235\u0005v\u0000\u0000\u0235\u0236\u0005u\u0000\u0000\u0236"+ + "\u0237\u0005l\u0000\u0000\u0237\u0238\u0005e\u0000\u0000\u0238p\u0001"+ + "\u0000\u0000\u0000\u0239\u023a\u0005b\u0000\u0000\u023a\u023b\u0005v\u0000"+ + "\u0000\u023b\u023c\u0005u\u0000\u0000\u023c\u023d\u0005g\u0000\u0000\u023d"+ + "\u023e\u0005t\u0000\u0000\u023er\u0001\u0000\u0000\u0000\u023f\u0240\u0005"+ + "b\u0000\u0000\u0240\u0241\u0005v\u0000\u0000\u0241\u0242\u0005u\u0000"+ + "\u0000\u0242\u0243\u0005g\u0000\u0000\u0243\u0244\u0005e\u0000\u0000\u0244"+ + "t\u0001\u0000\u0000\u0000\u0245\u0246\u0005b\u0000\u0000\u0246\u0247\u0005"+ + "v\u0000\u0000\u0247\u0248\u0005s\u0000\u0000\u0248\u0249\u0005l\u0000"+ + "\u0000\u0249\u024a\u0005t\u0000\u0000\u024av\u0001\u0000\u0000\u0000\u024b"+ + "\u024c\u0005b\u0000\u0000\u024c\u024d\u0005v\u0000\u0000\u024d\u024e\u0005"+ + "s\u0000\u0000\u024e\u024f\u0005l\u0000\u0000\u024f\u0250\u0005e\u0000"+ + "\u0000\u0250x\u0001\u0000\u0000\u0000\u0251\u0252\u0005b\u0000\u0000\u0252"+ + "\u0253\u0005v\u0000\u0000\u0253\u0254\u0005s\u0000\u0000\u0254\u0255\u0005"+ + "g\u0000\u0000\u0255\u0256\u0005t\u0000\u0000\u0256z\u0001\u0000\u0000"+ + "\u0000\u0257\u0258\u0005b\u0000\u0000\u0258\u0259\u0005v\u0000\u0000\u0259"+ + "\u025a\u0005s\u0000\u0000\u025a\u025b\u0005g\u0000\u0000\u025b\u025c\u0005"+ + "e\u0000\u0000\u025c|\u0001\u0000\u0000\u0000\u025d\u025e\u0005f\u0000"+ + "\u0000\u025e\u025f\u0005p\u0000\u0000\u025f\u0260\u0005a\u0000\u0000\u0260"+ + "\u0261\u0005b\u0000\u0000\u0261\u0262\u0005s\u0000\u0000\u0262~\u0001"+ + "\u0000\u0000\u0000\u0263\u0264\u0005f\u0000\u0000\u0264\u0265\u0005p\u0000"+ + "\u0000\u0265\u0266\u0005f\u0000\u0000\u0266\u0267\u0005r\u0000\u0000\u0267"+ + "\u0268\u0005o\u0000\u0000\u0268\u0269\u0005m\u0000\u0000\u0269\u026a\u0005"+ + "b\u0000\u0000\u026a\u026b\u0005v\u0000\u0000\u026b\u026c\u0001\u0000\u0000"+ + "\u0000\u026c\u026d\u0003\u00a9T\u0000\u026d\u026e\u0003\u00cfg\u0000\u026e"+ + "\u026f\u0007\u0000\u0000\u0000\u026f\u0270\u0003\u00d1h\u0000\u0270\u0272"+ + "\u0001\u0000\u0000\u0000\u0271\u0273\u0003\u00abU\u0000\u0272\u0271\u0001"+ + "\u0000\u0000\u0000\u0272\u0273\u0001\u0000\u0000\u0000\u0273\u0080\u0001"+ + "\u0000\u0000\u0000\u0274\u0275\u0005f\u0000\u0000\u0275\u0276\u0005p\u0000"+ + "\u0000\u0276\u0277\u0005i\u0000\u0000\u0277\u0278\u0005s\u0000\u0000\u0278"+ + "\u0279\u0005n\u0000\u0000\u0279\u027a\u0005a\u0000\u0000\u027a\u027b\u0005"+ + "n\u0000\u0000\u027b\u0082\u0001\u0000\u0000\u0000\u027c\u027d\u0005f\u0000"+ + "\u0000\u027d\u027e\u0005p\u0000\u0000\u027e\u027f\u0005m\u0000\u0000\u027f"+ + "\u0280\u0005a\u0000\u0000\u0280\u0281\u0005x\u0000\u0000\u0281\u0084\u0001"+ + "\u0000\u0000\u0000\u0282\u0283\u0005f\u0000\u0000\u0283\u0284\u0005p\u0000"+ + "\u0000\u0284\u0285\u0005m\u0000\u0000\u0285\u0286\u0005i\u0000\u0000\u0286"+ + "\u0287\u0005n\u0000\u0000\u0287\u0086\u0001\u0000\u0000\u0000\u0288\u0289"+ + "\u0005f\u0000\u0000\u0289\u028a\u0005p\u0000\u0000\u028a\u028b\u0005r"+ + "\u0000\u0000\u028b\u028c\u0005e\u0000\u0000\u028c\u028d\u0005m\u0000\u0000"+ + "\u028d\u0088\u0001\u0000\u0000\u0000\u028e\u028f\u0005f\u0000\u0000\u028f"+ + "\u0290\u0005p\u0000\u0000\u0290\u0291\u0005r\u0000\u0000\u0291\u0292\u0005"+ + "o\u0000\u0000\u0292\u0293\u0005u\u0000\u0000\u0293\u0294\u0005n\u0000"+ + "\u0000\u0294\u0295\u0005d\u0000\u0000\u0295\u0296\u0005t\u0000\u0000\u0296"+ + "\u0297\u0005o\u0000\u0000\u0297\u0298\u0005i\u0000\u0000\u0298\u0299\u0005"+ + "n\u0000\u0000\u0299\u029a\u0005t\u0000\u0000\u029a\u029c\u0001\u0000\u0000"+ + "\u0000\u029b\u029d\u0003\u00abU\u0000\u029c\u029b\u0001\u0000\u0000\u0000"+ + "\u029c\u029d\u0001\u0000\u0000\u0000\u029d\u008a\u0001\u0000\u0000\u0000"+ + "\u029e\u029f\u0005f\u0000\u0000\u029f\u02a0\u0005p\u0000\u0000\u02a0\u02a1"+ + "\u0005s\u0000\u0000\u02a1\u02a2\u0005q\u0000\u0000\u02a2\u02a3\u0005r"+ + "\u0000\u0000\u02a3\u02a4\u0005t\u0000\u0000\u02a4\u02a6\u0001\u0000\u0000"+ + "\u0000\u02a5\u02a7\u0003\u00abU\u0000\u02a6\u02a5\u0001\u0000\u0000\u0000"+ + "\u02a6\u02a7\u0001\u0000\u0000\u0000\u02a7\u008c\u0001\u0000\u0000\u0000"+ + "\u02a8\u02a9\u0005f\u0000\u0000\u02a9\u02aa\u0005p\u0000\u0000\u02aa\u02ab"+ + "\u0005t\u0000\u0000\u02ab\u02ac\u0005o\u0000\u0000\u02ac\u02ad\u0005b"+ + "\u0000\u0000\u02ad\u02ae\u0005v\u0000\u0000\u02ae\u02af\u0001\u0000\u0000"+ + "\u0000\u02af\u02b1\u0003\u00a7S\u0000\u02b0\u02b2\u0003\u00abU\u0000\u02b1"+ + "\u02b0\u0001\u0000\u0000\u0000\u02b1\u02b2\u0001\u0000\u0000\u0000\u02b2"+ + "\u008e\u0001\u0000\u0000\u0000\u02b3\u02b4\u0005f\u0000\u0000\u02b4\u02b5"+ + "\u0005p\u0000\u0000\u02b5\u02b6\u0005t\u0000\u0000\u02b6\u02b7\u0005o"+ + "\u0000\u0000\u02b7\u02b8\u0005f\u0000\u0000\u02b8\u02b9\u0005p\u0000\u0000"+ + "\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u02bc\u0003\u00a9T\u0000\u02bb"+ + "\u02bd\u0003\u00abU\u0000\u02bc\u02bb\u0001\u0000\u0000\u0000\u02bc\u02bd"+ + "\u0001\u0000\u0000\u0000\u02bd\u0090\u0001\u0000\u0000\u0000\u02be\u02bf"+ + "\u0005f\u0000\u0000\u02bf\u02c0\u0005p\u0000\u0000\u02c0\u02c1\u0005s"+ + "\u0000\u0000\u02c1\u02c2\u0005u\u0000\u0000\u02c2\u02c3\u0005b\u0000\u0000"+ + "\u02c3\u0092\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005f\u0000\u0000\u02c5"+ + "\u02c6\u0005p\u0000\u0000\u02c6\u02c7\u0005a\u0000\u0000\u02c7\u02c8\u0005"+ + "d\u0000\u0000\u02c8\u02c9\u0005d\u0000\u0000\u02c9\u02cb\u0001\u0000\u0000"+ + "\u0000\u02ca\u02cc\u0003\u00abU\u0000\u02cb\u02ca\u0001\u0000\u0000\u0000"+ + "\u02cb\u02cc\u0001\u0000\u0000\u0000\u02cc\u0094\u0001\u0000\u0000\u0000"+ + "\u02cd\u02ce\u0005f\u0000\u0000\u02ce\u02cf\u0005p\u0000\u0000\u02cf\u02d0"+ + "\u0005m\u0000\u0000\u02d0\u02d1\u0005u\u0000\u0000\u02d1\u02d2\u0005l"+ + "\u0000\u0000\u02d2\u0096\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005f\u0000"+ + "\u0000\u02d4\u02d5\u0005p\u0000\u0000\u02d5\u02d6\u0005d\u0000\u0000\u02d6"+ + "\u02d7\u0005i\u0000\u0000\u02d7\u02d8\u0005v\u0000\u0000\u02d8\u02d9\u0001"+ + "\u0000\u0000\u0000\u02d9\u02da\u0003\u00abU\u0000\u02da\u0098\u0001\u0000"+ + "\u0000\u0000\u02db\u02dc\u0005f\u0000\u0000\u02dc\u02dd\u0005p\u0000\u0000"+ + "\u02dd\u02de\u0005p\u0000\u0000\u02de\u02df\u0005o\u0000\u0000\u02df\u02e0"+ + "\u0005s\u0000\u0000\u02e0\u009a\u0001\u0000\u0000\u0000\u02e1\u02e2\u0005"+ + "f\u0000\u0000\u02e2\u02e3\u0005p\u0000\u0000\u02e3\u02e4\u0005n\u0000"+ + "\u0000\u02e4\u02e5\u0005e\u0000\u0000\u02e5\u02e6\u0005g\u0000\u0000\u02e6"+ + "\u009c\u0001\u0000\u0000\u0000\u02e7\u02e8\u0005t\u0000\u0000\u02e8\u02e9"+ + "\u0005r\u0000\u0000\u02e9\u02ea\u0005u\u0000\u0000\u02ea\u02eb\u0005e"+ + "\u0000\u0000\u02eb\u009e\u0001\u0000\u0000\u0000\u02ec\u02ed\u0005r\u0000"+ + "\u0000\u02ed\u02ee\u0005e\u0000\u0000\u02ee\u02ef\u0005a\u0000\u0000\u02ef"+ + "\u02f0\u0005d\u0000\u0000\u02f0\u00a0\u0001\u0000\u0000\u0000\u02f1\u02f2"+ + "\u0005w\u0000\u0000\u02f2\u02f3\u0005r\u0000\u0000\u02f3\u02f4\u0005i"+ + "\u0000\u0000\u02f4\u02f5\u0005t\u0000\u0000\u02f5\u02f6\u0005e\u0000\u0000"+ + "\u02f6\u00a2\u0001\u0000\u0000\u0000\u02f7\u02f8\u0005p\u0000\u0000\u02f8"+ + "\u02f9\u0005r\u0000\u0000\u02f9\u02fa\u0005i\u0000\u0000\u02fa\u02fb\u0005"+ + "m\u0000\u0000\u02fb\u02fc\u0005e\u0000\u0000\u02fc\u00a4\u0001\u0000\u0000"+ + "\u0000\u02fd\u02fe\u0005e\u0000\u0000\u02fe\u02ff\u0005x\u0000\u0000\u02ff"+ + "\u0300\u0005t\u0000\u0000\u0300\u0301\u0005r\u0000\u0000\u0301\u0302\u0005"+ + "a\u0000\u0000\u0302\u0303\u0005c\u0000\u0000\u0303\u0304\u0005t\u0000"+ + "\u0000\u0304\u00a6\u0001\u0000\u0000\u0000\u0305\u0306\u0003\u00cfg\u0000"+ + "\u0306\u0307\u0003\u00bd^\u0000\u0307\u0308\u0005\'\u0000\u0000\u0308"+ + "\u0309\u0007\u0000\u0000\u0000\u0309\u030a\u0003\u00d1h\u0000\u030a\u00a8"+ + "\u0001\u0000\u0000\u0000\u030b\u030c\u0003\u00cfg\u0000\u030c\u030d\u0003"+ + "\u00bd^\u0000\u030d\u030e\u0003\u00d7k\u0000\u030e\u030f\u0003\u00bd^"+ + "\u0000\u030f\u0310\u0003\u00d1h\u0000\u0310\u00aa\u0001\u0000\u0000\u0000"+ + "\u0311\u0312\u0005[\u0000\u0000\u0312\u0313\u0005r\u0000\u0000\u0313\u0314"+ + "\u0005n\u0000\u0000\u0314\u0315\u0005e\u0000\u0000\u0315\u032b\u0005]"+ + "\u0000\u0000\u0316\u0317\u0005[\u0000\u0000\u0317\u0318\u0005r\u0000\u0000"+ + "\u0318\u0319\u0005n\u0000\u0000\u0319\u031a\u0005a\u0000\u0000\u031a\u032b"+ + "\u0005]\u0000\u0000\u031b\u031c\u0005[\u0000\u0000\u031c\u031d\u0005r"+ + "\u0000\u0000\u031d\u031e\u0005t\u0000\u0000\u031e\u031f\u0005p\u0000\u0000"+ + "\u031f\u032b\u0005]\u0000\u0000\u0320\u0321\u0005[\u0000\u0000\u0321\u0322"+ + "\u0005r\u0000\u0000\u0322\u0323\u0005t\u0000\u0000\u0323\u0324\u0005n"+ + "\u0000\u0000\u0324\u032b\u0005]\u0000\u0000\u0325\u0326\u0005[\u0000\u0000"+ + "\u0326\u0327\u0005r\u0000\u0000\u0327\u0328\u0005t\u0000\u0000\u0328\u0329"+ + "\u0005z\u0000\u0000\u0329\u032b\u0005]\u0000\u0000\u032a\u0311\u0001\u0000"+ + "\u0000\u0000\u032a\u0316\u0001\u0000\u0000\u0000\u032a\u031b\u0001\u0000"+ + "\u0000\u0000\u032a\u0320\u0001\u0000\u0000\u0000\u032a\u0325\u0001\u0000"+ + "\u0000\u0000\u032b\u00ac\u0001\u0000\u0000\u0000\u032c\u032d\u0005f\u0000"+ + "\u0000\u032d\u032e\u0005a\u0000\u0000\u032e\u032f\u0005l\u0000\u0000\u032f"+ + "\u0330\u0005s\u0000\u0000\u0330\u0331\u0005e\u0000\u0000\u0331\u00ae\u0001"+ + "\u0000\u0000\u0000\u0332\u0333\u0005d\u0000\u0000\u0333\u0334\u0005e\u0000"+ + "\u0000\u0334\u0335\u0005f\u0000\u0000\u0335\u0336\u0005a\u0000\u0000\u0336"+ + "\u0337\u0005u\u0000\u0000\u0337\u0338\u0005l\u0000\u0000\u0338\u0339\u0005"+ + "t\u0000\u0000\u0339\u00b0\u0001\u0000\u0000\u0000\u033a\u033b\u0005a\u0000"+ + "\u0000\u033b\u033c\u0005s\u0000\u0000\u033c\u033d\u0005s\u0000\u0000\u033d"+ + "\u033e\u0005i\u0000\u0000\u033e\u033f\u0005g\u0000\u0000\u033f\u0340\u0005"+ + "n\u0000\u0000\u0340\u00b2\u0001\u0000\u0000\u0000\u0341\u0342\u0005h\u0000"+ + "\u0000\u0342\u0343\u0005a\u0000\u0000\u0343\u0344\u0005v\u0000\u0000\u0344"+ + "\u0345\u0005o\u0000\u0000\u0345\u0346\u0005c\u0000\u0000\u0346\u00b4\u0001"+ + "\u0000\u0000\u0000\u0347\u0348\u0005a\u0000\u0000\u0348\u0349\u0005s\u0000"+ + "\u0000\u0349\u034a\u0005s\u0000\u0000\u034a\u034b\u0005u\u0000\u0000\u034b"+ + "\u034c\u0005m\u0000\u0000\u034c\u034d\u0005e\u0000\u0000\u034d\u00b6\u0001"+ + "\u0000\u0000\u0000\u034e\u034f\u0005r\u0000\u0000\u034f\u0350\u0005e\u0000"+ + "\u0000\u0350\u0351\u0005t\u0000\u0000\u0351\u0352\u0005u\u0000\u0000\u0352"+ + "\u0353\u0005r\u0000\u0000\u0353\u0354\u0005n\u0000\u0000\u0354\u00b8\u0001"+ + "\u0000\u0000\u0000\u0355\u0356\u0003\u00bd^\u0000\u0356\u0357\u0005\'"+ + "\u0000\u0000\u0357\u0358\u0005b\u0000\u0000\u0358\u035a\u0001\u0000\u0000"+ + "\u0000\u0359\u035b\u0007\u0001\u0000\u0000\u035a\u0359\u0001\u0000\u0000"+ + "\u0000\u035b\u035c\u0001\u0000\u0000\u0000\u035c\u035a\u0001\u0000\u0000"+ + "\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u0382\u0001\u0000\u0000"+ + "\u0000\u035e\u035f\u0005#\u0000\u0000\u035f\u0360\u0005b\u0000\u0000\u0360"+ + "\u0362\u0001\u0000\u0000\u0000\u0361\u0363\u0007\u0001\u0000\u0000\u0362"+ + "\u0361\u0001\u0000\u0000\u0000\u0363\u0364\u0001\u0000\u0000\u0000\u0364"+ + "\u0362\u0001\u0000\u0000\u0000\u0364\u0365\u0001\u0000\u0000\u0000\u0365"+ + "\u0382\u0001\u0000\u0000\u0000\u0366\u0367\u0005#\u0000\u0000\u0367\u0368"+ + "\u0005x\u0000\u0000\u0368\u036a\u0001\u0000\u0000\u0000\u0369\u036b\u0007"+ + "\u0001\u0000\u0000\u036a\u0369\u0001\u0000\u0000\u0000\u036b\u036c\u0001"+ + "\u0000\u0000\u0000\u036c\u036a\u0001\u0000\u0000\u0000\u036c\u036d\u0001"+ + "\u0000\u0000\u0000\u036d\u0382\u0001\u0000\u0000\u0000\u036e\u036f\u0003"+ + "\u00bd^\u0000\u036f\u0370\u0005\'\u0000\u0000\u0370\u0371\u0005d\u0000"+ + "\u0000\u0371\u0374\u0001\u0000\u0000\u0000\u0372\u0375\u00033\u0019\u0000"+ + "\u0373\u0375\u00035\u001a\u0000\u0374\u0372\u0001\u0000\u0000\u0000\u0374"+ + "\u0373\u0001\u0000\u0000\u0000\u0374\u0375\u0001\u0000\u0000\u0000\u0375"+ + "\u0376\u0001\u0000\u0000\u0000\u0376\u0377\u0003\u00bb]\u0000\u0377\u0382"+ + "\u0001\u0000\u0000\u0000\u0378\u0379\u0003\u00bd^\u0000\u0379\u037a\u0005"+ + "\'\u0000\u0000\u037a\u037b\u0005x\u0000\u0000\u037b\u037d\u0001\u0000"+ + "\u0000\u0000\u037c\u037e\u0007\u0002\u0000\u0000\u037d\u037c\u0001\u0000"+ + "\u0000\u0000\u037e\u037f\u0001\u0000\u0000\u0000\u037f\u037d\u0001\u0000"+ + "\u0000\u0000\u037f\u0380\u0001\u0000\u0000\u0000\u0380\u0382\u0001\u0000"+ + "\u0000\u0000\u0381\u0355\u0001\u0000\u0000\u0000\u0381\u035e\u0001\u0000"+ + "\u0000\u0000\u0381\u0366\u0001\u0000\u0000\u0000\u0381\u036e\u0001\u0000"+ + "\u0000\u0000\u0381\u0378\u0001\u0000\u0000\u0000\u0382\u00ba\u0001\u0000"+ + "\u0000\u0000\u0383\u0385\u0003\u00bf_\u0000\u0384\u0383\u0001\u0000\u0000"+ + "\u0000\u0384\u0385\u0001\u0000\u0000\u0000\u0385\u0386\u0001\u0000\u0000"+ + "\u0000\u0386\u0387\u0003\u00bd^\u0000\u0387\u00bc\u0001\u0000\u0000\u0000"+ + "\u0388\u038a\u0003\u00c7c\u0000\u0389\u0388\u0001\u0000\u0000\u0000\u038a"+ + "\u038b\u0001\u0000\u0000\u0000\u038b\u0389\u0001\u0000\u0000\u0000\u038b"+ + "\u038c\u0001\u0000\u0000\u0000\u038c\u00be\u0001\u0000\u0000\u0000\u038d"+ + "\u0390\u00033\u0019\u0000\u038e\u0390\u00035\u001a\u0000\u038f\u038d\u0001"+ + "\u0000\u0000\u0000\u038f\u038e\u0001\u0000\u0000\u0000\u0390\u00c0\u0001"+ + "\u0000\u0000\u0000\u0391\u0392\u0005.\u0000\u0000\u0392\u00c2\u0001\u0000"+ + "\u0000\u0000\u0393\u0396\u0003\u00c9d\u0000\u0394\u0396\u0003\u00c5b\u0000"+ + "\u0395\u0393\u0001\u0000\u0000\u0000\u0395\u0394\u0001\u0000\u0000\u0000"+ + "\u0396\u039e\u0001\u0000\u0000\u0000\u0397\u039d\u0003\u00c9d\u0000\u0398"+ + "\u039d\u0003\u00c5b\u0000\u0399\u039d\u0005$\u0000\u0000\u039a\u039d\u0003"+ + "\u00c7c\u0000\u039b\u039d\u0003\u00d9l\u0000\u039c\u0397\u0001\u0000\u0000"+ + "\u0000\u039c\u0398\u0001\u0000\u0000\u0000\u039c\u0399\u0001\u0000\u0000"+ + "\u0000\u039c\u039a\u0001\u0000\u0000\u0000\u039c\u039b\u0001\u0000\u0000"+ + "\u0000\u039d\u03a0\u0001\u0000\u0000\u0000\u039e\u039c\u0001\u0000\u0000"+ + "\u0000\u039e\u039f\u0001\u0000\u0000\u0000\u039f\u00c4\u0001\u0000\u0000"+ + "\u0000\u03a0\u039e\u0001\u0000\u0000\u0000\u03a1\u03a2\u0005_\u0000\u0000"+ + "\u03a2\u00c6\u0001\u0000\u0000\u0000\u03a3\u03a4\u0007\u0003\u0000\u0000"+ + "\u03a4\u00c8\u0001\u0000\u0000\u0000\u03a5\u03a6\u0007\u0004\u0000\u0000"+ + "\u03a6\u00ca\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005(\u0000\u0000\u03a8"+ + "\u00cc\u0001\u0000\u0000\u0000\u03a9\u03aa\u0005)\u0000\u0000\u03aa\u00ce"+ + "\u0001\u0000\u0000\u0000\u03ab\u03ac\u0005[\u0000\u0000\u03ac\u00d0\u0001"+ + "\u0000\u0000\u0000\u03ad\u03ae\u0005]\u0000\u0000\u03ae\u00d2\u0001\u0000"+ + "\u0000\u0000\u03af\u03b0\u0005{\u0000\u0000\u03b0\u00d4\u0001\u0000\u0000"+ + "\u0000\u03b1\u03b2\u0005}\u0000\u0000\u03b2\u00d6\u0001\u0000\u0000\u0000"+ + "\u03b3\u03b4\u0005,\u0000\u0000\u03b4\u00d8\u0001\u0000\u0000\u0000\u03b5"+ + "\u03b6\u0005:\u0000\u0000\u03b6\u00da\u0001\u0000\u0000\u0000\u03b7\u03b8"+ + "\u0005;\u0000\u0000\u03b8\u00dc\u0001\u0000\u0000\u0000\u03b9\u03ba\u0005"+ + "\'\u0000\u0000\u03ba\u00de\u0001\u0000\u0000\u0000\u03bb\u03bc\u0005<"+ + "\u0000\u0000\u03bc\u03bd\u0005-\u0000\u0000\u03bd\u00e0\u0001\u0000\u0000"+ + "\u0000\u03be\u03bf\u0005-\u0000\u0000\u03bf\u03c0\u0005>\u0000\u0000\u03c0"+ + "\u00e2\u0001\u0000\u0000\u0000\u03c1\u03c3\u0007\u0005\u0000\u0000\u03c2"+ + "\u03c1\u0001\u0000\u0000\u0000\u03c3\u03c4\u0001\u0000\u0000\u0000\u03c4"+ + "\u03c2\u0001\u0000\u0000\u0000\u03c4\u03c5\u0001\u0000\u0000\u0000\u03c5"+ + "\u03c6\u0001\u0000\u0000\u0000\u03c6\u03c7\u0006q\u0000\u0000\u03c7\u00e4"+ + "\u0001\u0000\u0000\u0000\u03c8\u03c9\u0005/\u0000\u0000\u03c9\u03ca\u0005"+ + "*\u0000\u0000\u03ca\u03ce\u0001\u0000\u0000\u0000\u03cb\u03cd\t\u0000"+ + "\u0000\u0000\u03cc\u03cb\u0001\u0000\u0000\u0000\u03cd\u03d0\u0001\u0000"+ + "\u0000\u0000\u03ce\u03cf\u0001\u0000\u0000\u0000\u03ce\u03cc\u0001\u0000"+ + "\u0000\u0000\u03cf\u03d1\u0001\u0000\u0000\u0000\u03d0\u03ce\u0001\u0000"+ + "\u0000\u0000\u03d1\u03d2\u0005*\u0000\u0000\u03d2\u03d3\u0005/\u0000\u0000"+ + "\u03d3\u03d4\u0001\u0000\u0000\u0000\u03d4\u03d5\u0006r\u0000\u0000\u03d5"+ + "\u00e6\u0001\u0000\u0000\u0000\u03d6\u03d7\u0005/\u0000\u0000\u03d7\u03d8"+ + "\u0005/\u0000\u0000\u03d8\u03dc\u0001\u0000\u0000\u0000\u03d9\u03db\b"+ + "\u0006\u0000\u0000\u03da\u03d9\u0001\u0000\u0000\u0000\u03db\u03de\u0001"+ + "\u0000\u0000\u0000\u03dc\u03da\u0001\u0000\u0000\u0000\u03dc\u03dd\u0001"+ + "\u0000\u0000\u0000\u03dd\u03df\u0001\u0000\u0000\u0000\u03de\u03dc\u0001"+ + "\u0000\u0000\u0000\u03df\u03e0\u0006s\u0000\u0000\u03e0\u00e8\u0001\u0000"+ + "\u0000\u0000\u001e\u0000\u00f5\u0100\u010b\u0113\u011b\u0129\u013a\u0272"+ + "\u029c\u02a6\u02b1\u02bc\u02cb\u032a\u035c\u0364\u036c\u0374\u037f\u0381"+ + "\u0384\u038b\u038f\u0395\u039c\u039e\u03c4\u03ce\u03dc\u0001\u0006\u0000"+ + "\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/ExprLexer.tokens b/subprojects/common/grammar/src/main/gen/ExprLexer.tokens new file mode 100644 index 0000000000..9531176830 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/ExprLexer.tokens @@ -0,0 +1,204 @@ +BOOLTYPE=1 +INTTYPE=2 +RATTYPE=3 +BVTYPE=4 +FPTYPE=5 +FUNC=6 +ARRAY=7 +IF=8 +THEN=9 +ELSE=10 +IFF=11 +ITE=12 +IMPLY=13 +FORALL=14 +EXISTS=15 +OR=16 +AND=17 +XOR=18 +NOT=19 +EQ=20 +NEQ=21 +LT=22 +LEQ=23 +GT=24 +GEQ=25 +PLUS=26 +MINUS=27 +MUL=28 +DIV=29 +MOD=30 +REM=31 +PERCENT=32 +BV_CONCAT=33 +BV_ZERO_EXTEND=34 +BV_SIGN_EXTEND=35 +BV_ADD=36 +BV_SUB=37 +BV_POS=38 +BV_NEG=39 +BV_MUL=40 +BV_UDIV=41 +BV_SDIV=42 +BV_SMOD=43 +BV_UREM=44 +BV_SREM=45 +BV_OR=46 +BV_AND=47 +BV_XOR=48 +BV_NOT=49 +BV_SHL=50 +BV_ASHR=51 +BV_LSHR=52 +BV_ROL=53 +BV_ROR=54 +BV_ULT=55 +BV_ULE=56 +BV_UGT=57 +BV_UGE=58 +BV_SLT=59 +BV_SLE=60 +BV_SGT=61 +BV_SGE=62 +FP_ABS=63 +FP_FROM_BV=64 +FP_IS_NAN=65 +FPMAX=66 +FPMIN=67 +FPREM=68 +FPROUNDTOINT=69 +FPSQRT=70 +FPTOBV=71 +FPTOFP=72 +FPSUB=73 +FPADD=74 +FPMUL=75 +FPDIV=76 +FPPOS=77 +FPNEG=78 +TRUE=79 +READ=80 +WRITE=81 +PRIME=82 +EXTRACT=83 +BV_TYPE_DECL=84 +FP_TYPE_DECL=85 +FP_ROUNDINGMODE=86 +FALSE=87 +DEFAULT=88 +ASSIGN=89 +HAVOC=90 +ASSUME=91 +RETURN=92 +BV=93 +INT=94 +NAT=95 +SIGN=96 +DOT=97 +ID=98 +UNDERSCORE=99 +DIGIT=100 +LETTER=101 +LPAREN=102 +RPAREN=103 +LBRACK=104 +RBRACK=105 +LBRAC=106 +RBRAC=107 +COMMA=108 +COLON=109 +SEMICOLON=110 +QUOT=111 +LARROW=112 +RARROW=113 +WS=114 +COMMENT=115 +LINE_COMMENT=116 +'if'=8 +'then'=9 +'else'=10 +'iff'=11 +'ite'=12 +'=>'=13 +'forall'=14 +'exists'=15 +'or'=16 +'and'=17 +'xor'=18 +'not'=19 +'='=20 +'/='=21 +'<'=22 +'<='=23 +'>'=24 +'>='=25 +'+'=26 +'-'=27 +'*'=28 +'div'=29 +'mod'=30 +'rem'=31 +'%'=32 +'bv_zero_extend'=34 +'bv_sign_extend'=35 +'bvadd'=36 +'bvsub'=37 +'bvpos'=38 +'bvneg'=39 +'bvmul'=40 +'bvudiv'=41 +'bvsdiv'=42 +'bvsmod'=43 +'bvurem'=44 +'bvsrem'=45 +'bvor'=46 +'bvand'=47 +'bvxor'=48 +'bvnot'=49 +'bvshl'=50 +'bvashr'=51 +'bvlshr'=52 +'bvrol'=53 +'bvror'=54 +'bvult'=55 +'bvule'=56 +'bvugt'=57 +'bvuge'=58 +'bvslt'=59 +'bvsle'=60 +'bvsgt'=61 +'bvsge'=62 +'fpabs'=63 +'fpisnan'=65 +'fpmax'=66 +'fpmin'=67 +'fprem'=68 +'fpsub'=73 +'fpmul'=75 +'fppos'=77 +'fpneg'=78 +'true'=79 +'read'=80 +'write'=81 +'prime'=82 +'extract'=83 +'false'=87 +'default'=88 +'assign'=89 +'havoc'=90 +'assume'=91 +'return'=92 +'.'=97 +'_'=99 +'('=102 +')'=103 +'['=104 +']'=105 +'{'=106 +'}'=107 +','=108 +':'=109 +';'=110 +'\''=111 +'<-'=112 +'->'=113 diff --git a/subprojects/common/grammar/src/main/gen/ExprListener.java b/subprojects/common/grammar/src/main/gen/ExprListener.java new file mode 100644 index 0000000000..83fdeaf5e6 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/ExprListener.java @@ -0,0 +1,529 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Expr.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link ExprParser}. + */ +public interface ExprListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link ExprParser#expr}. + * @param ctx the parse tree + */ + void enterExpr(ExprParser.ExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#expr}. + * @param ctx the parse tree + */ + void exitExpr(ExprParser.ExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#exprList}. + * @param ctx the parse tree + */ + void enterExprList(ExprParser.ExprListContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#exprList}. + * @param ctx the parse tree + */ + void exitExprList(ExprParser.ExprListContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#funcLitExpr}. + * @param ctx the parse tree + */ + void enterFuncLitExpr(ExprParser.FuncLitExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#funcLitExpr}. + * @param ctx the parse tree + */ + void exitFuncLitExpr(ExprParser.FuncLitExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#iteExpr}. + * @param ctx the parse tree + */ + void enterIteExpr(ExprParser.IteExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#iteExpr}. + * @param ctx the parse tree + */ + void exitIteExpr(ExprParser.IteExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#iffExpr}. + * @param ctx the parse tree + */ + void enterIffExpr(ExprParser.IffExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#iffExpr}. + * @param ctx the parse tree + */ + void exitIffExpr(ExprParser.IffExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#implyExpr}. + * @param ctx the parse tree + */ + void enterImplyExpr(ExprParser.ImplyExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#implyExpr}. + * @param ctx the parse tree + */ + void exitImplyExpr(ExprParser.ImplyExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#quantifiedExpr}. + * @param ctx the parse tree + */ + void enterQuantifiedExpr(ExprParser.QuantifiedExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#quantifiedExpr}. + * @param ctx the parse tree + */ + void exitQuantifiedExpr(ExprParser.QuantifiedExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#forallExpr}. + * @param ctx the parse tree + */ + void enterForallExpr(ExprParser.ForallExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#forallExpr}. + * @param ctx the parse tree + */ + void exitForallExpr(ExprParser.ForallExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#existsExpr}. + * @param ctx the parse tree + */ + void enterExistsExpr(ExprParser.ExistsExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#existsExpr}. + * @param ctx the parse tree + */ + void exitExistsExpr(ExprParser.ExistsExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#fpFuncExpr}. + * @param ctx the parse tree + */ + void enterFpFuncExpr(ExprParser.FpFuncExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#fpFuncExpr}. + * @param ctx the parse tree + */ + void exitFpFuncExpr(ExprParser.FpFuncExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#orExpr}. + * @param ctx the parse tree + */ + void enterOrExpr(ExprParser.OrExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#orExpr}. + * @param ctx the parse tree + */ + void exitOrExpr(ExprParser.OrExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#xorExpr}. + * @param ctx the parse tree + */ + void enterXorExpr(ExprParser.XorExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#xorExpr}. + * @param ctx the parse tree + */ + void exitXorExpr(ExprParser.XorExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#andExpr}. + * @param ctx the parse tree + */ + void enterAndExpr(ExprParser.AndExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#andExpr}. + * @param ctx the parse tree + */ + void exitAndExpr(ExprParser.AndExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#notExpr}. + * @param ctx the parse tree + */ + void enterNotExpr(ExprParser.NotExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#notExpr}. + * @param ctx the parse tree + */ + void exitNotExpr(ExprParser.NotExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#equalityExpr}. + * @param ctx the parse tree + */ + void enterEqualityExpr(ExprParser.EqualityExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#equalityExpr}. + * @param ctx the parse tree + */ + void exitEqualityExpr(ExprParser.EqualityExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#relationExpr}. + * @param ctx the parse tree + */ + void enterRelationExpr(ExprParser.RelationExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#relationExpr}. + * @param ctx the parse tree + */ + void exitRelationExpr(ExprParser.RelationExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#bitwiseOrExpr}. + * @param ctx the parse tree + */ + void enterBitwiseOrExpr(ExprParser.BitwiseOrExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#bitwiseOrExpr}. + * @param ctx the parse tree + */ + void exitBitwiseOrExpr(ExprParser.BitwiseOrExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#bitwiseXorExpr}. + * @param ctx the parse tree + */ + void enterBitwiseXorExpr(ExprParser.BitwiseXorExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#bitwiseXorExpr}. + * @param ctx the parse tree + */ + void exitBitwiseXorExpr(ExprParser.BitwiseXorExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#bitwiseAndExpr}. + * @param ctx the parse tree + */ + void enterBitwiseAndExpr(ExprParser.BitwiseAndExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#bitwiseAndExpr}. + * @param ctx the parse tree + */ + void exitBitwiseAndExpr(ExprParser.BitwiseAndExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#bitwiseShiftExpr}. + * @param ctx the parse tree + */ + void enterBitwiseShiftExpr(ExprParser.BitwiseShiftExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#bitwiseShiftExpr}. + * @param ctx the parse tree + */ + void exitBitwiseShiftExpr(ExprParser.BitwiseShiftExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#additiveExpr}. + * @param ctx the parse tree + */ + void enterAdditiveExpr(ExprParser.AdditiveExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#additiveExpr}. + * @param ctx the parse tree + */ + void exitAdditiveExpr(ExprParser.AdditiveExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#multiplicativeExpr}. + * @param ctx the parse tree + */ + void enterMultiplicativeExpr(ExprParser.MultiplicativeExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#multiplicativeExpr}. + * @param ctx the parse tree + */ + void exitMultiplicativeExpr(ExprParser.MultiplicativeExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#bvConcatExpr}. + * @param ctx the parse tree + */ + void enterBvConcatExpr(ExprParser.BvConcatExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#bvConcatExpr}. + * @param ctx the parse tree + */ + void exitBvConcatExpr(ExprParser.BvConcatExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#bvExtendExpr}. + * @param ctx the parse tree + */ + void enterBvExtendExpr(ExprParser.BvExtendExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#bvExtendExpr}. + * @param ctx the parse tree + */ + void exitBvExtendExpr(ExprParser.BvExtendExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#unaryExpr}. + * @param ctx the parse tree + */ + void enterUnaryExpr(ExprParser.UnaryExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#unaryExpr}. + * @param ctx the parse tree + */ + void exitUnaryExpr(ExprParser.UnaryExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#bitwiseNotExpr}. + * @param ctx the parse tree + */ + void enterBitwiseNotExpr(ExprParser.BitwiseNotExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#bitwiseNotExpr}. + * @param ctx the parse tree + */ + void exitBitwiseNotExpr(ExprParser.BitwiseNotExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#functionCall}. + * @param ctx the parse tree + */ + void enterFunctionCall(ExprParser.FunctionCallContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#functionCall}. + * @param ctx the parse tree + */ + void exitFunctionCall(ExprParser.FunctionCallContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#arrayRead}. + * @param ctx the parse tree + */ + void enterArrayRead(ExprParser.ArrayReadContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#arrayRead}. + * @param ctx the parse tree + */ + void exitArrayRead(ExprParser.ArrayReadContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#arrayWrite}. + * @param ctx the parse tree + */ + void enterArrayWrite(ExprParser.ArrayWriteContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#arrayWrite}. + * @param ctx the parse tree + */ + void exitArrayWrite(ExprParser.ArrayWriteContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#primeExpr}. + * @param ctx the parse tree + */ + void enterPrimeExpr(ExprParser.PrimeExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#primeExpr}. + * @param ctx the parse tree + */ + void exitPrimeExpr(ExprParser.PrimeExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#bvExtract}. + * @param ctx the parse tree + */ + void enterBvExtract(ExprParser.BvExtractContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#bvExtract}. + * @param ctx the parse tree + */ + void exitBvExtract(ExprParser.BvExtractContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#primaryExpr}. + * @param ctx the parse tree + */ + void enterPrimaryExpr(ExprParser.PrimaryExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#primaryExpr}. + * @param ctx the parse tree + */ + void exitPrimaryExpr(ExprParser.PrimaryExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#trueExpr}. + * @param ctx the parse tree + */ + void enterTrueExpr(ExprParser.TrueExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#trueExpr}. + * @param ctx the parse tree + */ + void exitTrueExpr(ExprParser.TrueExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#falseExpr}. + * @param ctx the parse tree + */ + void enterFalseExpr(ExprParser.FalseExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#falseExpr}. + * @param ctx the parse tree + */ + void exitFalseExpr(ExprParser.FalseExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#intLitExpr}. + * @param ctx the parse tree + */ + void enterIntLitExpr(ExprParser.IntLitExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#intLitExpr}. + * @param ctx the parse tree + */ + void exitIntLitExpr(ExprParser.IntLitExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#ratLitExpr}. + * @param ctx the parse tree + */ + void enterRatLitExpr(ExprParser.RatLitExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#ratLitExpr}. + * @param ctx the parse tree + */ + void exitRatLitExpr(ExprParser.RatLitExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#arrLitExpr}. + * @param ctx the parse tree + */ + void enterArrLitExpr(ExprParser.ArrLitExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#arrLitExpr}. + * @param ctx the parse tree + */ + void exitArrLitExpr(ExprParser.ArrLitExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#bvLitExpr}. + * @param ctx the parse tree + */ + void enterBvLitExpr(ExprParser.BvLitExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#bvLitExpr}. + * @param ctx the parse tree + */ + void exitBvLitExpr(ExprParser.BvLitExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#fpLitExpr}. + * @param ctx the parse tree + */ + void enterFpLitExpr(ExprParser.FpLitExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#fpLitExpr}. + * @param ctx the parse tree + */ + void exitFpLitExpr(ExprParser.FpLitExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#idExpr}. + * @param ctx the parse tree + */ + void enterIdExpr(ExprParser.IdExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#idExpr}. + * @param ctx the parse tree + */ + void exitIdExpr(ExprParser.IdExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#parenExpr}. + * @param ctx the parse tree + */ + void enterParenExpr(ExprParser.ParenExprContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#parenExpr}. + * @param ctx the parse tree + */ + void exitParenExpr(ExprParser.ParenExprContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#decl}. + * @param ctx the parse tree + */ + void enterDecl(ExprParser.DeclContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#decl}. + * @param ctx the parse tree + */ + void exitDecl(ExprParser.DeclContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#declList}. + * @param ctx the parse tree + */ + void enterDeclList(ExprParser.DeclListContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#declList}. + * @param ctx the parse tree + */ + void exitDeclList(ExprParser.DeclListContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#type}. + * @param ctx the parse tree + */ + void enterType(ExprParser.TypeContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#type}. + * @param ctx the parse tree + */ + void exitType(ExprParser.TypeContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#typeList}. + * @param ctx the parse tree + */ + void enterTypeList(ExprParser.TypeListContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#typeList}. + * @param ctx the parse tree + */ + void exitTypeList(ExprParser.TypeListContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#boolType}. + * @param ctx the parse tree + */ + void enterBoolType(ExprParser.BoolTypeContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#boolType}. + * @param ctx the parse tree + */ + void exitBoolType(ExprParser.BoolTypeContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#intType}. + * @param ctx the parse tree + */ + void enterIntType(ExprParser.IntTypeContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#intType}. + * @param ctx the parse tree + */ + void exitIntType(ExprParser.IntTypeContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#ratType}. + * @param ctx the parse tree + */ + void enterRatType(ExprParser.RatTypeContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#ratType}. + * @param ctx the parse tree + */ + void exitRatType(ExprParser.RatTypeContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#funcType}. + * @param ctx the parse tree + */ + void enterFuncType(ExprParser.FuncTypeContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#funcType}. + * @param ctx the parse tree + */ + void exitFuncType(ExprParser.FuncTypeContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#arrayType}. + * @param ctx the parse tree + */ + void enterArrayType(ExprParser.ArrayTypeContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#arrayType}. + * @param ctx the parse tree + */ + void exitArrayType(ExprParser.ArrayTypeContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#bvType}. + * @param ctx the parse tree + */ + void enterBvType(ExprParser.BvTypeContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#bvType}. + * @param ctx the parse tree + */ + void exitBvType(ExprParser.BvTypeContext ctx); + /** + * Enter a parse tree produced by {@link ExprParser#fpType}. + * @param ctx the parse tree + */ + void enterFpType(ExprParser.FpTypeContext ctx); + /** + * Exit a parse tree produced by {@link ExprParser#fpType}. + * @param ctx the parse tree + */ + void exitFpType(ExprParser.FpTypeContext ctx); +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/ExprParser.java b/subprojects/common/grammar/src/main/gen/ExprParser.java new file mode 100644 index 0000000000..636948593a --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/ExprParser.java @@ -0,0 +1,4341 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Expr.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class ExprParser extends Parser { + static { RuntimeMetaData.checkVersion("4.10.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + BOOLTYPE=1, INTTYPE=2, RATTYPE=3, BVTYPE=4, FPTYPE=5, FUNC=6, ARRAY=7, + IF=8, THEN=9, ELSE=10, IFF=11, ITE=12, IMPLY=13, FORALL=14, EXISTS=15, + OR=16, AND=17, XOR=18, NOT=19, EQ=20, NEQ=21, LT=22, LEQ=23, GT=24, GEQ=25, + PLUS=26, MINUS=27, MUL=28, DIV=29, MOD=30, REM=31, PERCENT=32, BV_CONCAT=33, + BV_ZERO_EXTEND=34, BV_SIGN_EXTEND=35, BV_ADD=36, BV_SUB=37, BV_POS=38, + BV_NEG=39, BV_MUL=40, BV_UDIV=41, BV_SDIV=42, BV_SMOD=43, BV_UREM=44, + BV_SREM=45, BV_OR=46, BV_AND=47, BV_XOR=48, BV_NOT=49, BV_SHL=50, BV_ASHR=51, + BV_LSHR=52, BV_ROL=53, BV_ROR=54, BV_ULT=55, BV_ULE=56, BV_UGT=57, BV_UGE=58, + BV_SLT=59, BV_SLE=60, BV_SGT=61, BV_SGE=62, FP_ABS=63, FP_FROM_BV=64, + FP_IS_NAN=65, FPMAX=66, FPMIN=67, FPREM=68, FPROUNDTOINT=69, FPSQRT=70, + FPTOBV=71, FPTOFP=72, FPSUB=73, FPADD=74, FPMUL=75, FPDIV=76, FPPOS=77, + FPNEG=78, TRUE=79, READ=80, WRITE=81, PRIME=82, EXTRACT=83, BV_TYPE_DECL=84, + FP_TYPE_DECL=85, FP_ROUNDINGMODE=86, FALSE=87, DEFAULT=88, ASSIGN=89, + HAVOC=90, ASSUME=91, RETURN=92, BV=93, INT=94, NAT=95, SIGN=96, DOT=97, + ID=98, UNDERSCORE=99, DIGIT=100, LETTER=101, LPAREN=102, RPAREN=103, LBRACK=104, + RBRACK=105, LBRAC=106, RBRAC=107, COMMA=108, COLON=109, SEMICOLON=110, + QUOT=111, LARROW=112, RARROW=113, WS=114, COMMENT=115, LINE_COMMENT=116; + public static final int + RULE_expr = 0, RULE_exprList = 1, RULE_funcLitExpr = 2, RULE_iteExpr = 3, + RULE_iffExpr = 4, RULE_implyExpr = 5, RULE_quantifiedExpr = 6, RULE_forallExpr = 7, + RULE_existsExpr = 8, RULE_fpFuncExpr = 9, RULE_orExpr = 10, RULE_xorExpr = 11, + RULE_andExpr = 12, RULE_notExpr = 13, RULE_equalityExpr = 14, RULE_relationExpr = 15, + RULE_bitwiseOrExpr = 16, RULE_bitwiseXorExpr = 17, RULE_bitwiseAndExpr = 18, + RULE_bitwiseShiftExpr = 19, RULE_additiveExpr = 20, RULE_multiplicativeExpr = 21, + RULE_bvConcatExpr = 22, RULE_bvExtendExpr = 23, RULE_unaryExpr = 24, RULE_bitwiseNotExpr = 25, + RULE_functionCall = 26, RULE_arrayRead = 27, RULE_arrayWrite = 28, RULE_primeExpr = 29, + RULE_bvExtract = 30, RULE_primaryExpr = 31, RULE_trueExpr = 32, RULE_falseExpr = 33, + RULE_intLitExpr = 34, RULE_ratLitExpr = 35, RULE_arrLitExpr = 36, RULE_bvLitExpr = 37, + RULE_fpLitExpr = 38, RULE_idExpr = 39, RULE_parenExpr = 40, RULE_decl = 41, + RULE_declList = 42, RULE_type = 43, RULE_typeList = 44, RULE_boolType = 45, + RULE_intType = 46, RULE_ratType = 47, RULE_funcType = 48, RULE_arrayType = 49, + RULE_bvType = 50, RULE_fpType = 51; + private static String[] makeRuleNames() { + return new String[] { + "expr", "exprList", "funcLitExpr", "iteExpr", "iffExpr", "implyExpr", + "quantifiedExpr", "forallExpr", "existsExpr", "fpFuncExpr", "orExpr", + "xorExpr", "andExpr", "notExpr", "equalityExpr", "relationExpr", "bitwiseOrExpr", + "bitwiseXorExpr", "bitwiseAndExpr", "bitwiseShiftExpr", "additiveExpr", + "multiplicativeExpr", "bvConcatExpr", "bvExtendExpr", "unaryExpr", "bitwiseNotExpr", + "functionCall", "arrayRead", "arrayWrite", "primeExpr", "bvExtract", + "primaryExpr", "trueExpr", "falseExpr", "intLitExpr", "ratLitExpr", "arrLitExpr", + "bvLitExpr", "fpLitExpr", "idExpr", "parenExpr", "decl", "declList", + "type", "typeList", "boolType", "intType", "ratType", "funcType", "arrayType", + "bvType", "fpType" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, "'if'", "'then'", "'else'", + "'iff'", "'ite'", "'=>'", "'forall'", "'exists'", "'or'", "'and'", "'xor'", + "'not'", "'='", "'/='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", + "'div'", "'mod'", "'rem'", "'%'", null, "'bv_zero_extend'", "'bv_sign_extend'", + "'bvadd'", "'bvsub'", "'bvpos'", "'bvneg'", "'bvmul'", "'bvudiv'", "'bvsdiv'", + "'bvsmod'", "'bvurem'", "'bvsrem'", "'bvor'", "'bvand'", "'bvxor'", "'bvnot'", + "'bvshl'", "'bvashr'", "'bvlshr'", "'bvrol'", "'bvror'", "'bvult'", "'bvule'", + "'bvugt'", "'bvuge'", "'bvslt'", "'bvsle'", "'bvsgt'", "'bvsge'", "'fpabs'", + null, "'fpisnan'", "'fpmax'", "'fpmin'", "'fprem'", null, null, null, + null, "'fpsub'", null, "'fpmul'", null, "'fppos'", "'fpneg'", "'true'", + "'read'", "'write'", "'prime'", "'extract'", null, null, null, "'false'", + "'default'", "'assign'", "'havoc'", "'assume'", "'return'", null, null, + null, null, "'.'", null, "'_'", null, null, "'('", "')'", "'['", "']'", + "'{'", "'}'", "','", "':'", "';'", "'''", "'<-'", "'->'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "BOOLTYPE", "INTTYPE", "RATTYPE", "BVTYPE", "FPTYPE", "FUNC", "ARRAY", + "IF", "THEN", "ELSE", "IFF", "ITE", "IMPLY", "FORALL", "EXISTS", "OR", + "AND", "XOR", "NOT", "EQ", "NEQ", "LT", "LEQ", "GT", "GEQ", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "REM", "PERCENT", "BV_CONCAT", "BV_ZERO_EXTEND", + "BV_SIGN_EXTEND", "BV_ADD", "BV_SUB", "BV_POS", "BV_NEG", "BV_MUL", "BV_UDIV", + "BV_SDIV", "BV_SMOD", "BV_UREM", "BV_SREM", "BV_OR", "BV_AND", "BV_XOR", + "BV_NOT", "BV_SHL", "BV_ASHR", "BV_LSHR", "BV_ROL", "BV_ROR", "BV_ULT", + "BV_ULE", "BV_UGT", "BV_UGE", "BV_SLT", "BV_SLE", "BV_SGT", "BV_SGE", + "FP_ABS", "FP_FROM_BV", "FP_IS_NAN", "FPMAX", "FPMIN", "FPREM", "FPROUNDTOINT", + "FPSQRT", "FPTOBV", "FPTOFP", "FPSUB", "FPADD", "FPMUL", "FPDIV", "FPPOS", + "FPNEG", "TRUE", "READ", "WRITE", "PRIME", "EXTRACT", "BV_TYPE_DECL", + "FP_TYPE_DECL", "FP_ROUNDINGMODE", "FALSE", "DEFAULT", "ASSIGN", "HAVOC", + "ASSUME", "RETURN", "BV", "INT", "NAT", "SIGN", "DOT", "ID", "UNDERSCORE", + "DIGIT", "LETTER", "LPAREN", "RPAREN", "LBRACK", "RBRACK", "LBRAC", "RBRAC", + "COMMA", "COLON", "SEMICOLON", "QUOT", "LARROW", "RARROW", "WS", "COMMENT", + "LINE_COMMENT" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "Expr.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public ExprParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + public static class ExprContext extends ParserRuleContext { + public FuncLitExprContext funcLitExpr() { + return getRuleContext(FuncLitExprContext.class,0); + } + public ExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitExpr(this); + else return visitor.visitChildren(this); + } + } + + public final ExprContext expr() throws RecognitionException { + ExprContext _localctx = new ExprContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_expr); + try { + enterOuterAlt(_localctx, 1); + { + setState(104); + funcLitExpr(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ExprListContext extends ParserRuleContext { + public ExprContext expr; + public List exprs = new ArrayList(); + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public List COMMA() { return getTokens(ExprParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(ExprParser.COMMA, i); + } + public ExprListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_exprList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterExprList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitExprList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitExprList(this); + else return visitor.visitChildren(this); + } + } + + public final ExprListContext exprList() throws RecognitionException { + ExprListContext _localctx = new ExprListContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_exprList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + { + setState(106); + ((ExprListContext)_localctx).expr = expr(); + ((ExprListContext)_localctx).exprs.add(((ExprListContext)_localctx).expr); + } + setState(111); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(107); + match(COMMA); + setState(108); + ((ExprListContext)_localctx).expr = expr(); + ((ExprListContext)_localctx).exprs.add(((ExprListContext)_localctx).expr); + } + } + setState(113); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FuncLitExprContext extends ParserRuleContext { + public DeclContext param; + public ExprContext result; + public IteExprContext iteExpr() { + return getRuleContext(IteExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode FUNC() { return getToken(ExprParser.FUNC, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public DeclContext decl() { + return getRuleContext(DeclContext.class,0); + } + public ExprContext expr() { + return getRuleContext(ExprContext.class,0); + } + public FuncLitExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_funcLitExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterFuncLitExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitFuncLitExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitFuncLitExpr(this); + else return visitor.visitChildren(this); + } + } + + public final FuncLitExprContext funcLitExpr() throws RecognitionException { + FuncLitExprContext _localctx = new FuncLitExprContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_funcLitExpr); + try { + setState(121); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(114); + iteExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(115); + match(LPAREN); + setState(116); + match(FUNC); + setState(117); + ((FuncLitExprContext)_localctx).param = decl(); + setState(118); + ((FuncLitExprContext)_localctx).result = expr(); + setState(119); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IteExprContext extends ParserRuleContext { + public ExprContext cond; + public ExprContext then; + public ExprContext elze; + public IffExprContext iffExpr() { + return getRuleContext(IffExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode ITE() { return getToken(ExprParser.ITE, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public IteExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_iteExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterIteExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitIteExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitIteExpr(this); + else return visitor.visitChildren(this); + } + } + + public final IteExprContext iteExpr() throws RecognitionException { + IteExprContext _localctx = new IteExprContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_iteExpr); + try { + setState(131); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(123); + iffExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(124); + match(LPAREN); + setState(125); + match(ITE); + setState(126); + ((IteExprContext)_localctx).cond = expr(); + setState(127); + ((IteExprContext)_localctx).then = expr(); + setState(128); + ((IteExprContext)_localctx).elze = expr(); + setState(129); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IffExprContext extends ParserRuleContext { + public ExprContext leftOp; + public ExprContext rightOp; + public ImplyExprContext implyExpr() { + return getRuleContext(ImplyExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode IFF() { return getToken(ExprParser.IFF, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public IffExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_iffExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterIffExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitIffExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitIffExpr(this); + else return visitor.visitChildren(this); + } + } + + public final IffExprContext iffExpr() throws RecognitionException { + IffExprContext _localctx = new IffExprContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_iffExpr); + int _la; + try { + setState(142); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(133); + implyExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(134); + match(LPAREN); + setState(135); + match(IFF); + setState(136); + ((IffExprContext)_localctx).leftOp = expr(); + setState(138); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (TRUE - 79)) | (1L << (FALSE - 79)) | (1L << (BV - 79)) | (1L << (INT - 79)) | (1L << (ID - 79)) | (1L << (LPAREN - 79)))) != 0)) { + { + setState(137); + ((IffExprContext)_localctx).rightOp = expr(); + } + } + + setState(140); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ImplyExprContext extends ParserRuleContext { + public ExprContext leftOp; + public ExprContext rightOp; + public QuantifiedExprContext quantifiedExpr() { + return getRuleContext(QuantifiedExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode IMPLY() { return getToken(ExprParser.IMPLY, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public ImplyExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_implyExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterImplyExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitImplyExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitImplyExpr(this); + else return visitor.visitChildren(this); + } + } + + public final ImplyExprContext implyExpr() throws RecognitionException { + ImplyExprContext _localctx = new ImplyExprContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_implyExpr); + int _la; + try { + setState(153); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(144); + quantifiedExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(145); + match(LPAREN); + setState(146); + match(IMPLY); + setState(147); + ((ImplyExprContext)_localctx).leftOp = expr(); + setState(149); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (TRUE - 79)) | (1L << (FALSE - 79)) | (1L << (BV - 79)) | (1L << (INT - 79)) | (1L << (ID - 79)) | (1L << (LPAREN - 79)))) != 0)) { + { + setState(148); + ((ImplyExprContext)_localctx).rightOp = expr(); + } + } + + setState(151); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class QuantifiedExprContext extends ParserRuleContext { + public FpFuncExprContext fpFuncExpr() { + return getRuleContext(FpFuncExprContext.class,0); + } + public ForallExprContext forallExpr() { + return getRuleContext(ForallExprContext.class,0); + } + public ExistsExprContext existsExpr() { + return getRuleContext(ExistsExprContext.class,0); + } + public QuantifiedExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_quantifiedExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterQuantifiedExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitQuantifiedExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitQuantifiedExpr(this); + else return visitor.visitChildren(this); + } + } + + public final QuantifiedExprContext quantifiedExpr() throws RecognitionException { + QuantifiedExprContext _localctx = new QuantifiedExprContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_quantifiedExpr); + try { + setState(158); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(155); + fpFuncExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(156); + forallExpr(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(157); + existsExpr(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ForallExprContext extends ParserRuleContext { + public DeclListContext paramDecls; + public ExprContext op; + public List LPAREN() { return getTokens(ExprParser.LPAREN); } + public TerminalNode LPAREN(int i) { + return getToken(ExprParser.LPAREN, i); + } + public TerminalNode FORALL() { return getToken(ExprParser.FORALL, 0); } + public List RPAREN() { return getTokens(ExprParser.RPAREN); } + public TerminalNode RPAREN(int i) { + return getToken(ExprParser.RPAREN, i); + } + public DeclListContext declList() { + return getRuleContext(DeclListContext.class,0); + } + public ExprContext expr() { + return getRuleContext(ExprContext.class,0); + } + public ForallExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_forallExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterForallExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitForallExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitForallExpr(this); + else return visitor.visitChildren(this); + } + } + + public final ForallExprContext forallExpr() throws RecognitionException { + ForallExprContext _localctx = new ForallExprContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_forallExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(160); + match(LPAREN); + setState(161); + match(FORALL); + setState(162); + match(LPAREN); + setState(163); + ((ForallExprContext)_localctx).paramDecls = declList(); + setState(164); + match(RPAREN); + setState(165); + ((ForallExprContext)_localctx).op = expr(); + setState(166); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ExistsExprContext extends ParserRuleContext { + public DeclListContext paramDecls; + public ExprContext op; + public List LPAREN() { return getTokens(ExprParser.LPAREN); } + public TerminalNode LPAREN(int i) { + return getToken(ExprParser.LPAREN, i); + } + public TerminalNode EXISTS() { return getToken(ExprParser.EXISTS, 0); } + public List RPAREN() { return getTokens(ExprParser.RPAREN); } + public TerminalNode RPAREN(int i) { + return getToken(ExprParser.RPAREN, i); + } + public DeclListContext declList() { + return getRuleContext(DeclListContext.class,0); + } + public ExprContext expr() { + return getRuleContext(ExprContext.class,0); + } + public ExistsExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_existsExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterExistsExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitExistsExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitExistsExpr(this); + else return visitor.visitChildren(this); + } + } + + public final ExistsExprContext existsExpr() throws RecognitionException { + ExistsExprContext _localctx = new ExistsExprContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_existsExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(168); + match(LPAREN); + setState(169); + match(EXISTS); + setState(170); + match(LPAREN); + setState(171); + ((ExistsExprContext)_localctx).paramDecls = declList(); + setState(172); + match(RPAREN); + setState(173); + ((ExistsExprContext)_localctx).op = expr(); + setState(174); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FpFuncExprContext extends ParserRuleContext { + public Token oper; + public ExprContext leftOp; + public ExprContext rightOp; + public OrExprContext orExpr() { + return getRuleContext(OrExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public TerminalNode FPMAX() { return getToken(ExprParser.FPMAX, 0); } + public TerminalNode FPMIN() { return getToken(ExprParser.FPMIN, 0); } + public FpFuncExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fpFuncExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterFpFuncExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitFpFuncExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitFpFuncExpr(this); + else return visitor.visitChildren(this); + } + } + + public final FpFuncExprContext fpFuncExpr() throws RecognitionException { + FpFuncExprContext _localctx = new FpFuncExprContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_fpFuncExpr); + int _la; + try { + setState(183); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(176); + orExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(177); + match(LPAREN); + setState(178); + ((FpFuncExprContext)_localctx).oper = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==FPMAX || _la==FPMIN) ) { + ((FpFuncExprContext)_localctx).oper = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(179); + ((FpFuncExprContext)_localctx).leftOp = expr(); + setState(180); + ((FpFuncExprContext)_localctx).rightOp = expr(); + setState(181); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class OrExprContext extends ParserRuleContext { + public ExprContext expr; + public List ops = new ArrayList(); + public XorExprContext xorExpr() { + return getRuleContext(XorExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode OR() { return getToken(ExprParser.OR, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public OrExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_orExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterOrExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitOrExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitOrExpr(this); + else return visitor.visitChildren(this); + } + } + + public final OrExprContext orExpr() throws RecognitionException { + OrExprContext _localctx = new OrExprContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_orExpr); + int _la; + try { + setState(197); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(185); + xorExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(186); + match(LPAREN); + setState(187); + match(OR); + setState(188); + ((OrExprContext)_localctx).expr = expr(); + ((OrExprContext)_localctx).ops.add(((OrExprContext)_localctx).expr); + setState(192); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (TRUE - 79)) | (1L << (FALSE - 79)) | (1L << (BV - 79)) | (1L << (INT - 79)) | (1L << (ID - 79)) | (1L << (LPAREN - 79)))) != 0)) { + { + { + setState(189); + ((OrExprContext)_localctx).expr = expr(); + ((OrExprContext)_localctx).ops.add(((OrExprContext)_localctx).expr); + } + } + setState(194); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(195); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class XorExprContext extends ParserRuleContext { + public ExprContext leftOp; + public ExprContext rightOp; + public AndExprContext andExpr() { + return getRuleContext(AndExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode XOR() { return getToken(ExprParser.XOR, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public XorExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_xorExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterXorExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitXorExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitXorExpr(this); + else return visitor.visitChildren(this); + } + } + + public final XorExprContext xorExpr() throws RecognitionException { + XorExprContext _localctx = new XorExprContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_xorExpr); + try { + setState(206); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(199); + andExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(200); + match(LPAREN); + setState(201); + match(XOR); + setState(202); + ((XorExprContext)_localctx).leftOp = expr(); + setState(203); + ((XorExprContext)_localctx).rightOp = expr(); + setState(204); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AndExprContext extends ParserRuleContext { + public ExprContext expr; + public List ops = new ArrayList(); + public NotExprContext notExpr() { + return getRuleContext(NotExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode AND() { return getToken(ExprParser.AND, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public AndExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_andExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterAndExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitAndExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitAndExpr(this); + else return visitor.visitChildren(this); + } + } + + public final AndExprContext andExpr() throws RecognitionException { + AndExprContext _localctx = new AndExprContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_andExpr); + int _la; + try { + setState(220); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(208); + notExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(209); + match(LPAREN); + setState(210); + match(AND); + setState(211); + ((AndExprContext)_localctx).expr = expr(); + ((AndExprContext)_localctx).ops.add(((AndExprContext)_localctx).expr); + setState(215); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (TRUE - 79)) | (1L << (FALSE - 79)) | (1L << (BV - 79)) | (1L << (INT - 79)) | (1L << (ID - 79)) | (1L << (LPAREN - 79)))) != 0)) { + { + { + setState(212); + ((AndExprContext)_localctx).expr = expr(); + ((AndExprContext)_localctx).ops.add(((AndExprContext)_localctx).expr); + } + } + setState(217); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(218); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class NotExprContext extends ParserRuleContext { + public ExprContext op; + public EqualityExprContext equalityExpr() { + return getRuleContext(EqualityExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode NOT() { return getToken(ExprParser.NOT, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public ExprContext expr() { + return getRuleContext(ExprContext.class,0); + } + public NotExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_notExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterNotExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitNotExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitNotExpr(this); + else return visitor.visitChildren(this); + } + } + + public final NotExprContext notExpr() throws RecognitionException { + NotExprContext _localctx = new NotExprContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_notExpr); + try { + setState(228); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(222); + equalityExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(223); + match(LPAREN); + setState(224); + match(NOT); + setState(225); + ((NotExprContext)_localctx).op = expr(); + setState(226); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class EqualityExprContext extends ParserRuleContext { + public Token oper; + public ExprContext leftOp; + public ExprContext rightOp; + public RelationExprContext relationExpr() { + return getRuleContext(RelationExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public TerminalNode EQ() { return getToken(ExprParser.EQ, 0); } + public TerminalNode NEQ() { return getToken(ExprParser.NEQ, 0); } + public EqualityExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_equalityExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterEqualityExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitEqualityExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitEqualityExpr(this); + else return visitor.visitChildren(this); + } + } + + public final EqualityExprContext equalityExpr() throws RecognitionException { + EqualityExprContext _localctx = new EqualityExprContext(_ctx, getState()); + enterRule(_localctx, 28, RULE_equalityExpr); + int _la; + try { + setState(237); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(230); + relationExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(231); + match(LPAREN); + setState(232); + ((EqualityExprContext)_localctx).oper = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==EQ || _la==NEQ) ) { + ((EqualityExprContext)_localctx).oper = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(233); + ((EqualityExprContext)_localctx).leftOp = expr(); + setState(234); + ((EqualityExprContext)_localctx).rightOp = expr(); + setState(235); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class RelationExprContext extends ParserRuleContext { + public Token oper; + public ExprContext leftOp; + public ExprContext rightOp; + public BitwiseOrExprContext bitwiseOrExpr() { + return getRuleContext(BitwiseOrExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public TerminalNode LT() { return getToken(ExprParser.LT, 0); } + public TerminalNode LEQ() { return getToken(ExprParser.LEQ, 0); } + public TerminalNode GT() { return getToken(ExprParser.GT, 0); } + public TerminalNode GEQ() { return getToken(ExprParser.GEQ, 0); } + public TerminalNode BV_ULT() { return getToken(ExprParser.BV_ULT, 0); } + public TerminalNode BV_ULE() { return getToken(ExprParser.BV_ULE, 0); } + public TerminalNode BV_UGT() { return getToken(ExprParser.BV_UGT, 0); } + public TerminalNode BV_UGE() { return getToken(ExprParser.BV_UGE, 0); } + public TerminalNode BV_SLT() { return getToken(ExprParser.BV_SLT, 0); } + public TerminalNode BV_SLE() { return getToken(ExprParser.BV_SLE, 0); } + public TerminalNode BV_SGT() { return getToken(ExprParser.BV_SGT, 0); } + public TerminalNode BV_SGE() { return getToken(ExprParser.BV_SGE, 0); } + public RelationExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relationExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterRelationExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitRelationExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitRelationExpr(this); + else return visitor.visitChildren(this); + } + } + + public final RelationExprContext relationExpr() throws RecognitionException { + RelationExprContext _localctx = new RelationExprContext(_ctx, getState()); + enterRule(_localctx, 30, RULE_relationExpr); + int _la; + try { + setState(246); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(239); + bitwiseOrExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(240); + match(LPAREN); + setState(241); + ((RelationExprContext)_localctx).oper = _input.LT(1); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << LT) | (1L << LEQ) | (1L << GT) | (1L << GEQ) | (1L << BV_ULT) | (1L << BV_ULE) | (1L << BV_UGT) | (1L << BV_UGE) | (1L << BV_SLT) | (1L << BV_SLE) | (1L << BV_SGT) | (1L << BV_SGE))) != 0)) ) { + ((RelationExprContext)_localctx).oper = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(242); + ((RelationExprContext)_localctx).leftOp = expr(); + setState(243); + ((RelationExprContext)_localctx).rightOp = expr(); + setState(244); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BitwiseOrExprContext extends ParserRuleContext { + public Token oper; + public ExprContext expr; + public List ops = new ArrayList(); + public BitwiseXorExprContext bitwiseXorExpr() { + return getRuleContext(BitwiseXorExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public TerminalNode BV_OR() { return getToken(ExprParser.BV_OR, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public BitwiseOrExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bitwiseOrExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterBitwiseOrExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitBitwiseOrExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitBitwiseOrExpr(this); + else return visitor.visitChildren(this); + } + } + + public final BitwiseOrExprContext bitwiseOrExpr() throws RecognitionException { + BitwiseOrExprContext _localctx = new BitwiseOrExprContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_bitwiseOrExpr); + int _la; + try { + setState(260); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(248); + bitwiseXorExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(249); + match(LPAREN); + setState(250); + ((BitwiseOrExprContext)_localctx).oper = match(BV_OR); + setState(251); + ((BitwiseOrExprContext)_localctx).expr = expr(); + ((BitwiseOrExprContext)_localctx).ops.add(((BitwiseOrExprContext)_localctx).expr); + setState(255); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (TRUE - 79)) | (1L << (FALSE - 79)) | (1L << (BV - 79)) | (1L << (INT - 79)) | (1L << (ID - 79)) | (1L << (LPAREN - 79)))) != 0)) { + { + { + setState(252); + ((BitwiseOrExprContext)_localctx).expr = expr(); + ((BitwiseOrExprContext)_localctx).ops.add(((BitwiseOrExprContext)_localctx).expr); + } + } + setState(257); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(258); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BitwiseXorExprContext extends ParserRuleContext { + public Token oper; + public ExprContext leftOp; + public ExprContext rightOp; + public BitwiseAndExprContext bitwiseAndExpr() { + return getRuleContext(BitwiseAndExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public TerminalNode BV_XOR() { return getToken(ExprParser.BV_XOR, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public BitwiseXorExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bitwiseXorExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterBitwiseXorExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitBitwiseXorExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitBitwiseXorExpr(this); + else return visitor.visitChildren(this); + } + } + + public final BitwiseXorExprContext bitwiseXorExpr() throws RecognitionException { + BitwiseXorExprContext _localctx = new BitwiseXorExprContext(_ctx, getState()); + enterRule(_localctx, 34, RULE_bitwiseXorExpr); + try { + setState(269); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(262); + bitwiseAndExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(263); + match(LPAREN); + setState(264); + ((BitwiseXorExprContext)_localctx).oper = match(BV_XOR); + setState(265); + ((BitwiseXorExprContext)_localctx).leftOp = expr(); + setState(266); + ((BitwiseXorExprContext)_localctx).rightOp = expr(); + setState(267); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BitwiseAndExprContext extends ParserRuleContext { + public Token oper; + public ExprContext expr; + public List ops = new ArrayList(); + public BitwiseShiftExprContext bitwiseShiftExpr() { + return getRuleContext(BitwiseShiftExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public TerminalNode BV_AND() { return getToken(ExprParser.BV_AND, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public BitwiseAndExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bitwiseAndExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterBitwiseAndExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitBitwiseAndExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitBitwiseAndExpr(this); + else return visitor.visitChildren(this); + } + } + + public final BitwiseAndExprContext bitwiseAndExpr() throws RecognitionException { + BitwiseAndExprContext _localctx = new BitwiseAndExprContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_bitwiseAndExpr); + int _la; + try { + setState(283); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(271); + bitwiseShiftExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(272); + match(LPAREN); + setState(273); + ((BitwiseAndExprContext)_localctx).oper = match(BV_AND); + setState(274); + ((BitwiseAndExprContext)_localctx).expr = expr(); + ((BitwiseAndExprContext)_localctx).ops.add(((BitwiseAndExprContext)_localctx).expr); + setState(278); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (TRUE - 79)) | (1L << (FALSE - 79)) | (1L << (BV - 79)) | (1L << (INT - 79)) | (1L << (ID - 79)) | (1L << (LPAREN - 79)))) != 0)) { + { + { + setState(275); + ((BitwiseAndExprContext)_localctx).expr = expr(); + ((BitwiseAndExprContext)_localctx).ops.add(((BitwiseAndExprContext)_localctx).expr); + } + } + setState(280); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(281); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BitwiseShiftExprContext extends ParserRuleContext { + public Token oper; + public ExprContext leftOp; + public ExprContext rightOp; + public AdditiveExprContext additiveExpr() { + return getRuleContext(AdditiveExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public TerminalNode BV_SHL() { return getToken(ExprParser.BV_SHL, 0); } + public TerminalNode BV_ASHR() { return getToken(ExprParser.BV_ASHR, 0); } + public TerminalNode BV_LSHR() { return getToken(ExprParser.BV_LSHR, 0); } + public TerminalNode BV_ROL() { return getToken(ExprParser.BV_ROL, 0); } + public TerminalNode BV_ROR() { return getToken(ExprParser.BV_ROR, 0); } + public BitwiseShiftExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bitwiseShiftExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterBitwiseShiftExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitBitwiseShiftExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitBitwiseShiftExpr(this); + else return visitor.visitChildren(this); + } + } + + public final BitwiseShiftExprContext bitwiseShiftExpr() throws RecognitionException { + BitwiseShiftExprContext _localctx = new BitwiseShiftExprContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_bitwiseShiftExpr); + int _la; + try { + setState(292); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(285); + additiveExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(286); + match(LPAREN); + setState(287); + ((BitwiseShiftExprContext)_localctx).oper = _input.LT(1); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << BV_SHL) | (1L << BV_ASHR) | (1L << BV_LSHR) | (1L << BV_ROL) | (1L << BV_ROR))) != 0)) ) { + ((BitwiseShiftExprContext)_localctx).oper = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(288); + ((BitwiseShiftExprContext)_localctx).leftOp = expr(); + setState(289); + ((BitwiseShiftExprContext)_localctx).rightOp = expr(); + setState(290); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AdditiveExprContext extends ParserRuleContext { + public Token oper; + public ExprContext expr; + public List ops = new ArrayList(); + public MultiplicativeExprContext multiplicativeExpr() { + return getRuleContext(MultiplicativeExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public TerminalNode PLUS() { return getToken(ExprParser.PLUS, 0); } + public TerminalNode MINUS() { return getToken(ExprParser.MINUS, 0); } + public TerminalNode BV_ADD() { return getToken(ExprParser.BV_ADD, 0); } + public TerminalNode BV_SUB() { return getToken(ExprParser.BV_SUB, 0); } + public TerminalNode FPADD() { return getToken(ExprParser.FPADD, 0); } + public TerminalNode FPSUB() { return getToken(ExprParser.FPSUB, 0); } + public AdditiveExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_additiveExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterAdditiveExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitAdditiveExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitAdditiveExpr(this); + else return visitor.visitChildren(this); + } + } + + public final AdditiveExprContext additiveExpr() throws RecognitionException { + AdditiveExprContext _localctx = new AdditiveExprContext(_ctx, getState()); + enterRule(_localctx, 40, RULE_additiveExpr); + int _la; + try { + setState(306); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(294); + multiplicativeExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(295); + match(LPAREN); + setState(296); + ((AdditiveExprContext)_localctx).oper = _input.LT(1); + _la = _input.LA(1); + if ( !(((((_la - 26)) & ~0x3f) == 0 && ((1L << (_la - 26)) & ((1L << (PLUS - 26)) | (1L << (MINUS - 26)) | (1L << (BV_ADD - 26)) | (1L << (BV_SUB - 26)) | (1L << (FPSUB - 26)) | (1L << (FPADD - 26)))) != 0)) ) { + ((AdditiveExprContext)_localctx).oper = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(297); + ((AdditiveExprContext)_localctx).expr = expr(); + ((AdditiveExprContext)_localctx).ops.add(((AdditiveExprContext)_localctx).expr); + setState(301); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (TRUE - 79)) | (1L << (FALSE - 79)) | (1L << (BV - 79)) | (1L << (INT - 79)) | (1L << (ID - 79)) | (1L << (LPAREN - 79)))) != 0)) { + { + { + setState(298); + ((AdditiveExprContext)_localctx).expr = expr(); + ((AdditiveExprContext)_localctx).ops.add(((AdditiveExprContext)_localctx).expr); + } + } + setState(303); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(304); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class MultiplicativeExprContext extends ParserRuleContext { + public Token oper; + public ExprContext expr; + public List ops = new ArrayList(); + public BvConcatExprContext bvConcatExpr() { + return getRuleContext(BvConcatExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public TerminalNode MUL() { return getToken(ExprParser.MUL, 0); } + public TerminalNode DIV() { return getToken(ExprParser.DIV, 0); } + public TerminalNode MOD() { return getToken(ExprParser.MOD, 0); } + public TerminalNode REM() { return getToken(ExprParser.REM, 0); } + public TerminalNode BV_MUL() { return getToken(ExprParser.BV_MUL, 0); } + public TerminalNode BV_UDIV() { return getToken(ExprParser.BV_UDIV, 0); } + public TerminalNode BV_SDIV() { return getToken(ExprParser.BV_SDIV, 0); } + public TerminalNode BV_SMOD() { return getToken(ExprParser.BV_SMOD, 0); } + public TerminalNode BV_UREM() { return getToken(ExprParser.BV_UREM, 0); } + public TerminalNode BV_SREM() { return getToken(ExprParser.BV_SREM, 0); } + public TerminalNode FPREM() { return getToken(ExprParser.FPREM, 0); } + public TerminalNode FPMUL() { return getToken(ExprParser.FPMUL, 0); } + public TerminalNode FPDIV() { return getToken(ExprParser.FPDIV, 0); } + public MultiplicativeExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_multiplicativeExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterMultiplicativeExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitMultiplicativeExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitMultiplicativeExpr(this); + else return visitor.visitChildren(this); + } + } + + public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionException { + MultiplicativeExprContext _localctx = new MultiplicativeExprContext(_ctx, getState()); + enterRule(_localctx, 42, RULE_multiplicativeExpr); + int _la; + try { + setState(320); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(308); + bvConcatExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(309); + match(LPAREN); + setState(310); + ((MultiplicativeExprContext)_localctx).oper = _input.LT(1); + _la = _input.LA(1); + if ( !(((((_la - 28)) & ~0x3f) == 0 && ((1L << (_la - 28)) & ((1L << (MUL - 28)) | (1L << (DIV - 28)) | (1L << (MOD - 28)) | (1L << (REM - 28)) | (1L << (BV_MUL - 28)) | (1L << (BV_UDIV - 28)) | (1L << (BV_SDIV - 28)) | (1L << (BV_SMOD - 28)) | (1L << (BV_UREM - 28)) | (1L << (BV_SREM - 28)) | (1L << (FPREM - 28)) | (1L << (FPMUL - 28)) | (1L << (FPDIV - 28)))) != 0)) ) { + ((MultiplicativeExprContext)_localctx).oper = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(311); + ((MultiplicativeExprContext)_localctx).expr = expr(); + ((MultiplicativeExprContext)_localctx).ops.add(((MultiplicativeExprContext)_localctx).expr); + setState(315); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (TRUE - 79)) | (1L << (FALSE - 79)) | (1L << (BV - 79)) | (1L << (INT - 79)) | (1L << (ID - 79)) | (1L << (LPAREN - 79)))) != 0)) { + { + { + setState(312); + ((MultiplicativeExprContext)_localctx).expr = expr(); + ((MultiplicativeExprContext)_localctx).ops.add(((MultiplicativeExprContext)_localctx).expr); + } + } + setState(317); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(318); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BvConcatExprContext extends ParserRuleContext { + public Token oper; + public ExprContext expr; + public List ops = new ArrayList(); + public BvExtendExprContext bvExtendExpr() { + return getRuleContext(BvExtendExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public TerminalNode BV_CONCAT() { return getToken(ExprParser.BV_CONCAT, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public BvConcatExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bvConcatExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterBvConcatExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitBvConcatExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitBvConcatExpr(this); + else return visitor.visitChildren(this); + } + } + + public final BvConcatExprContext bvConcatExpr() throws RecognitionException { + BvConcatExprContext _localctx = new BvConcatExprContext(_ctx, getState()); + enterRule(_localctx, 44, RULE_bvConcatExpr); + int _la; + try { + setState(332); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(322); + bvExtendExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(323); + match(LPAREN); + setState(324); + ((BvConcatExprContext)_localctx).oper = match(BV_CONCAT); + setState(326); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(325); + ((BvConcatExprContext)_localctx).expr = expr(); + ((BvConcatExprContext)_localctx).ops.add(((BvConcatExprContext)_localctx).expr); + } + } + setState(328); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (TRUE - 79)) | (1L << (FALSE - 79)) | (1L << (BV - 79)) | (1L << (INT - 79)) | (1L << (ID - 79)) | (1L << (LPAREN - 79)))) != 0) ); + setState(330); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BvExtendExprContext extends ParserRuleContext { + public Token oper; + public ExprContext leftOp; + public BvTypeContext rightOp; + public UnaryExprContext unaryExpr() { + return getRuleContext(UnaryExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public ExprContext expr() { + return getRuleContext(ExprContext.class,0); + } + public BvTypeContext bvType() { + return getRuleContext(BvTypeContext.class,0); + } + public TerminalNode BV_ZERO_EXTEND() { return getToken(ExprParser.BV_ZERO_EXTEND, 0); } + public TerminalNode BV_SIGN_EXTEND() { return getToken(ExprParser.BV_SIGN_EXTEND, 0); } + public BvExtendExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bvExtendExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterBvExtendExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitBvExtendExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitBvExtendExpr(this); + else return visitor.visitChildren(this); + } + } + + public final BvExtendExprContext bvExtendExpr() throws RecognitionException { + BvExtendExprContext _localctx = new BvExtendExprContext(_ctx, getState()); + enterRule(_localctx, 46, RULE_bvExtendExpr); + int _la; + try { + setState(341); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(334); + unaryExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(335); + match(LPAREN); + setState(336); + ((BvExtendExprContext)_localctx).oper = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==BV_ZERO_EXTEND || _la==BV_SIGN_EXTEND) ) { + ((BvExtendExprContext)_localctx).oper = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(337); + ((BvExtendExprContext)_localctx).leftOp = expr(); + setState(338); + ((BvExtendExprContext)_localctx).rightOp = bvType(); + setState(339); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class UnaryExprContext extends ParserRuleContext { + public Token oper; + public ExprContext op; + public BitwiseNotExprContext bitwiseNotExpr() { + return getRuleContext(BitwiseNotExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public ExprContext expr() { + return getRuleContext(ExprContext.class,0); + } + public TerminalNode PLUS() { return getToken(ExprParser.PLUS, 0); } + public TerminalNode MINUS() { return getToken(ExprParser.MINUS, 0); } + public TerminalNode BV_POS() { return getToken(ExprParser.BV_POS, 0); } + public TerminalNode BV_NEG() { return getToken(ExprParser.BV_NEG, 0); } + public TerminalNode FP_ABS() { return getToken(ExprParser.FP_ABS, 0); } + public TerminalNode FP_IS_NAN() { return getToken(ExprParser.FP_IS_NAN, 0); } + public TerminalNode FPROUNDTOINT() { return getToken(ExprParser.FPROUNDTOINT, 0); } + public TerminalNode FPSQRT() { return getToken(ExprParser.FPSQRT, 0); } + public TerminalNode FPTOFP() { return getToken(ExprParser.FPTOFP, 0); } + public TerminalNode FPTOBV() { return getToken(ExprParser.FPTOBV, 0); } + public TerminalNode FP_FROM_BV() { return getToken(ExprParser.FP_FROM_BV, 0); } + public TerminalNode FPNEG() { return getToken(ExprParser.FPNEG, 0); } + public TerminalNode FPPOS() { return getToken(ExprParser.FPPOS, 0); } + public UnaryExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_unaryExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterUnaryExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitUnaryExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitUnaryExpr(this); + else return visitor.visitChildren(this); + } + } + + public final UnaryExprContext unaryExpr() throws RecognitionException { + UnaryExprContext _localctx = new UnaryExprContext(_ctx, getState()); + enterRule(_localctx, 48, RULE_unaryExpr); + int _la; + try { + setState(349); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(343); + bitwiseNotExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(344); + match(LPAREN); + setState(345); + ((UnaryExprContext)_localctx).oper = _input.LT(1); + _la = _input.LA(1); + if ( !(((((_la - 26)) & ~0x3f) == 0 && ((1L << (_la - 26)) & ((1L << (PLUS - 26)) | (1L << (MINUS - 26)) | (1L << (BV_POS - 26)) | (1L << (BV_NEG - 26)) | (1L << (FP_ABS - 26)) | (1L << (FP_FROM_BV - 26)) | (1L << (FP_IS_NAN - 26)) | (1L << (FPROUNDTOINT - 26)) | (1L << (FPSQRT - 26)) | (1L << (FPTOBV - 26)) | (1L << (FPTOFP - 26)) | (1L << (FPPOS - 26)) | (1L << (FPNEG - 26)))) != 0)) ) { + ((UnaryExprContext)_localctx).oper = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(346); + ((UnaryExprContext)_localctx).op = expr(); + setState(347); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BitwiseNotExprContext extends ParserRuleContext { + public ExprContext op; + public FunctionCallContext functionCall() { + return getRuleContext(FunctionCallContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode BV_NOT() { return getToken(ExprParser.BV_NOT, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public ExprContext expr() { + return getRuleContext(ExprContext.class,0); + } + public BitwiseNotExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bitwiseNotExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterBitwiseNotExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitBitwiseNotExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitBitwiseNotExpr(this); + else return visitor.visitChildren(this); + } + } + + public final BitwiseNotExprContext bitwiseNotExpr() throws RecognitionException { + BitwiseNotExprContext _localctx = new BitwiseNotExprContext(_ctx, getState()); + enterRule(_localctx, 50, RULE_bitwiseNotExpr); + try { + setState(357); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(351); + functionCall(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(352); + match(LPAREN); + setState(353); + match(BV_NOT); + setState(354); + ((BitwiseNotExprContext)_localctx).op = expr(); + setState(355); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FunctionCallContext extends ParserRuleContext { + public ExprContext op; + public ExprContext expr; + public List ops = new ArrayList(); + public ArrayReadContext arrayRead() { + return getRuleContext(ArrayReadContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode FUNC() { return getToken(ExprParser.FUNC, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public FunctionCallContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_functionCall; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterFunctionCall(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitFunctionCall(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitFunctionCall(this); + else return visitor.visitChildren(this); + } + } + + public final FunctionCallContext functionCall() throws RecognitionException { + FunctionCallContext _localctx = new FunctionCallContext(_ctx, getState()); + enterRule(_localctx, 52, RULE_functionCall); + int _la; + try { + setState(371); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(359); + arrayRead(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(360); + match(LPAREN); + setState(361); + match(FUNC); + setState(362); + ((FunctionCallContext)_localctx).op = expr(); + setState(366); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (TRUE - 79)) | (1L << (FALSE - 79)) | (1L << (BV - 79)) | (1L << (INT - 79)) | (1L << (ID - 79)) | (1L << (LPAREN - 79)))) != 0)) { + { + { + setState(363); + ((FunctionCallContext)_localctx).expr = expr(); + ((FunctionCallContext)_localctx).ops.add(((FunctionCallContext)_localctx).expr); + } + } + setState(368); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(369); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ArrayReadContext extends ParserRuleContext { + public ExprContext array; + public ExprContext index; + public ArrayWriteContext arrayWrite() { + return getRuleContext(ArrayWriteContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode READ() { return getToken(ExprParser.READ, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public ArrayReadContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arrayRead; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterArrayRead(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitArrayRead(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitArrayRead(this); + else return visitor.visitChildren(this); + } + } + + public final ArrayReadContext arrayRead() throws RecognitionException { + ArrayReadContext _localctx = new ArrayReadContext(_ctx, getState()); + enterRule(_localctx, 54, RULE_arrayRead); + try { + setState(380); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(373); + arrayWrite(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(374); + match(LPAREN); + setState(375); + match(READ); + setState(376); + ((ArrayReadContext)_localctx).array = expr(); + setState(377); + ((ArrayReadContext)_localctx).index = expr(); + setState(378); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ArrayWriteContext extends ParserRuleContext { + public ExprContext array; + public ExprContext index; + public ExprContext elem; + public PrimeExprContext primeExpr() { + return getRuleContext(PrimeExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode WRITE() { return getToken(ExprParser.WRITE, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public ArrayWriteContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arrayWrite; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterArrayWrite(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitArrayWrite(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitArrayWrite(this); + else return visitor.visitChildren(this); + } + } + + public final ArrayWriteContext arrayWrite() throws RecognitionException { + ArrayWriteContext _localctx = new ArrayWriteContext(_ctx, getState()); + enterRule(_localctx, 56, RULE_arrayWrite); + try { + setState(390); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(382); + primeExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(383); + match(LPAREN); + setState(384); + match(WRITE); + setState(385); + ((ArrayWriteContext)_localctx).array = expr(); + setState(386); + ((ArrayWriteContext)_localctx).index = expr(); + setState(387); + ((ArrayWriteContext)_localctx).elem = expr(); + setState(388); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PrimeExprContext extends ParserRuleContext { + public ExprContext op; + public BvExtractContext bvExtract() { + return getRuleContext(BvExtractContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode PRIME() { return getToken(ExprParser.PRIME, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public ExprContext expr() { + return getRuleContext(ExprContext.class,0); + } + public PrimeExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_primeExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterPrimeExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitPrimeExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitPrimeExpr(this); + else return visitor.visitChildren(this); + } + } + + public final PrimeExprContext primeExpr() throws RecognitionException { + PrimeExprContext _localctx = new PrimeExprContext(_ctx, getState()); + enterRule(_localctx, 58, RULE_primeExpr); + try { + setState(398); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(392); + bvExtract(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(393); + match(LPAREN); + setState(394); + match(PRIME); + setState(395); + ((PrimeExprContext)_localctx).op = expr(); + setState(396); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BvExtractContext extends ParserRuleContext { + public ExprContext op; + public ExprContext from; + public ExprContext until; + public PrimaryExprContext primaryExpr() { + return getRuleContext(PrimaryExprContext.class,0); + } + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode EXTRACT() { return getToken(ExprParser.EXTRACT, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public BvExtractContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bvExtract; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterBvExtract(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitBvExtract(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitBvExtract(this); + else return visitor.visitChildren(this); + } + } + + public final BvExtractContext bvExtract() throws RecognitionException { + BvExtractContext _localctx = new BvExtractContext(_ctx, getState()); + enterRule(_localctx, 60, RULE_bvExtract); + try { + setState(408); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(400); + primaryExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(401); + match(LPAREN); + setState(402); + match(EXTRACT); + setState(403); + ((BvExtractContext)_localctx).op = expr(); + setState(404); + ((BvExtractContext)_localctx).from = expr(); + setState(405); + ((BvExtractContext)_localctx).until = expr(); + setState(406); + match(RPAREN); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PrimaryExprContext extends ParserRuleContext { + public TrueExprContext trueExpr() { + return getRuleContext(TrueExprContext.class,0); + } + public FalseExprContext falseExpr() { + return getRuleContext(FalseExprContext.class,0); + } + public IntLitExprContext intLitExpr() { + return getRuleContext(IntLitExprContext.class,0); + } + public RatLitExprContext ratLitExpr() { + return getRuleContext(RatLitExprContext.class,0); + } + public ArrLitExprContext arrLitExpr() { + return getRuleContext(ArrLitExprContext.class,0); + } + public FpLitExprContext fpLitExpr() { + return getRuleContext(FpLitExprContext.class,0); + } + public BvLitExprContext bvLitExpr() { + return getRuleContext(BvLitExprContext.class,0); + } + public IdExprContext idExpr() { + return getRuleContext(IdExprContext.class,0); + } + public ParenExprContext parenExpr() { + return getRuleContext(ParenExprContext.class,0); + } + public PrimaryExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_primaryExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterPrimaryExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitPrimaryExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitPrimaryExpr(this); + else return visitor.visitChildren(this); + } + } + + public final PrimaryExprContext primaryExpr() throws RecognitionException { + PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, getState()); + enterRule(_localctx, 62, RULE_primaryExpr); + try { + setState(419); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(410); + trueExpr(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(411); + falseExpr(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(412); + intLitExpr(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(413); + ratLitExpr(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(414); + arrLitExpr(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(415); + fpLitExpr(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(416); + bvLitExpr(); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(417); + idExpr(); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(418); + parenExpr(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TrueExprContext extends ParserRuleContext { + public TerminalNode TRUE() { return getToken(ExprParser.TRUE, 0); } + public TrueExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_trueExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterTrueExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitTrueExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitTrueExpr(this); + else return visitor.visitChildren(this); + } + } + + public final TrueExprContext trueExpr() throws RecognitionException { + TrueExprContext _localctx = new TrueExprContext(_ctx, getState()); + enterRule(_localctx, 64, RULE_trueExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(421); + match(TRUE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FalseExprContext extends ParserRuleContext { + public TerminalNode FALSE() { return getToken(ExprParser.FALSE, 0); } + public FalseExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_falseExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterFalseExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitFalseExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitFalseExpr(this); + else return visitor.visitChildren(this); + } + } + + public final FalseExprContext falseExpr() throws RecognitionException { + FalseExprContext _localctx = new FalseExprContext(_ctx, getState()); + enterRule(_localctx, 66, RULE_falseExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(423); + match(FALSE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IntLitExprContext extends ParserRuleContext { + public Token value; + public TerminalNode INT() { return getToken(ExprParser.INT, 0); } + public IntLitExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_intLitExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterIntLitExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitIntLitExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitIntLitExpr(this); + else return visitor.visitChildren(this); + } + } + + public final IntLitExprContext intLitExpr() throws RecognitionException { + IntLitExprContext _localctx = new IntLitExprContext(_ctx, getState()); + enterRule(_localctx, 68, RULE_intLitExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(425); + ((IntLitExprContext)_localctx).value = match(INT); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class RatLitExprContext extends ParserRuleContext { + public Token num; + public Token denom; + public TerminalNode PERCENT() { return getToken(ExprParser.PERCENT, 0); } + public List INT() { return getTokens(ExprParser.INT); } + public TerminalNode INT(int i) { + return getToken(ExprParser.INT, i); + } + public RatLitExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ratLitExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterRatLitExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitRatLitExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitRatLitExpr(this); + else return visitor.visitChildren(this); + } + } + + public final RatLitExprContext ratLitExpr() throws RecognitionException { + RatLitExprContext _localctx = new RatLitExprContext(_ctx, getState()); + enterRule(_localctx, 70, RULE_ratLitExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(427); + ((RatLitExprContext)_localctx).num = match(INT); + setState(428); + match(PERCENT); + setState(429); + ((RatLitExprContext)_localctx).denom = match(INT); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ArrLitExprContext extends ParserRuleContext { + public ExprContext expr; + public List indexExpr = new ArrayList(); + public List valueExpr = new ArrayList(); + public ExprContext elseExpr; + public List LPAREN() { return getTokens(ExprParser.LPAREN); } + public TerminalNode LPAREN(int i) { + return getToken(ExprParser.LPAREN, i); + } + public TerminalNode ARRAY() { return getToken(ExprParser.ARRAY, 0); } + public TerminalNode DEFAULT() { return getToken(ExprParser.DEFAULT, 0); } + public List RPAREN() { return getTokens(ExprParser.RPAREN); } + public TerminalNode RPAREN(int i) { + return getToken(ExprParser.RPAREN, i); + } + public List expr() { + return getRuleContexts(ExprContext.class); + } + public ExprContext expr(int i) { + return getRuleContext(ExprContext.class,i); + } + public ArrLitExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arrLitExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterArrLitExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitArrLitExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitArrLitExpr(this); + else return visitor.visitChildren(this); + } + } + + public final ArrLitExprContext arrLitExpr() throws RecognitionException { + ArrLitExprContext _localctx = new ArrLitExprContext(_ctx, getState()); + enterRule(_localctx, 72, RULE_arrLitExpr); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(431); + match(LPAREN); + setState(432); + match(ARRAY); + setState(440); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,39,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(433); + match(LPAREN); + setState(434); + ((ArrLitExprContext)_localctx).expr = expr(); + ((ArrLitExprContext)_localctx).indexExpr.add(((ArrLitExprContext)_localctx).expr); + setState(435); + ((ArrLitExprContext)_localctx).expr = expr(); + ((ArrLitExprContext)_localctx).valueExpr.add(((ArrLitExprContext)_localctx).expr); + setState(436); + match(RPAREN); + } + } + } + setState(442); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,39,_ctx); + } + setState(443); + match(LPAREN); + setState(444); + match(DEFAULT); + setState(445); + ((ArrLitExprContext)_localctx).elseExpr = expr(); + setState(446); + match(RPAREN); + setState(447); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BvLitExprContext extends ParserRuleContext { + public Token bv; + public TerminalNode BV() { return getToken(ExprParser.BV, 0); } + public BvLitExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bvLitExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterBvLitExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitBvLitExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitBvLitExpr(this); + else return visitor.visitChildren(this); + } + } + + public final BvLitExprContext bvLitExpr() throws RecognitionException { + BvLitExprContext _localctx = new BvLitExprContext(_ctx, getState()); + enterRule(_localctx, 74, RULE_bvLitExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(449); + ((BvLitExprContext)_localctx).bv = match(BV); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FpLitExprContext extends ParserRuleContext { + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public List bvLitExpr() { + return getRuleContexts(BvLitExprContext.class); + } + public BvLitExprContext bvLitExpr(int i) { + return getRuleContext(BvLitExprContext.class,i); + } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public FpLitExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fpLitExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterFpLitExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitFpLitExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitFpLitExpr(this); + else return visitor.visitChildren(this); + } + } + + public final FpLitExprContext fpLitExpr() throws RecognitionException { + FpLitExprContext _localctx = new FpLitExprContext(_ctx, getState()); + enterRule(_localctx, 76, RULE_fpLitExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(451); + match(LPAREN); + setState(452); + bvLitExpr(); + setState(453); + bvLitExpr(); + setState(454); + bvLitExpr(); + setState(455); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IdExprContext extends ParserRuleContext { + public Token id; + public TerminalNode ID() { return getToken(ExprParser.ID, 0); } + public IdExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_idExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterIdExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitIdExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitIdExpr(this); + else return visitor.visitChildren(this); + } + } + + public final IdExprContext idExpr() throws RecognitionException { + IdExprContext _localctx = new IdExprContext(_ctx, getState()); + enterRule(_localctx, 78, RULE_idExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(457); + ((IdExprContext)_localctx).id = match(ID); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ParenExprContext extends ParserRuleContext { + public ExprContext op; + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public ExprContext expr() { + return getRuleContext(ExprContext.class,0); + } + public ParenExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_parenExpr; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterParenExpr(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitParenExpr(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitParenExpr(this); + else return visitor.visitChildren(this); + } + } + + public final ParenExprContext parenExpr() throws RecognitionException { + ParenExprContext _localctx = new ParenExprContext(_ctx, getState()); + enterRule(_localctx, 80, RULE_parenExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(459); + match(LPAREN); + setState(460); + ((ParenExprContext)_localctx).op = expr(); + setState(461); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class DeclContext extends ParserRuleContext { + public Token name; + public TypeContext ttype; + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public TerminalNode ID() { return getToken(ExprParser.ID, 0); } + public TypeContext type() { + return getRuleContext(TypeContext.class,0); + } + public DeclContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_decl; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterDecl(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitDecl(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitDecl(this); + else return visitor.visitChildren(this); + } + } + + public final DeclContext decl() throws RecognitionException { + DeclContext _localctx = new DeclContext(_ctx, getState()); + enterRule(_localctx, 82, RULE_decl); + try { + enterOuterAlt(_localctx, 1); + { + setState(463); + match(LPAREN); + setState(464); + ((DeclContext)_localctx).name = match(ID); + setState(465); + ((DeclContext)_localctx).ttype = type(); + setState(466); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class DeclListContext extends ParserRuleContext { + public DeclContext decl; + public List decls = new ArrayList(); + public List decl() { + return getRuleContexts(DeclContext.class); + } + public DeclContext decl(int i) { + return getRuleContext(DeclContext.class,i); + } + public List COMMA() { return getTokens(ExprParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(ExprParser.COMMA, i); + } + public DeclListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_declList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterDeclList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitDeclList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitDeclList(this); + else return visitor.visitChildren(this); + } + } + + public final DeclListContext declList() throws RecognitionException { + DeclListContext _localctx = new DeclListContext(_ctx, getState()); + enterRule(_localctx, 84, RULE_declList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + { + setState(468); + ((DeclListContext)_localctx).decl = decl(); + ((DeclListContext)_localctx).decls.add(((DeclListContext)_localctx).decl); + } + setState(473); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(469); + match(COMMA); + setState(470); + ((DeclListContext)_localctx).decl = decl(); + ((DeclListContext)_localctx).decls.add(((DeclListContext)_localctx).decl); + } + } + setState(475); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TypeContext extends ParserRuleContext { + public BoolTypeContext boolType() { + return getRuleContext(BoolTypeContext.class,0); + } + public IntTypeContext intType() { + return getRuleContext(IntTypeContext.class,0); + } + public RatTypeContext ratType() { + return getRuleContext(RatTypeContext.class,0); + } + public FuncTypeContext funcType() { + return getRuleContext(FuncTypeContext.class,0); + } + public ArrayTypeContext arrayType() { + return getRuleContext(ArrayTypeContext.class,0); + } + public BvTypeContext bvType() { + return getRuleContext(BvTypeContext.class,0); + } + public FpTypeContext fpType() { + return getRuleContext(FpTypeContext.class,0); + } + public TypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitType(this); + else return visitor.visitChildren(this); + } + } + + public final TypeContext type() throws RecognitionException { + TypeContext _localctx = new TypeContext(_ctx, getState()); + enterRule(_localctx, 86, RULE_type); + try { + setState(483); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(476); + boolType(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(477); + intType(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(478); + ratType(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(479); + funcType(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(480); + arrayType(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(481); + bvType(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(482); + fpType(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TypeListContext extends ParserRuleContext { + public TypeContext type; + public List types = new ArrayList(); + public List type() { + return getRuleContexts(TypeContext.class); + } + public TypeContext type(int i) { + return getRuleContext(TypeContext.class,i); + } + public List COMMA() { return getTokens(ExprParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(ExprParser.COMMA, i); + } + public TypeListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterTypeList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitTypeList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitTypeList(this); + else return visitor.visitChildren(this); + } + } + + public final TypeListContext typeList() throws RecognitionException { + TypeListContext _localctx = new TypeListContext(_ctx, getState()); + enterRule(_localctx, 88, RULE_typeList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + { + setState(485); + ((TypeListContext)_localctx).type = type(); + ((TypeListContext)_localctx).types.add(((TypeListContext)_localctx).type); + } + setState(490); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(486); + match(COMMA); + setState(487); + ((TypeListContext)_localctx).type = type(); + ((TypeListContext)_localctx).types.add(((TypeListContext)_localctx).type); + } + } + setState(492); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BoolTypeContext extends ParserRuleContext { + public TerminalNode BOOLTYPE() { return getToken(ExprParser.BOOLTYPE, 0); } + public BoolTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_boolType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterBoolType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitBoolType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitBoolType(this); + else return visitor.visitChildren(this); + } + } + + public final BoolTypeContext boolType() throws RecognitionException { + BoolTypeContext _localctx = new BoolTypeContext(_ctx, getState()); + enterRule(_localctx, 90, RULE_boolType); + try { + enterOuterAlt(_localctx, 1); + { + setState(493); + match(BOOLTYPE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IntTypeContext extends ParserRuleContext { + public TerminalNode INTTYPE() { return getToken(ExprParser.INTTYPE, 0); } + public IntTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_intType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterIntType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitIntType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitIntType(this); + else return visitor.visitChildren(this); + } + } + + public final IntTypeContext intType() throws RecognitionException { + IntTypeContext _localctx = new IntTypeContext(_ctx, getState()); + enterRule(_localctx, 92, RULE_intType); + try { + enterOuterAlt(_localctx, 1); + { + setState(495); + match(INTTYPE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class RatTypeContext extends ParserRuleContext { + public TerminalNode RATTYPE() { return getToken(ExprParser.RATTYPE, 0); } + public RatTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ratType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterRatType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitRatType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitRatType(this); + else return visitor.visitChildren(this); + } + } + + public final RatTypeContext ratType() throws RecognitionException { + RatTypeContext _localctx = new RatTypeContext(_ctx, getState()); + enterRule(_localctx, 94, RULE_ratType); + try { + enterOuterAlt(_localctx, 1); + { + setState(497); + match(RATTYPE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FuncTypeContext extends ParserRuleContext { + public TypeContext from; + public TypeContext to; + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode FUNC() { return getToken(ExprParser.FUNC, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List type() { + return getRuleContexts(TypeContext.class); + } + public TypeContext type(int i) { + return getRuleContext(TypeContext.class,i); + } + public FuncTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_funcType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterFuncType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitFuncType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitFuncType(this); + else return visitor.visitChildren(this); + } + } + + public final FuncTypeContext funcType() throws RecognitionException { + FuncTypeContext _localctx = new FuncTypeContext(_ctx, getState()); + enterRule(_localctx, 96, RULE_funcType); + try { + enterOuterAlt(_localctx, 1); + { + setState(499); + match(LPAREN); + setState(500); + match(FUNC); + setState(501); + ((FuncTypeContext)_localctx).from = type(); + setState(502); + ((FuncTypeContext)_localctx).to = type(); + setState(503); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ArrayTypeContext extends ParserRuleContext { + public TypeContext indexType; + public TypeContext elemType; + public List LPAREN() { return getTokens(ExprParser.LPAREN); } + public TerminalNode LPAREN(int i) { + return getToken(ExprParser.LPAREN, i); + } + public TerminalNode ARRAY() { return getToken(ExprParser.ARRAY, 0); } + public TerminalNode LBRACK() { return getToken(ExprParser.LBRACK, 0); } + public TerminalNode RBRACK() { return getToken(ExprParser.RBRACK, 0); } + public TerminalNode RARROW() { return getToken(ExprParser.RARROW, 0); } + public List RPAREN() { return getTokens(ExprParser.RPAREN); } + public TerminalNode RPAREN(int i) { + return getToken(ExprParser.RPAREN, i); + } + public List type() { + return getRuleContexts(TypeContext.class); + } + public TypeContext type(int i) { + return getRuleContext(TypeContext.class,i); + } + public ArrayTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arrayType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterArrayType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitArrayType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitArrayType(this); + else return visitor.visitChildren(this); + } + } + + public final ArrayTypeContext arrayType() throws RecognitionException { + ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); + enterRule(_localctx, 98, RULE_arrayType); + try { + enterOuterAlt(_localctx, 1); + { + setState(505); + match(LPAREN); + setState(506); + match(ARRAY); + setState(507); + match(LPAREN); + setState(508); + match(LBRACK); + setState(509); + ((ArrayTypeContext)_localctx).indexType = type(); + setState(510); + match(RBRACK); + setState(511); + match(RARROW); + setState(512); + ((ArrayTypeContext)_localctx).elemType = type(); + setState(513); + match(RPAREN); + setState(514); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BvTypeContext extends ParserRuleContext { + public Token size; + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode BVTYPE() { return getToken(ExprParser.BVTYPE, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public TerminalNode INT() { return getToken(ExprParser.INT, 0); } + public BvTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bvType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterBvType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitBvType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitBvType(this); + else return visitor.visitChildren(this); + } + } + + public final BvTypeContext bvType() throws RecognitionException { + BvTypeContext _localctx = new BvTypeContext(_ctx, getState()); + enterRule(_localctx, 100, RULE_bvType); + try { + enterOuterAlt(_localctx, 1); + { + setState(516); + match(LPAREN); + setState(517); + match(BVTYPE); + setState(518); + ((BvTypeContext)_localctx).size = match(INT); + setState(519); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FpTypeContext extends ParserRuleContext { + public Token exponent; + public Token significand; + public TerminalNode LPAREN() { return getToken(ExprParser.LPAREN, 0); } + public TerminalNode FPTYPE() { return getToken(ExprParser.FPTYPE, 0); } + public TerminalNode RPAREN() { return getToken(ExprParser.RPAREN, 0); } + public List INT() { return getTokens(ExprParser.INT); } + public TerminalNode INT(int i) { + return getToken(ExprParser.INT, i); + } + public FpTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fpType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).enterFpType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof ExprListener ) ((ExprListener)listener).exitFpType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof ExprVisitor ) return ((ExprVisitor)visitor).visitFpType(this); + else return visitor.visitChildren(this); + } + } + + public final FpTypeContext fpType() throws RecognitionException { + FpTypeContext _localctx = new FpTypeContext(_ctx, getState()); + enterRule(_localctx, 102, RULE_fpType); + try { + enterOuterAlt(_localctx, 1); + { + setState(521); + match(LPAREN); + setState(522); + match(FPTYPE); + setState(523); + ((FpTypeContext)_localctx).exponent = match(INT); + setState(524); + ((FpTypeContext)_localctx).significand = match(INT); + setState(525); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static final String _serializedATN = + "\u0004\u0001t\u0210\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002"+ + "\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002"+ + "\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002"+ + "\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b\u0007\u000b\u0002"+ + "\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002\u000f\u0007\u000f"+ + "\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002\u0012\u0007\u0012"+ + "\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002\u0015\u0007\u0015"+ + "\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002\u0018\u0007\u0018"+ + "\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002\u001b\u0007\u001b"+ + "\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002\u001e\u0007\u001e"+ + "\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007!\u0002\"\u0007\"\u0002"+ + "#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007&\u0002\'\u0007\'\u0002"+ + "(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007+\u0002,\u0007,\u0002"+ + "-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u00070\u00021\u00071\u0002"+ + "2\u00072\u00023\u00073\u0001\u0000\u0001\u0000\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0005\u0001n\b\u0001\n\u0001\f\u0001q\t\u0001\u0001\u0002"+ + "\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002"+ + "\u0003\u0002z\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003"+ + "\u0001\u0003\u0001\u0003\u0001\u0003\u0001\u0003\u0003\u0003\u0084\b\u0003"+ + "\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004"+ + "\u008b\b\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u008f\b\u0004\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u0096"+ + "\b\u0005\u0001\u0005\u0001\u0005\u0003\u0005\u009a\b\u0005\u0001\u0006"+ + "\u0001\u0006\u0001\u0006\u0003\u0006\u009f\b\u0006\u0001\u0007\u0001\u0007"+ + "\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007\u0001\u0007"+ + "\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b\u0001"+ + "\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0003\t\u00b8\b\t\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\n\u0005\n\u00bf\b\n\n\n\f\n\u00c2\t\n"+ + "\u0001\n\u0001\n\u0003\n\u00c6\b\n\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b\u0003\u000b\u00cf\b\u000b"+ + "\u0001\f\u0001\f\u0001\f\u0001\f\u0001\f\u0005\f\u00d6\b\f\n\f\f\f\u00d9"+ + "\t\f\u0001\f\u0001\f\u0003\f\u00dd\b\f\u0001\r\u0001\r\u0001\r\u0001\r"+ + "\u0001\r\u0001\r\u0003\r\u00e5\b\r\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0003\u000e\u00ee\b\u000e"+ + "\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u000f"+ + "\u0001\u000f\u0003\u000f\u00f7\b\u000f\u0001\u0010\u0001\u0010\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0005\u0010\u00fe\b\u0010\n\u0010\f\u0010\u0101"+ + "\t\u0010\u0001\u0010\u0001\u0010\u0003\u0010\u0105\b\u0010\u0001\u0011"+ + "\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0003\u0011\u010e\b\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012"+ + "\u0001\u0012\u0005\u0012\u0115\b\u0012\n\u0012\f\u0012\u0118\t\u0012\u0001"+ + "\u0012\u0001\u0012\u0003\u0012\u011c\b\u0012\u0001\u0013\u0001\u0013\u0001"+ + "\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0001\u0013\u0003\u0013\u0125"+ + "\b\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0014\u0005"+ + "\u0014\u012c\b\u0014\n\u0014\f\u0014\u012f\t\u0014\u0001\u0014\u0001\u0014"+ + "\u0003\u0014\u0133\b\u0014\u0001\u0015\u0001\u0015\u0001\u0015\u0001\u0015"+ + "\u0001\u0015\u0005\u0015\u013a\b\u0015\n\u0015\f\u0015\u013d\t\u0015\u0001"+ + "\u0015\u0001\u0015\u0003\u0015\u0141\b\u0015\u0001\u0016\u0001\u0016\u0001"+ + "\u0016\u0001\u0016\u0004\u0016\u0147\b\u0016\u000b\u0016\f\u0016\u0148"+ + "\u0001\u0016\u0001\u0016\u0003\u0016\u014d\b\u0016\u0001\u0017\u0001\u0017"+ + "\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0001\u0017\u0003\u0017"+ + "\u0156\b\u0017\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018\u0001\u0018"+ + "\u0001\u0018\u0003\u0018\u015e\b\u0018\u0001\u0019\u0001\u0019\u0001\u0019"+ + "\u0001\u0019\u0001\u0019\u0001\u0019\u0003\u0019\u0166\b\u0019\u0001\u001a"+ + "\u0001\u001a\u0001\u001a\u0001\u001a\u0001\u001a\u0005\u001a\u016d\b\u001a"+ + "\n\u001a\f\u001a\u0170\t\u001a\u0001\u001a\u0001\u001a\u0003\u001a\u0174"+ + "\b\u001a\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001\u001b\u0001"+ + "\u001b\u0001\u001b\u0003\u001b\u017d\b\u001b\u0001\u001c\u0001\u001c\u0001"+ + "\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c\u0003"+ + "\u001c\u0187\b\u001c\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001"+ + "\u001d\u0001\u001d\u0003\u001d\u018f\b\u001d\u0001\u001e\u0001\u001e\u0001"+ + "\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0001\u001e\u0003"+ + "\u001e\u0199\b\u001e\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001"+ + "\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0001\u001f\u0003\u001f\u01a4"+ + "\b\u001f\u0001 \u0001 \u0001!\u0001!\u0001\"\u0001\"\u0001#\u0001#\u0001"+ + "#\u0001#\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0005$\u01b7"+ + "\b$\n$\f$\u01ba\t$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001$\u0001%\u0001"+ + "%\u0001&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001(\u0001"+ + "(\u0001(\u0001(\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001"+ + "*\u0005*\u01d8\b*\n*\f*\u01db\t*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ + "+\u0001+\u0003+\u01e4\b+\u0001,\u0001,\u0001,\u0005,\u01e9\b,\n,\f,\u01ec"+ + "\t,\u0001-\u0001-\u0001.\u0001.\u0001/\u0001/\u00010\u00010\u00010\u0001"+ + "0\u00010\u00010\u00011\u00011\u00011\u00011\u00011\u00011\u00011\u0001"+ + "1\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u00012\u00013\u0001"+ + "3\u00013\u00013\u00013\u00013\u00013\u0000\u00004\u0000\u0002\u0004\u0006"+ + "\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*,."+ + "02468:<>@BDFHJLNPRTVXZ\\^`bdf\u0000\b\u0001\u0000BC\u0001\u0000\u0014"+ + "\u0015\u0002\u0000\u0016\u00197>\u0001\u000026\u0003\u0000\u001a\u001b"+ + "$%IJ\u0004\u0000\u001c\u001f(-DDKL\u0001\u0000\"#\u0005\u0000\u001a\u001b"+ + "&\'?AEHMN\u0213\u0000h\u0001\u0000\u0000\u0000\u0002j\u0001\u0000\u0000"+ + "\u0000\u0004y\u0001\u0000\u0000\u0000\u0006\u0083\u0001\u0000\u0000\u0000"+ + "\b\u008e\u0001\u0000\u0000\u0000\n\u0099\u0001\u0000\u0000\u0000\f\u009e"+ + "\u0001\u0000\u0000\u0000\u000e\u00a0\u0001\u0000\u0000\u0000\u0010\u00a8"+ + "\u0001\u0000\u0000\u0000\u0012\u00b7\u0001\u0000\u0000\u0000\u0014\u00c5"+ + "\u0001\u0000\u0000\u0000\u0016\u00ce\u0001\u0000\u0000\u0000\u0018\u00dc"+ + "\u0001\u0000\u0000\u0000\u001a\u00e4\u0001\u0000\u0000\u0000\u001c\u00ed"+ + "\u0001\u0000\u0000\u0000\u001e\u00f6\u0001\u0000\u0000\u0000 \u0104\u0001"+ + "\u0000\u0000\u0000\"\u010d\u0001\u0000\u0000\u0000$\u011b\u0001\u0000"+ + "\u0000\u0000&\u0124\u0001\u0000\u0000\u0000(\u0132\u0001\u0000\u0000\u0000"+ + "*\u0140\u0001\u0000\u0000\u0000,\u014c\u0001\u0000\u0000\u0000.\u0155"+ + "\u0001\u0000\u0000\u00000\u015d\u0001\u0000\u0000\u00002\u0165\u0001\u0000"+ + "\u0000\u00004\u0173\u0001\u0000\u0000\u00006\u017c\u0001\u0000\u0000\u0000"+ + "8\u0186\u0001\u0000\u0000\u0000:\u018e\u0001\u0000\u0000\u0000<\u0198"+ + "\u0001\u0000\u0000\u0000>\u01a3\u0001\u0000\u0000\u0000@\u01a5\u0001\u0000"+ + "\u0000\u0000B\u01a7\u0001\u0000\u0000\u0000D\u01a9\u0001\u0000\u0000\u0000"+ + "F\u01ab\u0001\u0000\u0000\u0000H\u01af\u0001\u0000\u0000\u0000J\u01c1"+ + "\u0001\u0000\u0000\u0000L\u01c3\u0001\u0000\u0000\u0000N\u01c9\u0001\u0000"+ + "\u0000\u0000P\u01cb\u0001\u0000\u0000\u0000R\u01cf\u0001\u0000\u0000\u0000"+ + "T\u01d4\u0001\u0000\u0000\u0000V\u01e3\u0001\u0000\u0000\u0000X\u01e5"+ + "\u0001\u0000\u0000\u0000Z\u01ed\u0001\u0000\u0000\u0000\\\u01ef\u0001"+ + "\u0000\u0000\u0000^\u01f1\u0001\u0000\u0000\u0000`\u01f3\u0001\u0000\u0000"+ + "\u0000b\u01f9\u0001\u0000\u0000\u0000d\u0204\u0001\u0000\u0000\u0000f"+ + "\u0209\u0001\u0000\u0000\u0000hi\u0003\u0004\u0002\u0000i\u0001\u0001"+ + "\u0000\u0000\u0000jo\u0003\u0000\u0000\u0000kl\u0005l\u0000\u0000ln\u0003"+ + "\u0000\u0000\u0000mk\u0001\u0000\u0000\u0000nq\u0001\u0000\u0000\u0000"+ + "om\u0001\u0000\u0000\u0000op\u0001\u0000\u0000\u0000p\u0003\u0001\u0000"+ + "\u0000\u0000qo\u0001\u0000\u0000\u0000rz\u0003\u0006\u0003\u0000st\u0005"+ + "f\u0000\u0000tu\u0005\u0006\u0000\u0000uv\u0003R)\u0000vw\u0003\u0000"+ + "\u0000\u0000wx\u0005g\u0000\u0000xz\u0001\u0000\u0000\u0000yr\u0001\u0000"+ + "\u0000\u0000ys\u0001\u0000\u0000\u0000z\u0005\u0001\u0000\u0000\u0000"+ + "{\u0084\u0003\b\u0004\u0000|}\u0005f\u0000\u0000}~\u0005\f\u0000\u0000"+ + "~\u007f\u0003\u0000\u0000\u0000\u007f\u0080\u0003\u0000\u0000\u0000\u0080"+ + "\u0081\u0003\u0000\u0000\u0000\u0081\u0082\u0005g\u0000\u0000\u0082\u0084"+ + "\u0001\u0000\u0000\u0000\u0083{\u0001\u0000\u0000\u0000\u0083|\u0001\u0000"+ + "\u0000\u0000\u0084\u0007\u0001\u0000\u0000\u0000\u0085\u008f\u0003\n\u0005"+ + "\u0000\u0086\u0087\u0005f\u0000\u0000\u0087\u0088\u0005\u000b\u0000\u0000"+ + "\u0088\u008a\u0003\u0000\u0000\u0000\u0089\u008b\u0003\u0000\u0000\u0000"+ + "\u008a\u0089\u0001\u0000\u0000\u0000\u008a\u008b\u0001\u0000\u0000\u0000"+ + "\u008b\u008c\u0001\u0000\u0000\u0000\u008c\u008d\u0005g\u0000\u0000\u008d"+ + "\u008f\u0001\u0000\u0000\u0000\u008e\u0085\u0001\u0000\u0000\u0000\u008e"+ + "\u0086\u0001\u0000\u0000\u0000\u008f\t\u0001\u0000\u0000\u0000\u0090\u009a"+ + "\u0003\f\u0006\u0000\u0091\u0092\u0005f\u0000\u0000\u0092\u0093\u0005"+ + "\r\u0000\u0000\u0093\u0095\u0003\u0000\u0000\u0000\u0094\u0096\u0003\u0000"+ + "\u0000\u0000\u0095\u0094\u0001\u0000\u0000\u0000\u0095\u0096\u0001\u0000"+ + "\u0000\u0000\u0096\u0097\u0001\u0000\u0000\u0000\u0097\u0098\u0005g\u0000"+ + "\u0000\u0098\u009a\u0001\u0000\u0000\u0000\u0099\u0090\u0001\u0000\u0000"+ + "\u0000\u0099\u0091\u0001\u0000\u0000\u0000\u009a\u000b\u0001\u0000\u0000"+ + "\u0000\u009b\u009f\u0003\u0012\t\u0000\u009c\u009f\u0003\u000e\u0007\u0000"+ + "\u009d\u009f\u0003\u0010\b\u0000\u009e\u009b\u0001\u0000\u0000\u0000\u009e"+ + "\u009c\u0001\u0000\u0000\u0000\u009e\u009d\u0001\u0000\u0000\u0000\u009f"+ + "\r\u0001\u0000\u0000\u0000\u00a0\u00a1\u0005f\u0000\u0000\u00a1\u00a2"+ + "\u0005\u000e\u0000\u0000\u00a2\u00a3\u0005f\u0000\u0000\u00a3\u00a4\u0003"+ + "T*\u0000\u00a4\u00a5\u0005g\u0000\u0000\u00a5\u00a6\u0003\u0000\u0000"+ + "\u0000\u00a6\u00a7\u0005g\u0000\u0000\u00a7\u000f\u0001\u0000\u0000\u0000"+ + "\u00a8\u00a9\u0005f\u0000\u0000\u00a9\u00aa\u0005\u000f\u0000\u0000\u00aa"+ + "\u00ab\u0005f\u0000\u0000\u00ab\u00ac\u0003T*\u0000\u00ac\u00ad\u0005"+ + "g\u0000\u0000\u00ad\u00ae\u0003\u0000\u0000\u0000\u00ae\u00af\u0005g\u0000"+ + "\u0000\u00af\u0011\u0001\u0000\u0000\u0000\u00b0\u00b8\u0003\u0014\n\u0000"+ + "\u00b1\u00b2\u0005f\u0000\u0000\u00b2\u00b3\u0007\u0000\u0000\u0000\u00b3"+ + "\u00b4\u0003\u0000\u0000\u0000\u00b4\u00b5\u0003\u0000\u0000\u0000\u00b5"+ + "\u00b6\u0005g\u0000\u0000\u00b6\u00b8\u0001\u0000\u0000\u0000\u00b7\u00b0"+ + "\u0001\u0000\u0000\u0000\u00b7\u00b1\u0001\u0000\u0000\u0000\u00b8\u0013"+ + "\u0001\u0000\u0000\u0000\u00b9\u00c6\u0003\u0016\u000b\u0000\u00ba\u00bb"+ + "\u0005f\u0000\u0000\u00bb\u00bc\u0005\u0010\u0000\u0000\u00bc\u00c0\u0003"+ + "\u0000\u0000\u0000\u00bd\u00bf\u0003\u0000\u0000\u0000\u00be\u00bd\u0001"+ + "\u0000\u0000\u0000\u00bf\u00c2\u0001\u0000\u0000\u0000\u00c0\u00be\u0001"+ + "\u0000\u0000\u0000\u00c0\u00c1\u0001\u0000\u0000\u0000\u00c1\u00c3\u0001"+ + "\u0000\u0000\u0000\u00c2\u00c0\u0001\u0000\u0000\u0000\u00c3\u00c4\u0005"+ + "g\u0000\u0000\u00c4\u00c6\u0001\u0000\u0000\u0000\u00c5\u00b9\u0001\u0000"+ + "\u0000\u0000\u00c5\u00ba\u0001\u0000\u0000\u0000\u00c6\u0015\u0001\u0000"+ + "\u0000\u0000\u00c7\u00cf\u0003\u0018\f\u0000\u00c8\u00c9\u0005f\u0000"+ + "\u0000\u00c9\u00ca\u0005\u0012\u0000\u0000\u00ca\u00cb\u0003\u0000\u0000"+ + "\u0000\u00cb\u00cc\u0003\u0000\u0000\u0000\u00cc\u00cd\u0005g\u0000\u0000"+ + "\u00cd\u00cf\u0001\u0000\u0000\u0000\u00ce\u00c7\u0001\u0000\u0000\u0000"+ + "\u00ce\u00c8\u0001\u0000\u0000\u0000\u00cf\u0017\u0001\u0000\u0000\u0000"+ + "\u00d0\u00dd\u0003\u001a\r\u0000\u00d1\u00d2\u0005f\u0000\u0000\u00d2"+ + "\u00d3\u0005\u0011\u0000\u0000\u00d3\u00d7\u0003\u0000\u0000\u0000\u00d4"+ + "\u00d6\u0003\u0000\u0000\u0000\u00d5\u00d4\u0001\u0000\u0000\u0000\u00d6"+ + "\u00d9\u0001\u0000\u0000\u0000\u00d7\u00d5\u0001\u0000\u0000\u0000\u00d7"+ + "\u00d8\u0001\u0000\u0000\u0000\u00d8\u00da\u0001\u0000\u0000\u0000\u00d9"+ + "\u00d7\u0001\u0000\u0000\u0000\u00da\u00db\u0005g\u0000\u0000\u00db\u00dd"+ + "\u0001\u0000\u0000\u0000\u00dc\u00d0\u0001\u0000\u0000\u0000\u00dc\u00d1"+ + "\u0001\u0000\u0000\u0000\u00dd\u0019\u0001\u0000\u0000\u0000\u00de\u00e5"+ + "\u0003\u001c\u000e\u0000\u00df\u00e0\u0005f\u0000\u0000\u00e0\u00e1\u0005"+ + "\u0013\u0000\u0000\u00e1\u00e2\u0003\u0000\u0000\u0000\u00e2\u00e3\u0005"+ + "g\u0000\u0000\u00e3\u00e5\u0001\u0000\u0000\u0000\u00e4\u00de\u0001\u0000"+ + "\u0000\u0000\u00e4\u00df\u0001\u0000\u0000\u0000\u00e5\u001b\u0001\u0000"+ + "\u0000\u0000\u00e6\u00ee\u0003\u001e\u000f\u0000\u00e7\u00e8\u0005f\u0000"+ + "\u0000\u00e8\u00e9\u0007\u0001\u0000\u0000\u00e9\u00ea\u0003\u0000\u0000"+ + "\u0000\u00ea\u00eb\u0003\u0000\u0000\u0000\u00eb\u00ec\u0005g\u0000\u0000"+ + "\u00ec\u00ee\u0001\u0000\u0000\u0000\u00ed\u00e6\u0001\u0000\u0000\u0000"+ + "\u00ed\u00e7\u0001\u0000\u0000\u0000\u00ee\u001d\u0001\u0000\u0000\u0000"+ + "\u00ef\u00f7\u0003 \u0010\u0000\u00f0\u00f1\u0005f\u0000\u0000\u00f1\u00f2"+ + "\u0007\u0002\u0000\u0000\u00f2\u00f3\u0003\u0000\u0000\u0000\u00f3\u00f4"+ + "\u0003\u0000\u0000\u0000\u00f4\u00f5\u0005g\u0000\u0000\u00f5\u00f7\u0001"+ + "\u0000\u0000\u0000\u00f6\u00ef\u0001\u0000\u0000\u0000\u00f6\u00f0\u0001"+ + "\u0000\u0000\u0000\u00f7\u001f\u0001\u0000\u0000\u0000\u00f8\u0105\u0003"+ + "\"\u0011\u0000\u00f9\u00fa\u0005f\u0000\u0000\u00fa\u00fb\u0005.\u0000"+ + "\u0000\u00fb\u00ff\u0003\u0000\u0000\u0000\u00fc\u00fe\u0003\u0000\u0000"+ + "\u0000\u00fd\u00fc\u0001\u0000\u0000\u0000\u00fe\u0101\u0001\u0000\u0000"+ + "\u0000\u00ff\u00fd\u0001\u0000\u0000\u0000\u00ff\u0100\u0001\u0000\u0000"+ + "\u0000\u0100\u0102\u0001\u0000\u0000\u0000\u0101\u00ff\u0001\u0000\u0000"+ + "\u0000\u0102\u0103\u0005g\u0000\u0000\u0103\u0105\u0001\u0000\u0000\u0000"+ + "\u0104\u00f8\u0001\u0000\u0000\u0000\u0104\u00f9\u0001\u0000\u0000\u0000"+ + "\u0105!\u0001\u0000\u0000\u0000\u0106\u010e\u0003$\u0012\u0000\u0107\u0108"+ + "\u0005f\u0000\u0000\u0108\u0109\u00050\u0000\u0000\u0109\u010a\u0003\u0000"+ + "\u0000\u0000\u010a\u010b\u0003\u0000\u0000\u0000\u010b\u010c\u0005g\u0000"+ + "\u0000\u010c\u010e\u0001\u0000\u0000\u0000\u010d\u0106\u0001\u0000\u0000"+ + "\u0000\u010d\u0107\u0001\u0000\u0000\u0000\u010e#\u0001\u0000\u0000\u0000"+ + "\u010f\u011c\u0003&\u0013\u0000\u0110\u0111\u0005f\u0000\u0000\u0111\u0112"+ + "\u0005/\u0000\u0000\u0112\u0116\u0003\u0000\u0000\u0000\u0113\u0115\u0003"+ + "\u0000\u0000\u0000\u0114\u0113\u0001\u0000\u0000\u0000\u0115\u0118\u0001"+ + "\u0000\u0000\u0000\u0116\u0114\u0001\u0000\u0000\u0000\u0116\u0117\u0001"+ + "\u0000\u0000\u0000\u0117\u0119\u0001\u0000\u0000\u0000\u0118\u0116\u0001"+ + "\u0000\u0000\u0000\u0119\u011a\u0005g\u0000\u0000\u011a\u011c\u0001\u0000"+ + "\u0000\u0000\u011b\u010f\u0001\u0000\u0000\u0000\u011b\u0110\u0001\u0000"+ + "\u0000\u0000\u011c%\u0001\u0000\u0000\u0000\u011d\u0125\u0003(\u0014\u0000"+ + "\u011e\u011f\u0005f\u0000\u0000\u011f\u0120\u0007\u0003\u0000\u0000\u0120"+ + "\u0121\u0003\u0000\u0000\u0000\u0121\u0122\u0003\u0000\u0000\u0000\u0122"+ + "\u0123\u0005g\u0000\u0000\u0123\u0125\u0001\u0000\u0000\u0000\u0124\u011d"+ + "\u0001\u0000\u0000\u0000\u0124\u011e\u0001\u0000\u0000\u0000\u0125\'\u0001"+ + "\u0000\u0000\u0000\u0126\u0133\u0003*\u0015\u0000\u0127\u0128\u0005f\u0000"+ + "\u0000\u0128\u0129\u0007\u0004\u0000\u0000\u0129\u012d\u0003\u0000\u0000"+ + "\u0000\u012a\u012c\u0003\u0000\u0000\u0000\u012b\u012a\u0001\u0000\u0000"+ + "\u0000\u012c\u012f\u0001\u0000\u0000\u0000\u012d\u012b\u0001\u0000\u0000"+ + "\u0000\u012d\u012e\u0001\u0000\u0000\u0000\u012e\u0130\u0001\u0000\u0000"+ + "\u0000\u012f\u012d\u0001\u0000\u0000\u0000\u0130\u0131\u0005g\u0000\u0000"+ + "\u0131\u0133\u0001\u0000\u0000\u0000\u0132\u0126\u0001\u0000\u0000\u0000"+ + "\u0132\u0127\u0001\u0000\u0000\u0000\u0133)\u0001\u0000\u0000\u0000\u0134"+ + "\u0141\u0003,\u0016\u0000\u0135\u0136\u0005f\u0000\u0000\u0136\u0137\u0007"+ + "\u0005\u0000\u0000\u0137\u013b\u0003\u0000\u0000\u0000\u0138\u013a\u0003"+ + "\u0000\u0000\u0000\u0139\u0138\u0001\u0000\u0000\u0000\u013a\u013d\u0001"+ + "\u0000\u0000\u0000\u013b\u0139\u0001\u0000\u0000\u0000\u013b\u013c\u0001"+ + "\u0000\u0000\u0000\u013c\u013e\u0001\u0000\u0000\u0000\u013d\u013b\u0001"+ + "\u0000\u0000\u0000\u013e\u013f\u0005g\u0000\u0000\u013f\u0141\u0001\u0000"+ + "\u0000\u0000\u0140\u0134\u0001\u0000\u0000\u0000\u0140\u0135\u0001\u0000"+ + "\u0000\u0000\u0141+\u0001\u0000\u0000\u0000\u0142\u014d\u0003.\u0017\u0000"+ + "\u0143\u0144\u0005f\u0000\u0000\u0144\u0146\u0005!\u0000\u0000\u0145\u0147"+ + "\u0003\u0000\u0000\u0000\u0146\u0145\u0001\u0000\u0000\u0000\u0147\u0148"+ + "\u0001\u0000\u0000\u0000\u0148\u0146\u0001\u0000\u0000\u0000\u0148\u0149"+ + "\u0001\u0000\u0000\u0000\u0149\u014a\u0001\u0000\u0000\u0000\u014a\u014b"+ + "\u0005g\u0000\u0000\u014b\u014d\u0001\u0000\u0000\u0000\u014c\u0142\u0001"+ + "\u0000\u0000\u0000\u014c\u0143\u0001\u0000\u0000\u0000\u014d-\u0001\u0000"+ + "\u0000\u0000\u014e\u0156\u00030\u0018\u0000\u014f\u0150\u0005f\u0000\u0000"+ + "\u0150\u0151\u0007\u0006\u0000\u0000\u0151\u0152\u0003\u0000\u0000\u0000"+ + "\u0152\u0153\u0003d2\u0000\u0153\u0154\u0005g\u0000\u0000\u0154\u0156"+ + "\u0001\u0000\u0000\u0000\u0155\u014e\u0001\u0000\u0000\u0000\u0155\u014f"+ + "\u0001\u0000\u0000\u0000\u0156/\u0001\u0000\u0000\u0000\u0157\u015e\u0003"+ + "2\u0019\u0000\u0158\u0159\u0005f\u0000\u0000\u0159\u015a\u0007\u0007\u0000"+ + "\u0000\u015a\u015b\u0003\u0000\u0000\u0000\u015b\u015c\u0005g\u0000\u0000"+ + "\u015c\u015e\u0001\u0000\u0000\u0000\u015d\u0157\u0001\u0000\u0000\u0000"+ + "\u015d\u0158\u0001\u0000\u0000\u0000\u015e1\u0001\u0000\u0000\u0000\u015f"+ + "\u0166\u00034\u001a\u0000\u0160\u0161\u0005f\u0000\u0000\u0161\u0162\u0005"+ + "1\u0000\u0000\u0162\u0163\u0003\u0000\u0000\u0000\u0163\u0164\u0005g\u0000"+ + "\u0000\u0164\u0166\u0001\u0000\u0000\u0000\u0165\u015f\u0001\u0000\u0000"+ + "\u0000\u0165\u0160\u0001\u0000\u0000\u0000\u01663\u0001\u0000\u0000\u0000"+ + "\u0167\u0174\u00036\u001b\u0000\u0168\u0169\u0005f\u0000\u0000\u0169\u016a"+ + "\u0005\u0006\u0000\u0000\u016a\u016e\u0003\u0000\u0000\u0000\u016b\u016d"+ + "\u0003\u0000\u0000\u0000\u016c\u016b\u0001\u0000\u0000\u0000\u016d\u0170"+ + "\u0001\u0000\u0000\u0000\u016e\u016c\u0001\u0000\u0000\u0000\u016e\u016f"+ + "\u0001\u0000\u0000\u0000\u016f\u0171\u0001\u0000\u0000\u0000\u0170\u016e"+ + "\u0001\u0000\u0000\u0000\u0171\u0172\u0005g\u0000\u0000\u0172\u0174\u0001"+ + "\u0000\u0000\u0000\u0173\u0167\u0001\u0000\u0000\u0000\u0173\u0168\u0001"+ + "\u0000\u0000\u0000\u01745\u0001\u0000\u0000\u0000\u0175\u017d\u00038\u001c"+ + "\u0000\u0176\u0177\u0005f\u0000\u0000\u0177\u0178\u0005P\u0000\u0000\u0178"+ + "\u0179\u0003\u0000\u0000\u0000\u0179\u017a\u0003\u0000\u0000\u0000\u017a"+ + "\u017b\u0005g\u0000\u0000\u017b\u017d\u0001\u0000\u0000\u0000\u017c\u0175"+ + "\u0001\u0000\u0000\u0000\u017c\u0176\u0001\u0000\u0000\u0000\u017d7\u0001"+ + "\u0000\u0000\u0000\u017e\u0187\u0003:\u001d\u0000\u017f\u0180\u0005f\u0000"+ + "\u0000\u0180\u0181\u0005Q\u0000\u0000\u0181\u0182\u0003\u0000\u0000\u0000"+ + "\u0182\u0183\u0003\u0000\u0000\u0000\u0183\u0184\u0003\u0000\u0000\u0000"+ + "\u0184\u0185\u0005g\u0000\u0000\u0185\u0187\u0001\u0000\u0000\u0000\u0186"+ + "\u017e\u0001\u0000\u0000\u0000\u0186\u017f\u0001\u0000\u0000\u0000\u0187"+ + "9\u0001\u0000\u0000\u0000\u0188\u018f\u0003<\u001e\u0000\u0189\u018a\u0005"+ + "f\u0000\u0000\u018a\u018b\u0005R\u0000\u0000\u018b\u018c\u0003\u0000\u0000"+ + "\u0000\u018c\u018d\u0005g\u0000\u0000\u018d\u018f\u0001\u0000\u0000\u0000"+ + "\u018e\u0188\u0001\u0000\u0000\u0000\u018e\u0189\u0001\u0000\u0000\u0000"+ + "\u018f;\u0001\u0000\u0000\u0000\u0190\u0199\u0003>\u001f\u0000\u0191\u0192"+ + "\u0005f\u0000\u0000\u0192\u0193\u0005S\u0000\u0000\u0193\u0194\u0003\u0000"+ + "\u0000\u0000\u0194\u0195\u0003\u0000\u0000\u0000\u0195\u0196\u0003\u0000"+ + "\u0000\u0000\u0196\u0197\u0005g\u0000\u0000\u0197\u0199\u0001\u0000\u0000"+ + "\u0000\u0198\u0190\u0001\u0000\u0000\u0000\u0198\u0191\u0001\u0000\u0000"+ + "\u0000\u0199=\u0001\u0000\u0000\u0000\u019a\u01a4\u0003@ \u0000\u019b"+ + "\u01a4\u0003B!\u0000\u019c\u01a4\u0003D\"\u0000\u019d\u01a4\u0003F#\u0000"+ + "\u019e\u01a4\u0003H$\u0000\u019f\u01a4\u0003L&\u0000\u01a0\u01a4\u0003"+ + "J%\u0000\u01a1\u01a4\u0003N\'\u0000\u01a2\u01a4\u0003P(\u0000\u01a3\u019a"+ + "\u0001\u0000\u0000\u0000\u01a3\u019b\u0001\u0000\u0000\u0000\u01a3\u019c"+ + "\u0001\u0000\u0000\u0000\u01a3\u019d\u0001\u0000\u0000\u0000\u01a3\u019e"+ + "\u0001\u0000\u0000\u0000\u01a3\u019f\u0001\u0000\u0000\u0000\u01a3\u01a0"+ + "\u0001\u0000\u0000\u0000\u01a3\u01a1\u0001\u0000\u0000\u0000\u01a3\u01a2"+ + "\u0001\u0000\u0000\u0000\u01a4?\u0001\u0000\u0000\u0000\u01a5\u01a6\u0005"+ + "O\u0000\u0000\u01a6A\u0001\u0000\u0000\u0000\u01a7\u01a8\u0005W\u0000"+ + "\u0000\u01a8C\u0001\u0000\u0000\u0000\u01a9\u01aa\u0005^\u0000\u0000\u01aa"+ + "E\u0001\u0000\u0000\u0000\u01ab\u01ac\u0005^\u0000\u0000\u01ac\u01ad\u0005"+ + " \u0000\u0000\u01ad\u01ae\u0005^\u0000\u0000\u01aeG\u0001\u0000\u0000"+ + "\u0000\u01af\u01b0\u0005f\u0000\u0000\u01b0\u01b8\u0005\u0007\u0000\u0000"+ + "\u01b1\u01b2\u0005f\u0000\u0000\u01b2\u01b3\u0003\u0000\u0000\u0000\u01b3"+ + "\u01b4\u0003\u0000\u0000\u0000\u01b4\u01b5\u0005g\u0000\u0000\u01b5\u01b7"+ + "\u0001\u0000\u0000\u0000\u01b6\u01b1\u0001\u0000\u0000\u0000\u01b7\u01ba"+ + "\u0001\u0000\u0000\u0000\u01b8\u01b6\u0001\u0000\u0000\u0000\u01b8\u01b9"+ + "\u0001\u0000\u0000\u0000\u01b9\u01bb\u0001\u0000\u0000\u0000\u01ba\u01b8"+ + "\u0001\u0000\u0000\u0000\u01bb\u01bc\u0005f\u0000\u0000\u01bc\u01bd\u0005"+ + "X\u0000\u0000\u01bd\u01be\u0003\u0000\u0000\u0000\u01be\u01bf\u0005g\u0000"+ + "\u0000\u01bf\u01c0\u0005g\u0000\u0000\u01c0I\u0001\u0000\u0000\u0000\u01c1"+ + "\u01c2\u0005]\u0000\u0000\u01c2K\u0001\u0000\u0000\u0000\u01c3\u01c4\u0005"+ + "f\u0000\u0000\u01c4\u01c5\u0003J%\u0000\u01c5\u01c6\u0003J%\u0000\u01c6"+ + "\u01c7\u0003J%\u0000\u01c7\u01c8\u0005g\u0000\u0000\u01c8M\u0001\u0000"+ + "\u0000\u0000\u01c9\u01ca\u0005b\u0000\u0000\u01caO\u0001\u0000\u0000\u0000"+ + "\u01cb\u01cc\u0005f\u0000\u0000\u01cc\u01cd\u0003\u0000\u0000\u0000\u01cd"+ + "\u01ce\u0005g\u0000\u0000\u01ceQ\u0001\u0000\u0000\u0000\u01cf\u01d0\u0005"+ + "f\u0000\u0000\u01d0\u01d1\u0005b\u0000\u0000\u01d1\u01d2\u0003V+\u0000"+ + "\u01d2\u01d3\u0005g\u0000\u0000\u01d3S\u0001\u0000\u0000\u0000\u01d4\u01d9"+ + "\u0003R)\u0000\u01d5\u01d6\u0005l\u0000\u0000\u01d6\u01d8\u0003R)\u0000"+ + "\u01d7\u01d5\u0001\u0000\u0000\u0000\u01d8\u01db\u0001\u0000\u0000\u0000"+ + "\u01d9\u01d7\u0001\u0000\u0000\u0000\u01d9\u01da\u0001\u0000\u0000\u0000"+ + "\u01daU\u0001\u0000\u0000\u0000\u01db\u01d9\u0001\u0000\u0000\u0000\u01dc"+ + "\u01e4\u0003Z-\u0000\u01dd\u01e4\u0003\\.\u0000\u01de\u01e4\u0003^/\u0000"+ + "\u01df\u01e4\u0003`0\u0000\u01e0\u01e4\u0003b1\u0000\u01e1\u01e4\u0003"+ + "d2\u0000\u01e2\u01e4\u0003f3\u0000\u01e3\u01dc\u0001\u0000\u0000\u0000"+ + "\u01e3\u01dd\u0001\u0000\u0000\u0000\u01e3\u01de\u0001\u0000\u0000\u0000"+ + "\u01e3\u01df\u0001\u0000\u0000\u0000\u01e3\u01e0\u0001\u0000\u0000\u0000"+ + "\u01e3\u01e1\u0001\u0000\u0000\u0000\u01e3\u01e2\u0001\u0000\u0000\u0000"+ + "\u01e4W\u0001\u0000\u0000\u0000\u01e5\u01ea\u0003V+\u0000\u01e6\u01e7"+ + "\u0005l\u0000\u0000\u01e7\u01e9\u0003V+\u0000\u01e8\u01e6\u0001\u0000"+ + "\u0000\u0000\u01e9\u01ec\u0001\u0000\u0000\u0000\u01ea\u01e8\u0001\u0000"+ + "\u0000\u0000\u01ea\u01eb\u0001\u0000\u0000\u0000\u01ebY\u0001\u0000\u0000"+ + "\u0000\u01ec\u01ea\u0001\u0000\u0000\u0000\u01ed\u01ee\u0005\u0001\u0000"+ + "\u0000\u01ee[\u0001\u0000\u0000\u0000\u01ef\u01f0\u0005\u0002\u0000\u0000"+ + "\u01f0]\u0001\u0000\u0000\u0000\u01f1\u01f2\u0005\u0003\u0000\u0000\u01f2"+ + "_\u0001\u0000\u0000\u0000\u01f3\u01f4\u0005f\u0000\u0000\u01f4\u01f5\u0005"+ + "\u0006\u0000\u0000\u01f5\u01f6\u0003V+\u0000\u01f6\u01f7\u0003V+\u0000"+ + "\u01f7\u01f8\u0005g\u0000\u0000\u01f8a\u0001\u0000\u0000\u0000\u01f9\u01fa"+ + "\u0005f\u0000\u0000\u01fa\u01fb\u0005\u0007\u0000\u0000\u01fb\u01fc\u0005"+ + "f\u0000\u0000\u01fc\u01fd\u0005h\u0000\u0000\u01fd\u01fe\u0003V+\u0000"+ + "\u01fe\u01ff\u0005i\u0000\u0000\u01ff\u0200\u0005q\u0000\u0000\u0200\u0201"+ + "\u0003V+\u0000\u0201\u0202\u0005g\u0000\u0000\u0202\u0203\u0005g\u0000"+ + "\u0000\u0203c\u0001\u0000\u0000\u0000\u0204\u0205\u0005f\u0000\u0000\u0205"+ + "\u0206\u0005\u0004\u0000\u0000\u0206\u0207\u0005^\u0000\u0000\u0207\u0208"+ + "\u0005g\u0000\u0000\u0208e\u0001\u0000\u0000\u0000\u0209\u020a\u0005f"+ + "\u0000\u0000\u020a\u020b\u0005\u0005\u0000\u0000\u020b\u020c\u0005^\u0000"+ + "\u0000\u020c\u020d\u0005^\u0000\u0000\u020d\u020e\u0005g\u0000\u0000\u020e"+ + "g\u0001\u0000\u0000\u0000+oy\u0083\u008a\u008e\u0095\u0099\u009e\u00b7"+ + "\u00c0\u00c5\u00ce\u00d7\u00dc\u00e4\u00ed\u00f6\u00ff\u0104\u010d\u0116"+ + "\u011b\u0124\u012d\u0132\u013b\u0140\u0148\u014c\u0155\u015d\u0165\u016e"+ + "\u0173\u017c\u0186\u018e\u0198\u01a3\u01b8\u01d9\u01e3\u01ea"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/ExprVisitor.java b/subprojects/common/grammar/src/main/gen/ExprVisitor.java new file mode 100644 index 0000000000..34e7e4aba5 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/ExprVisitor.java @@ -0,0 +1,324 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Expr.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.tree.ParseTreeVisitor; + +/** + * This interface defines a complete generic visitor for a parse tree produced + * by {@link ExprParser}. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +public interface ExprVisitor extends ParseTreeVisitor { + /** + * Visit a parse tree produced by {@link ExprParser#expr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExpr(ExprParser.ExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#exprList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExprList(ExprParser.ExprListContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#funcLitExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFuncLitExpr(ExprParser.FuncLitExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#iteExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIteExpr(ExprParser.IteExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#iffExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIffExpr(ExprParser.IffExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#implyExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitImplyExpr(ExprParser.ImplyExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#quantifiedExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitQuantifiedExpr(ExprParser.QuantifiedExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#forallExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitForallExpr(ExprParser.ForallExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#existsExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitExistsExpr(ExprParser.ExistsExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#fpFuncExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFpFuncExpr(ExprParser.FpFuncExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#orExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitOrExpr(ExprParser.OrExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#xorExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitXorExpr(ExprParser.XorExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#andExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAndExpr(ExprParser.AndExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#notExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNotExpr(ExprParser.NotExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#equalityExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitEqualityExpr(ExprParser.EqualityExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#relationExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRelationExpr(ExprParser.RelationExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#bitwiseOrExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBitwiseOrExpr(ExprParser.BitwiseOrExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#bitwiseXorExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBitwiseXorExpr(ExprParser.BitwiseXorExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#bitwiseAndExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBitwiseAndExpr(ExprParser.BitwiseAndExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#bitwiseShiftExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBitwiseShiftExpr(ExprParser.BitwiseShiftExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#additiveExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAdditiveExpr(ExprParser.AdditiveExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#multiplicativeExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMultiplicativeExpr(ExprParser.MultiplicativeExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#bvConcatExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBvConcatExpr(ExprParser.BvConcatExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#bvExtendExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBvExtendExpr(ExprParser.BvExtendExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#unaryExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitUnaryExpr(ExprParser.UnaryExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#bitwiseNotExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBitwiseNotExpr(ExprParser.BitwiseNotExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#functionCall}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFunctionCall(ExprParser.FunctionCallContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#arrayRead}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArrayRead(ExprParser.ArrayReadContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#arrayWrite}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArrayWrite(ExprParser.ArrayWriteContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#primeExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPrimeExpr(ExprParser.PrimeExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#bvExtract}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBvExtract(ExprParser.BvExtractContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#primaryExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPrimaryExpr(ExprParser.PrimaryExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#trueExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTrueExpr(ExprParser.TrueExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#falseExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFalseExpr(ExprParser.FalseExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#intLitExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIntLitExpr(ExprParser.IntLitExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#ratLitExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRatLitExpr(ExprParser.RatLitExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#arrLitExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArrLitExpr(ExprParser.ArrLitExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#bvLitExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBvLitExpr(ExprParser.BvLitExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#fpLitExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFpLitExpr(ExprParser.FpLitExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#idExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIdExpr(ExprParser.IdExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#parenExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitParenExpr(ExprParser.ParenExprContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#decl}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDecl(ExprParser.DeclContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#declList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDeclList(ExprParser.DeclListContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#type}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitType(ExprParser.TypeContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#typeList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeList(ExprParser.TypeListContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#boolType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBoolType(ExprParser.BoolTypeContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#intType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIntType(ExprParser.IntTypeContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#ratType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRatType(ExprParser.RatTypeContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#funcType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFuncType(ExprParser.FuncTypeContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#arrayType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArrayType(ExprParser.ArrayTypeContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#bvType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBvType(ExprParser.BvTypeContext ctx); + /** + * Visit a parse tree produced by {@link ExprParser#fpType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFpType(ExprParser.FpTypeContext ctx); +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/Type.interp b/subprojects/common/grammar/src/main/gen/Type.interp new file mode 100644 index 0000000000..593c013a33 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/Type.interp @@ -0,0 +1,252 @@ +token literal names: +null +null +null +null +null +null +null +null +'if' +'then' +'else' +'iff' +'ite' +'=>' +'forall' +'exists' +'or' +'and' +'xor' +'not' +'=' +'/=' +'<' +'<=' +'>' +'>=' +'+' +'-' +'*' +'div' +'mod' +'rem' +'%' +null +'bv_zero_extend' +'bv_sign_extend' +'bvadd' +'bvsub' +'bvpos' +'bvneg' +'bvmul' +'bvudiv' +'bvsdiv' +'bvsmod' +'bvurem' +'bvsrem' +'bvor' +'bvand' +'bvxor' +'bvnot' +'bvshl' +'bvashr' +'bvlshr' +'bvrol' +'bvror' +'bvult' +'bvule' +'bvugt' +'bvuge' +'bvslt' +'bvsle' +'bvsgt' +'bvsge' +'fpabs' +null +'fpisnan' +'fpmax' +'fpmin' +'fprem' +null +null +null +null +'fpsub' +null +'fpmul' +null +'fppos' +'fpneg' +'true' +'read' +'write' +'prime' +'extract' +null +null +null +'false' +'default' +'assign' +'havoc' +'assume' +'return' +null +null +null +null +'.' +null +'_' +null +null +'(' +')' +'[' +']' +'{' +'}' +',' +':' +';' +'\'' +'<-' +'->' +null +null +null + +token symbolic names: +null +BOOLTYPE +INTTYPE +RATTYPE +BVTYPE +FPTYPE +FUNC +ARRAY +IF +THEN +ELSE +IFF +ITE +IMPLY +FORALL +EXISTS +OR +AND +XOR +NOT +EQ +NEQ +LT +LEQ +GT +GEQ +PLUS +MINUS +MUL +DIV +MOD +REM +PERCENT +BV_CONCAT +BV_ZERO_EXTEND +BV_SIGN_EXTEND +BV_ADD +BV_SUB +BV_POS +BV_NEG +BV_MUL +BV_UDIV +BV_SDIV +BV_SMOD +BV_UREM +BV_SREM +BV_OR +BV_AND +BV_XOR +BV_NOT +BV_SHL +BV_ASHR +BV_LSHR +BV_ROL +BV_ROR +BV_ULT +BV_ULE +BV_UGT +BV_UGE +BV_SLT +BV_SLE +BV_SGT +BV_SGE +FP_ABS +FP_FROM_BV +FP_IS_NAN +FPMAX +FPMIN +FPREM +FPROUNDTOINT +FPSQRT +FPTOBV +FPTOFP +FPSUB +FPADD +FPMUL +FPDIV +FPPOS +FPNEG +TRUE +READ +WRITE +PRIME +EXTRACT +BV_TYPE_DECL +FP_TYPE_DECL +FP_ROUNDINGMODE +FALSE +DEFAULT +ASSIGN +HAVOC +ASSUME +RETURN +BV +INT +NAT +SIGN +DOT +ID +UNDERSCORE +DIGIT +LETTER +LPAREN +RPAREN +LBRACK +RBRACK +LBRAC +RBRAC +COMMA +COLON +SEMICOLON +QUOT +LARROW +RARROW +WS +COMMENT +LINE_COMMENT + +rule names: +type +typeList +boolType +intType +ratType +funcType +arrayType +bvType +fpType + + +atn: +[4, 1, 116, 70, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 26, 8, 0, 1, 1, 1, 1, 1, 1, 5, 1, 31, 8, 1, 10, 1, 12, 1, 34, 9, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 0, 0, 9, 0, 2, 4, 6, 8, 10, 12, 14, 16, 0, 0, 67, 0, 25, 1, 0, 0, 0, 2, 27, 1, 0, 0, 0, 4, 35, 1, 0, 0, 0, 6, 37, 1, 0, 0, 0, 8, 39, 1, 0, 0, 0, 10, 41, 1, 0, 0, 0, 12, 47, 1, 0, 0, 0, 14, 58, 1, 0, 0, 0, 16, 63, 1, 0, 0, 0, 18, 26, 3, 4, 2, 0, 19, 26, 3, 6, 3, 0, 20, 26, 3, 8, 4, 0, 21, 26, 3, 10, 5, 0, 22, 26, 3, 12, 6, 0, 23, 26, 3, 14, 7, 0, 24, 26, 3, 16, 8, 0, 25, 18, 1, 0, 0, 0, 25, 19, 1, 0, 0, 0, 25, 20, 1, 0, 0, 0, 25, 21, 1, 0, 0, 0, 25, 22, 1, 0, 0, 0, 25, 23, 1, 0, 0, 0, 25, 24, 1, 0, 0, 0, 26, 1, 1, 0, 0, 0, 27, 32, 3, 0, 0, 0, 28, 29, 5, 108, 0, 0, 29, 31, 3, 0, 0, 0, 30, 28, 1, 0, 0, 0, 31, 34, 1, 0, 0, 0, 32, 30, 1, 0, 0, 0, 32, 33, 1, 0, 0, 0, 33, 3, 1, 0, 0, 0, 34, 32, 1, 0, 0, 0, 35, 36, 5, 1, 0, 0, 36, 5, 1, 0, 0, 0, 37, 38, 5, 2, 0, 0, 38, 7, 1, 0, 0, 0, 39, 40, 5, 3, 0, 0, 40, 9, 1, 0, 0, 0, 41, 42, 5, 102, 0, 0, 42, 43, 5, 6, 0, 0, 43, 44, 3, 0, 0, 0, 44, 45, 3, 0, 0, 0, 45, 46, 5, 103, 0, 0, 46, 11, 1, 0, 0, 0, 47, 48, 5, 102, 0, 0, 48, 49, 5, 7, 0, 0, 49, 50, 5, 102, 0, 0, 50, 51, 5, 104, 0, 0, 51, 52, 3, 0, 0, 0, 52, 53, 5, 105, 0, 0, 53, 54, 5, 113, 0, 0, 54, 55, 3, 0, 0, 0, 55, 56, 5, 103, 0, 0, 56, 57, 5, 103, 0, 0, 57, 13, 1, 0, 0, 0, 58, 59, 5, 102, 0, 0, 59, 60, 5, 4, 0, 0, 60, 61, 5, 94, 0, 0, 61, 62, 5, 103, 0, 0, 62, 15, 1, 0, 0, 0, 63, 64, 5, 102, 0, 0, 64, 65, 5, 5, 0, 0, 65, 66, 5, 94, 0, 0, 66, 67, 5, 94, 0, 0, 67, 68, 5, 103, 0, 0, 68, 17, 1, 0, 0, 0, 2, 25, 32] \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/Type.tokens b/subprojects/common/grammar/src/main/gen/Type.tokens new file mode 100644 index 0000000000..9531176830 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/Type.tokens @@ -0,0 +1,204 @@ +BOOLTYPE=1 +INTTYPE=2 +RATTYPE=3 +BVTYPE=4 +FPTYPE=5 +FUNC=6 +ARRAY=7 +IF=8 +THEN=9 +ELSE=10 +IFF=11 +ITE=12 +IMPLY=13 +FORALL=14 +EXISTS=15 +OR=16 +AND=17 +XOR=18 +NOT=19 +EQ=20 +NEQ=21 +LT=22 +LEQ=23 +GT=24 +GEQ=25 +PLUS=26 +MINUS=27 +MUL=28 +DIV=29 +MOD=30 +REM=31 +PERCENT=32 +BV_CONCAT=33 +BV_ZERO_EXTEND=34 +BV_SIGN_EXTEND=35 +BV_ADD=36 +BV_SUB=37 +BV_POS=38 +BV_NEG=39 +BV_MUL=40 +BV_UDIV=41 +BV_SDIV=42 +BV_SMOD=43 +BV_UREM=44 +BV_SREM=45 +BV_OR=46 +BV_AND=47 +BV_XOR=48 +BV_NOT=49 +BV_SHL=50 +BV_ASHR=51 +BV_LSHR=52 +BV_ROL=53 +BV_ROR=54 +BV_ULT=55 +BV_ULE=56 +BV_UGT=57 +BV_UGE=58 +BV_SLT=59 +BV_SLE=60 +BV_SGT=61 +BV_SGE=62 +FP_ABS=63 +FP_FROM_BV=64 +FP_IS_NAN=65 +FPMAX=66 +FPMIN=67 +FPREM=68 +FPROUNDTOINT=69 +FPSQRT=70 +FPTOBV=71 +FPTOFP=72 +FPSUB=73 +FPADD=74 +FPMUL=75 +FPDIV=76 +FPPOS=77 +FPNEG=78 +TRUE=79 +READ=80 +WRITE=81 +PRIME=82 +EXTRACT=83 +BV_TYPE_DECL=84 +FP_TYPE_DECL=85 +FP_ROUNDINGMODE=86 +FALSE=87 +DEFAULT=88 +ASSIGN=89 +HAVOC=90 +ASSUME=91 +RETURN=92 +BV=93 +INT=94 +NAT=95 +SIGN=96 +DOT=97 +ID=98 +UNDERSCORE=99 +DIGIT=100 +LETTER=101 +LPAREN=102 +RPAREN=103 +LBRACK=104 +RBRACK=105 +LBRAC=106 +RBRAC=107 +COMMA=108 +COLON=109 +SEMICOLON=110 +QUOT=111 +LARROW=112 +RARROW=113 +WS=114 +COMMENT=115 +LINE_COMMENT=116 +'if'=8 +'then'=9 +'else'=10 +'iff'=11 +'ite'=12 +'=>'=13 +'forall'=14 +'exists'=15 +'or'=16 +'and'=17 +'xor'=18 +'not'=19 +'='=20 +'/='=21 +'<'=22 +'<='=23 +'>'=24 +'>='=25 +'+'=26 +'-'=27 +'*'=28 +'div'=29 +'mod'=30 +'rem'=31 +'%'=32 +'bv_zero_extend'=34 +'bv_sign_extend'=35 +'bvadd'=36 +'bvsub'=37 +'bvpos'=38 +'bvneg'=39 +'bvmul'=40 +'bvudiv'=41 +'bvsdiv'=42 +'bvsmod'=43 +'bvurem'=44 +'bvsrem'=45 +'bvor'=46 +'bvand'=47 +'bvxor'=48 +'bvnot'=49 +'bvshl'=50 +'bvashr'=51 +'bvlshr'=52 +'bvrol'=53 +'bvror'=54 +'bvult'=55 +'bvule'=56 +'bvugt'=57 +'bvuge'=58 +'bvslt'=59 +'bvsle'=60 +'bvsgt'=61 +'bvsge'=62 +'fpabs'=63 +'fpisnan'=65 +'fpmax'=66 +'fpmin'=67 +'fprem'=68 +'fpsub'=73 +'fpmul'=75 +'fppos'=77 +'fpneg'=78 +'true'=79 +'read'=80 +'write'=81 +'prime'=82 +'extract'=83 +'false'=87 +'default'=88 +'assign'=89 +'havoc'=90 +'assume'=91 +'return'=92 +'.'=97 +'_'=99 +'('=102 +')'=103 +'['=104 +']'=105 +'{'=106 +'}'=107 +','=108 +':'=109 +';'=110 +'\''=111 +'<-'=112 +'->'=113 diff --git a/subprojects/common/grammar/src/main/gen/TypeBaseListener.java b/subprojects/common/grammar/src/main/gen/TypeBaseListener.java new file mode 100644 index 0000000000..b44bd2012f --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/TypeBaseListener.java @@ -0,0 +1,146 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Type.g4 by ANTLR 4.10.1 + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ErrorNode; +import org.antlr.v4.runtime.tree.TerminalNode; + +/** + * This class provides an empty implementation of {@link TypeListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +public class TypeBaseListener implements TypeListener { + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterType(TypeParser.TypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitType(TypeParser.TypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTypeList(TypeParser.TypeListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTypeList(TypeParser.TypeListContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBoolType(TypeParser.BoolTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBoolType(TypeParser.BoolTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIntType(TypeParser.IntTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIntType(TypeParser.IntTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRatType(TypeParser.RatTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRatType(TypeParser.RatTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFuncType(TypeParser.FuncTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFuncType(TypeParser.FuncTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArrayType(TypeParser.ArrayTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArrayType(TypeParser.ArrayTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBvType(TypeParser.BvTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBvType(TypeParser.BvTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFpType(TypeParser.FpTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFpType(TypeParser.FpTypeContext ctx) { } + + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEveryRule(ParserRuleContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitTerminal(TerminalNode node) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void visitErrorNode(ErrorNode node) { } +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/TypeBaseVisitor.java b/subprojects/common/grammar/src/main/gen/TypeBaseVisitor.java new file mode 100644 index 0000000000..422aec04b7 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/TypeBaseVisitor.java @@ -0,0 +1,76 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Type.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; + +/** + * This class provides an empty implementation of {@link TypeVisitor}, + * which can be extended to create a visitor which only needs to handle a subset + * of the available methods. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +public class TypeBaseVisitor extends AbstractParseTreeVisitor implements TypeVisitor { + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitType(TypeParser.TypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitTypeList(TypeParser.TypeListContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBoolType(TypeParser.BoolTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitIntType(TypeParser.IntTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitRatType(TypeParser.RatTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFuncType(TypeParser.FuncTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitArrayType(TypeParser.ArrayTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitBvType(TypeParser.BvTypeContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitFpType(TypeParser.FpTypeContext ctx) { return visitChildren(ctx); } +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/TypeLexer.interp b/subprojects/common/grammar/src/main/gen/TypeLexer.interp new file mode 100644 index 0000000000..4d5136f69e --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/TypeLexer.interp @@ -0,0 +1,365 @@ +token literal names: +null +null +null +null +null +null +null +null +'if' +'then' +'else' +'iff' +'ite' +'=>' +'forall' +'exists' +'or' +'and' +'xor' +'not' +'=' +'/=' +'<' +'<=' +'>' +'>=' +'+' +'-' +'*' +'div' +'mod' +'rem' +'%' +null +'bv_zero_extend' +'bv_sign_extend' +'bvadd' +'bvsub' +'bvpos' +'bvneg' +'bvmul' +'bvudiv' +'bvsdiv' +'bvsmod' +'bvurem' +'bvsrem' +'bvor' +'bvand' +'bvxor' +'bvnot' +'bvshl' +'bvashr' +'bvlshr' +'bvrol' +'bvror' +'bvult' +'bvule' +'bvugt' +'bvuge' +'bvslt' +'bvsle' +'bvsgt' +'bvsge' +'fpabs' +null +'fpisnan' +'fpmax' +'fpmin' +'fprem' +null +null +null +null +'fpsub' +null +'fpmul' +null +'fppos' +'fpneg' +'true' +'read' +'write' +'prime' +'extract' +null +null +null +'false' +'default' +'assign' +'havoc' +'assume' +'return' +null +null +null +null +'.' +null +'_' +null +null +'(' +')' +'[' +']' +'{' +'}' +',' +':' +';' +'\'' +'<-' +'->' +null +null +null + +token symbolic names: +null +BOOLTYPE +INTTYPE +RATTYPE +BVTYPE +FPTYPE +FUNC +ARRAY +IF +THEN +ELSE +IFF +ITE +IMPLY +FORALL +EXISTS +OR +AND +XOR +NOT +EQ +NEQ +LT +LEQ +GT +GEQ +PLUS +MINUS +MUL +DIV +MOD +REM +PERCENT +BV_CONCAT +BV_ZERO_EXTEND +BV_SIGN_EXTEND +BV_ADD +BV_SUB +BV_POS +BV_NEG +BV_MUL +BV_UDIV +BV_SDIV +BV_SMOD +BV_UREM +BV_SREM +BV_OR +BV_AND +BV_XOR +BV_NOT +BV_SHL +BV_ASHR +BV_LSHR +BV_ROL +BV_ROR +BV_ULT +BV_ULE +BV_UGT +BV_UGE +BV_SLT +BV_SLE +BV_SGT +BV_SGE +FP_ABS +FP_FROM_BV +FP_IS_NAN +FPMAX +FPMIN +FPREM +FPROUNDTOINT +FPSQRT +FPTOBV +FPTOFP +FPSUB +FPADD +FPMUL +FPDIV +FPPOS +FPNEG +TRUE +READ +WRITE +PRIME +EXTRACT +BV_TYPE_DECL +FP_TYPE_DECL +FP_ROUNDINGMODE +FALSE +DEFAULT +ASSIGN +HAVOC +ASSUME +RETURN +BV +INT +NAT +SIGN +DOT +ID +UNDERSCORE +DIGIT +LETTER +LPAREN +RPAREN +LBRACK +RBRACK +LBRAC +RBRAC +COMMA +COLON +SEMICOLON +QUOT +LARROW +RARROW +WS +COMMENT +LINE_COMMENT + +rule names: +BOOLTYPE +INTTYPE +RATTYPE +BVTYPE +FPTYPE +FUNC +ARRAY +IF +THEN +ELSE +IFF +ITE +IMPLY +FORALL +EXISTS +OR +AND +XOR +NOT +EQ +NEQ +LT +LEQ +GT +GEQ +PLUS +MINUS +MUL +DIV +MOD +REM +PERCENT +BV_CONCAT +BV_ZERO_EXTEND +BV_SIGN_EXTEND +BV_ADD +BV_SUB +BV_POS +BV_NEG +BV_MUL +BV_UDIV +BV_SDIV +BV_SMOD +BV_UREM +BV_SREM +BV_OR +BV_AND +BV_XOR +BV_NOT +BV_SHL +BV_ASHR +BV_LSHR +BV_ROL +BV_ROR +BV_ULT +BV_ULE +BV_UGT +BV_UGE +BV_SLT +BV_SLE +BV_SGT +BV_SGE +FP_ABS +FP_FROM_BV +FP_IS_NAN +FPMAX +FPMIN +FPREM +FPROUNDTOINT +FPSQRT +FPTOBV +FPTOFP +FPSUB +FPADD +FPMUL +FPDIV +FPPOS +FPNEG +TRUE +READ +WRITE +PRIME +EXTRACT +BV_TYPE_DECL +FP_TYPE_DECL +FP_ROUNDINGMODE +FALSE +DEFAULT +ASSIGN +HAVOC +ASSUME +RETURN +BV +INT +NAT +SIGN +DOT +ID +UNDERSCORE +DIGIT +LETTER +LPAREN +RPAREN +LBRACK +RBRACK +LBRAC +RBRAC +COMMA +COLON +SEMICOLON +QUOT +LARROW +RARROW +WS +COMMENT +LINE_COMMENT + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[4, 0, 116, 993, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 3, 0, 246, 8, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 257, 8, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 3, 2, 268, 8, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 276, 8, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 3, 4, 284, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 298, 8, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 315, 8, 6, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 26, 1, 26, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 627, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 3, 68, 669, 8, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 3, 69, 679, 8, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 3, 70, 690, 8, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 701, 8, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 716, 8, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 811, 8, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 859, 8, 92, 11, 92, 12, 92, 860, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 867, 8, 92, 11, 92, 12, 92, 868, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 875, 8, 92, 11, 92, 12, 92, 876, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 3, 92, 885, 8, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 4, 92, 894, 8, 92, 11, 92, 12, 92, 895, 3, 92, 898, 8, 92, 1, 93, 3, 93, 901, 8, 93, 1, 93, 1, 93, 1, 94, 4, 94, 906, 8, 94, 11, 94, 12, 94, 907, 1, 95, 1, 95, 3, 95, 912, 8, 95, 1, 96, 1, 96, 1, 97, 1, 97, 3, 97, 918, 8, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 5, 97, 925, 8, 97, 10, 97, 12, 97, 928, 9, 97, 1, 98, 1, 98, 1, 99, 1, 99, 1, 100, 1, 100, 1, 101, 1, 101, 1, 102, 1, 102, 1, 103, 1, 103, 1, 104, 1, 104, 1, 105, 1, 105, 1, 106, 1, 106, 1, 107, 1, 107, 1, 108, 1, 108, 1, 109, 1, 109, 1, 110, 1, 110, 1, 111, 1, 111, 1, 111, 1, 112, 1, 112, 1, 112, 1, 113, 4, 113, 963, 8, 113, 11, 113, 12, 113, 964, 1, 113, 1, 113, 1, 114, 1, 114, 1, 114, 1, 114, 5, 114, 973, 8, 114, 10, 114, 12, 114, 976, 9, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 114, 1, 115, 1, 115, 1, 115, 1, 115, 5, 115, 987, 8, 115, 10, 115, 12, 115, 990, 9, 115, 1, 115, 1, 115, 1, 974, 0, 116, 1, 1, 3, 2, 5, 3, 7, 4, 9, 5, 11, 6, 13, 7, 15, 8, 17, 9, 19, 10, 21, 11, 23, 12, 25, 13, 27, 14, 29, 15, 31, 16, 33, 17, 35, 18, 37, 19, 39, 20, 41, 21, 43, 22, 45, 23, 47, 24, 49, 25, 51, 26, 53, 27, 55, 28, 57, 29, 59, 30, 61, 31, 63, 32, 65, 33, 67, 34, 69, 35, 71, 36, 73, 37, 75, 38, 77, 39, 79, 40, 81, 41, 83, 42, 85, 43, 87, 44, 89, 45, 91, 46, 93, 47, 95, 48, 97, 49, 99, 50, 101, 51, 103, 52, 105, 53, 107, 54, 109, 55, 111, 56, 113, 57, 115, 58, 117, 59, 119, 60, 121, 61, 123, 62, 125, 63, 127, 64, 129, 65, 131, 66, 133, 67, 135, 68, 137, 69, 139, 70, 141, 71, 143, 72, 145, 73, 147, 74, 149, 75, 151, 76, 153, 77, 155, 78, 157, 79, 159, 80, 161, 81, 163, 82, 165, 83, 167, 84, 169, 85, 171, 86, 173, 87, 175, 88, 177, 89, 179, 90, 181, 91, 183, 92, 185, 93, 187, 94, 189, 95, 191, 96, 193, 97, 195, 98, 197, 99, 199, 100, 201, 101, 203, 102, 205, 103, 207, 104, 209, 105, 211, 106, 213, 107, 215, 108, 217, 109, 219, 110, 221, 111, 223, 112, 225, 113, 227, 114, 229, 115, 231, 116, 1, 0, 7, 2, 0, 115, 115, 117, 117, 1, 0, 48, 49, 3, 0, 48, 57, 65, 70, 97, 102, 1, 0, 48, 57, 2, 0, 65, 90, 97, 122, 3, 0, 9, 10, 12, 13, 32, 32, 2, 0, 10, 10, 13, 13, 1038, 0, 1, 1, 0, 0, 0, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 229, 1, 0, 0, 0, 0, 231, 1, 0, 0, 0, 1, 245, 1, 0, 0, 0, 3, 256, 1, 0, 0, 0, 5, 267, 1, 0, 0, 0, 7, 275, 1, 0, 0, 0, 9, 283, 1, 0, 0, 0, 11, 297, 1, 0, 0, 0, 13, 314, 1, 0, 0, 0, 15, 316, 1, 0, 0, 0, 17, 319, 1, 0, 0, 0, 19, 324, 1, 0, 0, 0, 21, 329, 1, 0, 0, 0, 23, 333, 1, 0, 0, 0, 25, 337, 1, 0, 0, 0, 27, 340, 1, 0, 0, 0, 29, 347, 1, 0, 0, 0, 31, 354, 1, 0, 0, 0, 33, 357, 1, 0, 0, 0, 35, 361, 1, 0, 0, 0, 37, 365, 1, 0, 0, 0, 39, 369, 1, 0, 0, 0, 41, 371, 1, 0, 0, 0, 43, 374, 1, 0, 0, 0, 45, 376, 1, 0, 0, 0, 47, 379, 1, 0, 0, 0, 49, 381, 1, 0, 0, 0, 51, 384, 1, 0, 0, 0, 53, 386, 1, 0, 0, 0, 55, 388, 1, 0, 0, 0, 57, 390, 1, 0, 0, 0, 59, 394, 1, 0, 0, 0, 61, 398, 1, 0, 0, 0, 63, 402, 1, 0, 0, 0, 65, 404, 1, 0, 0, 0, 67, 407, 1, 0, 0, 0, 69, 422, 1, 0, 0, 0, 71, 437, 1, 0, 0, 0, 73, 443, 1, 0, 0, 0, 75, 449, 1, 0, 0, 0, 77, 455, 1, 0, 0, 0, 79, 461, 1, 0, 0, 0, 81, 467, 1, 0, 0, 0, 83, 474, 1, 0, 0, 0, 85, 481, 1, 0, 0, 0, 87, 488, 1, 0, 0, 0, 89, 495, 1, 0, 0, 0, 91, 502, 1, 0, 0, 0, 93, 507, 1, 0, 0, 0, 95, 513, 1, 0, 0, 0, 97, 519, 1, 0, 0, 0, 99, 525, 1, 0, 0, 0, 101, 531, 1, 0, 0, 0, 103, 538, 1, 0, 0, 0, 105, 545, 1, 0, 0, 0, 107, 551, 1, 0, 0, 0, 109, 557, 1, 0, 0, 0, 111, 563, 1, 0, 0, 0, 113, 569, 1, 0, 0, 0, 115, 575, 1, 0, 0, 0, 117, 581, 1, 0, 0, 0, 119, 587, 1, 0, 0, 0, 121, 593, 1, 0, 0, 0, 123, 599, 1, 0, 0, 0, 125, 605, 1, 0, 0, 0, 127, 611, 1, 0, 0, 0, 129, 628, 1, 0, 0, 0, 131, 636, 1, 0, 0, 0, 133, 642, 1, 0, 0, 0, 135, 648, 1, 0, 0, 0, 137, 654, 1, 0, 0, 0, 139, 670, 1, 0, 0, 0, 141, 680, 1, 0, 0, 0, 143, 691, 1, 0, 0, 0, 145, 702, 1, 0, 0, 0, 147, 708, 1, 0, 0, 0, 149, 717, 1, 0, 0, 0, 151, 723, 1, 0, 0, 0, 153, 731, 1, 0, 0, 0, 155, 737, 1, 0, 0, 0, 157, 743, 1, 0, 0, 0, 159, 748, 1, 0, 0, 0, 161, 753, 1, 0, 0, 0, 163, 759, 1, 0, 0, 0, 165, 765, 1, 0, 0, 0, 167, 773, 1, 0, 0, 0, 169, 779, 1, 0, 0, 0, 171, 810, 1, 0, 0, 0, 173, 812, 1, 0, 0, 0, 175, 818, 1, 0, 0, 0, 177, 826, 1, 0, 0, 0, 179, 833, 1, 0, 0, 0, 181, 839, 1, 0, 0, 0, 183, 846, 1, 0, 0, 0, 185, 897, 1, 0, 0, 0, 187, 900, 1, 0, 0, 0, 189, 905, 1, 0, 0, 0, 191, 911, 1, 0, 0, 0, 193, 913, 1, 0, 0, 0, 195, 917, 1, 0, 0, 0, 197, 929, 1, 0, 0, 0, 199, 931, 1, 0, 0, 0, 201, 933, 1, 0, 0, 0, 203, 935, 1, 0, 0, 0, 205, 937, 1, 0, 0, 0, 207, 939, 1, 0, 0, 0, 209, 941, 1, 0, 0, 0, 211, 943, 1, 0, 0, 0, 213, 945, 1, 0, 0, 0, 215, 947, 1, 0, 0, 0, 217, 949, 1, 0, 0, 0, 219, 951, 1, 0, 0, 0, 221, 953, 1, 0, 0, 0, 223, 955, 1, 0, 0, 0, 225, 958, 1, 0, 0, 0, 227, 962, 1, 0, 0, 0, 229, 968, 1, 0, 0, 0, 231, 982, 1, 0, 0, 0, 233, 234, 5, 98, 0, 0, 234, 235, 5, 111, 0, 0, 235, 236, 5, 111, 0, 0, 236, 246, 5, 108, 0, 0, 237, 238, 5, 66, 0, 0, 238, 239, 5, 111, 0, 0, 239, 240, 5, 111, 0, 0, 240, 246, 5, 108, 0, 0, 241, 242, 5, 66, 0, 0, 242, 243, 5, 79, 0, 0, 243, 244, 5, 79, 0, 0, 244, 246, 5, 76, 0, 0, 245, 233, 1, 0, 0, 0, 245, 237, 1, 0, 0, 0, 245, 241, 1, 0, 0, 0, 246, 2, 1, 0, 0, 0, 247, 248, 5, 105, 0, 0, 248, 249, 5, 110, 0, 0, 249, 257, 5, 116, 0, 0, 250, 251, 5, 73, 0, 0, 251, 252, 5, 110, 0, 0, 252, 257, 5, 116, 0, 0, 253, 254, 5, 73, 0, 0, 254, 255, 5, 78, 0, 0, 255, 257, 5, 84, 0, 0, 256, 247, 1, 0, 0, 0, 256, 250, 1, 0, 0, 0, 256, 253, 1, 0, 0, 0, 257, 4, 1, 0, 0, 0, 258, 259, 5, 114, 0, 0, 259, 260, 5, 97, 0, 0, 260, 268, 5, 116, 0, 0, 261, 262, 5, 82, 0, 0, 262, 263, 5, 97, 0, 0, 263, 268, 5, 116, 0, 0, 264, 265, 5, 82, 0, 0, 265, 266, 5, 65, 0, 0, 266, 268, 5, 84, 0, 0, 267, 258, 1, 0, 0, 0, 267, 261, 1, 0, 0, 0, 267, 264, 1, 0, 0, 0, 268, 6, 1, 0, 0, 0, 269, 270, 5, 98, 0, 0, 270, 276, 5, 118, 0, 0, 271, 272, 5, 66, 0, 0, 272, 276, 5, 118, 0, 0, 273, 274, 5, 66, 0, 0, 274, 276, 5, 86, 0, 0, 275, 269, 1, 0, 0, 0, 275, 271, 1, 0, 0, 0, 275, 273, 1, 0, 0, 0, 276, 8, 1, 0, 0, 0, 277, 278, 5, 102, 0, 0, 278, 284, 5, 112, 0, 0, 279, 280, 5, 70, 0, 0, 280, 284, 5, 112, 0, 0, 281, 282, 5, 70, 0, 0, 282, 284, 5, 80, 0, 0, 283, 277, 1, 0, 0, 0, 283, 279, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 284, 10, 1, 0, 0, 0, 285, 286, 5, 102, 0, 0, 286, 287, 5, 117, 0, 0, 287, 288, 5, 110, 0, 0, 288, 298, 5, 99, 0, 0, 289, 290, 5, 70, 0, 0, 290, 291, 5, 117, 0, 0, 291, 292, 5, 110, 0, 0, 292, 298, 5, 99, 0, 0, 293, 294, 5, 70, 0, 0, 294, 295, 5, 85, 0, 0, 295, 296, 5, 78, 0, 0, 296, 298, 5, 67, 0, 0, 297, 285, 1, 0, 0, 0, 297, 289, 1, 0, 0, 0, 297, 293, 1, 0, 0, 0, 298, 12, 1, 0, 0, 0, 299, 300, 5, 97, 0, 0, 300, 301, 5, 114, 0, 0, 301, 302, 5, 114, 0, 0, 302, 303, 5, 97, 0, 0, 303, 315, 5, 121, 0, 0, 304, 305, 5, 65, 0, 0, 305, 306, 5, 114, 0, 0, 306, 307, 5, 114, 0, 0, 307, 308, 5, 97, 0, 0, 308, 315, 5, 121, 0, 0, 309, 310, 5, 65, 0, 0, 310, 311, 5, 82, 0, 0, 311, 312, 5, 82, 0, 0, 312, 313, 5, 65, 0, 0, 313, 315, 5, 89, 0, 0, 314, 299, 1, 0, 0, 0, 314, 304, 1, 0, 0, 0, 314, 309, 1, 0, 0, 0, 315, 14, 1, 0, 0, 0, 316, 317, 5, 105, 0, 0, 317, 318, 5, 102, 0, 0, 318, 16, 1, 0, 0, 0, 319, 320, 5, 116, 0, 0, 320, 321, 5, 104, 0, 0, 321, 322, 5, 101, 0, 0, 322, 323, 5, 110, 0, 0, 323, 18, 1, 0, 0, 0, 324, 325, 5, 101, 0, 0, 325, 326, 5, 108, 0, 0, 326, 327, 5, 115, 0, 0, 327, 328, 5, 101, 0, 0, 328, 20, 1, 0, 0, 0, 329, 330, 5, 105, 0, 0, 330, 331, 5, 102, 0, 0, 331, 332, 5, 102, 0, 0, 332, 22, 1, 0, 0, 0, 333, 334, 5, 105, 0, 0, 334, 335, 5, 116, 0, 0, 335, 336, 5, 101, 0, 0, 336, 24, 1, 0, 0, 0, 337, 338, 5, 61, 0, 0, 338, 339, 5, 62, 0, 0, 339, 26, 1, 0, 0, 0, 340, 341, 5, 102, 0, 0, 341, 342, 5, 111, 0, 0, 342, 343, 5, 114, 0, 0, 343, 344, 5, 97, 0, 0, 344, 345, 5, 108, 0, 0, 345, 346, 5, 108, 0, 0, 346, 28, 1, 0, 0, 0, 347, 348, 5, 101, 0, 0, 348, 349, 5, 120, 0, 0, 349, 350, 5, 105, 0, 0, 350, 351, 5, 115, 0, 0, 351, 352, 5, 116, 0, 0, 352, 353, 5, 115, 0, 0, 353, 30, 1, 0, 0, 0, 354, 355, 5, 111, 0, 0, 355, 356, 5, 114, 0, 0, 356, 32, 1, 0, 0, 0, 357, 358, 5, 97, 0, 0, 358, 359, 5, 110, 0, 0, 359, 360, 5, 100, 0, 0, 360, 34, 1, 0, 0, 0, 361, 362, 5, 120, 0, 0, 362, 363, 5, 111, 0, 0, 363, 364, 5, 114, 0, 0, 364, 36, 1, 0, 0, 0, 365, 366, 5, 110, 0, 0, 366, 367, 5, 111, 0, 0, 367, 368, 5, 116, 0, 0, 368, 38, 1, 0, 0, 0, 369, 370, 5, 61, 0, 0, 370, 40, 1, 0, 0, 0, 371, 372, 5, 47, 0, 0, 372, 373, 5, 61, 0, 0, 373, 42, 1, 0, 0, 0, 374, 375, 5, 60, 0, 0, 375, 44, 1, 0, 0, 0, 376, 377, 5, 60, 0, 0, 377, 378, 5, 61, 0, 0, 378, 46, 1, 0, 0, 0, 379, 380, 5, 62, 0, 0, 380, 48, 1, 0, 0, 0, 381, 382, 5, 62, 0, 0, 382, 383, 5, 61, 0, 0, 383, 50, 1, 0, 0, 0, 384, 385, 5, 43, 0, 0, 385, 52, 1, 0, 0, 0, 386, 387, 5, 45, 0, 0, 387, 54, 1, 0, 0, 0, 388, 389, 5, 42, 0, 0, 389, 56, 1, 0, 0, 0, 390, 391, 5, 100, 0, 0, 391, 392, 5, 105, 0, 0, 392, 393, 5, 118, 0, 0, 393, 58, 1, 0, 0, 0, 394, 395, 5, 109, 0, 0, 395, 396, 5, 111, 0, 0, 396, 397, 5, 100, 0, 0, 397, 60, 1, 0, 0, 0, 398, 399, 5, 114, 0, 0, 399, 400, 5, 101, 0, 0, 400, 401, 5, 109, 0, 0, 401, 62, 1, 0, 0, 0, 402, 403, 5, 37, 0, 0, 403, 64, 1, 0, 0, 0, 404, 405, 3, 51, 25, 0, 405, 406, 3, 51, 25, 0, 406, 66, 1, 0, 0, 0, 407, 408, 5, 98, 0, 0, 408, 409, 5, 118, 0, 0, 409, 410, 5, 95, 0, 0, 410, 411, 5, 122, 0, 0, 411, 412, 5, 101, 0, 0, 412, 413, 5, 114, 0, 0, 413, 414, 5, 111, 0, 0, 414, 415, 5, 95, 0, 0, 415, 416, 5, 101, 0, 0, 416, 417, 5, 120, 0, 0, 417, 418, 5, 116, 0, 0, 418, 419, 5, 101, 0, 0, 419, 420, 5, 110, 0, 0, 420, 421, 5, 100, 0, 0, 421, 68, 1, 0, 0, 0, 422, 423, 5, 98, 0, 0, 423, 424, 5, 118, 0, 0, 424, 425, 5, 95, 0, 0, 425, 426, 5, 115, 0, 0, 426, 427, 5, 105, 0, 0, 427, 428, 5, 103, 0, 0, 428, 429, 5, 110, 0, 0, 429, 430, 5, 95, 0, 0, 430, 431, 5, 101, 0, 0, 431, 432, 5, 120, 0, 0, 432, 433, 5, 116, 0, 0, 433, 434, 5, 101, 0, 0, 434, 435, 5, 110, 0, 0, 435, 436, 5, 100, 0, 0, 436, 70, 1, 0, 0, 0, 437, 438, 5, 98, 0, 0, 438, 439, 5, 118, 0, 0, 439, 440, 5, 97, 0, 0, 440, 441, 5, 100, 0, 0, 441, 442, 5, 100, 0, 0, 442, 72, 1, 0, 0, 0, 443, 444, 5, 98, 0, 0, 444, 445, 5, 118, 0, 0, 445, 446, 5, 115, 0, 0, 446, 447, 5, 117, 0, 0, 447, 448, 5, 98, 0, 0, 448, 74, 1, 0, 0, 0, 449, 450, 5, 98, 0, 0, 450, 451, 5, 118, 0, 0, 451, 452, 5, 112, 0, 0, 452, 453, 5, 111, 0, 0, 453, 454, 5, 115, 0, 0, 454, 76, 1, 0, 0, 0, 455, 456, 5, 98, 0, 0, 456, 457, 5, 118, 0, 0, 457, 458, 5, 110, 0, 0, 458, 459, 5, 101, 0, 0, 459, 460, 5, 103, 0, 0, 460, 78, 1, 0, 0, 0, 461, 462, 5, 98, 0, 0, 462, 463, 5, 118, 0, 0, 463, 464, 5, 109, 0, 0, 464, 465, 5, 117, 0, 0, 465, 466, 5, 108, 0, 0, 466, 80, 1, 0, 0, 0, 467, 468, 5, 98, 0, 0, 468, 469, 5, 118, 0, 0, 469, 470, 5, 117, 0, 0, 470, 471, 5, 100, 0, 0, 471, 472, 5, 105, 0, 0, 472, 473, 5, 118, 0, 0, 473, 82, 1, 0, 0, 0, 474, 475, 5, 98, 0, 0, 475, 476, 5, 118, 0, 0, 476, 477, 5, 115, 0, 0, 477, 478, 5, 100, 0, 0, 478, 479, 5, 105, 0, 0, 479, 480, 5, 118, 0, 0, 480, 84, 1, 0, 0, 0, 481, 482, 5, 98, 0, 0, 482, 483, 5, 118, 0, 0, 483, 484, 5, 115, 0, 0, 484, 485, 5, 109, 0, 0, 485, 486, 5, 111, 0, 0, 486, 487, 5, 100, 0, 0, 487, 86, 1, 0, 0, 0, 488, 489, 5, 98, 0, 0, 489, 490, 5, 118, 0, 0, 490, 491, 5, 117, 0, 0, 491, 492, 5, 114, 0, 0, 492, 493, 5, 101, 0, 0, 493, 494, 5, 109, 0, 0, 494, 88, 1, 0, 0, 0, 495, 496, 5, 98, 0, 0, 496, 497, 5, 118, 0, 0, 497, 498, 5, 115, 0, 0, 498, 499, 5, 114, 0, 0, 499, 500, 5, 101, 0, 0, 500, 501, 5, 109, 0, 0, 501, 90, 1, 0, 0, 0, 502, 503, 5, 98, 0, 0, 503, 504, 5, 118, 0, 0, 504, 505, 5, 111, 0, 0, 505, 506, 5, 114, 0, 0, 506, 92, 1, 0, 0, 0, 507, 508, 5, 98, 0, 0, 508, 509, 5, 118, 0, 0, 509, 510, 5, 97, 0, 0, 510, 511, 5, 110, 0, 0, 511, 512, 5, 100, 0, 0, 512, 94, 1, 0, 0, 0, 513, 514, 5, 98, 0, 0, 514, 515, 5, 118, 0, 0, 515, 516, 5, 120, 0, 0, 516, 517, 5, 111, 0, 0, 517, 518, 5, 114, 0, 0, 518, 96, 1, 0, 0, 0, 519, 520, 5, 98, 0, 0, 520, 521, 5, 118, 0, 0, 521, 522, 5, 110, 0, 0, 522, 523, 5, 111, 0, 0, 523, 524, 5, 116, 0, 0, 524, 98, 1, 0, 0, 0, 525, 526, 5, 98, 0, 0, 526, 527, 5, 118, 0, 0, 527, 528, 5, 115, 0, 0, 528, 529, 5, 104, 0, 0, 529, 530, 5, 108, 0, 0, 530, 100, 1, 0, 0, 0, 531, 532, 5, 98, 0, 0, 532, 533, 5, 118, 0, 0, 533, 534, 5, 97, 0, 0, 534, 535, 5, 115, 0, 0, 535, 536, 5, 104, 0, 0, 536, 537, 5, 114, 0, 0, 537, 102, 1, 0, 0, 0, 538, 539, 5, 98, 0, 0, 539, 540, 5, 118, 0, 0, 540, 541, 5, 108, 0, 0, 541, 542, 5, 115, 0, 0, 542, 543, 5, 104, 0, 0, 543, 544, 5, 114, 0, 0, 544, 104, 1, 0, 0, 0, 545, 546, 5, 98, 0, 0, 546, 547, 5, 118, 0, 0, 547, 548, 5, 114, 0, 0, 548, 549, 5, 111, 0, 0, 549, 550, 5, 108, 0, 0, 550, 106, 1, 0, 0, 0, 551, 552, 5, 98, 0, 0, 552, 553, 5, 118, 0, 0, 553, 554, 5, 114, 0, 0, 554, 555, 5, 111, 0, 0, 555, 556, 5, 114, 0, 0, 556, 108, 1, 0, 0, 0, 557, 558, 5, 98, 0, 0, 558, 559, 5, 118, 0, 0, 559, 560, 5, 117, 0, 0, 560, 561, 5, 108, 0, 0, 561, 562, 5, 116, 0, 0, 562, 110, 1, 0, 0, 0, 563, 564, 5, 98, 0, 0, 564, 565, 5, 118, 0, 0, 565, 566, 5, 117, 0, 0, 566, 567, 5, 108, 0, 0, 567, 568, 5, 101, 0, 0, 568, 112, 1, 0, 0, 0, 569, 570, 5, 98, 0, 0, 570, 571, 5, 118, 0, 0, 571, 572, 5, 117, 0, 0, 572, 573, 5, 103, 0, 0, 573, 574, 5, 116, 0, 0, 574, 114, 1, 0, 0, 0, 575, 576, 5, 98, 0, 0, 576, 577, 5, 118, 0, 0, 577, 578, 5, 117, 0, 0, 578, 579, 5, 103, 0, 0, 579, 580, 5, 101, 0, 0, 580, 116, 1, 0, 0, 0, 581, 582, 5, 98, 0, 0, 582, 583, 5, 118, 0, 0, 583, 584, 5, 115, 0, 0, 584, 585, 5, 108, 0, 0, 585, 586, 5, 116, 0, 0, 586, 118, 1, 0, 0, 0, 587, 588, 5, 98, 0, 0, 588, 589, 5, 118, 0, 0, 589, 590, 5, 115, 0, 0, 590, 591, 5, 108, 0, 0, 591, 592, 5, 101, 0, 0, 592, 120, 1, 0, 0, 0, 593, 594, 5, 98, 0, 0, 594, 595, 5, 118, 0, 0, 595, 596, 5, 115, 0, 0, 596, 597, 5, 103, 0, 0, 597, 598, 5, 116, 0, 0, 598, 122, 1, 0, 0, 0, 599, 600, 5, 98, 0, 0, 600, 601, 5, 118, 0, 0, 601, 602, 5, 115, 0, 0, 602, 603, 5, 103, 0, 0, 603, 604, 5, 101, 0, 0, 604, 124, 1, 0, 0, 0, 605, 606, 5, 102, 0, 0, 606, 607, 5, 112, 0, 0, 607, 608, 5, 97, 0, 0, 608, 609, 5, 98, 0, 0, 609, 610, 5, 115, 0, 0, 610, 126, 1, 0, 0, 0, 611, 612, 5, 102, 0, 0, 612, 613, 5, 112, 0, 0, 613, 614, 5, 102, 0, 0, 614, 615, 5, 114, 0, 0, 615, 616, 5, 111, 0, 0, 616, 617, 5, 109, 0, 0, 617, 618, 5, 98, 0, 0, 618, 619, 5, 118, 0, 0, 619, 620, 1, 0, 0, 0, 620, 621, 3, 169, 84, 0, 621, 622, 3, 207, 103, 0, 622, 623, 7, 0, 0, 0, 623, 624, 3, 209, 104, 0, 624, 626, 1, 0, 0, 0, 625, 627, 3, 171, 85, 0, 626, 625, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 128, 1, 0, 0, 0, 628, 629, 5, 102, 0, 0, 629, 630, 5, 112, 0, 0, 630, 631, 5, 105, 0, 0, 631, 632, 5, 115, 0, 0, 632, 633, 5, 110, 0, 0, 633, 634, 5, 97, 0, 0, 634, 635, 5, 110, 0, 0, 635, 130, 1, 0, 0, 0, 636, 637, 5, 102, 0, 0, 637, 638, 5, 112, 0, 0, 638, 639, 5, 109, 0, 0, 639, 640, 5, 97, 0, 0, 640, 641, 5, 120, 0, 0, 641, 132, 1, 0, 0, 0, 642, 643, 5, 102, 0, 0, 643, 644, 5, 112, 0, 0, 644, 645, 5, 109, 0, 0, 645, 646, 5, 105, 0, 0, 646, 647, 5, 110, 0, 0, 647, 134, 1, 0, 0, 0, 648, 649, 5, 102, 0, 0, 649, 650, 5, 112, 0, 0, 650, 651, 5, 114, 0, 0, 651, 652, 5, 101, 0, 0, 652, 653, 5, 109, 0, 0, 653, 136, 1, 0, 0, 0, 654, 655, 5, 102, 0, 0, 655, 656, 5, 112, 0, 0, 656, 657, 5, 114, 0, 0, 657, 658, 5, 111, 0, 0, 658, 659, 5, 117, 0, 0, 659, 660, 5, 110, 0, 0, 660, 661, 5, 100, 0, 0, 661, 662, 5, 116, 0, 0, 662, 663, 5, 111, 0, 0, 663, 664, 5, 105, 0, 0, 664, 665, 5, 110, 0, 0, 665, 666, 5, 116, 0, 0, 666, 668, 1, 0, 0, 0, 667, 669, 3, 171, 85, 0, 668, 667, 1, 0, 0, 0, 668, 669, 1, 0, 0, 0, 669, 138, 1, 0, 0, 0, 670, 671, 5, 102, 0, 0, 671, 672, 5, 112, 0, 0, 672, 673, 5, 115, 0, 0, 673, 674, 5, 113, 0, 0, 674, 675, 5, 114, 0, 0, 675, 676, 5, 116, 0, 0, 676, 678, 1, 0, 0, 0, 677, 679, 3, 171, 85, 0, 678, 677, 1, 0, 0, 0, 678, 679, 1, 0, 0, 0, 679, 140, 1, 0, 0, 0, 680, 681, 5, 102, 0, 0, 681, 682, 5, 112, 0, 0, 682, 683, 5, 116, 0, 0, 683, 684, 5, 111, 0, 0, 684, 685, 5, 98, 0, 0, 685, 686, 5, 118, 0, 0, 686, 687, 1, 0, 0, 0, 687, 689, 3, 167, 83, 0, 688, 690, 3, 171, 85, 0, 689, 688, 1, 0, 0, 0, 689, 690, 1, 0, 0, 0, 690, 142, 1, 0, 0, 0, 691, 692, 5, 102, 0, 0, 692, 693, 5, 112, 0, 0, 693, 694, 5, 116, 0, 0, 694, 695, 5, 111, 0, 0, 695, 696, 5, 102, 0, 0, 696, 697, 5, 112, 0, 0, 697, 698, 1, 0, 0, 0, 698, 700, 3, 169, 84, 0, 699, 701, 3, 171, 85, 0, 700, 699, 1, 0, 0, 0, 700, 701, 1, 0, 0, 0, 701, 144, 1, 0, 0, 0, 702, 703, 5, 102, 0, 0, 703, 704, 5, 112, 0, 0, 704, 705, 5, 115, 0, 0, 705, 706, 5, 117, 0, 0, 706, 707, 5, 98, 0, 0, 707, 146, 1, 0, 0, 0, 708, 709, 5, 102, 0, 0, 709, 710, 5, 112, 0, 0, 710, 711, 5, 97, 0, 0, 711, 712, 5, 100, 0, 0, 712, 713, 5, 100, 0, 0, 713, 715, 1, 0, 0, 0, 714, 716, 3, 171, 85, 0, 715, 714, 1, 0, 0, 0, 715, 716, 1, 0, 0, 0, 716, 148, 1, 0, 0, 0, 717, 718, 5, 102, 0, 0, 718, 719, 5, 112, 0, 0, 719, 720, 5, 109, 0, 0, 720, 721, 5, 117, 0, 0, 721, 722, 5, 108, 0, 0, 722, 150, 1, 0, 0, 0, 723, 724, 5, 102, 0, 0, 724, 725, 5, 112, 0, 0, 725, 726, 5, 100, 0, 0, 726, 727, 5, 105, 0, 0, 727, 728, 5, 118, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 3, 171, 85, 0, 730, 152, 1, 0, 0, 0, 731, 732, 5, 102, 0, 0, 732, 733, 5, 112, 0, 0, 733, 734, 5, 112, 0, 0, 734, 735, 5, 111, 0, 0, 735, 736, 5, 115, 0, 0, 736, 154, 1, 0, 0, 0, 737, 738, 5, 102, 0, 0, 738, 739, 5, 112, 0, 0, 739, 740, 5, 110, 0, 0, 740, 741, 5, 101, 0, 0, 741, 742, 5, 103, 0, 0, 742, 156, 1, 0, 0, 0, 743, 744, 5, 116, 0, 0, 744, 745, 5, 114, 0, 0, 745, 746, 5, 117, 0, 0, 746, 747, 5, 101, 0, 0, 747, 158, 1, 0, 0, 0, 748, 749, 5, 114, 0, 0, 749, 750, 5, 101, 0, 0, 750, 751, 5, 97, 0, 0, 751, 752, 5, 100, 0, 0, 752, 160, 1, 0, 0, 0, 753, 754, 5, 119, 0, 0, 754, 755, 5, 114, 0, 0, 755, 756, 5, 105, 0, 0, 756, 757, 5, 116, 0, 0, 757, 758, 5, 101, 0, 0, 758, 162, 1, 0, 0, 0, 759, 760, 5, 112, 0, 0, 760, 761, 5, 114, 0, 0, 761, 762, 5, 105, 0, 0, 762, 763, 5, 109, 0, 0, 763, 764, 5, 101, 0, 0, 764, 164, 1, 0, 0, 0, 765, 766, 5, 101, 0, 0, 766, 767, 5, 120, 0, 0, 767, 768, 5, 116, 0, 0, 768, 769, 5, 114, 0, 0, 769, 770, 5, 97, 0, 0, 770, 771, 5, 99, 0, 0, 771, 772, 5, 116, 0, 0, 772, 166, 1, 0, 0, 0, 773, 774, 3, 207, 103, 0, 774, 775, 3, 189, 94, 0, 775, 776, 5, 39, 0, 0, 776, 777, 7, 0, 0, 0, 777, 778, 3, 209, 104, 0, 778, 168, 1, 0, 0, 0, 779, 780, 3, 207, 103, 0, 780, 781, 3, 189, 94, 0, 781, 782, 3, 215, 107, 0, 782, 783, 3, 189, 94, 0, 783, 784, 3, 209, 104, 0, 784, 170, 1, 0, 0, 0, 785, 786, 5, 91, 0, 0, 786, 787, 5, 114, 0, 0, 787, 788, 5, 110, 0, 0, 788, 789, 5, 101, 0, 0, 789, 811, 5, 93, 0, 0, 790, 791, 5, 91, 0, 0, 791, 792, 5, 114, 0, 0, 792, 793, 5, 110, 0, 0, 793, 794, 5, 97, 0, 0, 794, 811, 5, 93, 0, 0, 795, 796, 5, 91, 0, 0, 796, 797, 5, 114, 0, 0, 797, 798, 5, 116, 0, 0, 798, 799, 5, 112, 0, 0, 799, 811, 5, 93, 0, 0, 800, 801, 5, 91, 0, 0, 801, 802, 5, 114, 0, 0, 802, 803, 5, 116, 0, 0, 803, 804, 5, 110, 0, 0, 804, 811, 5, 93, 0, 0, 805, 806, 5, 91, 0, 0, 806, 807, 5, 114, 0, 0, 807, 808, 5, 116, 0, 0, 808, 809, 5, 122, 0, 0, 809, 811, 5, 93, 0, 0, 810, 785, 1, 0, 0, 0, 810, 790, 1, 0, 0, 0, 810, 795, 1, 0, 0, 0, 810, 800, 1, 0, 0, 0, 810, 805, 1, 0, 0, 0, 811, 172, 1, 0, 0, 0, 812, 813, 5, 102, 0, 0, 813, 814, 5, 97, 0, 0, 814, 815, 5, 108, 0, 0, 815, 816, 5, 115, 0, 0, 816, 817, 5, 101, 0, 0, 817, 174, 1, 0, 0, 0, 818, 819, 5, 100, 0, 0, 819, 820, 5, 101, 0, 0, 820, 821, 5, 102, 0, 0, 821, 822, 5, 97, 0, 0, 822, 823, 5, 117, 0, 0, 823, 824, 5, 108, 0, 0, 824, 825, 5, 116, 0, 0, 825, 176, 1, 0, 0, 0, 826, 827, 5, 97, 0, 0, 827, 828, 5, 115, 0, 0, 828, 829, 5, 115, 0, 0, 829, 830, 5, 105, 0, 0, 830, 831, 5, 103, 0, 0, 831, 832, 5, 110, 0, 0, 832, 178, 1, 0, 0, 0, 833, 834, 5, 104, 0, 0, 834, 835, 5, 97, 0, 0, 835, 836, 5, 118, 0, 0, 836, 837, 5, 111, 0, 0, 837, 838, 5, 99, 0, 0, 838, 180, 1, 0, 0, 0, 839, 840, 5, 97, 0, 0, 840, 841, 5, 115, 0, 0, 841, 842, 5, 115, 0, 0, 842, 843, 5, 117, 0, 0, 843, 844, 5, 109, 0, 0, 844, 845, 5, 101, 0, 0, 845, 182, 1, 0, 0, 0, 846, 847, 5, 114, 0, 0, 847, 848, 5, 101, 0, 0, 848, 849, 5, 116, 0, 0, 849, 850, 5, 117, 0, 0, 850, 851, 5, 114, 0, 0, 851, 852, 5, 110, 0, 0, 852, 184, 1, 0, 0, 0, 853, 854, 3, 189, 94, 0, 854, 855, 5, 39, 0, 0, 855, 856, 5, 98, 0, 0, 856, 858, 1, 0, 0, 0, 857, 859, 7, 1, 0, 0, 858, 857, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 858, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 898, 1, 0, 0, 0, 862, 863, 5, 35, 0, 0, 863, 864, 5, 98, 0, 0, 864, 866, 1, 0, 0, 0, 865, 867, 7, 1, 0, 0, 866, 865, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 866, 1, 0, 0, 0, 868, 869, 1, 0, 0, 0, 869, 898, 1, 0, 0, 0, 870, 871, 5, 35, 0, 0, 871, 872, 5, 120, 0, 0, 872, 874, 1, 0, 0, 0, 873, 875, 7, 1, 0, 0, 874, 873, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 874, 1, 0, 0, 0, 876, 877, 1, 0, 0, 0, 877, 898, 1, 0, 0, 0, 878, 879, 3, 189, 94, 0, 879, 880, 5, 39, 0, 0, 880, 881, 5, 100, 0, 0, 881, 884, 1, 0, 0, 0, 882, 885, 3, 51, 25, 0, 883, 885, 3, 53, 26, 0, 884, 882, 1, 0, 0, 0, 884, 883, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 1, 0, 0, 0, 886, 887, 3, 187, 93, 0, 887, 898, 1, 0, 0, 0, 888, 889, 3, 189, 94, 0, 889, 890, 5, 39, 0, 0, 890, 891, 5, 120, 0, 0, 891, 893, 1, 0, 0, 0, 892, 894, 7, 2, 0, 0, 893, 892, 1, 0, 0, 0, 894, 895, 1, 0, 0, 0, 895, 893, 1, 0, 0, 0, 895, 896, 1, 0, 0, 0, 896, 898, 1, 0, 0, 0, 897, 853, 1, 0, 0, 0, 897, 862, 1, 0, 0, 0, 897, 870, 1, 0, 0, 0, 897, 878, 1, 0, 0, 0, 897, 888, 1, 0, 0, 0, 898, 186, 1, 0, 0, 0, 899, 901, 3, 191, 95, 0, 900, 899, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 1, 0, 0, 0, 902, 903, 3, 189, 94, 0, 903, 188, 1, 0, 0, 0, 904, 906, 3, 199, 99, 0, 905, 904, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 905, 1, 0, 0, 0, 907, 908, 1, 0, 0, 0, 908, 190, 1, 0, 0, 0, 909, 912, 3, 51, 25, 0, 910, 912, 3, 53, 26, 0, 911, 909, 1, 0, 0, 0, 911, 910, 1, 0, 0, 0, 912, 192, 1, 0, 0, 0, 913, 914, 5, 46, 0, 0, 914, 194, 1, 0, 0, 0, 915, 918, 3, 201, 100, 0, 916, 918, 3, 197, 98, 0, 917, 915, 1, 0, 0, 0, 917, 916, 1, 0, 0, 0, 918, 926, 1, 0, 0, 0, 919, 925, 3, 201, 100, 0, 920, 925, 3, 197, 98, 0, 921, 925, 5, 36, 0, 0, 922, 925, 3, 199, 99, 0, 923, 925, 3, 217, 108, 0, 924, 919, 1, 0, 0, 0, 924, 920, 1, 0, 0, 0, 924, 921, 1, 0, 0, 0, 924, 922, 1, 0, 0, 0, 924, 923, 1, 0, 0, 0, 925, 928, 1, 0, 0, 0, 926, 924, 1, 0, 0, 0, 926, 927, 1, 0, 0, 0, 927, 196, 1, 0, 0, 0, 928, 926, 1, 0, 0, 0, 929, 930, 5, 95, 0, 0, 930, 198, 1, 0, 0, 0, 931, 932, 7, 3, 0, 0, 932, 200, 1, 0, 0, 0, 933, 934, 7, 4, 0, 0, 934, 202, 1, 0, 0, 0, 935, 936, 5, 40, 0, 0, 936, 204, 1, 0, 0, 0, 937, 938, 5, 41, 0, 0, 938, 206, 1, 0, 0, 0, 939, 940, 5, 91, 0, 0, 940, 208, 1, 0, 0, 0, 941, 942, 5, 93, 0, 0, 942, 210, 1, 0, 0, 0, 943, 944, 5, 123, 0, 0, 944, 212, 1, 0, 0, 0, 945, 946, 5, 125, 0, 0, 946, 214, 1, 0, 0, 0, 947, 948, 5, 44, 0, 0, 948, 216, 1, 0, 0, 0, 949, 950, 5, 58, 0, 0, 950, 218, 1, 0, 0, 0, 951, 952, 5, 59, 0, 0, 952, 220, 1, 0, 0, 0, 953, 954, 5, 39, 0, 0, 954, 222, 1, 0, 0, 0, 955, 956, 5, 60, 0, 0, 956, 957, 5, 45, 0, 0, 957, 224, 1, 0, 0, 0, 958, 959, 5, 45, 0, 0, 959, 960, 5, 62, 0, 0, 960, 226, 1, 0, 0, 0, 961, 963, 7, 5, 0, 0, 962, 961, 1, 0, 0, 0, 963, 964, 1, 0, 0, 0, 964, 962, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 967, 6, 113, 0, 0, 967, 228, 1, 0, 0, 0, 968, 969, 5, 47, 0, 0, 969, 970, 5, 42, 0, 0, 970, 974, 1, 0, 0, 0, 971, 973, 9, 0, 0, 0, 972, 971, 1, 0, 0, 0, 973, 976, 1, 0, 0, 0, 974, 975, 1, 0, 0, 0, 974, 972, 1, 0, 0, 0, 975, 977, 1, 0, 0, 0, 976, 974, 1, 0, 0, 0, 977, 978, 5, 42, 0, 0, 978, 979, 5, 47, 0, 0, 979, 980, 1, 0, 0, 0, 980, 981, 6, 114, 0, 0, 981, 230, 1, 0, 0, 0, 982, 983, 5, 47, 0, 0, 983, 984, 5, 47, 0, 0, 984, 988, 1, 0, 0, 0, 985, 987, 8, 6, 0, 0, 986, 985, 1, 0, 0, 0, 987, 990, 1, 0, 0, 0, 988, 986, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 991, 1, 0, 0, 0, 990, 988, 1, 0, 0, 0, 991, 992, 6, 115, 0, 0, 992, 232, 1, 0, 0, 0, 30, 0, 245, 256, 267, 275, 283, 297, 314, 626, 668, 678, 689, 700, 715, 810, 860, 868, 876, 884, 895, 897, 900, 907, 911, 917, 924, 926, 964, 974, 988, 1, 6, 0, 0] \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/TypeLexer.java b/subprojects/common/grammar/src/main/gen/TypeLexer.java new file mode 100644 index 0000000000..945c46739d --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/TypeLexer.java @@ -0,0 +1,770 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Type.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class TypeLexer extends Lexer { + static { RuntimeMetaData.checkVersion("4.10.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + BOOLTYPE=1, INTTYPE=2, RATTYPE=3, BVTYPE=4, FPTYPE=5, FUNC=6, ARRAY=7, + IF=8, THEN=9, ELSE=10, IFF=11, ITE=12, IMPLY=13, FORALL=14, EXISTS=15, + OR=16, AND=17, XOR=18, NOT=19, EQ=20, NEQ=21, LT=22, LEQ=23, GT=24, GEQ=25, + PLUS=26, MINUS=27, MUL=28, DIV=29, MOD=30, REM=31, PERCENT=32, BV_CONCAT=33, + BV_ZERO_EXTEND=34, BV_SIGN_EXTEND=35, BV_ADD=36, BV_SUB=37, BV_POS=38, + BV_NEG=39, BV_MUL=40, BV_UDIV=41, BV_SDIV=42, BV_SMOD=43, BV_UREM=44, + BV_SREM=45, BV_OR=46, BV_AND=47, BV_XOR=48, BV_NOT=49, BV_SHL=50, BV_ASHR=51, + BV_LSHR=52, BV_ROL=53, BV_ROR=54, BV_ULT=55, BV_ULE=56, BV_UGT=57, BV_UGE=58, + BV_SLT=59, BV_SLE=60, BV_SGT=61, BV_SGE=62, FP_ABS=63, FP_FROM_BV=64, + FP_IS_NAN=65, FPMAX=66, FPMIN=67, FPREM=68, FPROUNDTOINT=69, FPSQRT=70, + FPTOBV=71, FPTOFP=72, FPSUB=73, FPADD=74, FPMUL=75, FPDIV=76, FPPOS=77, + FPNEG=78, TRUE=79, READ=80, WRITE=81, PRIME=82, EXTRACT=83, BV_TYPE_DECL=84, + FP_TYPE_DECL=85, FP_ROUNDINGMODE=86, FALSE=87, DEFAULT=88, ASSIGN=89, + HAVOC=90, ASSUME=91, RETURN=92, BV=93, INT=94, NAT=95, SIGN=96, DOT=97, + ID=98, UNDERSCORE=99, DIGIT=100, LETTER=101, LPAREN=102, RPAREN=103, LBRACK=104, + RBRACK=105, LBRAC=106, RBRAC=107, COMMA=108, COLON=109, SEMICOLON=110, + QUOT=111, LARROW=112, RARROW=113, WS=114, COMMENT=115, LINE_COMMENT=116; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE" + }; + + private static String[] makeRuleNames() { + return new String[] { + "BOOLTYPE", "INTTYPE", "RATTYPE", "BVTYPE", "FPTYPE", "FUNC", "ARRAY", + "IF", "THEN", "ELSE", "IFF", "ITE", "IMPLY", "FORALL", "EXISTS", "OR", + "AND", "XOR", "NOT", "EQ", "NEQ", "LT", "LEQ", "GT", "GEQ", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "REM", "PERCENT", "BV_CONCAT", "BV_ZERO_EXTEND", + "BV_SIGN_EXTEND", "BV_ADD", "BV_SUB", "BV_POS", "BV_NEG", "BV_MUL", "BV_UDIV", + "BV_SDIV", "BV_SMOD", "BV_UREM", "BV_SREM", "BV_OR", "BV_AND", "BV_XOR", + "BV_NOT", "BV_SHL", "BV_ASHR", "BV_LSHR", "BV_ROL", "BV_ROR", "BV_ULT", + "BV_ULE", "BV_UGT", "BV_UGE", "BV_SLT", "BV_SLE", "BV_SGT", "BV_SGE", + "FP_ABS", "FP_FROM_BV", "FP_IS_NAN", "FPMAX", "FPMIN", "FPREM", "FPROUNDTOINT", + "FPSQRT", "FPTOBV", "FPTOFP", "FPSUB", "FPADD", "FPMUL", "FPDIV", "FPPOS", + "FPNEG", "TRUE", "READ", "WRITE", "PRIME", "EXTRACT", "BV_TYPE_DECL", + "FP_TYPE_DECL", "FP_ROUNDINGMODE", "FALSE", "DEFAULT", "ASSIGN", "HAVOC", + "ASSUME", "RETURN", "BV", "INT", "NAT", "SIGN", "DOT", "ID", "UNDERSCORE", + "DIGIT", "LETTER", "LPAREN", "RPAREN", "LBRACK", "RBRACK", "LBRAC", "RBRAC", + "COMMA", "COLON", "SEMICOLON", "QUOT", "LARROW", "RARROW", "WS", "COMMENT", + "LINE_COMMENT" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, "'if'", "'then'", "'else'", + "'iff'", "'ite'", "'=>'", "'forall'", "'exists'", "'or'", "'and'", "'xor'", + "'not'", "'='", "'/='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", + "'div'", "'mod'", "'rem'", "'%'", null, "'bv_zero_extend'", "'bv_sign_extend'", + "'bvadd'", "'bvsub'", "'bvpos'", "'bvneg'", "'bvmul'", "'bvudiv'", "'bvsdiv'", + "'bvsmod'", "'bvurem'", "'bvsrem'", "'bvor'", "'bvand'", "'bvxor'", "'bvnot'", + "'bvshl'", "'bvashr'", "'bvlshr'", "'bvrol'", "'bvror'", "'bvult'", "'bvule'", + "'bvugt'", "'bvuge'", "'bvslt'", "'bvsle'", "'bvsgt'", "'bvsge'", "'fpabs'", + null, "'fpisnan'", "'fpmax'", "'fpmin'", "'fprem'", null, null, null, + null, "'fpsub'", null, "'fpmul'", null, "'fppos'", "'fpneg'", "'true'", + "'read'", "'write'", "'prime'", "'extract'", null, null, null, "'false'", + "'default'", "'assign'", "'havoc'", "'assume'", "'return'", null, null, + null, null, "'.'", null, "'_'", null, null, "'('", "')'", "'['", "']'", + "'{'", "'}'", "','", "':'", "';'", "'''", "'<-'", "'->'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "BOOLTYPE", "INTTYPE", "RATTYPE", "BVTYPE", "FPTYPE", "FUNC", "ARRAY", + "IF", "THEN", "ELSE", "IFF", "ITE", "IMPLY", "FORALL", "EXISTS", "OR", + "AND", "XOR", "NOT", "EQ", "NEQ", "LT", "LEQ", "GT", "GEQ", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "REM", "PERCENT", "BV_CONCAT", "BV_ZERO_EXTEND", + "BV_SIGN_EXTEND", "BV_ADD", "BV_SUB", "BV_POS", "BV_NEG", "BV_MUL", "BV_UDIV", + "BV_SDIV", "BV_SMOD", "BV_UREM", "BV_SREM", "BV_OR", "BV_AND", "BV_XOR", + "BV_NOT", "BV_SHL", "BV_ASHR", "BV_LSHR", "BV_ROL", "BV_ROR", "BV_ULT", + "BV_ULE", "BV_UGT", "BV_UGE", "BV_SLT", "BV_SLE", "BV_SGT", "BV_SGE", + "FP_ABS", "FP_FROM_BV", "FP_IS_NAN", "FPMAX", "FPMIN", "FPREM", "FPROUNDTOINT", + "FPSQRT", "FPTOBV", "FPTOFP", "FPSUB", "FPADD", "FPMUL", "FPDIV", "FPPOS", + "FPNEG", "TRUE", "READ", "WRITE", "PRIME", "EXTRACT", "BV_TYPE_DECL", + "FP_TYPE_DECL", "FP_ROUNDINGMODE", "FALSE", "DEFAULT", "ASSIGN", "HAVOC", + "ASSUME", "RETURN", "BV", "INT", "NAT", "SIGN", "DOT", "ID", "UNDERSCORE", + "DIGIT", "LETTER", "LPAREN", "RPAREN", "LBRACK", "RBRACK", "LBRAC", "RBRAC", + "COMMA", "COLON", "SEMICOLON", "QUOT", "LARROW", "RARROW", "WS", "COMMENT", + "LINE_COMMENT" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public TypeLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "Type.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + public static final String _serializedATN = + "\u0004\u0000t\u03e1\u0006\uffff\uffff\u0002\u0000\u0007\u0000\u0002\u0001"+ + "\u0007\u0001\u0002\u0002\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004"+ + "\u0007\u0004\u0002\u0005\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007"+ + "\u0007\u0007\u0002\b\u0007\b\u0002\t\u0007\t\u0002\n\u0007\n\u0002\u000b"+ + "\u0007\u000b\u0002\f\u0007\f\u0002\r\u0007\r\u0002\u000e\u0007\u000e\u0002"+ + "\u000f\u0007\u000f\u0002\u0010\u0007\u0010\u0002\u0011\u0007\u0011\u0002"+ + "\u0012\u0007\u0012\u0002\u0013\u0007\u0013\u0002\u0014\u0007\u0014\u0002"+ + "\u0015\u0007\u0015\u0002\u0016\u0007\u0016\u0002\u0017\u0007\u0017\u0002"+ + "\u0018\u0007\u0018\u0002\u0019\u0007\u0019\u0002\u001a\u0007\u001a\u0002"+ + "\u001b\u0007\u001b\u0002\u001c\u0007\u001c\u0002\u001d\u0007\u001d\u0002"+ + "\u001e\u0007\u001e\u0002\u001f\u0007\u001f\u0002 \u0007 \u0002!\u0007"+ + "!\u0002\"\u0007\"\u0002#\u0007#\u0002$\u0007$\u0002%\u0007%\u0002&\u0007"+ + "&\u0002\'\u0007\'\u0002(\u0007(\u0002)\u0007)\u0002*\u0007*\u0002+\u0007"+ + "+\u0002,\u0007,\u0002-\u0007-\u0002.\u0007.\u0002/\u0007/\u00020\u0007"+ + "0\u00021\u00071\u00022\u00072\u00023\u00073\u00024\u00074\u00025\u0007"+ + "5\u00026\u00076\u00027\u00077\u00028\u00078\u00029\u00079\u0002:\u0007"+ + ":\u0002;\u0007;\u0002<\u0007<\u0002=\u0007=\u0002>\u0007>\u0002?\u0007"+ + "?\u0002@\u0007@\u0002A\u0007A\u0002B\u0007B\u0002C\u0007C\u0002D\u0007"+ + "D\u0002E\u0007E\u0002F\u0007F\u0002G\u0007G\u0002H\u0007H\u0002I\u0007"+ + "I\u0002J\u0007J\u0002K\u0007K\u0002L\u0007L\u0002M\u0007M\u0002N\u0007"+ + "N\u0002O\u0007O\u0002P\u0007P\u0002Q\u0007Q\u0002R\u0007R\u0002S\u0007"+ + "S\u0002T\u0007T\u0002U\u0007U\u0002V\u0007V\u0002W\u0007W\u0002X\u0007"+ + "X\u0002Y\u0007Y\u0002Z\u0007Z\u0002[\u0007[\u0002\\\u0007\\\u0002]\u0007"+ + "]\u0002^\u0007^\u0002_\u0007_\u0002`\u0007`\u0002a\u0007a\u0002b\u0007"+ + "b\u0002c\u0007c\u0002d\u0007d\u0002e\u0007e\u0002f\u0007f\u0002g\u0007"+ + "g\u0002h\u0007h\u0002i\u0007i\u0002j\u0007j\u0002k\u0007k\u0002l\u0007"+ + "l\u0002m\u0007m\u0002n\u0007n\u0002o\u0007o\u0002p\u0007p\u0002q\u0007"+ + "q\u0002r\u0007r\u0002s\u0007s\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001"+ + "\u0000\u0001\u0000\u0001\u0000\u0003\u0000\u00f6\b\u0000\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0001\u0001\u0001\u0003\u0001\u0101\b\u0001\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001\u0002\u0001"+ + "\u0002\u0003\u0002\u010c\b\u0002\u0001\u0003\u0001\u0003\u0001\u0003\u0001"+ + "\u0003\u0001\u0003\u0001\u0003\u0003\u0003\u0114\b\u0003\u0001\u0004\u0001"+ + "\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0001\u0004\u0003\u0004\u011c"+ + "\b\u0004\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001"+ + "\u0005\u0003\u0005\u012a\b\u0005\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0003"+ + "\u0006\u013b\b\u0006\u0001\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001"+ + "\b\u0001\b\u0001\b\u0001\b\u0001\t\u0001\t\u0001\t\u0001\t\u0001\t\u0001"+ + "\n\u0001\n\u0001\n\u0001\n\u0001\u000b\u0001\u000b\u0001\u000b\u0001\u000b"+ + "\u0001\f\u0001\f\u0001\f\u0001\r\u0001\r\u0001\r\u0001\r\u0001\r\u0001"+ + "\r\u0001\r\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e\u0001\u000e"+ + "\u0001\u000e\u0001\u000e\u0001\u000f\u0001\u000f\u0001\u000f\u0001\u0010"+ + "\u0001\u0010\u0001\u0010\u0001\u0010\u0001\u0011\u0001\u0011\u0001\u0011"+ + "\u0001\u0011\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0012\u0001\u0013"+ + "\u0001\u0013\u0001\u0014\u0001\u0014\u0001\u0014\u0001\u0015\u0001\u0015"+ + "\u0001\u0016\u0001\u0016\u0001\u0016\u0001\u0017\u0001\u0017\u0001\u0018"+ + "\u0001\u0018\u0001\u0018\u0001\u0019\u0001\u0019\u0001\u001a\u0001\u001a"+ + "\u0001\u001b\u0001\u001b\u0001\u001c\u0001\u001c\u0001\u001c\u0001\u001c"+ + "\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001d\u0001\u001e\u0001\u001e"+ + "\u0001\u001e\u0001\u001e\u0001\u001f\u0001\u001f\u0001 \u0001 \u0001 "+ + "\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001"+ + "!\u0001!\u0001!\u0001!\u0001!\u0001!\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001\"\u0001"+ + "\"\u0001\"\u0001#\u0001#\u0001#\u0001#\u0001#\u0001#\u0001$\u0001$\u0001"+ + "$\u0001$\u0001$\u0001$\u0001%\u0001%\u0001%\u0001%\u0001%\u0001%\u0001"+ + "&\u0001&\u0001&\u0001&\u0001&\u0001&\u0001\'\u0001\'\u0001\'\u0001\'\u0001"+ + "\'\u0001\'\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001(\u0001)\u0001"+ + ")\u0001)\u0001)\u0001)\u0001)\u0001)\u0001*\u0001*\u0001*\u0001*\u0001"+ + "*\u0001*\u0001*\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001+\u0001"+ + ",\u0001,\u0001,\u0001,\u0001,\u0001,\u0001,\u0001-\u0001-\u0001-\u0001"+ + "-\u0001-\u0001.\u0001.\u0001.\u0001.\u0001.\u0001.\u0001/\u0001/\u0001"+ + "/\u0001/\u0001/\u0001/\u00010\u00010\u00010\u00010\u00010\u00010\u0001"+ + "1\u00011\u00011\u00011\u00011\u00011\u00012\u00012\u00012\u00012\u0001"+ + "2\u00012\u00012\u00013\u00013\u00013\u00013\u00013\u00013\u00013\u0001"+ + "4\u00014\u00014\u00014\u00014\u00014\u00015\u00015\u00015\u00015\u0001"+ + "5\u00015\u00016\u00016\u00016\u00016\u00016\u00016\u00017\u00017\u0001"+ + "7\u00017\u00017\u00017\u00018\u00018\u00018\u00018\u00018\u00018\u0001"+ + "9\u00019\u00019\u00019\u00019\u00019\u0001:\u0001:\u0001:\u0001:\u0001"+ + ":\u0001:\u0001;\u0001;\u0001;\u0001;\u0001;\u0001;\u0001<\u0001<\u0001"+ + "<\u0001<\u0001<\u0001<\u0001=\u0001=\u0001=\u0001=\u0001=\u0001=\u0001"+ + ">\u0001>\u0001>\u0001>\u0001>\u0001>\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001?\u0001"+ + "?\u0003?\u0273\b?\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001@\u0001"+ + "@\u0001A\u0001A\u0001A\u0001A\u0001A\u0001A\u0001B\u0001B\u0001B\u0001"+ + "B\u0001B\u0001B\u0001C\u0001C\u0001C\u0001C\u0001C\u0001C\u0001D\u0001"+ + "D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001D\u0001"+ + "D\u0001D\u0001D\u0003D\u029d\bD\u0001E\u0001E\u0001E\u0001E\u0001E\u0001"+ + "E\u0001E\u0001E\u0003E\u02a7\bE\u0001F\u0001F\u0001F\u0001F\u0001F\u0001"+ + "F\u0001F\u0001F\u0001F\u0003F\u02b2\bF\u0001G\u0001G\u0001G\u0001G\u0001"+ + "G\u0001G\u0001G\u0001G\u0001G\u0003G\u02bd\bG\u0001H\u0001H\u0001H\u0001"+ + "H\u0001H\u0001H\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0001I\u0003"+ + "I\u02cc\bI\u0001J\u0001J\u0001J\u0001J\u0001J\u0001J\u0001K\u0001K\u0001"+ + "K\u0001K\u0001K\u0001K\u0001K\u0001K\u0001L\u0001L\u0001L\u0001L\u0001"+ + "L\u0001L\u0001M\u0001M\u0001M\u0001M\u0001M\u0001M\u0001N\u0001N\u0001"+ + "N\u0001N\u0001N\u0001O\u0001O\u0001O\u0001O\u0001O\u0001P\u0001P\u0001"+ + "P\u0001P\u0001P\u0001P\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001Q\u0001"+ + "R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001R\u0001S\u0001S\u0001"+ + "S\u0001S\u0001S\u0001S\u0001T\u0001T\u0001T\u0001T\u0001T\u0001T\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001U\u0001"+ + "U\u0001U\u0001U\u0001U\u0001U\u0003U\u032b\bU\u0001V\u0001V\u0001V\u0001"+ + "V\u0001V\u0001V\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001W\u0001"+ + "W\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001X\u0001Y\u0001Y\u0001"+ + "Y\u0001Y\u0001Y\u0001Y\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001Z\u0001"+ + "Z\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001[\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0004\\\u035b\b\\\u000b\\\f\\\u035c\u0001\\\u0001\\"+ + "\u0001\\\u0001\\\u0004\\\u0363\b\\\u000b\\\f\\\u0364\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0004\\\u036b\b\\\u000b\\\f\\\u036c\u0001\\\u0001\\\u0001\\"+ + "\u0001\\\u0001\\\u0001\\\u0003\\\u0375\b\\\u0001\\\u0001\\\u0001\\\u0001"+ + "\\\u0001\\\u0001\\\u0001\\\u0004\\\u037e\b\\\u000b\\\f\\\u037f\u0003\\"+ + "\u0382\b\\\u0001]\u0003]\u0385\b]\u0001]\u0001]\u0001^\u0004^\u038a\b"+ + "^\u000b^\f^\u038b\u0001_\u0001_\u0003_\u0390\b_\u0001`\u0001`\u0001a\u0001"+ + "a\u0003a\u0396\ba\u0001a\u0001a\u0001a\u0001a\u0001a\u0005a\u039d\ba\n"+ + "a\fa\u03a0\ta\u0001b\u0001b\u0001c\u0001c\u0001d\u0001d\u0001e\u0001e"+ + "\u0001f\u0001f\u0001g\u0001g\u0001h\u0001h\u0001i\u0001i\u0001j\u0001"+ + "j\u0001k\u0001k\u0001l\u0001l\u0001m\u0001m\u0001n\u0001n\u0001o\u0001"+ + "o\u0001o\u0001p\u0001p\u0001p\u0001q\u0004q\u03c3\bq\u000bq\fq\u03c4\u0001"+ + "q\u0001q\u0001r\u0001r\u0001r\u0001r\u0005r\u03cd\br\nr\fr\u03d0\tr\u0001"+ + "r\u0001r\u0001r\u0001r\u0001r\u0001s\u0001s\u0001s\u0001s\u0005s\u03db"+ + "\bs\ns\fs\u03de\ts\u0001s\u0001s\u0001\u03ce\u0000t\u0001\u0001\u0003"+ + "\u0002\u0005\u0003\u0007\u0004\t\u0005\u000b\u0006\r\u0007\u000f\b\u0011"+ + "\t\u0013\n\u0015\u000b\u0017\f\u0019\r\u001b\u000e\u001d\u000f\u001f\u0010"+ + "!\u0011#\u0012%\u0013\'\u0014)\u0015+\u0016-\u0017/\u00181\u00193\u001a"+ + "5\u001b7\u001c9\u001d;\u001e=\u001f? A!C\"E#G$I%K&M\'O(Q)S*U+W,Y-[.]/"+ + "_0a1c2e3g4i5k6m7o8q9s:u;w}?\u007f@\u0081A\u0083B\u0085C\u0087D\u0089"+ + "E\u008bF\u008dG\u008fH\u0091I\u0093J\u0095K\u0097L\u0099M\u009bN\u009d"+ + "O\u009fP\u00a1Q\u00a3R\u00a5S\u00a7T\u00a9U\u00abV\u00adW\u00afX\u00b1"+ + "Y\u00b3Z\u00b5[\u00b7\\\u00b9]\u00bb^\u00bd_\u00bf`\u00c1a\u00c3b\u00c5"+ + "c\u00c7d\u00c9e\u00cbf\u00cdg\u00cfh\u00d1i\u00d3j\u00d5k\u00d7l\u00d9"+ + "m\u00dbn\u00ddo\u00dfp\u00e1q\u00e3r\u00e5s\u00e7t\u0001\u0000\u0007\u0002"+ + "\u0000ssuu\u0001\u000001\u0003\u000009AFaf\u0001\u000009\u0002\u0000A"+ + "Zaz\u0003\u0000\t\n\f\r \u0002\u0000\n\n\r\r\u040e\u0000\u0001\u0001"+ + "\u0000\u0000\u0000\u0000\u0003\u0001\u0000\u0000\u0000\u0000\u0005\u0001"+ + "\u0000\u0000\u0000\u0000\u0007\u0001\u0000\u0000\u0000\u0000\t\u0001\u0000"+ + "\u0000\u0000\u0000\u000b\u0001\u0000\u0000\u0000\u0000\r\u0001\u0000\u0000"+ + "\u0000\u0000\u000f\u0001\u0000\u0000\u0000\u0000\u0011\u0001\u0000\u0000"+ + "\u0000\u0000\u0013\u0001\u0000\u0000\u0000\u0000\u0015\u0001\u0000\u0000"+ + "\u0000\u0000\u0017\u0001\u0000\u0000\u0000\u0000\u0019\u0001\u0000\u0000"+ + "\u0000\u0000\u001b\u0001\u0000\u0000\u0000\u0000\u001d\u0001\u0000\u0000"+ + "\u0000\u0000\u001f\u0001\u0000\u0000\u0000\u0000!\u0001\u0000\u0000\u0000"+ + "\u0000#\u0001\u0000\u0000\u0000\u0000%\u0001\u0000\u0000\u0000\u0000\'"+ + "\u0001\u0000\u0000\u0000\u0000)\u0001\u0000\u0000\u0000\u0000+\u0001\u0000"+ + "\u0000\u0000\u0000-\u0001\u0000\u0000\u0000\u0000/\u0001\u0000\u0000\u0000"+ + "\u00001\u0001\u0000\u0000\u0000\u00003\u0001\u0000\u0000\u0000\u00005"+ + "\u0001\u0000\u0000\u0000\u00007\u0001\u0000\u0000\u0000\u00009\u0001\u0000"+ + "\u0000\u0000\u0000;\u0001\u0000\u0000\u0000\u0000=\u0001\u0000\u0000\u0000"+ + "\u0000?\u0001\u0000\u0000\u0000\u0000A\u0001\u0000\u0000\u0000\u0000C"+ + "\u0001\u0000\u0000\u0000\u0000E\u0001\u0000\u0000\u0000\u0000G\u0001\u0000"+ + "\u0000\u0000\u0000I\u0001\u0000\u0000\u0000\u0000K\u0001\u0000\u0000\u0000"+ + "\u0000M\u0001\u0000\u0000\u0000\u0000O\u0001\u0000\u0000\u0000\u0000Q"+ + "\u0001\u0000\u0000\u0000\u0000S\u0001\u0000\u0000\u0000\u0000U\u0001\u0000"+ + "\u0000\u0000\u0000W\u0001\u0000\u0000\u0000\u0000Y\u0001\u0000\u0000\u0000"+ + "\u0000[\u0001\u0000\u0000\u0000\u0000]\u0001\u0000\u0000\u0000\u0000_"+ + "\u0001\u0000\u0000\u0000\u0000a\u0001\u0000\u0000\u0000\u0000c\u0001\u0000"+ + "\u0000\u0000\u0000e\u0001\u0000\u0000\u0000\u0000g\u0001\u0000\u0000\u0000"+ + "\u0000i\u0001\u0000\u0000\u0000\u0000k\u0001\u0000\u0000\u0000\u0000m"+ + "\u0001\u0000\u0000\u0000\u0000o\u0001\u0000\u0000\u0000\u0000q\u0001\u0000"+ + "\u0000\u0000\u0000s\u0001\u0000\u0000\u0000\u0000u\u0001\u0000\u0000\u0000"+ + "\u0000w\u0001\u0000\u0000\u0000\u0000y\u0001\u0000\u0000\u0000\u0000{"+ + "\u0001\u0000\u0000\u0000\u0000}\u0001\u0000\u0000\u0000\u0000\u007f\u0001"+ + "\u0000\u0000\u0000\u0000\u0081\u0001\u0000\u0000\u0000\u0000\u0083\u0001"+ + "\u0000\u0000\u0000\u0000\u0085\u0001\u0000\u0000\u0000\u0000\u0087\u0001"+ + "\u0000\u0000\u0000\u0000\u0089\u0001\u0000\u0000\u0000\u0000\u008b\u0001"+ + "\u0000\u0000\u0000\u0000\u008d\u0001\u0000\u0000\u0000\u0000\u008f\u0001"+ + "\u0000\u0000\u0000\u0000\u0091\u0001\u0000\u0000\u0000\u0000\u0093\u0001"+ + "\u0000\u0000\u0000\u0000\u0095\u0001\u0000\u0000\u0000\u0000\u0097\u0001"+ + "\u0000\u0000\u0000\u0000\u0099\u0001\u0000\u0000\u0000\u0000\u009b\u0001"+ + "\u0000\u0000\u0000\u0000\u009d\u0001\u0000\u0000\u0000\u0000\u009f\u0001"+ + "\u0000\u0000\u0000\u0000\u00a1\u0001\u0000\u0000\u0000\u0000\u00a3\u0001"+ + "\u0000\u0000\u0000\u0000\u00a5\u0001\u0000\u0000\u0000\u0000\u00a7\u0001"+ + "\u0000\u0000\u0000\u0000\u00a9\u0001\u0000\u0000\u0000\u0000\u00ab\u0001"+ + "\u0000\u0000\u0000\u0000\u00ad\u0001\u0000\u0000\u0000\u0000\u00af\u0001"+ + "\u0000\u0000\u0000\u0000\u00b1\u0001\u0000\u0000\u0000\u0000\u00b3\u0001"+ + "\u0000\u0000\u0000\u0000\u00b5\u0001\u0000\u0000\u0000\u0000\u00b7\u0001"+ + "\u0000\u0000\u0000\u0000\u00b9\u0001\u0000\u0000\u0000\u0000\u00bb\u0001"+ + "\u0000\u0000\u0000\u0000\u00bd\u0001\u0000\u0000\u0000\u0000\u00bf\u0001"+ + "\u0000\u0000\u0000\u0000\u00c1\u0001\u0000\u0000\u0000\u0000\u00c3\u0001"+ + "\u0000\u0000\u0000\u0000\u00c5\u0001\u0000\u0000\u0000\u0000\u00c7\u0001"+ + "\u0000\u0000\u0000\u0000\u00c9\u0001\u0000\u0000\u0000\u0000\u00cb\u0001"+ + "\u0000\u0000\u0000\u0000\u00cd\u0001\u0000\u0000\u0000\u0000\u00cf\u0001"+ + "\u0000\u0000\u0000\u0000\u00d1\u0001\u0000\u0000\u0000\u0000\u00d3\u0001"+ + "\u0000\u0000\u0000\u0000\u00d5\u0001\u0000\u0000\u0000\u0000\u00d7\u0001"+ + "\u0000\u0000\u0000\u0000\u00d9\u0001\u0000\u0000\u0000\u0000\u00db\u0001"+ + "\u0000\u0000\u0000\u0000\u00dd\u0001\u0000\u0000\u0000\u0000\u00df\u0001"+ + "\u0000\u0000\u0000\u0000\u00e1\u0001\u0000\u0000\u0000\u0000\u00e3\u0001"+ + "\u0000\u0000\u0000\u0000\u00e5\u0001\u0000\u0000\u0000\u0000\u00e7\u0001"+ + "\u0000\u0000\u0000\u0001\u00f5\u0001\u0000\u0000\u0000\u0003\u0100\u0001"+ + "\u0000\u0000\u0000\u0005\u010b\u0001\u0000\u0000\u0000\u0007\u0113\u0001"+ + "\u0000\u0000\u0000\t\u011b\u0001\u0000\u0000\u0000\u000b\u0129\u0001\u0000"+ + "\u0000\u0000\r\u013a\u0001\u0000\u0000\u0000\u000f\u013c\u0001\u0000\u0000"+ + "\u0000\u0011\u013f\u0001\u0000\u0000\u0000\u0013\u0144\u0001\u0000\u0000"+ + "\u0000\u0015\u0149\u0001\u0000\u0000\u0000\u0017\u014d\u0001\u0000\u0000"+ + "\u0000\u0019\u0151\u0001\u0000\u0000\u0000\u001b\u0154\u0001\u0000\u0000"+ + "\u0000\u001d\u015b\u0001\u0000\u0000\u0000\u001f\u0162\u0001\u0000\u0000"+ + "\u0000!\u0165\u0001\u0000\u0000\u0000#\u0169\u0001\u0000\u0000\u0000%"+ + "\u016d\u0001\u0000\u0000\u0000\'\u0171\u0001\u0000\u0000\u0000)\u0173"+ + "\u0001\u0000\u0000\u0000+\u0176\u0001\u0000\u0000\u0000-\u0178\u0001\u0000"+ + "\u0000\u0000/\u017b\u0001\u0000\u0000\u00001\u017d\u0001\u0000\u0000\u0000"+ + "3\u0180\u0001\u0000\u0000\u00005\u0182\u0001\u0000\u0000\u00007\u0184"+ + "\u0001\u0000\u0000\u00009\u0186\u0001\u0000\u0000\u0000;\u018a\u0001\u0000"+ + "\u0000\u0000=\u018e\u0001\u0000\u0000\u0000?\u0192\u0001\u0000\u0000\u0000"+ + "A\u0194\u0001\u0000\u0000\u0000C\u0197\u0001\u0000\u0000\u0000E\u01a6"+ + "\u0001\u0000\u0000\u0000G\u01b5\u0001\u0000\u0000\u0000I\u01bb\u0001\u0000"+ + "\u0000\u0000K\u01c1\u0001\u0000\u0000\u0000M\u01c7\u0001\u0000\u0000\u0000"+ + "O\u01cd\u0001\u0000\u0000\u0000Q\u01d3\u0001\u0000\u0000\u0000S\u01da"+ + "\u0001\u0000\u0000\u0000U\u01e1\u0001\u0000\u0000\u0000W\u01e8\u0001\u0000"+ + "\u0000\u0000Y\u01ef\u0001\u0000\u0000\u0000[\u01f6\u0001\u0000\u0000\u0000"+ + "]\u01fb\u0001\u0000\u0000\u0000_\u0201\u0001\u0000\u0000\u0000a\u0207"+ + "\u0001\u0000\u0000\u0000c\u020d\u0001\u0000\u0000\u0000e\u0213\u0001\u0000"+ + "\u0000\u0000g\u021a\u0001\u0000\u0000\u0000i\u0221\u0001\u0000\u0000\u0000"+ + "k\u0227\u0001\u0000\u0000\u0000m\u022d\u0001\u0000\u0000\u0000o\u0233"+ + "\u0001\u0000\u0000\u0000q\u0239\u0001\u0000\u0000\u0000s\u023f\u0001\u0000"+ + "\u0000\u0000u\u0245\u0001\u0000\u0000\u0000w\u024b\u0001\u0000\u0000\u0000"+ + "y\u0251\u0001\u0000\u0000\u0000{\u0257\u0001\u0000\u0000\u0000}\u025d"+ + "\u0001\u0000\u0000\u0000\u007f\u0263\u0001\u0000\u0000\u0000\u0081\u0274"+ + "\u0001\u0000\u0000\u0000\u0083\u027c\u0001\u0000\u0000\u0000\u0085\u0282"+ + "\u0001\u0000\u0000\u0000\u0087\u0288\u0001\u0000\u0000\u0000\u0089\u028e"+ + "\u0001\u0000\u0000\u0000\u008b\u029e\u0001\u0000\u0000\u0000\u008d\u02a8"+ + "\u0001\u0000\u0000\u0000\u008f\u02b3\u0001\u0000\u0000\u0000\u0091\u02be"+ + "\u0001\u0000\u0000\u0000\u0093\u02c4\u0001\u0000\u0000\u0000\u0095\u02cd"+ + "\u0001\u0000\u0000\u0000\u0097\u02d3\u0001\u0000\u0000\u0000\u0099\u02db"+ + "\u0001\u0000\u0000\u0000\u009b\u02e1\u0001\u0000\u0000\u0000\u009d\u02e7"+ + "\u0001\u0000\u0000\u0000\u009f\u02ec\u0001\u0000\u0000\u0000\u00a1\u02f1"+ + "\u0001\u0000\u0000\u0000\u00a3\u02f7\u0001\u0000\u0000\u0000\u00a5\u02fd"+ + "\u0001\u0000\u0000\u0000\u00a7\u0305\u0001\u0000\u0000\u0000\u00a9\u030b"+ + "\u0001\u0000\u0000\u0000\u00ab\u032a\u0001\u0000\u0000\u0000\u00ad\u032c"+ + "\u0001\u0000\u0000\u0000\u00af\u0332\u0001\u0000\u0000\u0000\u00b1\u033a"+ + "\u0001\u0000\u0000\u0000\u00b3\u0341\u0001\u0000\u0000\u0000\u00b5\u0347"+ + "\u0001\u0000\u0000\u0000\u00b7\u034e\u0001\u0000\u0000\u0000\u00b9\u0381"+ + "\u0001\u0000\u0000\u0000\u00bb\u0384\u0001\u0000\u0000\u0000\u00bd\u0389"+ + "\u0001\u0000\u0000\u0000\u00bf\u038f\u0001\u0000\u0000\u0000\u00c1\u0391"+ + "\u0001\u0000\u0000\u0000\u00c3\u0395\u0001\u0000\u0000\u0000\u00c5\u03a1"+ + "\u0001\u0000\u0000\u0000\u00c7\u03a3\u0001\u0000\u0000\u0000\u00c9\u03a5"+ + "\u0001\u0000\u0000\u0000\u00cb\u03a7\u0001\u0000\u0000\u0000\u00cd\u03a9"+ + "\u0001\u0000\u0000\u0000\u00cf\u03ab\u0001\u0000\u0000\u0000\u00d1\u03ad"+ + "\u0001\u0000\u0000\u0000\u00d3\u03af\u0001\u0000\u0000\u0000\u00d5\u03b1"+ + "\u0001\u0000\u0000\u0000\u00d7\u03b3\u0001\u0000\u0000\u0000\u00d9\u03b5"+ + "\u0001\u0000\u0000\u0000\u00db\u03b7\u0001\u0000\u0000\u0000\u00dd\u03b9"+ + "\u0001\u0000\u0000\u0000\u00df\u03bb\u0001\u0000\u0000\u0000\u00e1\u03be"+ + "\u0001\u0000\u0000\u0000\u00e3\u03c2\u0001\u0000\u0000\u0000\u00e5\u03c8"+ + "\u0001\u0000\u0000\u0000\u00e7\u03d6\u0001\u0000\u0000\u0000\u00e9\u00ea"+ + "\u0005b\u0000\u0000\u00ea\u00eb\u0005o\u0000\u0000\u00eb\u00ec\u0005o"+ + "\u0000\u0000\u00ec\u00f6\u0005l\u0000\u0000\u00ed\u00ee\u0005B\u0000\u0000"+ + "\u00ee\u00ef\u0005o\u0000\u0000\u00ef\u00f0\u0005o\u0000\u0000\u00f0\u00f6"+ + "\u0005l\u0000\u0000\u00f1\u00f2\u0005B\u0000\u0000\u00f2\u00f3\u0005O"+ + "\u0000\u0000\u00f3\u00f4\u0005O\u0000\u0000\u00f4\u00f6\u0005L\u0000\u0000"+ + "\u00f5\u00e9\u0001\u0000\u0000\u0000\u00f5\u00ed\u0001\u0000\u0000\u0000"+ + "\u00f5\u00f1\u0001\u0000\u0000\u0000\u00f6\u0002\u0001\u0000\u0000\u0000"+ + "\u00f7\u00f8\u0005i\u0000\u0000\u00f8\u00f9\u0005n\u0000\u0000\u00f9\u0101"+ + "\u0005t\u0000\u0000\u00fa\u00fb\u0005I\u0000\u0000\u00fb\u00fc\u0005n"+ + "\u0000\u0000\u00fc\u0101\u0005t\u0000\u0000\u00fd\u00fe\u0005I\u0000\u0000"+ + "\u00fe\u00ff\u0005N\u0000\u0000\u00ff\u0101\u0005T\u0000\u0000\u0100\u00f7"+ + "\u0001\u0000\u0000\u0000\u0100\u00fa\u0001\u0000\u0000\u0000\u0100\u00fd"+ + "\u0001\u0000\u0000\u0000\u0101\u0004\u0001\u0000\u0000\u0000\u0102\u0103"+ + "\u0005r\u0000\u0000\u0103\u0104\u0005a\u0000\u0000\u0104\u010c\u0005t"+ + "\u0000\u0000\u0105\u0106\u0005R\u0000\u0000\u0106\u0107\u0005a\u0000\u0000"+ + "\u0107\u010c\u0005t\u0000\u0000\u0108\u0109\u0005R\u0000\u0000\u0109\u010a"+ + "\u0005A\u0000\u0000\u010a\u010c\u0005T\u0000\u0000\u010b\u0102\u0001\u0000"+ + "\u0000\u0000\u010b\u0105\u0001\u0000\u0000\u0000\u010b\u0108\u0001\u0000"+ + "\u0000\u0000\u010c\u0006\u0001\u0000\u0000\u0000\u010d\u010e\u0005b\u0000"+ + "\u0000\u010e\u0114\u0005v\u0000\u0000\u010f\u0110\u0005B\u0000\u0000\u0110"+ + "\u0114\u0005v\u0000\u0000\u0111\u0112\u0005B\u0000\u0000\u0112\u0114\u0005"+ + "V\u0000\u0000\u0113\u010d\u0001\u0000\u0000\u0000\u0113\u010f\u0001\u0000"+ + "\u0000\u0000\u0113\u0111\u0001\u0000\u0000\u0000\u0114\b\u0001\u0000\u0000"+ + "\u0000\u0115\u0116\u0005f\u0000\u0000\u0116\u011c\u0005p\u0000\u0000\u0117"+ + "\u0118\u0005F\u0000\u0000\u0118\u011c\u0005p\u0000\u0000\u0119\u011a\u0005"+ + "F\u0000\u0000\u011a\u011c\u0005P\u0000\u0000\u011b\u0115\u0001\u0000\u0000"+ + "\u0000\u011b\u0117\u0001\u0000\u0000\u0000\u011b\u0119\u0001\u0000\u0000"+ + "\u0000\u011c\n\u0001\u0000\u0000\u0000\u011d\u011e\u0005f\u0000\u0000"+ + "\u011e\u011f\u0005u\u0000\u0000\u011f\u0120\u0005n\u0000\u0000\u0120\u012a"+ + "\u0005c\u0000\u0000\u0121\u0122\u0005F\u0000\u0000\u0122\u0123\u0005u"+ + "\u0000\u0000\u0123\u0124\u0005n\u0000\u0000\u0124\u012a\u0005c\u0000\u0000"+ + "\u0125\u0126\u0005F\u0000\u0000\u0126\u0127\u0005U\u0000\u0000\u0127\u0128"+ + "\u0005N\u0000\u0000\u0128\u012a\u0005C\u0000\u0000\u0129\u011d\u0001\u0000"+ + "\u0000\u0000\u0129\u0121\u0001\u0000\u0000\u0000\u0129\u0125\u0001\u0000"+ + "\u0000\u0000\u012a\f\u0001\u0000\u0000\u0000\u012b\u012c\u0005a\u0000"+ + "\u0000\u012c\u012d\u0005r\u0000\u0000\u012d\u012e\u0005r\u0000\u0000\u012e"+ + "\u012f\u0005a\u0000\u0000\u012f\u013b\u0005y\u0000\u0000\u0130\u0131\u0005"+ + "A\u0000\u0000\u0131\u0132\u0005r\u0000\u0000\u0132\u0133\u0005r\u0000"+ + "\u0000\u0133\u0134\u0005a\u0000\u0000\u0134\u013b\u0005y\u0000\u0000\u0135"+ + "\u0136\u0005A\u0000\u0000\u0136\u0137\u0005R\u0000\u0000\u0137\u0138\u0005"+ + "R\u0000\u0000\u0138\u0139\u0005A\u0000\u0000\u0139\u013b\u0005Y\u0000"+ + "\u0000\u013a\u012b\u0001\u0000\u0000\u0000\u013a\u0130\u0001\u0000\u0000"+ + "\u0000\u013a\u0135\u0001\u0000\u0000\u0000\u013b\u000e\u0001\u0000\u0000"+ + "\u0000\u013c\u013d\u0005i\u0000\u0000\u013d\u013e\u0005f\u0000\u0000\u013e"+ + "\u0010\u0001\u0000\u0000\u0000\u013f\u0140\u0005t\u0000\u0000\u0140\u0141"+ + "\u0005h\u0000\u0000\u0141\u0142\u0005e\u0000\u0000\u0142\u0143\u0005n"+ + "\u0000\u0000\u0143\u0012\u0001\u0000\u0000\u0000\u0144\u0145\u0005e\u0000"+ + "\u0000\u0145\u0146\u0005l\u0000\u0000\u0146\u0147\u0005s\u0000\u0000\u0147"+ + "\u0148\u0005e\u0000\u0000\u0148\u0014\u0001\u0000\u0000\u0000\u0149\u014a"+ + "\u0005i\u0000\u0000\u014a\u014b\u0005f\u0000\u0000\u014b\u014c\u0005f"+ + "\u0000\u0000\u014c\u0016\u0001\u0000\u0000\u0000\u014d\u014e\u0005i\u0000"+ + "\u0000\u014e\u014f\u0005t\u0000\u0000\u014f\u0150\u0005e\u0000\u0000\u0150"+ + "\u0018\u0001\u0000\u0000\u0000\u0151\u0152\u0005=\u0000\u0000\u0152\u0153"+ + "\u0005>\u0000\u0000\u0153\u001a\u0001\u0000\u0000\u0000\u0154\u0155\u0005"+ + "f\u0000\u0000\u0155\u0156\u0005o\u0000\u0000\u0156\u0157\u0005r\u0000"+ + "\u0000\u0157\u0158\u0005a\u0000\u0000\u0158\u0159\u0005l\u0000\u0000\u0159"+ + "\u015a\u0005l\u0000\u0000\u015a\u001c\u0001\u0000\u0000\u0000\u015b\u015c"+ + "\u0005e\u0000\u0000\u015c\u015d\u0005x\u0000\u0000\u015d\u015e\u0005i"+ + "\u0000\u0000\u015e\u015f\u0005s\u0000\u0000\u015f\u0160\u0005t\u0000\u0000"+ + "\u0160\u0161\u0005s\u0000\u0000\u0161\u001e\u0001\u0000\u0000\u0000\u0162"+ + "\u0163\u0005o\u0000\u0000\u0163\u0164\u0005r\u0000\u0000\u0164 \u0001"+ + "\u0000\u0000\u0000\u0165\u0166\u0005a\u0000\u0000\u0166\u0167\u0005n\u0000"+ + "\u0000\u0167\u0168\u0005d\u0000\u0000\u0168\"\u0001\u0000\u0000\u0000"+ + "\u0169\u016a\u0005x\u0000\u0000\u016a\u016b\u0005o\u0000\u0000\u016b\u016c"+ + "\u0005r\u0000\u0000\u016c$\u0001\u0000\u0000\u0000\u016d\u016e\u0005n"+ + "\u0000\u0000\u016e\u016f\u0005o\u0000\u0000\u016f\u0170\u0005t\u0000\u0000"+ + "\u0170&\u0001\u0000\u0000\u0000\u0171\u0172\u0005=\u0000\u0000\u0172("+ + "\u0001\u0000\u0000\u0000\u0173\u0174\u0005/\u0000\u0000\u0174\u0175\u0005"+ + "=\u0000\u0000\u0175*\u0001\u0000\u0000\u0000\u0176\u0177\u0005<\u0000"+ + "\u0000\u0177,\u0001\u0000\u0000\u0000\u0178\u0179\u0005<\u0000\u0000\u0179"+ + "\u017a\u0005=\u0000\u0000\u017a.\u0001\u0000\u0000\u0000\u017b\u017c\u0005"+ + ">\u0000\u0000\u017c0\u0001\u0000\u0000\u0000\u017d\u017e\u0005>\u0000"+ + "\u0000\u017e\u017f\u0005=\u0000\u0000\u017f2\u0001\u0000\u0000\u0000\u0180"+ + "\u0181\u0005+\u0000\u0000\u01814\u0001\u0000\u0000\u0000\u0182\u0183\u0005"+ + "-\u0000\u0000\u01836\u0001\u0000\u0000\u0000\u0184\u0185\u0005*\u0000"+ + "\u0000\u01858\u0001\u0000\u0000\u0000\u0186\u0187\u0005d\u0000\u0000\u0187"+ + "\u0188\u0005i\u0000\u0000\u0188\u0189\u0005v\u0000\u0000\u0189:\u0001"+ + "\u0000\u0000\u0000\u018a\u018b\u0005m\u0000\u0000\u018b\u018c\u0005o\u0000"+ + "\u0000\u018c\u018d\u0005d\u0000\u0000\u018d<\u0001\u0000\u0000\u0000\u018e"+ + "\u018f\u0005r\u0000\u0000\u018f\u0190\u0005e\u0000\u0000\u0190\u0191\u0005"+ + "m\u0000\u0000\u0191>\u0001\u0000\u0000\u0000\u0192\u0193\u0005%\u0000"+ + "\u0000\u0193@\u0001\u0000\u0000\u0000\u0194\u0195\u00033\u0019\u0000\u0195"+ + "\u0196\u00033\u0019\u0000\u0196B\u0001\u0000\u0000\u0000\u0197\u0198\u0005"+ + "b\u0000\u0000\u0198\u0199\u0005v\u0000\u0000\u0199\u019a\u0005_\u0000"+ + "\u0000\u019a\u019b\u0005z\u0000\u0000\u019b\u019c\u0005e\u0000\u0000\u019c"+ + "\u019d\u0005r\u0000\u0000\u019d\u019e\u0005o\u0000\u0000\u019e\u019f\u0005"+ + "_\u0000\u0000\u019f\u01a0\u0005e\u0000\u0000\u01a0\u01a1\u0005x\u0000"+ + "\u0000\u01a1\u01a2\u0005t\u0000\u0000\u01a2\u01a3\u0005e\u0000\u0000\u01a3"+ + "\u01a4\u0005n\u0000\u0000\u01a4\u01a5\u0005d\u0000\u0000\u01a5D\u0001"+ + "\u0000\u0000\u0000\u01a6\u01a7\u0005b\u0000\u0000\u01a7\u01a8\u0005v\u0000"+ + "\u0000\u01a8\u01a9\u0005_\u0000\u0000\u01a9\u01aa\u0005s\u0000\u0000\u01aa"+ + "\u01ab\u0005i\u0000\u0000\u01ab\u01ac\u0005g\u0000\u0000\u01ac\u01ad\u0005"+ + "n\u0000\u0000\u01ad\u01ae\u0005_\u0000\u0000\u01ae\u01af\u0005e\u0000"+ + "\u0000\u01af\u01b0\u0005x\u0000\u0000\u01b0\u01b1\u0005t\u0000\u0000\u01b1"+ + "\u01b2\u0005e\u0000\u0000\u01b2\u01b3\u0005n\u0000\u0000\u01b3\u01b4\u0005"+ + "d\u0000\u0000\u01b4F\u0001\u0000\u0000\u0000\u01b5\u01b6\u0005b\u0000"+ + "\u0000\u01b6\u01b7\u0005v\u0000\u0000\u01b7\u01b8\u0005a\u0000\u0000\u01b8"+ + "\u01b9\u0005d\u0000\u0000\u01b9\u01ba\u0005d\u0000\u0000\u01baH\u0001"+ + "\u0000\u0000\u0000\u01bb\u01bc\u0005b\u0000\u0000\u01bc\u01bd\u0005v\u0000"+ + "\u0000\u01bd\u01be\u0005s\u0000\u0000\u01be\u01bf\u0005u\u0000\u0000\u01bf"+ + "\u01c0\u0005b\u0000\u0000\u01c0J\u0001\u0000\u0000\u0000\u01c1\u01c2\u0005"+ + "b\u0000\u0000\u01c2\u01c3\u0005v\u0000\u0000\u01c3\u01c4\u0005p\u0000"+ + "\u0000\u01c4\u01c5\u0005o\u0000\u0000\u01c5\u01c6\u0005s\u0000\u0000\u01c6"+ + "L\u0001\u0000\u0000\u0000\u01c7\u01c8\u0005b\u0000\u0000\u01c8\u01c9\u0005"+ + "v\u0000\u0000\u01c9\u01ca\u0005n\u0000\u0000\u01ca\u01cb\u0005e\u0000"+ + "\u0000\u01cb\u01cc\u0005g\u0000\u0000\u01ccN\u0001\u0000\u0000\u0000\u01cd"+ + "\u01ce\u0005b\u0000\u0000\u01ce\u01cf\u0005v\u0000\u0000\u01cf\u01d0\u0005"+ + "m\u0000\u0000\u01d0\u01d1\u0005u\u0000\u0000\u01d1\u01d2\u0005l\u0000"+ + "\u0000\u01d2P\u0001\u0000\u0000\u0000\u01d3\u01d4\u0005b\u0000\u0000\u01d4"+ + "\u01d5\u0005v\u0000\u0000\u01d5\u01d6\u0005u\u0000\u0000\u01d6\u01d7\u0005"+ + "d\u0000\u0000\u01d7\u01d8\u0005i\u0000\u0000\u01d8\u01d9\u0005v\u0000"+ + "\u0000\u01d9R\u0001\u0000\u0000\u0000\u01da\u01db\u0005b\u0000\u0000\u01db"+ + "\u01dc\u0005v\u0000\u0000\u01dc\u01dd\u0005s\u0000\u0000\u01dd\u01de\u0005"+ + "d\u0000\u0000\u01de\u01df\u0005i\u0000\u0000\u01df\u01e0\u0005v\u0000"+ + "\u0000\u01e0T\u0001\u0000\u0000\u0000\u01e1\u01e2\u0005b\u0000\u0000\u01e2"+ + "\u01e3\u0005v\u0000\u0000\u01e3\u01e4\u0005s\u0000\u0000\u01e4\u01e5\u0005"+ + "m\u0000\u0000\u01e5\u01e6\u0005o\u0000\u0000\u01e6\u01e7\u0005d\u0000"+ + "\u0000\u01e7V\u0001\u0000\u0000\u0000\u01e8\u01e9\u0005b\u0000\u0000\u01e9"+ + "\u01ea\u0005v\u0000\u0000\u01ea\u01eb\u0005u\u0000\u0000\u01eb\u01ec\u0005"+ + "r\u0000\u0000\u01ec\u01ed\u0005e\u0000\u0000\u01ed\u01ee\u0005m\u0000"+ + "\u0000\u01eeX\u0001\u0000\u0000\u0000\u01ef\u01f0\u0005b\u0000\u0000\u01f0"+ + "\u01f1\u0005v\u0000\u0000\u01f1\u01f2\u0005s\u0000\u0000\u01f2\u01f3\u0005"+ + "r\u0000\u0000\u01f3\u01f4\u0005e\u0000\u0000\u01f4\u01f5\u0005m\u0000"+ + "\u0000\u01f5Z\u0001\u0000\u0000\u0000\u01f6\u01f7\u0005b\u0000\u0000\u01f7"+ + "\u01f8\u0005v\u0000\u0000\u01f8\u01f9\u0005o\u0000\u0000\u01f9\u01fa\u0005"+ + "r\u0000\u0000\u01fa\\\u0001\u0000\u0000\u0000\u01fb\u01fc\u0005b\u0000"+ + "\u0000\u01fc\u01fd\u0005v\u0000\u0000\u01fd\u01fe\u0005a\u0000\u0000\u01fe"+ + "\u01ff\u0005n\u0000\u0000\u01ff\u0200\u0005d\u0000\u0000\u0200^\u0001"+ + "\u0000\u0000\u0000\u0201\u0202\u0005b\u0000\u0000\u0202\u0203\u0005v\u0000"+ + "\u0000\u0203\u0204\u0005x\u0000\u0000\u0204\u0205\u0005o\u0000\u0000\u0205"+ + "\u0206\u0005r\u0000\u0000\u0206`\u0001\u0000\u0000\u0000\u0207\u0208\u0005"+ + "b\u0000\u0000\u0208\u0209\u0005v\u0000\u0000\u0209\u020a\u0005n\u0000"+ + "\u0000\u020a\u020b\u0005o\u0000\u0000\u020b\u020c\u0005t\u0000\u0000\u020c"+ + "b\u0001\u0000\u0000\u0000\u020d\u020e\u0005b\u0000\u0000\u020e\u020f\u0005"+ + "v\u0000\u0000\u020f\u0210\u0005s\u0000\u0000\u0210\u0211\u0005h\u0000"+ + "\u0000\u0211\u0212\u0005l\u0000\u0000\u0212d\u0001\u0000\u0000\u0000\u0213"+ + "\u0214\u0005b\u0000\u0000\u0214\u0215\u0005v\u0000\u0000\u0215\u0216\u0005"+ + "a\u0000\u0000\u0216\u0217\u0005s\u0000\u0000\u0217\u0218\u0005h\u0000"+ + "\u0000\u0218\u0219\u0005r\u0000\u0000\u0219f\u0001\u0000\u0000\u0000\u021a"+ + "\u021b\u0005b\u0000\u0000\u021b\u021c\u0005v\u0000\u0000\u021c\u021d\u0005"+ + "l\u0000\u0000\u021d\u021e\u0005s\u0000\u0000\u021e\u021f\u0005h\u0000"+ + "\u0000\u021f\u0220\u0005r\u0000\u0000\u0220h\u0001\u0000\u0000\u0000\u0221"+ + "\u0222\u0005b\u0000\u0000\u0222\u0223\u0005v\u0000\u0000\u0223\u0224\u0005"+ + "r\u0000\u0000\u0224\u0225\u0005o\u0000\u0000\u0225\u0226\u0005l\u0000"+ + "\u0000\u0226j\u0001\u0000\u0000\u0000\u0227\u0228\u0005b\u0000\u0000\u0228"+ + "\u0229\u0005v\u0000\u0000\u0229\u022a\u0005r\u0000\u0000\u022a\u022b\u0005"+ + "o\u0000\u0000\u022b\u022c\u0005r\u0000\u0000\u022cl\u0001\u0000\u0000"+ + "\u0000\u022d\u022e\u0005b\u0000\u0000\u022e\u022f\u0005v\u0000\u0000\u022f"+ + "\u0230\u0005u\u0000\u0000\u0230\u0231\u0005l\u0000\u0000\u0231\u0232\u0005"+ + "t\u0000\u0000\u0232n\u0001\u0000\u0000\u0000\u0233\u0234\u0005b\u0000"+ + "\u0000\u0234\u0235\u0005v\u0000\u0000\u0235\u0236\u0005u\u0000\u0000\u0236"+ + "\u0237\u0005l\u0000\u0000\u0237\u0238\u0005e\u0000\u0000\u0238p\u0001"+ + "\u0000\u0000\u0000\u0239\u023a\u0005b\u0000\u0000\u023a\u023b\u0005v\u0000"+ + "\u0000\u023b\u023c\u0005u\u0000\u0000\u023c\u023d\u0005g\u0000\u0000\u023d"+ + "\u023e\u0005t\u0000\u0000\u023er\u0001\u0000\u0000\u0000\u023f\u0240\u0005"+ + "b\u0000\u0000\u0240\u0241\u0005v\u0000\u0000\u0241\u0242\u0005u\u0000"+ + "\u0000\u0242\u0243\u0005g\u0000\u0000\u0243\u0244\u0005e\u0000\u0000\u0244"+ + "t\u0001\u0000\u0000\u0000\u0245\u0246\u0005b\u0000\u0000\u0246\u0247\u0005"+ + "v\u0000\u0000\u0247\u0248\u0005s\u0000\u0000\u0248\u0249\u0005l\u0000"+ + "\u0000\u0249\u024a\u0005t\u0000\u0000\u024av\u0001\u0000\u0000\u0000\u024b"+ + "\u024c\u0005b\u0000\u0000\u024c\u024d\u0005v\u0000\u0000\u024d\u024e\u0005"+ + "s\u0000\u0000\u024e\u024f\u0005l\u0000\u0000\u024f\u0250\u0005e\u0000"+ + "\u0000\u0250x\u0001\u0000\u0000\u0000\u0251\u0252\u0005b\u0000\u0000\u0252"+ + "\u0253\u0005v\u0000\u0000\u0253\u0254\u0005s\u0000\u0000\u0254\u0255\u0005"+ + "g\u0000\u0000\u0255\u0256\u0005t\u0000\u0000\u0256z\u0001\u0000\u0000"+ + "\u0000\u0257\u0258\u0005b\u0000\u0000\u0258\u0259\u0005v\u0000\u0000\u0259"+ + "\u025a\u0005s\u0000\u0000\u025a\u025b\u0005g\u0000\u0000\u025b\u025c\u0005"+ + "e\u0000\u0000\u025c|\u0001\u0000\u0000\u0000\u025d\u025e\u0005f\u0000"+ + "\u0000\u025e\u025f\u0005p\u0000\u0000\u025f\u0260\u0005a\u0000\u0000\u0260"+ + "\u0261\u0005b\u0000\u0000\u0261\u0262\u0005s\u0000\u0000\u0262~\u0001"+ + "\u0000\u0000\u0000\u0263\u0264\u0005f\u0000\u0000\u0264\u0265\u0005p\u0000"+ + "\u0000\u0265\u0266\u0005f\u0000\u0000\u0266\u0267\u0005r\u0000\u0000\u0267"+ + "\u0268\u0005o\u0000\u0000\u0268\u0269\u0005m\u0000\u0000\u0269\u026a\u0005"+ + "b\u0000\u0000\u026a\u026b\u0005v\u0000\u0000\u026b\u026c\u0001\u0000\u0000"+ + "\u0000\u026c\u026d\u0003\u00a9T\u0000\u026d\u026e\u0003\u00cfg\u0000\u026e"+ + "\u026f\u0007\u0000\u0000\u0000\u026f\u0270\u0003\u00d1h\u0000\u0270\u0272"+ + "\u0001\u0000\u0000\u0000\u0271\u0273\u0003\u00abU\u0000\u0272\u0271\u0001"+ + "\u0000\u0000\u0000\u0272\u0273\u0001\u0000\u0000\u0000\u0273\u0080\u0001"+ + "\u0000\u0000\u0000\u0274\u0275\u0005f\u0000\u0000\u0275\u0276\u0005p\u0000"+ + "\u0000\u0276\u0277\u0005i\u0000\u0000\u0277\u0278\u0005s\u0000\u0000\u0278"+ + "\u0279\u0005n\u0000\u0000\u0279\u027a\u0005a\u0000\u0000\u027a\u027b\u0005"+ + "n\u0000\u0000\u027b\u0082\u0001\u0000\u0000\u0000\u027c\u027d\u0005f\u0000"+ + "\u0000\u027d\u027e\u0005p\u0000\u0000\u027e\u027f\u0005m\u0000\u0000\u027f"+ + "\u0280\u0005a\u0000\u0000\u0280\u0281\u0005x\u0000\u0000\u0281\u0084\u0001"+ + "\u0000\u0000\u0000\u0282\u0283\u0005f\u0000\u0000\u0283\u0284\u0005p\u0000"+ + "\u0000\u0284\u0285\u0005m\u0000\u0000\u0285\u0286\u0005i\u0000\u0000\u0286"+ + "\u0287\u0005n\u0000\u0000\u0287\u0086\u0001\u0000\u0000\u0000\u0288\u0289"+ + "\u0005f\u0000\u0000\u0289\u028a\u0005p\u0000\u0000\u028a\u028b\u0005r"+ + "\u0000\u0000\u028b\u028c\u0005e\u0000\u0000\u028c\u028d\u0005m\u0000\u0000"+ + "\u028d\u0088\u0001\u0000\u0000\u0000\u028e\u028f\u0005f\u0000\u0000\u028f"+ + "\u0290\u0005p\u0000\u0000\u0290\u0291\u0005r\u0000\u0000\u0291\u0292\u0005"+ + "o\u0000\u0000\u0292\u0293\u0005u\u0000\u0000\u0293\u0294\u0005n\u0000"+ + "\u0000\u0294\u0295\u0005d\u0000\u0000\u0295\u0296\u0005t\u0000\u0000\u0296"+ + "\u0297\u0005o\u0000\u0000\u0297\u0298\u0005i\u0000\u0000\u0298\u0299\u0005"+ + "n\u0000\u0000\u0299\u029a\u0005t\u0000\u0000\u029a\u029c\u0001\u0000\u0000"+ + "\u0000\u029b\u029d\u0003\u00abU\u0000\u029c\u029b\u0001\u0000\u0000\u0000"+ + "\u029c\u029d\u0001\u0000\u0000\u0000\u029d\u008a\u0001\u0000\u0000\u0000"+ + "\u029e\u029f\u0005f\u0000\u0000\u029f\u02a0\u0005p\u0000\u0000\u02a0\u02a1"+ + "\u0005s\u0000\u0000\u02a1\u02a2\u0005q\u0000\u0000\u02a2\u02a3\u0005r"+ + "\u0000\u0000\u02a3\u02a4\u0005t\u0000\u0000\u02a4\u02a6\u0001\u0000\u0000"+ + "\u0000\u02a5\u02a7\u0003\u00abU\u0000\u02a6\u02a5\u0001\u0000\u0000\u0000"+ + "\u02a6\u02a7\u0001\u0000\u0000\u0000\u02a7\u008c\u0001\u0000\u0000\u0000"+ + "\u02a8\u02a9\u0005f\u0000\u0000\u02a9\u02aa\u0005p\u0000\u0000\u02aa\u02ab"+ + "\u0005t\u0000\u0000\u02ab\u02ac\u0005o\u0000\u0000\u02ac\u02ad\u0005b"+ + "\u0000\u0000\u02ad\u02ae\u0005v\u0000\u0000\u02ae\u02af\u0001\u0000\u0000"+ + "\u0000\u02af\u02b1\u0003\u00a7S\u0000\u02b0\u02b2\u0003\u00abU\u0000\u02b1"+ + "\u02b0\u0001\u0000\u0000\u0000\u02b1\u02b2\u0001\u0000\u0000\u0000\u02b2"+ + "\u008e\u0001\u0000\u0000\u0000\u02b3\u02b4\u0005f\u0000\u0000\u02b4\u02b5"+ + "\u0005p\u0000\u0000\u02b5\u02b6\u0005t\u0000\u0000\u02b6\u02b7\u0005o"+ + "\u0000\u0000\u02b7\u02b8\u0005f\u0000\u0000\u02b8\u02b9\u0005p\u0000\u0000"+ + "\u02b9\u02ba\u0001\u0000\u0000\u0000\u02ba\u02bc\u0003\u00a9T\u0000\u02bb"+ + "\u02bd\u0003\u00abU\u0000\u02bc\u02bb\u0001\u0000\u0000\u0000\u02bc\u02bd"+ + "\u0001\u0000\u0000\u0000\u02bd\u0090\u0001\u0000\u0000\u0000\u02be\u02bf"+ + "\u0005f\u0000\u0000\u02bf\u02c0\u0005p\u0000\u0000\u02c0\u02c1\u0005s"+ + "\u0000\u0000\u02c1\u02c2\u0005u\u0000\u0000\u02c2\u02c3\u0005b\u0000\u0000"+ + "\u02c3\u0092\u0001\u0000\u0000\u0000\u02c4\u02c5\u0005f\u0000\u0000\u02c5"+ + "\u02c6\u0005p\u0000\u0000\u02c6\u02c7\u0005a\u0000\u0000\u02c7\u02c8\u0005"+ + "d\u0000\u0000\u02c8\u02c9\u0005d\u0000\u0000\u02c9\u02cb\u0001\u0000\u0000"+ + "\u0000\u02ca\u02cc\u0003\u00abU\u0000\u02cb\u02ca\u0001\u0000\u0000\u0000"+ + "\u02cb\u02cc\u0001\u0000\u0000\u0000\u02cc\u0094\u0001\u0000\u0000\u0000"+ + "\u02cd\u02ce\u0005f\u0000\u0000\u02ce\u02cf\u0005p\u0000\u0000\u02cf\u02d0"+ + "\u0005m\u0000\u0000\u02d0\u02d1\u0005u\u0000\u0000\u02d1\u02d2\u0005l"+ + "\u0000\u0000\u02d2\u0096\u0001\u0000\u0000\u0000\u02d3\u02d4\u0005f\u0000"+ + "\u0000\u02d4\u02d5\u0005p\u0000\u0000\u02d5\u02d6\u0005d\u0000\u0000\u02d6"+ + "\u02d7\u0005i\u0000\u0000\u02d7\u02d8\u0005v\u0000\u0000\u02d8\u02d9\u0001"+ + "\u0000\u0000\u0000\u02d9\u02da\u0003\u00abU\u0000\u02da\u0098\u0001\u0000"+ + "\u0000\u0000\u02db\u02dc\u0005f\u0000\u0000\u02dc\u02dd\u0005p\u0000\u0000"+ + "\u02dd\u02de\u0005p\u0000\u0000\u02de\u02df\u0005o\u0000\u0000\u02df\u02e0"+ + "\u0005s\u0000\u0000\u02e0\u009a\u0001\u0000\u0000\u0000\u02e1\u02e2\u0005"+ + "f\u0000\u0000\u02e2\u02e3\u0005p\u0000\u0000\u02e3\u02e4\u0005n\u0000"+ + "\u0000\u02e4\u02e5\u0005e\u0000\u0000\u02e5\u02e6\u0005g\u0000\u0000\u02e6"+ + "\u009c\u0001\u0000\u0000\u0000\u02e7\u02e8\u0005t\u0000\u0000\u02e8\u02e9"+ + "\u0005r\u0000\u0000\u02e9\u02ea\u0005u\u0000\u0000\u02ea\u02eb\u0005e"+ + "\u0000\u0000\u02eb\u009e\u0001\u0000\u0000\u0000\u02ec\u02ed\u0005r\u0000"+ + "\u0000\u02ed\u02ee\u0005e\u0000\u0000\u02ee\u02ef\u0005a\u0000\u0000\u02ef"+ + "\u02f0\u0005d\u0000\u0000\u02f0\u00a0\u0001\u0000\u0000\u0000\u02f1\u02f2"+ + "\u0005w\u0000\u0000\u02f2\u02f3\u0005r\u0000\u0000\u02f3\u02f4\u0005i"+ + "\u0000\u0000\u02f4\u02f5\u0005t\u0000\u0000\u02f5\u02f6\u0005e\u0000\u0000"+ + "\u02f6\u00a2\u0001\u0000\u0000\u0000\u02f7\u02f8\u0005p\u0000\u0000\u02f8"+ + "\u02f9\u0005r\u0000\u0000\u02f9\u02fa\u0005i\u0000\u0000\u02fa\u02fb\u0005"+ + "m\u0000\u0000\u02fb\u02fc\u0005e\u0000\u0000\u02fc\u00a4\u0001\u0000\u0000"+ + "\u0000\u02fd\u02fe\u0005e\u0000\u0000\u02fe\u02ff\u0005x\u0000\u0000\u02ff"+ + "\u0300\u0005t\u0000\u0000\u0300\u0301\u0005r\u0000\u0000\u0301\u0302\u0005"+ + "a\u0000\u0000\u0302\u0303\u0005c\u0000\u0000\u0303\u0304\u0005t\u0000"+ + "\u0000\u0304\u00a6\u0001\u0000\u0000\u0000\u0305\u0306\u0003\u00cfg\u0000"+ + "\u0306\u0307\u0003\u00bd^\u0000\u0307\u0308\u0005\'\u0000\u0000\u0308"+ + "\u0309\u0007\u0000\u0000\u0000\u0309\u030a\u0003\u00d1h\u0000\u030a\u00a8"+ + "\u0001\u0000\u0000\u0000\u030b\u030c\u0003\u00cfg\u0000\u030c\u030d\u0003"+ + "\u00bd^\u0000\u030d\u030e\u0003\u00d7k\u0000\u030e\u030f\u0003\u00bd^"+ + "\u0000\u030f\u0310\u0003\u00d1h\u0000\u0310\u00aa\u0001\u0000\u0000\u0000"+ + "\u0311\u0312\u0005[\u0000\u0000\u0312\u0313\u0005r\u0000\u0000\u0313\u0314"+ + "\u0005n\u0000\u0000\u0314\u0315\u0005e\u0000\u0000\u0315\u032b\u0005]"+ + "\u0000\u0000\u0316\u0317\u0005[\u0000\u0000\u0317\u0318\u0005r\u0000\u0000"+ + "\u0318\u0319\u0005n\u0000\u0000\u0319\u031a\u0005a\u0000\u0000\u031a\u032b"+ + "\u0005]\u0000\u0000\u031b\u031c\u0005[\u0000\u0000\u031c\u031d\u0005r"+ + "\u0000\u0000\u031d\u031e\u0005t\u0000\u0000\u031e\u031f\u0005p\u0000\u0000"+ + "\u031f\u032b\u0005]\u0000\u0000\u0320\u0321\u0005[\u0000\u0000\u0321\u0322"+ + "\u0005r\u0000\u0000\u0322\u0323\u0005t\u0000\u0000\u0323\u0324\u0005n"+ + "\u0000\u0000\u0324\u032b\u0005]\u0000\u0000\u0325\u0326\u0005[\u0000\u0000"+ + "\u0326\u0327\u0005r\u0000\u0000\u0327\u0328\u0005t\u0000\u0000\u0328\u0329"+ + "\u0005z\u0000\u0000\u0329\u032b\u0005]\u0000\u0000\u032a\u0311\u0001\u0000"+ + "\u0000\u0000\u032a\u0316\u0001\u0000\u0000\u0000\u032a\u031b\u0001\u0000"+ + "\u0000\u0000\u032a\u0320\u0001\u0000\u0000\u0000\u032a\u0325\u0001\u0000"+ + "\u0000\u0000\u032b\u00ac\u0001\u0000\u0000\u0000\u032c\u032d\u0005f\u0000"+ + "\u0000\u032d\u032e\u0005a\u0000\u0000\u032e\u032f\u0005l\u0000\u0000\u032f"+ + "\u0330\u0005s\u0000\u0000\u0330\u0331\u0005e\u0000\u0000\u0331\u00ae\u0001"+ + "\u0000\u0000\u0000\u0332\u0333\u0005d\u0000\u0000\u0333\u0334\u0005e\u0000"+ + "\u0000\u0334\u0335\u0005f\u0000\u0000\u0335\u0336\u0005a\u0000\u0000\u0336"+ + "\u0337\u0005u\u0000\u0000\u0337\u0338\u0005l\u0000\u0000\u0338\u0339\u0005"+ + "t\u0000\u0000\u0339\u00b0\u0001\u0000\u0000\u0000\u033a\u033b\u0005a\u0000"+ + "\u0000\u033b\u033c\u0005s\u0000\u0000\u033c\u033d\u0005s\u0000\u0000\u033d"+ + "\u033e\u0005i\u0000\u0000\u033e\u033f\u0005g\u0000\u0000\u033f\u0340\u0005"+ + "n\u0000\u0000\u0340\u00b2\u0001\u0000\u0000\u0000\u0341\u0342\u0005h\u0000"+ + "\u0000\u0342\u0343\u0005a\u0000\u0000\u0343\u0344\u0005v\u0000\u0000\u0344"+ + "\u0345\u0005o\u0000\u0000\u0345\u0346\u0005c\u0000\u0000\u0346\u00b4\u0001"+ + "\u0000\u0000\u0000\u0347\u0348\u0005a\u0000\u0000\u0348\u0349\u0005s\u0000"+ + "\u0000\u0349\u034a\u0005s\u0000\u0000\u034a\u034b\u0005u\u0000\u0000\u034b"+ + "\u034c\u0005m\u0000\u0000\u034c\u034d\u0005e\u0000\u0000\u034d\u00b6\u0001"+ + "\u0000\u0000\u0000\u034e\u034f\u0005r\u0000\u0000\u034f\u0350\u0005e\u0000"+ + "\u0000\u0350\u0351\u0005t\u0000\u0000\u0351\u0352\u0005u\u0000\u0000\u0352"+ + "\u0353\u0005r\u0000\u0000\u0353\u0354\u0005n\u0000\u0000\u0354\u00b8\u0001"+ + "\u0000\u0000\u0000\u0355\u0356\u0003\u00bd^\u0000\u0356\u0357\u0005\'"+ + "\u0000\u0000\u0357\u0358\u0005b\u0000\u0000\u0358\u035a\u0001\u0000\u0000"+ + "\u0000\u0359\u035b\u0007\u0001\u0000\u0000\u035a\u0359\u0001\u0000\u0000"+ + "\u0000\u035b\u035c\u0001\u0000\u0000\u0000\u035c\u035a\u0001\u0000\u0000"+ + "\u0000\u035c\u035d\u0001\u0000\u0000\u0000\u035d\u0382\u0001\u0000\u0000"+ + "\u0000\u035e\u035f\u0005#\u0000\u0000\u035f\u0360\u0005b\u0000\u0000\u0360"+ + "\u0362\u0001\u0000\u0000\u0000\u0361\u0363\u0007\u0001\u0000\u0000\u0362"+ + "\u0361\u0001\u0000\u0000\u0000\u0363\u0364\u0001\u0000\u0000\u0000\u0364"+ + "\u0362\u0001\u0000\u0000\u0000\u0364\u0365\u0001\u0000\u0000\u0000\u0365"+ + "\u0382\u0001\u0000\u0000\u0000\u0366\u0367\u0005#\u0000\u0000\u0367\u0368"+ + "\u0005x\u0000\u0000\u0368\u036a\u0001\u0000\u0000\u0000\u0369\u036b\u0007"+ + "\u0001\u0000\u0000\u036a\u0369\u0001\u0000\u0000\u0000\u036b\u036c\u0001"+ + "\u0000\u0000\u0000\u036c\u036a\u0001\u0000\u0000\u0000\u036c\u036d\u0001"+ + "\u0000\u0000\u0000\u036d\u0382\u0001\u0000\u0000\u0000\u036e\u036f\u0003"+ + "\u00bd^\u0000\u036f\u0370\u0005\'\u0000\u0000\u0370\u0371\u0005d\u0000"+ + "\u0000\u0371\u0374\u0001\u0000\u0000\u0000\u0372\u0375\u00033\u0019\u0000"+ + "\u0373\u0375\u00035\u001a\u0000\u0374\u0372\u0001\u0000\u0000\u0000\u0374"+ + "\u0373\u0001\u0000\u0000\u0000\u0374\u0375\u0001\u0000\u0000\u0000\u0375"+ + "\u0376\u0001\u0000\u0000\u0000\u0376\u0377\u0003\u00bb]\u0000\u0377\u0382"+ + "\u0001\u0000\u0000\u0000\u0378\u0379\u0003\u00bd^\u0000\u0379\u037a\u0005"+ + "\'\u0000\u0000\u037a\u037b\u0005x\u0000\u0000\u037b\u037d\u0001\u0000"+ + "\u0000\u0000\u037c\u037e\u0007\u0002\u0000\u0000\u037d\u037c\u0001\u0000"+ + "\u0000\u0000\u037e\u037f\u0001\u0000\u0000\u0000\u037f\u037d\u0001\u0000"+ + "\u0000\u0000\u037f\u0380\u0001\u0000\u0000\u0000\u0380\u0382\u0001\u0000"+ + "\u0000\u0000\u0381\u0355\u0001\u0000\u0000\u0000\u0381\u035e\u0001\u0000"+ + "\u0000\u0000\u0381\u0366\u0001\u0000\u0000\u0000\u0381\u036e\u0001\u0000"+ + "\u0000\u0000\u0381\u0378\u0001\u0000\u0000\u0000\u0382\u00ba\u0001\u0000"+ + "\u0000\u0000\u0383\u0385\u0003\u00bf_\u0000\u0384\u0383\u0001\u0000\u0000"+ + "\u0000\u0384\u0385\u0001\u0000\u0000\u0000\u0385\u0386\u0001\u0000\u0000"+ + "\u0000\u0386\u0387\u0003\u00bd^\u0000\u0387\u00bc\u0001\u0000\u0000\u0000"+ + "\u0388\u038a\u0003\u00c7c\u0000\u0389\u0388\u0001\u0000\u0000\u0000\u038a"+ + "\u038b\u0001\u0000\u0000\u0000\u038b\u0389\u0001\u0000\u0000\u0000\u038b"+ + "\u038c\u0001\u0000\u0000\u0000\u038c\u00be\u0001\u0000\u0000\u0000\u038d"+ + "\u0390\u00033\u0019\u0000\u038e\u0390\u00035\u001a\u0000\u038f\u038d\u0001"+ + "\u0000\u0000\u0000\u038f\u038e\u0001\u0000\u0000\u0000\u0390\u00c0\u0001"+ + "\u0000\u0000\u0000\u0391\u0392\u0005.\u0000\u0000\u0392\u00c2\u0001\u0000"+ + "\u0000\u0000\u0393\u0396\u0003\u00c9d\u0000\u0394\u0396\u0003\u00c5b\u0000"+ + "\u0395\u0393\u0001\u0000\u0000\u0000\u0395\u0394\u0001\u0000\u0000\u0000"+ + "\u0396\u039e\u0001\u0000\u0000\u0000\u0397\u039d\u0003\u00c9d\u0000\u0398"+ + "\u039d\u0003\u00c5b\u0000\u0399\u039d\u0005$\u0000\u0000\u039a\u039d\u0003"+ + "\u00c7c\u0000\u039b\u039d\u0003\u00d9l\u0000\u039c\u0397\u0001\u0000\u0000"+ + "\u0000\u039c\u0398\u0001\u0000\u0000\u0000\u039c\u0399\u0001\u0000\u0000"+ + "\u0000\u039c\u039a\u0001\u0000\u0000\u0000\u039c\u039b\u0001\u0000\u0000"+ + "\u0000\u039d\u03a0\u0001\u0000\u0000\u0000\u039e\u039c\u0001\u0000\u0000"+ + "\u0000\u039e\u039f\u0001\u0000\u0000\u0000\u039f\u00c4\u0001\u0000\u0000"+ + "\u0000\u03a0\u039e\u0001\u0000\u0000\u0000\u03a1\u03a2\u0005_\u0000\u0000"+ + "\u03a2\u00c6\u0001\u0000\u0000\u0000\u03a3\u03a4\u0007\u0003\u0000\u0000"+ + "\u03a4\u00c8\u0001\u0000\u0000\u0000\u03a5\u03a6\u0007\u0004\u0000\u0000"+ + "\u03a6\u00ca\u0001\u0000\u0000\u0000\u03a7\u03a8\u0005(\u0000\u0000\u03a8"+ + "\u00cc\u0001\u0000\u0000\u0000\u03a9\u03aa\u0005)\u0000\u0000\u03aa\u00ce"+ + "\u0001\u0000\u0000\u0000\u03ab\u03ac\u0005[\u0000\u0000\u03ac\u00d0\u0001"+ + "\u0000\u0000\u0000\u03ad\u03ae\u0005]\u0000\u0000\u03ae\u00d2\u0001\u0000"+ + "\u0000\u0000\u03af\u03b0\u0005{\u0000\u0000\u03b0\u00d4\u0001\u0000\u0000"+ + "\u0000\u03b1\u03b2\u0005}\u0000\u0000\u03b2\u00d6\u0001\u0000\u0000\u0000"+ + "\u03b3\u03b4\u0005,\u0000\u0000\u03b4\u00d8\u0001\u0000\u0000\u0000\u03b5"+ + "\u03b6\u0005:\u0000\u0000\u03b6\u00da\u0001\u0000\u0000\u0000\u03b7\u03b8"+ + "\u0005;\u0000\u0000\u03b8\u00dc\u0001\u0000\u0000\u0000\u03b9\u03ba\u0005"+ + "\'\u0000\u0000\u03ba\u00de\u0001\u0000\u0000\u0000\u03bb\u03bc\u0005<"+ + "\u0000\u0000\u03bc\u03bd\u0005-\u0000\u0000\u03bd\u00e0\u0001\u0000\u0000"+ + "\u0000\u03be\u03bf\u0005-\u0000\u0000\u03bf\u03c0\u0005>\u0000\u0000\u03c0"+ + "\u00e2\u0001\u0000\u0000\u0000\u03c1\u03c3\u0007\u0005\u0000\u0000\u03c2"+ + "\u03c1\u0001\u0000\u0000\u0000\u03c3\u03c4\u0001\u0000\u0000\u0000\u03c4"+ + "\u03c2\u0001\u0000\u0000\u0000\u03c4\u03c5\u0001\u0000\u0000\u0000\u03c5"+ + "\u03c6\u0001\u0000\u0000\u0000\u03c6\u03c7\u0006q\u0000\u0000\u03c7\u00e4"+ + "\u0001\u0000\u0000\u0000\u03c8\u03c9\u0005/\u0000\u0000\u03c9\u03ca\u0005"+ + "*\u0000\u0000\u03ca\u03ce\u0001\u0000\u0000\u0000\u03cb\u03cd\t\u0000"+ + "\u0000\u0000\u03cc\u03cb\u0001\u0000\u0000\u0000\u03cd\u03d0\u0001\u0000"+ + "\u0000\u0000\u03ce\u03cf\u0001\u0000\u0000\u0000\u03ce\u03cc\u0001\u0000"+ + "\u0000\u0000\u03cf\u03d1\u0001\u0000\u0000\u0000\u03d0\u03ce\u0001\u0000"+ + "\u0000\u0000\u03d1\u03d2\u0005*\u0000\u0000\u03d2\u03d3\u0005/\u0000\u0000"+ + "\u03d3\u03d4\u0001\u0000\u0000\u0000\u03d4\u03d5\u0006r\u0000\u0000\u03d5"+ + "\u00e6\u0001\u0000\u0000\u0000\u03d6\u03d7\u0005/\u0000\u0000\u03d7\u03d8"+ + "\u0005/\u0000\u0000\u03d8\u03dc\u0001\u0000\u0000\u0000\u03d9\u03db\b"+ + "\u0006\u0000\u0000\u03da\u03d9\u0001\u0000\u0000\u0000\u03db\u03de\u0001"+ + "\u0000\u0000\u0000\u03dc\u03da\u0001\u0000\u0000\u0000\u03dc\u03dd\u0001"+ + "\u0000\u0000\u0000\u03dd\u03df\u0001\u0000\u0000\u0000\u03de\u03dc\u0001"+ + "\u0000\u0000\u0000\u03df\u03e0\u0006s\u0000\u0000\u03e0\u00e8\u0001\u0000"+ + "\u0000\u0000\u001e\u0000\u00f5\u0100\u010b\u0113\u011b\u0129\u013a\u0272"+ + "\u029c\u02a6\u02b1\u02bc\u02cb\u032a\u035c\u0364\u036c\u0374\u037f\u0381"+ + "\u0384\u038b\u038f\u0395\u039c\u039e\u03c4\u03ce\u03dc\u0001\u0006\u0000"+ + "\u0000"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/TypeLexer.tokens b/subprojects/common/grammar/src/main/gen/TypeLexer.tokens new file mode 100644 index 0000000000..9531176830 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/TypeLexer.tokens @@ -0,0 +1,204 @@ +BOOLTYPE=1 +INTTYPE=2 +RATTYPE=3 +BVTYPE=4 +FPTYPE=5 +FUNC=6 +ARRAY=7 +IF=8 +THEN=9 +ELSE=10 +IFF=11 +ITE=12 +IMPLY=13 +FORALL=14 +EXISTS=15 +OR=16 +AND=17 +XOR=18 +NOT=19 +EQ=20 +NEQ=21 +LT=22 +LEQ=23 +GT=24 +GEQ=25 +PLUS=26 +MINUS=27 +MUL=28 +DIV=29 +MOD=30 +REM=31 +PERCENT=32 +BV_CONCAT=33 +BV_ZERO_EXTEND=34 +BV_SIGN_EXTEND=35 +BV_ADD=36 +BV_SUB=37 +BV_POS=38 +BV_NEG=39 +BV_MUL=40 +BV_UDIV=41 +BV_SDIV=42 +BV_SMOD=43 +BV_UREM=44 +BV_SREM=45 +BV_OR=46 +BV_AND=47 +BV_XOR=48 +BV_NOT=49 +BV_SHL=50 +BV_ASHR=51 +BV_LSHR=52 +BV_ROL=53 +BV_ROR=54 +BV_ULT=55 +BV_ULE=56 +BV_UGT=57 +BV_UGE=58 +BV_SLT=59 +BV_SLE=60 +BV_SGT=61 +BV_SGE=62 +FP_ABS=63 +FP_FROM_BV=64 +FP_IS_NAN=65 +FPMAX=66 +FPMIN=67 +FPREM=68 +FPROUNDTOINT=69 +FPSQRT=70 +FPTOBV=71 +FPTOFP=72 +FPSUB=73 +FPADD=74 +FPMUL=75 +FPDIV=76 +FPPOS=77 +FPNEG=78 +TRUE=79 +READ=80 +WRITE=81 +PRIME=82 +EXTRACT=83 +BV_TYPE_DECL=84 +FP_TYPE_DECL=85 +FP_ROUNDINGMODE=86 +FALSE=87 +DEFAULT=88 +ASSIGN=89 +HAVOC=90 +ASSUME=91 +RETURN=92 +BV=93 +INT=94 +NAT=95 +SIGN=96 +DOT=97 +ID=98 +UNDERSCORE=99 +DIGIT=100 +LETTER=101 +LPAREN=102 +RPAREN=103 +LBRACK=104 +RBRACK=105 +LBRAC=106 +RBRAC=107 +COMMA=108 +COLON=109 +SEMICOLON=110 +QUOT=111 +LARROW=112 +RARROW=113 +WS=114 +COMMENT=115 +LINE_COMMENT=116 +'if'=8 +'then'=9 +'else'=10 +'iff'=11 +'ite'=12 +'=>'=13 +'forall'=14 +'exists'=15 +'or'=16 +'and'=17 +'xor'=18 +'not'=19 +'='=20 +'/='=21 +'<'=22 +'<='=23 +'>'=24 +'>='=25 +'+'=26 +'-'=27 +'*'=28 +'div'=29 +'mod'=30 +'rem'=31 +'%'=32 +'bv_zero_extend'=34 +'bv_sign_extend'=35 +'bvadd'=36 +'bvsub'=37 +'bvpos'=38 +'bvneg'=39 +'bvmul'=40 +'bvudiv'=41 +'bvsdiv'=42 +'bvsmod'=43 +'bvurem'=44 +'bvsrem'=45 +'bvor'=46 +'bvand'=47 +'bvxor'=48 +'bvnot'=49 +'bvshl'=50 +'bvashr'=51 +'bvlshr'=52 +'bvrol'=53 +'bvror'=54 +'bvult'=55 +'bvule'=56 +'bvugt'=57 +'bvuge'=58 +'bvslt'=59 +'bvsle'=60 +'bvsgt'=61 +'bvsge'=62 +'fpabs'=63 +'fpisnan'=65 +'fpmax'=66 +'fpmin'=67 +'fprem'=68 +'fpsub'=73 +'fpmul'=75 +'fppos'=77 +'fpneg'=78 +'true'=79 +'read'=80 +'write'=81 +'prime'=82 +'extract'=83 +'false'=87 +'default'=88 +'assign'=89 +'havoc'=90 +'assume'=91 +'return'=92 +'.'=97 +'_'=99 +'('=102 +')'=103 +'['=104 +']'=105 +'{'=106 +'}'=107 +','=108 +':'=109 +';'=110 +'\''=111 +'<-'=112 +'->'=113 diff --git a/subprojects/common/grammar/src/main/gen/TypeListener.java b/subprojects/common/grammar/src/main/gen/TypeListener.java new file mode 100644 index 0000000000..84ec1adeea --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/TypeListener.java @@ -0,0 +1,99 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Type.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link TypeParser}. + */ +public interface TypeListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link TypeParser#type}. + * @param ctx the parse tree + */ + void enterType(TypeParser.TypeContext ctx); + /** + * Exit a parse tree produced by {@link TypeParser#type}. + * @param ctx the parse tree + */ + void exitType(TypeParser.TypeContext ctx); + /** + * Enter a parse tree produced by {@link TypeParser#typeList}. + * @param ctx the parse tree + */ + void enterTypeList(TypeParser.TypeListContext ctx); + /** + * Exit a parse tree produced by {@link TypeParser#typeList}. + * @param ctx the parse tree + */ + void exitTypeList(TypeParser.TypeListContext ctx); + /** + * Enter a parse tree produced by {@link TypeParser#boolType}. + * @param ctx the parse tree + */ + void enterBoolType(TypeParser.BoolTypeContext ctx); + /** + * Exit a parse tree produced by {@link TypeParser#boolType}. + * @param ctx the parse tree + */ + void exitBoolType(TypeParser.BoolTypeContext ctx); + /** + * Enter a parse tree produced by {@link TypeParser#intType}. + * @param ctx the parse tree + */ + void enterIntType(TypeParser.IntTypeContext ctx); + /** + * Exit a parse tree produced by {@link TypeParser#intType}. + * @param ctx the parse tree + */ + void exitIntType(TypeParser.IntTypeContext ctx); + /** + * Enter a parse tree produced by {@link TypeParser#ratType}. + * @param ctx the parse tree + */ + void enterRatType(TypeParser.RatTypeContext ctx); + /** + * Exit a parse tree produced by {@link TypeParser#ratType}. + * @param ctx the parse tree + */ + void exitRatType(TypeParser.RatTypeContext ctx); + /** + * Enter a parse tree produced by {@link TypeParser#funcType}. + * @param ctx the parse tree + */ + void enterFuncType(TypeParser.FuncTypeContext ctx); + /** + * Exit a parse tree produced by {@link TypeParser#funcType}. + * @param ctx the parse tree + */ + void exitFuncType(TypeParser.FuncTypeContext ctx); + /** + * Enter a parse tree produced by {@link TypeParser#arrayType}. + * @param ctx the parse tree + */ + void enterArrayType(TypeParser.ArrayTypeContext ctx); + /** + * Exit a parse tree produced by {@link TypeParser#arrayType}. + * @param ctx the parse tree + */ + void exitArrayType(TypeParser.ArrayTypeContext ctx); + /** + * Enter a parse tree produced by {@link TypeParser#bvType}. + * @param ctx the parse tree + */ + void enterBvType(TypeParser.BvTypeContext ctx); + /** + * Exit a parse tree produced by {@link TypeParser#bvType}. + * @param ctx the parse tree + */ + void exitBvType(TypeParser.BvTypeContext ctx); + /** + * Enter a parse tree produced by {@link TypeParser#fpType}. + * @param ctx the parse tree + */ + void enterFpType(TypeParser.FpTypeContext ctx); + /** + * Exit a parse tree produced by {@link TypeParser#fpType}. + * @param ctx the parse tree + */ + void exitFpType(TypeParser.FpTypeContext ctx); +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/TypeParser.java b/subprojects/common/grammar/src/main/gen/TypeParser.java new file mode 100644 index 0000000000..22894f521d --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/TypeParser.java @@ -0,0 +1,745 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Type.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class TypeParser extends Parser { + static { RuntimeMetaData.checkVersion("4.10.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + BOOLTYPE=1, INTTYPE=2, RATTYPE=3, BVTYPE=4, FPTYPE=5, FUNC=6, ARRAY=7, + IF=8, THEN=9, ELSE=10, IFF=11, ITE=12, IMPLY=13, FORALL=14, EXISTS=15, + OR=16, AND=17, XOR=18, NOT=19, EQ=20, NEQ=21, LT=22, LEQ=23, GT=24, GEQ=25, + PLUS=26, MINUS=27, MUL=28, DIV=29, MOD=30, REM=31, PERCENT=32, BV_CONCAT=33, + BV_ZERO_EXTEND=34, BV_SIGN_EXTEND=35, BV_ADD=36, BV_SUB=37, BV_POS=38, + BV_NEG=39, BV_MUL=40, BV_UDIV=41, BV_SDIV=42, BV_SMOD=43, BV_UREM=44, + BV_SREM=45, BV_OR=46, BV_AND=47, BV_XOR=48, BV_NOT=49, BV_SHL=50, BV_ASHR=51, + BV_LSHR=52, BV_ROL=53, BV_ROR=54, BV_ULT=55, BV_ULE=56, BV_UGT=57, BV_UGE=58, + BV_SLT=59, BV_SLE=60, BV_SGT=61, BV_SGE=62, FP_ABS=63, FP_FROM_BV=64, + FP_IS_NAN=65, FPMAX=66, FPMIN=67, FPREM=68, FPROUNDTOINT=69, FPSQRT=70, + FPTOBV=71, FPTOFP=72, FPSUB=73, FPADD=74, FPMUL=75, FPDIV=76, FPPOS=77, + FPNEG=78, TRUE=79, READ=80, WRITE=81, PRIME=82, EXTRACT=83, BV_TYPE_DECL=84, + FP_TYPE_DECL=85, FP_ROUNDINGMODE=86, FALSE=87, DEFAULT=88, ASSIGN=89, + HAVOC=90, ASSUME=91, RETURN=92, BV=93, INT=94, NAT=95, SIGN=96, DOT=97, + ID=98, UNDERSCORE=99, DIGIT=100, LETTER=101, LPAREN=102, RPAREN=103, LBRACK=104, + RBRACK=105, LBRAC=106, RBRAC=107, COMMA=108, COLON=109, SEMICOLON=110, + QUOT=111, LARROW=112, RARROW=113, WS=114, COMMENT=115, LINE_COMMENT=116; + public static final int + RULE_type = 0, RULE_typeList = 1, RULE_boolType = 2, RULE_intType = 3, + RULE_ratType = 4, RULE_funcType = 5, RULE_arrayType = 6, RULE_bvType = 7, + RULE_fpType = 8; + private static String[] makeRuleNames() { + return new String[] { + "type", "typeList", "boolType", "intType", "ratType", "funcType", "arrayType", + "bvType", "fpType" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, null, null, null, null, null, null, null, "'if'", "'then'", "'else'", + "'iff'", "'ite'", "'=>'", "'forall'", "'exists'", "'or'", "'and'", "'xor'", + "'not'", "'='", "'/='", "'<'", "'<='", "'>'", "'>='", "'+'", "'-'", "'*'", + "'div'", "'mod'", "'rem'", "'%'", null, "'bv_zero_extend'", "'bv_sign_extend'", + "'bvadd'", "'bvsub'", "'bvpos'", "'bvneg'", "'bvmul'", "'bvudiv'", "'bvsdiv'", + "'bvsmod'", "'bvurem'", "'bvsrem'", "'bvor'", "'bvand'", "'bvxor'", "'bvnot'", + "'bvshl'", "'bvashr'", "'bvlshr'", "'bvrol'", "'bvror'", "'bvult'", "'bvule'", + "'bvugt'", "'bvuge'", "'bvslt'", "'bvsle'", "'bvsgt'", "'bvsge'", "'fpabs'", + null, "'fpisnan'", "'fpmax'", "'fpmin'", "'fprem'", null, null, null, + null, "'fpsub'", null, "'fpmul'", null, "'fppos'", "'fpneg'", "'true'", + "'read'", "'write'", "'prime'", "'extract'", null, null, null, "'false'", + "'default'", "'assign'", "'havoc'", "'assume'", "'return'", null, null, + null, null, "'.'", null, "'_'", null, null, "'('", "')'", "'['", "']'", + "'{'", "'}'", "','", "':'", "';'", "'''", "'<-'", "'->'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "BOOLTYPE", "INTTYPE", "RATTYPE", "BVTYPE", "FPTYPE", "FUNC", "ARRAY", + "IF", "THEN", "ELSE", "IFF", "ITE", "IMPLY", "FORALL", "EXISTS", "OR", + "AND", "XOR", "NOT", "EQ", "NEQ", "LT", "LEQ", "GT", "GEQ", "PLUS", "MINUS", + "MUL", "DIV", "MOD", "REM", "PERCENT", "BV_CONCAT", "BV_ZERO_EXTEND", + "BV_SIGN_EXTEND", "BV_ADD", "BV_SUB", "BV_POS", "BV_NEG", "BV_MUL", "BV_UDIV", + "BV_SDIV", "BV_SMOD", "BV_UREM", "BV_SREM", "BV_OR", "BV_AND", "BV_XOR", + "BV_NOT", "BV_SHL", "BV_ASHR", "BV_LSHR", "BV_ROL", "BV_ROR", "BV_ULT", + "BV_ULE", "BV_UGT", "BV_UGE", "BV_SLT", "BV_SLE", "BV_SGT", "BV_SGE", + "FP_ABS", "FP_FROM_BV", "FP_IS_NAN", "FPMAX", "FPMIN", "FPREM", "FPROUNDTOINT", + "FPSQRT", "FPTOBV", "FPTOFP", "FPSUB", "FPADD", "FPMUL", "FPDIV", "FPPOS", + "FPNEG", "TRUE", "READ", "WRITE", "PRIME", "EXTRACT", "BV_TYPE_DECL", + "FP_TYPE_DECL", "FP_ROUNDINGMODE", "FALSE", "DEFAULT", "ASSIGN", "HAVOC", + "ASSUME", "RETURN", "BV", "INT", "NAT", "SIGN", "DOT", "ID", "UNDERSCORE", + "DIGIT", "LETTER", "LPAREN", "RPAREN", "LBRACK", "RBRACK", "LBRAC", "RBRAC", + "COMMA", "COLON", "SEMICOLON", "QUOT", "LARROW", "RARROW", "WS", "COMMENT", + "LINE_COMMENT" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "Type.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public TypeParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + public static class TypeContext extends ParserRuleContext { + public BoolTypeContext boolType() { + return getRuleContext(BoolTypeContext.class,0); + } + public IntTypeContext intType() { + return getRuleContext(IntTypeContext.class,0); + } + public RatTypeContext ratType() { + return getRuleContext(RatTypeContext.class,0); + } + public FuncTypeContext funcType() { + return getRuleContext(FuncTypeContext.class,0); + } + public ArrayTypeContext arrayType() { + return getRuleContext(ArrayTypeContext.class,0); + } + public BvTypeContext bvType() { + return getRuleContext(BvTypeContext.class,0); + } + public FpTypeContext fpType() { + return getRuleContext(FpTypeContext.class,0); + } + public TypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).enterType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).exitType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof TypeVisitor ) return ((TypeVisitor)visitor).visitType(this); + else return visitor.visitChildren(this); + } + } + + public final TypeContext type() throws RecognitionException { + TypeContext _localctx = new TypeContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_type); + try { + setState(25); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,0,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(18); + boolType(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(19); + intType(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(20); + ratType(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(21); + funcType(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(22); + arrayType(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(23); + bvType(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(24); + fpType(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class TypeListContext extends ParserRuleContext { + public TypeContext type; + public List types = new ArrayList(); + public List type() { + return getRuleContexts(TypeContext.class); + } + public TypeContext type(int i) { + return getRuleContext(TypeContext.class,i); + } + public List COMMA() { return getTokens(TypeParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(TypeParser.COMMA, i); + } + public TypeListContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typeList; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).enterTypeList(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).exitTypeList(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof TypeVisitor ) return ((TypeVisitor)visitor).visitTypeList(this); + else return visitor.visitChildren(this); + } + } + + public final TypeListContext typeList() throws RecognitionException { + TypeListContext _localctx = new TypeListContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_typeList); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + { + setState(27); + ((TypeListContext)_localctx).type = type(); + ((TypeListContext)_localctx).types.add(((TypeListContext)_localctx).type); + } + setState(32); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(28); + match(COMMA); + setState(29); + ((TypeListContext)_localctx).type = type(); + ((TypeListContext)_localctx).types.add(((TypeListContext)_localctx).type); + } + } + setState(34); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BoolTypeContext extends ParserRuleContext { + public TerminalNode BOOLTYPE() { return getToken(TypeParser.BOOLTYPE, 0); } + public BoolTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_boolType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).enterBoolType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).exitBoolType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof TypeVisitor ) return ((TypeVisitor)visitor).visitBoolType(this); + else return visitor.visitChildren(this); + } + } + + public final BoolTypeContext boolType() throws RecognitionException { + BoolTypeContext _localctx = new BoolTypeContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_boolType); + try { + enterOuterAlt(_localctx, 1); + { + setState(35); + match(BOOLTYPE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IntTypeContext extends ParserRuleContext { + public TerminalNode INTTYPE() { return getToken(TypeParser.INTTYPE, 0); } + public IntTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_intType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).enterIntType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).exitIntType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof TypeVisitor ) return ((TypeVisitor)visitor).visitIntType(this); + else return visitor.visitChildren(this); + } + } + + public final IntTypeContext intType() throws RecognitionException { + IntTypeContext _localctx = new IntTypeContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_intType); + try { + enterOuterAlt(_localctx, 1); + { + setState(37); + match(INTTYPE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class RatTypeContext extends ParserRuleContext { + public TerminalNode RATTYPE() { return getToken(TypeParser.RATTYPE, 0); } + public RatTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ratType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).enterRatType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).exitRatType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof TypeVisitor ) return ((TypeVisitor)visitor).visitRatType(this); + else return visitor.visitChildren(this); + } + } + + public final RatTypeContext ratType() throws RecognitionException { + RatTypeContext _localctx = new RatTypeContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_ratType); + try { + enterOuterAlt(_localctx, 1); + { + setState(39); + match(RATTYPE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FuncTypeContext extends ParserRuleContext { + public TypeContext from; + public TypeContext to; + public TerminalNode LPAREN() { return getToken(TypeParser.LPAREN, 0); } + public TerminalNode FUNC() { return getToken(TypeParser.FUNC, 0); } + public TerminalNode RPAREN() { return getToken(TypeParser.RPAREN, 0); } + public List type() { + return getRuleContexts(TypeContext.class); + } + public TypeContext type(int i) { + return getRuleContext(TypeContext.class,i); + } + public FuncTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_funcType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).enterFuncType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).exitFuncType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof TypeVisitor ) return ((TypeVisitor)visitor).visitFuncType(this); + else return visitor.visitChildren(this); + } + } + + public final FuncTypeContext funcType() throws RecognitionException { + FuncTypeContext _localctx = new FuncTypeContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_funcType); + try { + enterOuterAlt(_localctx, 1); + { + setState(41); + match(LPAREN); + setState(42); + match(FUNC); + setState(43); + ((FuncTypeContext)_localctx).from = type(); + setState(44); + ((FuncTypeContext)_localctx).to = type(); + setState(45); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ArrayTypeContext extends ParserRuleContext { + public TypeContext indexType; + public TypeContext elemType; + public List LPAREN() { return getTokens(TypeParser.LPAREN); } + public TerminalNode LPAREN(int i) { + return getToken(TypeParser.LPAREN, i); + } + public TerminalNode ARRAY() { return getToken(TypeParser.ARRAY, 0); } + public TerminalNode LBRACK() { return getToken(TypeParser.LBRACK, 0); } + public TerminalNode RBRACK() { return getToken(TypeParser.RBRACK, 0); } + public TerminalNode RARROW() { return getToken(TypeParser.RARROW, 0); } + public List RPAREN() { return getTokens(TypeParser.RPAREN); } + public TerminalNode RPAREN(int i) { + return getToken(TypeParser.RPAREN, i); + } + public List type() { + return getRuleContexts(TypeContext.class); + } + public TypeContext type(int i) { + return getRuleContext(TypeContext.class,i); + } + public ArrayTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arrayType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).enterArrayType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).exitArrayType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof TypeVisitor ) return ((TypeVisitor)visitor).visitArrayType(this); + else return visitor.visitChildren(this); + } + } + + public final ArrayTypeContext arrayType() throws RecognitionException { + ArrayTypeContext _localctx = new ArrayTypeContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_arrayType); + try { + enterOuterAlt(_localctx, 1); + { + setState(47); + match(LPAREN); + setState(48); + match(ARRAY); + setState(49); + match(LPAREN); + setState(50); + match(LBRACK); + setState(51); + ((ArrayTypeContext)_localctx).indexType = type(); + setState(52); + match(RBRACK); + setState(53); + match(RARROW); + setState(54); + ((ArrayTypeContext)_localctx).elemType = type(); + setState(55); + match(RPAREN); + setState(56); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BvTypeContext extends ParserRuleContext { + public Token size; + public TerminalNode LPAREN() { return getToken(TypeParser.LPAREN, 0); } + public TerminalNode BVTYPE() { return getToken(TypeParser.BVTYPE, 0); } + public TerminalNode RPAREN() { return getToken(TypeParser.RPAREN, 0); } + public TerminalNode INT() { return getToken(TypeParser.INT, 0); } + public BvTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bvType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).enterBvType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).exitBvType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof TypeVisitor ) return ((TypeVisitor)visitor).visitBvType(this); + else return visitor.visitChildren(this); + } + } + + public final BvTypeContext bvType() throws RecognitionException { + BvTypeContext _localctx = new BvTypeContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_bvType); + try { + enterOuterAlt(_localctx, 1); + { + setState(58); + match(LPAREN); + setState(59); + match(BVTYPE); + setState(60); + ((BvTypeContext)_localctx).size = match(INT); + setState(61); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class FpTypeContext extends ParserRuleContext { + public Token exponent; + public Token significand; + public TerminalNode LPAREN() { return getToken(TypeParser.LPAREN, 0); } + public TerminalNode FPTYPE() { return getToken(TypeParser.FPTYPE, 0); } + public TerminalNode RPAREN() { return getToken(TypeParser.RPAREN, 0); } + public List INT() { return getTokens(TypeParser.INT); } + public TerminalNode INT(int i) { + return getToken(TypeParser.INT, i); + } + public FpTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fpType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).enterFpType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof TypeListener ) ((TypeListener)listener).exitFpType(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof TypeVisitor ) return ((TypeVisitor)visitor).visitFpType(this); + else return visitor.visitChildren(this); + } + } + + public final FpTypeContext fpType() throws RecognitionException { + FpTypeContext _localctx = new FpTypeContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_fpType); + try { + enterOuterAlt(_localctx, 1); + { + setState(63); + match(LPAREN); + setState(64); + match(FPTYPE); + setState(65); + ((FpTypeContext)_localctx).exponent = match(INT); + setState(66); + ((FpTypeContext)_localctx).significand = match(INT); + setState(67); + match(RPAREN); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static final String _serializedATN = + "\u0004\u0001tF\u0002\u0000\u0007\u0000\u0002\u0001\u0007\u0001\u0002\u0002"+ + "\u0007\u0002\u0002\u0003\u0007\u0003\u0002\u0004\u0007\u0004\u0002\u0005"+ + "\u0007\u0005\u0002\u0006\u0007\u0006\u0002\u0007\u0007\u0007\u0002\b\u0007"+ + "\b\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000\u0001\u0000"+ + "\u0001\u0000\u0003\u0000\u001a\b\u0000\u0001\u0001\u0001\u0001\u0001\u0001"+ + "\u0005\u0001\u001f\b\u0001\n\u0001\f\u0001\"\t\u0001\u0001\u0002\u0001"+ + "\u0002\u0001\u0003\u0001\u0003\u0001\u0004\u0001\u0004\u0001\u0005\u0001"+ + "\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0005\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001"+ + "\u0006\u0001\u0006\u0001\u0006\u0001\u0006\u0001\u0007\u0001\u0007\u0001"+ + "\u0007\u0001\u0007\u0001\u0007\u0001\b\u0001\b\u0001\b\u0001\b\u0001\b"+ + "\u0001\b\u0001\b\u0000\u0000\t\u0000\u0002\u0004\u0006\b\n\f\u000e\u0010"+ + "\u0000\u0000C\u0000\u0019\u0001\u0000\u0000\u0000\u0002\u001b\u0001\u0000"+ + "\u0000\u0000\u0004#\u0001\u0000\u0000\u0000\u0006%\u0001\u0000\u0000\u0000"+ + "\b\'\u0001\u0000\u0000\u0000\n)\u0001\u0000\u0000\u0000\f/\u0001\u0000"+ + "\u0000\u0000\u000e:\u0001\u0000\u0000\u0000\u0010?\u0001\u0000\u0000\u0000"+ + "\u0012\u001a\u0003\u0004\u0002\u0000\u0013\u001a\u0003\u0006\u0003\u0000"+ + "\u0014\u001a\u0003\b\u0004\u0000\u0015\u001a\u0003\n\u0005\u0000\u0016"+ + "\u001a\u0003\f\u0006\u0000\u0017\u001a\u0003\u000e\u0007\u0000\u0018\u001a"+ + "\u0003\u0010\b\u0000\u0019\u0012\u0001\u0000\u0000\u0000\u0019\u0013\u0001"+ + "\u0000\u0000\u0000\u0019\u0014\u0001\u0000\u0000\u0000\u0019\u0015\u0001"+ + "\u0000\u0000\u0000\u0019\u0016\u0001\u0000\u0000\u0000\u0019\u0017\u0001"+ + "\u0000\u0000\u0000\u0019\u0018\u0001\u0000\u0000\u0000\u001a\u0001\u0001"+ + "\u0000\u0000\u0000\u001b \u0003\u0000\u0000\u0000\u001c\u001d\u0005l\u0000"+ + "\u0000\u001d\u001f\u0003\u0000\u0000\u0000\u001e\u001c\u0001\u0000\u0000"+ + "\u0000\u001f\"\u0001\u0000\u0000\u0000 \u001e\u0001\u0000\u0000\u0000"+ + " !\u0001\u0000\u0000\u0000!\u0003\u0001\u0000\u0000\u0000\" \u0001\u0000"+ + "\u0000\u0000#$\u0005\u0001\u0000\u0000$\u0005\u0001\u0000\u0000\u0000"+ + "%&\u0005\u0002\u0000\u0000&\u0007\u0001\u0000\u0000\u0000\'(\u0005\u0003"+ + "\u0000\u0000(\t\u0001\u0000\u0000\u0000)*\u0005f\u0000\u0000*+\u0005\u0006"+ + "\u0000\u0000+,\u0003\u0000\u0000\u0000,-\u0003\u0000\u0000\u0000-.\u0005"+ + "g\u0000\u0000.\u000b\u0001\u0000\u0000\u0000/0\u0005f\u0000\u000001\u0005"+ + "\u0007\u0000\u000012\u0005f\u0000\u000023\u0005h\u0000\u000034\u0003\u0000"+ + "\u0000\u000045\u0005i\u0000\u000056\u0005q\u0000\u000067\u0003\u0000\u0000"+ + "\u000078\u0005g\u0000\u000089\u0005g\u0000\u00009\r\u0001\u0000\u0000"+ + "\u0000:;\u0005f\u0000\u0000;<\u0005\u0004\u0000\u0000<=\u0005^\u0000\u0000"+ + "=>\u0005g\u0000\u0000>\u000f\u0001\u0000\u0000\u0000?@\u0005f\u0000\u0000"+ + "@A\u0005\u0005\u0000\u0000AB\u0005^\u0000\u0000BC\u0005^\u0000\u0000C"+ + "D\u0005g\u0000\u0000D\u0011\u0001\u0000\u0000\u0000\u0002\u0019 "; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/subprojects/common/grammar/src/main/gen/TypeVisitor.java b/subprojects/common/grammar/src/main/gen/TypeVisitor.java new file mode 100644 index 0000000000..18d5275c35 --- /dev/null +++ b/subprojects/common/grammar/src/main/gen/TypeVisitor.java @@ -0,0 +1,66 @@ +// Generated from /home/levente/Documents/University/theta-fresh/subprojects/common/grammar/src/main/antlr/Type.g4 by ANTLR 4.10.1 +import org.antlr.v4.runtime.tree.ParseTreeVisitor; + +/** + * This interface defines a complete generic visitor for a parse tree produced + * by {@link TypeParser}. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +public interface TypeVisitor extends ParseTreeVisitor { + /** + * Visit a parse tree produced by {@link TypeParser#type}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitType(TypeParser.TypeContext ctx); + /** + * Visit a parse tree produced by {@link TypeParser#typeList}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTypeList(TypeParser.TypeListContext ctx); + /** + * Visit a parse tree produced by {@link TypeParser#boolType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBoolType(TypeParser.BoolTypeContext ctx); + /** + * Visit a parse tree produced by {@link TypeParser#intType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIntType(TypeParser.IntTypeContext ctx); + /** + * Visit a parse tree produced by {@link TypeParser#ratType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitRatType(TypeParser.RatTypeContext ctx); + /** + * Visit a parse tree produced by {@link TypeParser#funcType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFuncType(TypeParser.FuncTypeContext ctx); + /** + * Visit a parse tree produced by {@link TypeParser#arrayType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitArrayType(TypeParser.ArrayTypeContext ctx); + /** + * Visit a parse tree produced by {@link TypeParser#bvType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBvType(TypeParser.BvTypeContext ctx); + /** + * Visit a parse tree produced by {@link TypeParser#fpType}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFpType(TypeParser.FpTypeContext ctx); +} \ No newline at end of file diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverManager.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverManager.java index 3095b25ad9..fae40a26f5 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverManager.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverManager.java @@ -3,38 +3,28 @@ import com.google.common.collect.ImmutableList; import hu.bme.mit.theta.common.Tuple2; import hu.bme.mit.theta.common.logging.Logger; -import hu.bme.mit.theta.solver.ItpSolver; -import hu.bme.mit.theta.solver.Solver; -import hu.bme.mit.theta.solver.SolverBase; -import hu.bme.mit.theta.solver.SolverFactory; -import hu.bme.mit.theta.solver.SolverManager; -import hu.bme.mit.theta.solver.UCSolver; +import hu.bme.mit.theta.solver.*; +import hu.bme.mit.theta.solver.smtlib.impl.bitwuzla.BitwuzlaSmtLibSolverInstaller; import hu.bme.mit.theta.solver.smtlib.impl.boolector.BoolectorSmtLibSolverInstaller; -import hu.bme.mit.theta.solver.smtlib.impl.princess.PrincessSmtLibSolverInstaller; -import hu.bme.mit.theta.solver.smtlib.impl.smtinterpol.SMTInterpolSmtLibSolverInstaller; -import hu.bme.mit.theta.solver.smtlib.impl.yices2.Yices2SmtLibSolverInstaller; -import hu.bme.mit.theta.solver.smtlib.solver.installer.SmtLibSolverInstaller; -import hu.bme.mit.theta.solver.smtlib.solver.installer.SmtLibSolverInstallerException; import hu.bme.mit.theta.solver.smtlib.impl.cvc4.CVC4SmtLibSolverInstaller; +import hu.bme.mit.theta.solver.smtlib.impl.cvc5.CVC5SmtLibSolverInstaller; import hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSolverInstaller; import hu.bme.mit.theta.solver.smtlib.impl.mathsat.MathSATSmtLibSolverInstaller; +import hu.bme.mit.theta.solver.smtlib.impl.princess.PrincessSmtLibSolverInstaller; +import hu.bme.mit.theta.solver.smtlib.impl.smtinterpol.SMTInterpolSmtLibSolverInstaller; import hu.bme.mit.theta.solver.smtlib.impl.z3.Z3SmtLibSolverInstaller; +import hu.bme.mit.theta.solver.smtlib.solver.installer.SmtLibSolverInstaller; +import hu.bme.mit.theta.solver.smtlib.solver.installer.SmtLibSolverInstallerException; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; +import static com.google.common.base.Preconditions.*; public final class SmtLibSolverManager extends SolverManager { public static final Path HOME = Path.of(System.getProperty("user.home"), ".theta"); @@ -54,9 +44,10 @@ public static void registerGenericInsta static { registerInstaller("z3", Z3SmtLibSolverInstaller.class); registerInstaller("cvc4", CVC4SmtLibSolverInstaller.class); + registerInstaller("cvc5", CVC5SmtLibSolverInstaller.class); registerInstaller("mathsat", MathSATSmtLibSolverInstaller.class); - registerInstaller("yices2", Yices2SmtLibSolverInstaller.class); registerInstaller("boolector", BoolectorSmtLibSolverInstaller.class); + registerInstaller("bitwuzla", BitwuzlaSmtLibSolverInstaller.class); registerInstaller("smtinterpol", SMTInterpolSmtLibSolverInstaller.class); registerInstaller("princess", PrincessSmtLibSolverInstaller.class); registerGenericInstaller("generic", GenericSmtLibSolverInstaller.class); diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/bitwuzla/BitwuzlaSmtLibSolverFactory.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/bitwuzla/BitwuzlaSmtLibSolverFactory.java new file mode 100644 index 0000000000..d251d0beca --- /dev/null +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/bitwuzla/BitwuzlaSmtLibSolverFactory.java @@ -0,0 +1,22 @@ +package hu.bme.mit.theta.solver.smtlib.impl.bitwuzla; + +import hu.bme.mit.theta.solver.ItpSolver; +import hu.bme.mit.theta.solver.UCSolver; +import hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSolverFactory; + +import java.nio.file.Path; + +public class BitwuzlaSmtLibSolverFactory extends GenericSmtLibSolverFactory { + private BitwuzlaSmtLibSolverFactory(Path solverPath, String[] args) { + super(solverPath, args); + } + + public static BitwuzlaSmtLibSolverFactory create(Path solverPath, String[] args) { + return new BitwuzlaSmtLibSolverFactory(solverPath, args); + } + + @Override + public ItpSolver createItpSolver() { + throw new UnsupportedOperationException("Bitwuzla does not support interpolation"); + } +} diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/bitwuzla/BitwuzlaSmtLibSolverInstaller.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/bitwuzla/BitwuzlaSmtLibSolverInstaller.java new file mode 100644 index 0000000000..3128fd245a --- /dev/null +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/bitwuzla/BitwuzlaSmtLibSolverInstaller.java @@ -0,0 +1,104 @@ +package hu.bme.mit.theta.solver.smtlib.impl.bitwuzla; + +import hu.bme.mit.theta.common.logging.Logger; +import hu.bme.mit.theta.solver.SolverFactory; +import hu.bme.mit.theta.solver.smtlib.solver.installer.SmtLibSolverInstaller; +import hu.bme.mit.theta.solver.smtlib.solver.installer.SmtLibSolverInstallerException; +import hu.bme.mit.theta.solver.smtlib.utils.Compress; + +import java.io.IOException; +import java.net.URI; +import java.nio.file.Path; +import java.util.List; + +public class BitwuzlaSmtLibSolverInstaller extends SmtLibSolverInstaller.Default { + + public BitwuzlaSmtLibSolverInstaller(final Logger logger) { + super(logger); + } + + @Override + protected String getSolverName() { + return "bitwuzla"; + } + + @Override + protected void installSolver(final Path installDir, final String version) throws SmtLibSolverInstallerException { + final var downloadUrl = URI.create(String.format( + "https://github.com/bitwuzla/bitwuzla/archive/%s.zip", + version + )); + + logger.write(Logger.Level.MAINSTEP, "Starting download (%s)...\n", downloadUrl.toString()); + + try(final var inputStream = downloadUrl.toURL().openStream()) { + Compress.extract(inputStream, installDir, Compress.CompressionType.ZIP); + } + catch (IOException e) { + throw new SmtLibSolverInstallerException(e); + } + + logger.write(Logger.Level.MAINSTEP, "Download finished\n"); + + logger.write(Logger.Level.MAINSTEP, "Starting compilation\n"); + + installDir.resolve("contrib").resolve("setup-cadical.sh").toFile().setExecutable(true, true); + executeCommand(installDir, "./contrib/setup-cadical.sh"); + + installDir.resolve("contrib").resolve("setup-btor2tools.sh").toFile().setExecutable(true, true); + executeCommand(installDir, "./contrib/setup-btor2tools.sh"); + + installDir.resolve("contrib").resolve("setup-symfpu.sh").toFile().setExecutable(true, true); + executeCommand(installDir, "./contrib/setup-symfpu.sh"); + + installDir.resolve("configure.sh").toFile().setExecutable(true, true); + executeCommand(installDir, "./configure.sh"); + executeCommand(installDir.resolve("build"), "make"); + installDir.resolve("build").resolve("bin").resolve("bitwuzla").toFile().setExecutable(true, true); + + logger.write(Logger.Level.MAINSTEP, "Finished compilation\n"); + } + + @Override + protected void uninstallSolver(final Path installDir, final String version) { + // Default uninstall is suitable + } + + @Override + protected String[] getDefaultSolverArgs(String version) { + return new String[]{ + "--smt2", + "-i" + }; + } + + @Override + public SolverFactory getSolverFactory(final Path installDir, final String version, final Path solverPath, final String[] solverArgs) throws SmtLibSolverInstallerException { + final var solverFilePath = solverPath != null ? solverPath : installDir.resolve("build").resolve("bin").resolve("bitwuzla"); + return BitwuzlaSmtLibSolverFactory.create(solverFilePath, solverArgs); + } + + @Override + public List getSupportedVersions() { + return List.of("3ea759df11285e722b565c0b5c132dc0bb77066f"); + } + + private void executeCommand(final Path workingPath, final String command) throws SmtLibSolverInstallerException { + try { + logger.write(Logger.Level.SUBSTEP, "Execute command: %s\n", command); + final var process = new ProcessBuilder() + .command("bash", "-c", command) + .directory(workingPath.toFile()) + .redirectOutput(ProcessBuilder.Redirect.INHERIT) + .redirectError(ProcessBuilder.Redirect.INHERIT) + .start(); + + if(process.waitFor() != 0) { + throw new SmtLibSolverInstallerException(String.format("Error executing command: %s", command)); + } + } + catch (IOException | InterruptedException e) { + throw new SmtLibSolverInstallerException(String.format("Error executing command: %s", command), e); + } + } +} diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc4/CVC4SmtLibSolverFactory.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc4/CVC4SmtLibSolverFactory.java index dd1685e7aa..5c327c8b52 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc4/CVC4SmtLibSolverFactory.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc4/CVC4SmtLibSolverFactory.java @@ -17,13 +17,15 @@ package hu.bme.mit.theta.solver.smtlib.impl.cvc4; import hu.bme.mit.theta.solver.ItpSolver; +import hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSolverBinary; import hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSolverFactory; import java.nio.file.Path; +import java.util.EnumSet; public class CVC4SmtLibSolverFactory extends GenericSmtLibSolverFactory { private CVC4SmtLibSolverFactory(Path solverPath, String[] args) { - super(solverPath, args, true); + super(solverPath, args, EnumSet.of(GenericSmtLibSolverBinary.Solver.CVC4)); } public static CVC4SmtLibSolverFactory create(Path solverPath, String[] args) { diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibItpMarker.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibItpMarker.java new file mode 100644 index 0000000000..3b069f1347 --- /dev/null +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibItpMarker.java @@ -0,0 +1,6 @@ +package hu.bme.mit.theta.solver.smtlib.impl.cvc5; + +import hu.bme.mit.theta.solver.smtlib.solver.interpolation.SmtLibItpMarker; + +public class CVC5SmtLibItpMarker extends SmtLibItpMarker { +} diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibItpSolver.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibItpSolver.java new file mode 100644 index 0000000000..a044becb5c --- /dev/null +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibItpSolver.java @@ -0,0 +1,126 @@ +package hu.bme.mit.theta.solver.smtlib.impl.cvc5; + +import hu.bme.mit.theta.common.Tuple2; +import hu.bme.mit.theta.core.decl.ConstDecl; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.solver.*; +import hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Lexer; +import hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser; +import hu.bme.mit.theta.solver.smtlib.solver.SmtLibItpSolver; +import hu.bme.mit.theta.solver.smtlib.solver.SmtLibSolverException; +import hu.bme.mit.theta.solver.smtlib.solver.binary.SmtLibSolverBinary; +import hu.bme.mit.theta.solver.smtlib.solver.interpolation.SmtLibInterpolant; +import hu.bme.mit.theta.solver.smtlib.solver.interpolation.SmtLibItpPattern; +import hu.bme.mit.theta.solver.smtlib.solver.model.SmtLibModel; +import hu.bme.mit.theta.solver.smtlib.solver.parser.ThrowExceptionErrorListener; +import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibSymbolTable; +import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibTermTransformer; +import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibTransformationManager; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.misc.Interval; + +import java.util.*; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import static com.google.common.base.Preconditions.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; + +public class CVC5SmtLibItpSolver extends SmtLibItpSolver { + private final Supplier itpSolverBinaryFactory; + + public CVC5SmtLibItpSolver(final SmtLibSymbolTable symbolTable, final SmtLibTransformationManager transformationManager, final SmtLibTermTransformer termTransformer, final SmtLibSolverBinary solverBinary, final Supplier itpSolverBinaryFactory) { + super(symbolTable, transformationManager, termTransformer, solverBinary); + this.itpSolverBinaryFactory = itpSolverBinaryFactory; + } + + @Override + public ItpPattern createTreePattern(ItpMarkerTree root) { + checkNotNull(root); + return SmtLibItpPattern.of(root); + } + + @Override + public CVC5SmtLibItpMarker createMarker() { + final var marker = new CVC5SmtLibItpMarker(); + markers.add(marker); + return marker; + } + + @Override + protected void add(CVC5SmtLibItpMarker marker, Expr assertion, Set> consts, String term) { + consts.stream().map(symbolTable::getDeclaration).forEach(this::issueGeneralCommand); + issueGeneralCommand(String.format("(assert %s)", term)); + } + + @Override + public Interpolant getInterpolant(ItpPattern pattern) { + checkState(getStatus() == SolverStatus.UNSAT, "Cannot get interpolant if status is not UNSAT."); + checkArgument(pattern instanceof SmtLibItpPattern); + + try (final var itpSolverBinary = itpSolverBinaryFactory.get()) { + itpSolverBinary.issueCommand("(set-option :produce-interpolants true)"); + itpSolverBinary.issueCommand("(set-logic ALL)"); + declarationStack.forEach(constDecl -> itpSolverBinary.issueCommand(symbolTable.getDeclaration(constDecl))); + + @SuppressWarnings("unchecked") + final var cvc5ItpPattern = (SmtLibItpPattern) pattern; + final List markers = cvc5ItpPattern.getSequence(); + final List A = new ArrayList<>(); + final List B = new ArrayList<>(markers); + + final Map> itpMap = new HashMap<>(); + var interpolantCount = 0; + for (final var marker : markers) { + B.remove(marker); + A.add(marker); + + if(B.size() != 0) { + final var aTerm = A.stream().flatMap(m -> m.getTerms().stream().map(Tuple2::get2)); + final var bTerm = B.stream().flatMap(m -> m.getTerms().stream().map(Tuple2::get2)); + + itpSolverBinary.issueCommand(String.format("(assert (and %s))", aTerm.collect(Collectors.joining(" ")))); + itpSolverBinary.issueCommand(String.format("(get-interpolant _cvc5_interpolant%d (not (and %s)))", interpolantCount++, bTerm.collect(Collectors.joining(" ")))); + + itpMap.put(marker, termTransformer.toExpr(parseItpResponse(itpSolverBinary.readResponse()), Bool(), new SmtLibModel(Collections.emptyMap()))); + } + else { + itpMap.put(marker, False()); + } + } + + return new SmtLibInterpolant(itpMap); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + private String parseItpResponse(final String response) { + final var lexer = new SMTLIBv2Lexer(CharStreams.fromString(response)); + final var parser = new SMTLIBv2Parser(new CommonTokenStream(lexer)); + try { + lexer.removeErrorListeners(); + lexer.addErrorListener(new ThrowExceptionErrorListener()); + parser.removeErrorListeners(); + parser.addErrorListener(new ThrowExceptionErrorListener()); + return extractString(parser.model_response_fun().function_def().term()); + } + catch (Exception e) { + try { + throw new SmtLibSolverException(parser.response().general_response_error().reason.getText()); + } + catch(Exception ex) { + throw new SmtLibSolverException("Could not parse solver output: " + response, e); + } + } + } + + private static String extractString(final ParserRuleContext ctx) { + return ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex())); + } +} diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibSolverFactory.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibSolverFactory.java new file mode 100644 index 0000000000..84ff9fe8e9 --- /dev/null +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibSolverFactory.java @@ -0,0 +1,47 @@ +/* + * Copyright 2022 Budapest University of Technology and Economics + * + * 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. + */ + +package hu.bme.mit.theta.solver.smtlib.impl.cvc5; + +import hu.bme.mit.theta.solver.ItpSolver; +import hu.bme.mit.theta.solver.smtlib.impl.generic.*; +import hu.bme.mit.theta.solver.smtlib.solver.SmtLibSolver; + +import java.nio.file.Path; +import java.util.EnumSet; + +public class CVC5SmtLibSolverFactory extends GenericSmtLibSolverFactory { + private CVC5SmtLibSolverFactory(Path solverPath, String[] args) { + super(solverPath, args); + } + + public static CVC5SmtLibSolverFactory create(Path solverPath, String[] args) { + return new CVC5SmtLibSolverFactory(solverPath, args); + } + + @Override + public ItpSolver createItpSolver() { + final var symbolTable = new GenericSmtLibSymbolTable(); + final var transformationManager = new GenericSmtLibTransformationManager(symbolTable); + final var termTransformer = new GenericSmtLibTermTransformer(symbolTable); + final var solverBinary = new GenericSmtLibSolverBinary(solverPath, args, EnumSet.noneOf(GenericSmtLibSolverBinary.Solver.class)); + + return new CVC5SmtLibItpSolver( + symbolTable, transformationManager, termTransformer, solverBinary, + () -> new GenericSmtLibSolverBinary(solverPath, args, EnumSet.noneOf(GenericSmtLibSolverBinary.Solver.class)) + ); + } +} diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibSolverInstaller.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibSolverInstaller.java new file mode 100644 index 0000000000..3dfd9ebe64 --- /dev/null +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/cvc5/CVC5SmtLibSolverInstaller.java @@ -0,0 +1,114 @@ +package hu.bme.mit.theta.solver.smtlib.impl.cvc5; + +import hu.bme.mit.theta.common.OsHelper; +import hu.bme.mit.theta.common.logging.Logger; +import hu.bme.mit.theta.solver.SolverFactory; +import hu.bme.mit.theta.solver.smtlib.solver.installer.SmtLibSolverInstaller; +import hu.bme.mit.theta.solver.smtlib.solver.installer.SmtLibSolverInstallerException; +import hu.bme.mit.theta.solver.smtlib.utils.SemVer; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static hu.bme.mit.theta.common.OsHelper.Architecture.X64; +import static hu.bme.mit.theta.common.OsHelper.OperatingSystem.*; + +public class CVC5SmtLibSolverInstaller extends SmtLibSolverInstaller.Default { + private final List versions; + + public CVC5SmtLibSolverInstaller(final Logger logger) { + super(logger); + + versions = new ArrayList<>(); + versions.add(SemVer.VersionDecoder.create(SemVer.of("1.0.0")) + .addString(LINUX, X64, "Linux") + .addString(MAC, X64, "macOS") + .addString(WINDOWS, X64, "Win64") + .build() + ); + } + + @Override + protected String getSolverName() { + return "cvc5"; + } + + @Override + protected void installSolver(final Path installDir, final String version) throws SmtLibSolverInstallerException { + try( + final var inputChannel = Channels.newChannel(getDownloadUrl(version).openStream()); + final var outputChannel = new FileOutputStream(installDir.resolve(getSolverBinaryName(version)).toAbsolutePath().toString()).getChannel() + ) { + logger.write(Logger.Level.MAINSTEP, "Starting download (%s)...\n", getDownloadUrl(version).toString()); + outputChannel.transferFrom(inputChannel, 0, Long.MAX_VALUE); + installDir.resolve(getSolverBinaryName(version)).toFile().setExecutable(true, true); + } + catch (IOException e) { + throw new SmtLibSolverInstallerException(e); + } + + logger.write(Logger.Level.MAINSTEP, "Download finished\n"); + } + + @Override + protected void uninstallSolver(final Path installDir, final String version) { + // Default uninstall is suitable + } + + @Override + protected String[] getDefaultSolverArgs(String version) { + return new String[] { + "--lang", "smt2", + "--output-lang", "smt2", + "--quiet", + "--incremental" + }; + } + + @Override + public SolverFactory getSolverFactory(final Path installDir, final String version, final Path solverPath, final String[] solverArgs) throws SmtLibSolverInstallerException { + final var solverFilePath = solverPath != null ? solverPath : installDir.resolve(getSolverBinaryName(version)); + return CVC5SmtLibSolverFactory.create(solverFilePath, solverArgs); + } + + @Override + public List getSupportedVersions() { + return Arrays.asList("1.0.2", "1.0.1", "1.0.0"); + } + + private URL getDownloadUrl(final String version) throws SmtLibSolverInstallerException, MalformedURLException { + return URI.create(String.format( + "https://github.com/cvc5/cvc5/releases/download/cvc5-%s/cvc5-%s", + version, getArchString(version) + )).toURL(); + } + + private String getArchString(final String version) throws SmtLibSolverInstallerException { + final var semVer = SemVer.of(version); + String archStr = null; + + for (final var versionDecoder : versions) { + if (semVer.compareTo(versionDecoder.getVersion()) >= 0) { + archStr = versionDecoder.getOsArchString(OsHelper.getOs(), OsHelper.getArch()); + break; + } + } + if (archStr == null) { + throw new SmtLibSolverInstallerException(String.format("MathSAT on operating system %s and architecture %s is not supported", OsHelper.getOs(), OsHelper.getArch())); + } + + return archStr; + } + + private String getSolverBinaryName(final String version) throws SmtLibSolverInstallerException { + return String.format("cvc5-%s", getArchString(version)); + } +} diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibSolverBinary.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibSolverBinary.java index 1a80bd1f2e..acffdd6229 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibSolverBinary.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibSolverBinary.java @@ -25,12 +25,10 @@ import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.Queue; +import java.util.*; import static com.google.common.base.Preconditions.checkState; +import static java.lang.Math.min; public final class GenericSmtLibSolverBinary implements SmtLibSolverBinary { @@ -38,17 +36,17 @@ public final class GenericSmtLibSolverBinary implements SmtLibSolverBinary { private final ProcessHandler processHandler; public GenericSmtLibSolverBinary(final Path solverPath, final String[] args) { - this(solverPath, args, false); + this(solverPath, args, EnumSet.noneOf(Solver.class)); } - public GenericSmtLibSolverBinary(final Path solverPath, final String[] args, final boolean isCvc4) { + public GenericSmtLibSolverBinary(final Path solverPath, final String[] args, final EnumSet solverOverride) { final var processCmd = new ArrayList(); processCmd.add(solverPath.toAbsolutePath().toString()); processCmd.addAll(Arrays.asList(args)); final var solverProcessBuilder = new NuProcessBuilder(processCmd); - processHandler = new ProcessHandler(isCvc4); + processHandler = new ProcessHandler(solverOverride); solverProcessBuilder.setProcessListener(processHandler); solverProcess = solverProcessBuilder.start(); @@ -77,15 +75,22 @@ public void close() { solverProcess.destroy(true); } + public enum Solver { + CVC4, PRINCESS + } + private static final class ProcessHandler extends NuAbstractProcessHandler { private final Queue inputQueue = new LinkedList<>(); + private int headDoneIndex = 0; private final Queue outputQueue = new LinkedList<>(); private ReadProcessor readProcessor = null; private final boolean isCvc4; + private final boolean isPrincess; - public ProcessHandler(final boolean isCvc4) { - this.isCvc4 = isCvc4; + public ProcessHandler(final EnumSet solverOverride) { + this.isCvc4 = solverOverride.contains(Solver.CVC4); + this.isPrincess = solverOverride.contains(Solver.PRINCESS); } public synchronized void write(final String input) { @@ -102,12 +107,21 @@ public synchronized String read() throws InterruptedException { @Override public synchronized boolean onStdinReady(final ByteBuffer buffer) { - while (!inputQueue.isEmpty()) { - buffer.put(inputQueue.remove().getBytes(StandardCharsets.US_ASCII)); - buffer.put("\n".getBytes(StandardCharsets.US_ASCII)); + if (!inputQueue.isEmpty()) { + final var output = inputQueue.peek(); + final var eol = "\n".getBytes(StandardCharsets.US_ASCII); + final var cutoff = min(buffer.remaining() - eol.length, output.length() - headDoneIndex); + buffer.put(output.substring(headDoneIndex, headDoneIndex + cutoff).getBytes(StandardCharsets.US_ASCII)); + if(headDoneIndex + cutoff < output.length()) { + headDoneIndex = headDoneIndex + cutoff; + } else { + inputQueue.remove(); + headDoneIndex = 0; + buffer.put(eol); + } } buffer.flip(); - return false; + return !inputQueue.isEmpty(); } @Override @@ -117,7 +131,7 @@ public synchronized void onStdout(final ByteBuffer buffer, final boolean closed) @Override public synchronized void onStderr(final ByteBuffer buffer, final boolean closed) { - onInput(buffer); + if(!isPrincess) onInput(buffer); } private int isFp = 0; @@ -126,6 +140,7 @@ private synchronized void onInput(final ByteBuffer buffer) { final var buf = new byte[buffer.remaining()]; buffer.get(buf); final var input = new String(buf, StandardCharsets.US_ASCII); + //System.out.println(input); for (var c : input.toCharArray()) { diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibSolverFactory.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibSolverFactory.java index 9676a97c05..a18da0d4c5 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibSolverFactory.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/generic/GenericSmtLibSolverFactory.java @@ -23,20 +23,21 @@ import hu.bme.mit.theta.solver.smtlib.solver.SmtLibSolver; import java.nio.file.Path; +import java.util.EnumSet; public class GenericSmtLibSolverFactory implements SolverFactory { protected final Path solverPath; protected final String[] args; - private final boolean isCvc4; + private final EnumSet solverOverride; protected GenericSmtLibSolverFactory(Path solverPath, String[] args) { - this(solverPath, args, false); + this(solverPath, args, EnumSet.noneOf(GenericSmtLibSolverBinary.Solver.class)); } - protected GenericSmtLibSolverFactory(Path solverPath, String[] args, boolean isCvc4) { + protected GenericSmtLibSolverFactory(Path solverPath, String[] args, EnumSet solverOverride) { this.solverPath = solverPath; this.args = args; - this.isCvc4 = isCvc4; + this.solverOverride = solverOverride; } public static GenericSmtLibSolverFactory create(Path solverPath, String[] args) { @@ -48,7 +49,7 @@ public Solver createSolver() { final var symbolTable = new GenericSmtLibSymbolTable(); final var transformationManager = new GenericSmtLibTransformationManager(symbolTable); final var termTransformer = new GenericSmtLibTermTransformer(symbolTable); - final var solverBinary = new GenericSmtLibSolverBinary(solverPath, args, isCvc4); + final var solverBinary = new GenericSmtLibSolverBinary(solverPath, args, solverOverride); return new SmtLibSolver(symbolTable, transformationManager, termTransformer, solverBinary, false); } @@ -58,7 +59,7 @@ public UCSolver createUCSolver() { final var symbolTable = new GenericSmtLibSymbolTable(); final var transformationManager = new GenericSmtLibTransformationManager(symbolTable); final var termTransformer = new GenericSmtLibTermTransformer(symbolTable); - final var solverBinary = new GenericSmtLibSolverBinary(solverPath, args, isCvc4); + final var solverBinary = new GenericSmtLibSolverBinary(solverPath, args, solverOverride); return new SmtLibSolver(symbolTable, transformationManager, termTransformer, solverBinary, true); } diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/mathsat/MathSATSmtLibSolverInstaller.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/mathsat/MathSATSmtLibSolverInstaller.java index eeeb07357c..61677c8a34 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/mathsat/MathSATSmtLibSolverInstaller.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/mathsat/MathSATSmtLibSolverInstaller.java @@ -28,6 +28,12 @@ public MathSATSmtLibSolverInstaller(final Logger logger) { super(logger); versions = new ArrayList<>(); + versions.add(SemVer.VersionDecoder.create(SemVer.of("5.6.7")) + .addString(LINUX, X64, "linux-x86_64") + .addString(MAC, X64, "osx") + .addString(WINDOWS, X64, "win64-msvc") + .build() + ); versions.add(SemVer.VersionDecoder.create(SemVer.of("5.5.0")) .addString(LINUX, X64, "linux-x86_64") .addString(MAC, X64, "darwin-libcxx-x86_64") @@ -142,7 +148,7 @@ public SolverFactory getSolverFactory(final Path installDir, final String versio @Override public List getSupportedVersions() { return Arrays.asList( - "5.6.6", "5.6.5", "5.6.4", "5.6.3", "5.6.2", "5.6.1", "5.6.0", + "5.6.8", "5.6.7", "5.6.6", "5.6.5", "5.6.4", "5.6.3", "5.6.2", "5.6.1", "5.6.0", "5.5.4", "5.5.3", "5.5.2", "5.5.1", "5.5.0", "5.4.1", "5.4.0", "5.3.14", "5.3.13", "5.3.12", "5.3.11", "5.3.10", "5.3.9", "5.3.8", "5.3.7", "5.3.6", "5.3.5", "5.3.4", "5.3.3", "5.3.2", "5.3.1", diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/princess/PrincessSmtLibSolverFactory.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/princess/PrincessSmtLibSolverFactory.java index 5d61eb15c2..f2e51cd588 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/princess/PrincessSmtLibSolverFactory.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/princess/PrincessSmtLibSolverFactory.java @@ -1,6 +1,8 @@ package hu.bme.mit.theta.solver.smtlib.impl.princess; import hu.bme.mit.theta.solver.ItpSolver; +import hu.bme.mit.theta.solver.Solver; +import hu.bme.mit.theta.solver.UCSolver; import hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSolverBinary; import hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSolverFactory; import hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSymbolTable; @@ -8,10 +10,11 @@ import hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibTransformationManager; import java.nio.file.Path; +import java.util.EnumSet; public class PrincessSmtLibSolverFactory extends GenericSmtLibSolverFactory { private PrincessSmtLibSolverFactory(Path solverPath, String[] args) { - super(solverPath, args); + super(solverPath, args, EnumSet.of(GenericSmtLibSolverBinary.Solver.PRINCESS)); } public static PrincessSmtLibSolverFactory create(Path solverPath, String[] args) { @@ -23,7 +26,7 @@ public ItpSolver createItpSolver() { final var symbolTable = new GenericSmtLibSymbolTable(); final var transformationManager = new GenericSmtLibTransformationManager(symbolTable); final var termTransformer = new GenericSmtLibTermTransformer(symbolTable); - final var solverBinary = new GenericSmtLibSolverBinary(solverPath, args); + final var solverBinary = new GenericSmtLibSolverBinary(solverPath, args, EnumSet.of(GenericSmtLibSolverBinary.Solver.PRINCESS)); return new PrincessSmtLibItpSolver(symbolTable, transformationManager, termTransformer, solverBinary); } diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/princess/PrincessSmtLibSolverInstaller.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/princess/PrincessSmtLibSolverInstaller.java index b6c0dad3a7..7513277be6 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/princess/PrincessSmtLibSolverInstaller.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/princess/PrincessSmtLibSolverInstaller.java @@ -27,10 +27,15 @@ protected String getSolverName() { @Override protected void installSolver(final Path installDir, final String version) throws SmtLibSolverInstallerException { - final var downloadUrl = URI.create(String.format( - "http://www.philipp.ruemmer.org/princess/princess-bin-%s.zip", - version - )); + final var downloadUrl = Integer.parseInt(version.substring(0, 4)) > 2021 ? + URI.create(String.format( + "https://github.com/uuverifiers/princess/releases/download/snapshot-%s/princess-bin-%s.zip", + version, version + )) : + URI.create(String.format( + "http://www.philipp.ruemmer.org/princess/princess-bin-%s.zip", + version + )); logger.write(Logger.Level.MAINSTEP, "Starting download (%s)...\n", downloadUrl.toString()); @@ -68,6 +73,7 @@ public SolverFactory getSolverFactory(final Path installDir, final String versio @Override public List getSupportedVersions() { return Arrays.asList( + "2022-07-01", "2021-11-15", "2021-05-10", "2021-03-10", "2020-03-12", "2019-10-02", "2019-07-24", "2018-10-26", "2018-05-25", "2018-01-27", "2017-12-06", "2017-07-17" ); diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/smtinterpol/SMTInterpolSmtLibSolverInstaller.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/smtinterpol/SMTInterpolSmtLibSolverInstaller.java index 57ce9c5867..027b99e26f 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/smtinterpol/SMTInterpolSmtLibSolverInstaller.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/smtinterpol/SMTInterpolSmtLibSolverInstaller.java @@ -50,7 +50,7 @@ protected void uninstallSolver(final Path installDir, final String version) { @Override protected String[] getDefaultSolverArgs(String version) { - return new String[] { "-smt2" }; + return new String[] { "-smt2", "-q" }; } @Override @@ -61,12 +61,13 @@ public SolverFactory getSolverFactory(final Path installDir, final String versio @Override public List getSupportedVersions() { - return Arrays.asList("2.5-916", "2.5-663", "2.5-479", "2.5-7"); + return Arrays.asList("2.5-1230", "2.5-916", "2.5-663", "2.5-479", "2.5-7"); } private URL getDownloadUrl(final String version) throws SmtLibSolverInstallerException, MalformedURLException { final String fileName; switch (version) { + case "2.5-1230": fileName = "2.5-1230-g3eafb46a"; break; case "2.5-916": fileName = "2.5-916-ga5843d8b"; break; case "2.5-663": fileName = "2.5-663-gf15aa217"; break; case "2.5-479": fileName = "2.5-479-ga49e50b1"; break; diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/yices2/Yices2SmtLibSolver.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/yices2/Yices2SmtLibSolver.java deleted file mode 100644 index 7b84ca093e..0000000000 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/yices2/Yices2SmtLibSolver.java +++ /dev/null @@ -1,92 +0,0 @@ -package hu.bme.mit.theta.solver.smtlib.impl.yices2; - -import hu.bme.mit.theta.common.Tuple2; -import hu.bme.mit.theta.core.model.Valuation; -import hu.bme.mit.theta.solver.SolverStatus; -import hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Lexer; -import hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser; -import hu.bme.mit.theta.solver.smtlib.solver.SmtLibSolver; -import hu.bme.mit.theta.solver.smtlib.solver.SmtLibSolverException; -import hu.bme.mit.theta.solver.smtlib.solver.binary.SmtLibSolverBinary; -import hu.bme.mit.theta.solver.smtlib.solver.model.SmtLibModel; -import hu.bme.mit.theta.solver.smtlib.solver.model.SmtLibValuation; -import hu.bme.mit.theta.solver.smtlib.solver.parser.GetModelResponse; -import hu.bme.mit.theta.solver.smtlib.solver.parser.ThrowExceptionErrorListener; -import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibSymbolTable; -import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibTermTransformer; -import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibTransformationManager; -import org.antlr.v4.runtime.CharStreams; -import org.antlr.v4.runtime.CommonTokenStream; - -import java.util.HashMap; - -import static com.google.common.base.Preconditions.checkState; - -public class Yices2SmtLibSolver extends SmtLibSolver { - private Valuation model; - private SolverStatus status; - - public Yices2SmtLibSolver( - final SmtLibSymbolTable symbolTable, final SmtLibTransformationManager transformationManager, - final SmtLibTermTransformer termTransformer, final SmtLibSolverBinary solverBinary, - final boolean unsatCoreEnabled - ) { - super(symbolTable, transformationManager, termTransformer, solverBinary, unsatCoreEnabled); - } - - @Override - public SolverStatus check() { - return status = super.check(); - } - - @Override - public Valuation getModel() { - checkState(status == SolverStatus.SAT, "Cannot get model if status is not SAT."); - - if (model == null) { - model = extractModel(); - } - - return model; - } - - private Valuation extractModel() { - assert status == SolverStatus.SAT; - assert model == null; - - solverBinary.issueCommand("(get-model)"); - - final var modelValues = new HashMap(); - for(final var ignored : declarationStack.toCollection()) { - final var value = parseModelResponse(solverBinary.readResponse()); - modelValues.put(value.get1(), value.get2()); - } - - return new SmtLibValuation(symbolTable, transformationManager, termTransformer, new SmtLibModel(modelValues)); - } - - private Tuple2 parseModelResponse(final String response) { - try { - final var lexer = new SMTLIBv2Lexer(CharStreams.fromString(response)); - final var parser = new SMTLIBv2Parser(new CommonTokenStream(lexer)); - lexer.removeErrorListeners(); - lexer.addErrorListener(new ThrowExceptionErrorListener()); - parser.removeErrorListeners(); - parser.addErrorListener(new ThrowExceptionErrorListener()); - - final var term = parser.term().generic_term(); - final var id = GetModelResponse.extractString(term.qual_identifier()); - final var variable = GetModelResponse.extractString(term.term(0)); - final var value = GetModelResponse.extractString(term.term(1)); - - if(id.equals("=")) { - return Tuple2.of(variable, String.format("%s () (_ theta_type unknown) %s", variable, value)); - } - - throw new SmtLibSolverException("Could not parse solver output: " + response); - } - catch (Exception e) { - throw new SmtLibSolverException("Could not parse solver output: " + response, e); - } - } -} diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/yices2/Yices2SmtLibSolverFactory.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/yices2/Yices2SmtLibSolverFactory.java deleted file mode 100644 index b2c1712ecb..0000000000 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/yices2/Yices2SmtLibSolverFactory.java +++ /dev/null @@ -1,22 +0,0 @@ -package hu.bme.mit.theta.solver.smtlib.impl.yices2; - -import hu.bme.mit.theta.solver.ItpSolver; -import hu.bme.mit.theta.solver.smtlib.impl.generic.GenericSmtLibSolverFactory; - -import java.nio.file.Path; - -public class Yices2SmtLibSolverFactory extends GenericSmtLibSolverFactory { - - private Yices2SmtLibSolverFactory(Path solverPath, String[] args) { - super(solverPath, args); - } - - public static Yices2SmtLibSolverFactory create(Path solverPath, String[] args) { - return new Yices2SmtLibSolverFactory(solverPath, args); - } - - @Override - public ItpSolver createItpSolver() { - throw new UnsupportedOperationException("Yices2 does not support interpolation"); - } -} diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/yices2/Yices2SmtLibSolverInstaller.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/yices2/Yices2SmtLibSolverInstaller.java deleted file mode 100644 index 4483dc8222..0000000000 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/yices2/Yices2SmtLibSolverInstaller.java +++ /dev/null @@ -1,125 +0,0 @@ -package hu.bme.mit.theta.solver.smtlib.impl.yices2; - -import hu.bme.mit.theta.common.OsHelper; -import hu.bme.mit.theta.common.logging.Logger; -import hu.bme.mit.theta.solver.SolverFactory; -import hu.bme.mit.theta.solver.smtlib.solver.installer.SmtLibSolverInstaller; -import hu.bme.mit.theta.solver.smtlib.solver.installer.SmtLibSolverInstallerException; -import hu.bme.mit.theta.solver.smtlib.utils.Compress; -import hu.bme.mit.theta.solver.smtlib.utils.SemVer; - -import java.io.IOException; -import java.net.URI; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import static hu.bme.mit.theta.common.OsHelper.Architecture.X64; -import static hu.bme.mit.theta.common.OsHelper.OperatingSystem.LINUX; -import static hu.bme.mit.theta.common.OsHelper.OperatingSystem.MAC; -import static hu.bme.mit.theta.common.OsHelper.OperatingSystem.WINDOWS; - -public class Yices2SmtLibSolverInstaller extends SmtLibSolverInstaller.Default { - private final List versions; - - public Yices2SmtLibSolverInstaller(final Logger logger) { - super(logger); - - versions = new ArrayList<>(); - versions.add(SemVer.VersionDecoder.create(SemVer.of("2.6.2")) - .addString(LINUX, X64, "x86_64-pc-linux-gnu-static-gmp") - .addString(MAC, X64, "x86_64-apple-darwin18.7.0-static-gmp") - .addString(WINDOWS, X64, "x86_64-pc-mingw32-static-gmp") - .build() - ); - versions.add(SemVer.VersionDecoder.create(SemVer.of("2.5.4")) - .addString(LINUX, X64, "x86_64-pc-linux-gnu-static-gmp") - .addString(MAC, X64, "x86_64-apple-darwin16.7.0-static-gmp") - .addString(WINDOWS, X64, "x86_64-pc-mingw32-static-gmp") - .build() - ); - versions.add(SemVer.VersionDecoder.create(SemVer.of("2.5.3")) - .addString(LINUX, X64, "x86_64-unknown-linux-gnu-static-gmp") - .addString(MAC, X64, "x86_64-apple-darwin16.7.0-static-gmp") - .addString(WINDOWS, X64, "x86_64-pc-mingw32-static-gmp") - .build() - ); - } - - @Override - protected String getSolverName() { - return "yices2"; - } - - @Override - protected void installSolver(Path installDir, String version) throws SmtLibSolverInstallerException { - final var semVer = SemVer.of(version); - String archStr = null; - - for(final var versionDecoder : versions) { - if(semVer.compareTo(versionDecoder.getVersion()) >= 0) { - archStr = versionDecoder.getOsArchString(OsHelper.getOs(), OsHelper.getArch()); - break; - } - } - if(archStr == null) { - throw new SmtLibSolverInstallerException(String.format("Yices2 on operating system %s and architecture %s is not supported", OsHelper.getOs(), OsHelper.getArch())); - } - - final var downloadUrl = URI.create(String.format( - "https://yices.csl.sri.com/releases/%s/yices-%s-%s.%s", - version, version, archStr, OsHelper.getOs().equals(WINDOWS) ? "zip" : "tar.gz" - )); - - logger.write(Logger.Level.MAINSTEP, "Starting download (%s)...\n", downloadUrl.toString()); - - try(final var inputStream = downloadUrl.toURL().openStream()) { - if(OsHelper.getOs().equals(WINDOWS)) { - Compress.extract(inputStream, installDir, Compress.CompressionType.ZIP); - } - else { - Compress.extract(inputStream, installDir, Compress.CompressionType.TARGZ); - } - installDir.resolve("bin").resolve(getSolverBinaryName()).toFile().setExecutable(true, true); - } - catch (IOException e) { - throw new SmtLibSolverInstallerException(e); - } - - logger.write(Logger.Level.MAINSTEP, "Download finished\n"); - } - - @Override - protected void uninstallSolver(Path installDir, String version) { } - - @Override - protected String[] getDefaultSolverArgs(String version) { - return new String[] { "--incremental" }; - } - - @Override - public SolverFactory getSolverFactory(final Path installDir, final String version, final Path solverPath, final String[] solverArgs) throws SmtLibSolverInstallerException { - final var solverFilePath = solverPath != null ? solverPath : installDir.resolve("bin").resolve(getSolverBinaryName()); - return Yices2SmtLibSolverFactory.create(solverFilePath, solverArgs); - } - - @Override - public List getSupportedVersions() { - return Arrays.asList( - "2.6.2", "2.6.1", "2.6.0" - ); - } - - private String getSolverBinaryName() { - switch(OsHelper.getOs()) { - case WINDOWS: - return "yices-smt2.exe"; - case LINUX: - case MAC: - return "yices-smt2"; - default: - throw new AssertionError(); - } - } -} diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3NewSmtLibItpSolver.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3NewSmtLibItpSolver.java new file mode 100644 index 0000000000..36e723342c --- /dev/null +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3NewSmtLibItpSolver.java @@ -0,0 +1,126 @@ +package hu.bme.mit.theta.solver.smtlib.impl.z3; + +import hu.bme.mit.theta.common.Tuple2; +import hu.bme.mit.theta.core.decl.ConstDecl; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.solver.*; +import hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Lexer; +import hu.bme.mit.theta.solver.smtlib.dsl.gen.SMTLIBv2Parser; +import hu.bme.mit.theta.solver.smtlib.solver.SmtLibItpSolver; +import hu.bme.mit.theta.solver.smtlib.solver.SmtLibSolverException; +import hu.bme.mit.theta.solver.smtlib.solver.binary.SmtLibSolverBinary; +import hu.bme.mit.theta.solver.smtlib.solver.interpolation.SmtLibInterpolant; +import hu.bme.mit.theta.solver.smtlib.solver.interpolation.SmtLibItpPattern; +import hu.bme.mit.theta.solver.smtlib.solver.model.SmtLibModel; +import hu.bme.mit.theta.solver.smtlib.solver.parser.ThrowExceptionErrorListener; +import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibSymbolTable; +import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibTermTransformer; +import hu.bme.mit.theta.solver.smtlib.solver.transformer.SmtLibTransformationManager; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.misc.Interval; + +import java.util.*; +import java.util.stream.Collectors; + +import static com.google.common.base.Preconditions.*; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.Bool; +import static hu.bme.mit.theta.core.type.booltype.BoolExprs.False; + +public class Z3NewSmtLibItpSolver extends SmtLibItpSolver { + private final Map, String> assertionNames = new HashMap<>(); + private static final String assertionNamePattern = "_z3_assertion_%d"; + private static long assertionCount = 0; + + public Z3NewSmtLibItpSolver(final SmtLibSymbolTable symbolTable, final SmtLibTransformationManager transformationManager, final SmtLibTermTransformer termTransformer, final SmtLibSolverBinary solverBinary) { + super(symbolTable, transformationManager, termTransformer, solverBinary); + } + + @Override + public ItpPattern createTreePattern(ItpMarkerTree root) { + checkNotNull(root); + return SmtLibItpPattern.of(root); + } + + @Override + public Z3SmtLibItpMarker createMarker() { + final var marker = new Z3SmtLibItpMarker(); + markers.add(marker); + return marker; + } + + @Override + protected void add(Z3SmtLibItpMarker marker, Expr assertion, Set> consts, String term) { + consts.stream().map(symbolTable::getDeclaration).forEach(this::issueGeneralCommand); + + final var name = String.format(assertionNamePattern, assertionCount++); + assertionNames.put(assertion, name); + issueGeneralCommand(String.format("(assert (! %s :named %s))", term, name)); + } + + @Override + public Interpolant getInterpolant(ItpPattern pattern) { + checkState(getStatus() == SolverStatus.UNSAT, "Cannot get interpolant if status is not UNSAT."); + checkArgument(pattern instanceof SmtLibItpPattern); + @SuppressWarnings("unchecked") + final var z3ItpPattern = (SmtLibItpPattern) pattern; + final List markers = z3ItpPattern.getSequence(); + + final List A = new ArrayList<>(); + final List B = new ArrayList<>(markers); + + final Map> itpMap = new HashMap<>(); + for (final var marker : markers) { + B.remove(marker); + A.add(marker); + + if(B.size() != 0) { + final var aTerm = A.stream().flatMap(m -> m.getTerms().stream().map(Tuple2::get1)).map(assertionNames::get); + final var bTerm = B.stream().flatMap(m -> m.getTerms().stream().map(Tuple2::get1)).map(assertionNames::get); + + solverBinary.issueCommand(String.format("(get-interpolant (and %s) (and %s))", aTerm.collect(Collectors.joining(" ")), bTerm.collect(Collectors.joining(" ")))); + + itpMap.put(marker, termTransformer.toExpr(parseItpResponse(solverBinary.readResponse()), Bool(), new SmtLibModel(Collections.emptyMap()))); + } + else { + itpMap.put(marker, False()); + } + } + + return new SmtLibInterpolant(itpMap); + } + + private String parseItpResponse(final String response) { + final var lexer = new SMTLIBv2Lexer(CharStreams.fromString(response)); + final var parser = new SMTLIBv2Parser(new CommonTokenStream(lexer)); + try { + lexer.removeErrorListeners(); + lexer.addErrorListener(new ThrowExceptionErrorListener()); + parser.removeErrorListeners(); + parser.addErrorListener(new ThrowExceptionErrorListener()); + return extractString(parser.term()); + } + catch (Exception e) { + try { + throw new SmtLibSolverException(parser.response().general_response_error().reason.getText()); + } + catch(Exception ex) { + throw new SmtLibSolverException("Could not parse solver output: " + response, e); + } + } + } + + private static String extractString(final ParserRuleContext ctx) { + return ctx.start.getInputStream().getText(new Interval(ctx.start.getStartIndex(), ctx.stop.getStopIndex())); + } + + @Override + protected void init() { + issueGeneralCommand("(set-option :print-success true)"); + issueGeneralCommand("(set-option :produce-models true)"); + //issueGeneralCommand("(set-option :produce-interpolants true)"); + issueGeneralCommand("(set-logic ALL)"); + } +} diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibItpSolver.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3OldSmtLibItpSolver.java similarity index 98% rename from subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibItpSolver.java rename to subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3OldSmtLibItpSolver.java index b5f5187ee4..12497ecf56 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibItpSolver.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3OldSmtLibItpSolver.java @@ -40,10 +40,10 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkState; -public final class Z3SmtLibItpSolver extends SmtLibItpSolver { +public final class Z3OldSmtLibItpSolver extends SmtLibItpSolver { private boolean topMostContainsAssertions = false; - public Z3SmtLibItpSolver( + public Z3OldSmtLibItpSolver( final SmtLibSymbolTable symbolTable, final SmtLibTransformationManager transformationManager, final SmtLibTermTransformer termTransformer, final SmtLibSolverBinary solverBinary ) { diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibSolverFactory.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibSolverFactory.java index ec580ed951..73cdd934b7 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibSolverFactory.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibSolverFactory.java @@ -10,29 +10,41 @@ import java.nio.file.Path; public class Z3SmtLibSolverFactory extends GenericSmtLibSolverFactory { - private final boolean itpSupported; + public enum Z3ItpSupport { + NONE, OLD, NEW + } + + private final Z3ItpSupport itpSupport; - private Z3SmtLibSolverFactory(Path solverPath, String[] args, boolean itpSupported) { + private Z3SmtLibSolverFactory(Path solverPath, String[] args, Z3ItpSupport itpSupport) { super(solverPath, args); - this.itpSupported = itpSupported; + this.itpSupport = itpSupport; } - public static Z3SmtLibSolverFactory create(Path solverPath, String[] args, boolean itpSupported) { - return new Z3SmtLibSolverFactory(solverPath, args, itpSupported); + public static Z3SmtLibSolverFactory create(Path solverPath, String[] args, Z3ItpSupport itpSupport) { + return new Z3SmtLibSolverFactory(solverPath, args, itpSupport); } @Override public ItpSolver createItpSolver() { - if(itpSupported) { + if(!itpSupport.equals(Z3ItpSupport.NONE)) { final var symbolTable = new GenericSmtLibSymbolTable(); final var transformationManager = new GenericSmtLibTransformationManager(symbolTable); final var termTransformer = new GenericSmtLibTermTransformer(symbolTable); final var solverBinary = new GenericSmtLibSolverBinary(solverPath, args); - return new Z3SmtLibItpSolver(symbolTable, transformationManager, termTransformer, solverBinary); + if(itpSupport.equals(Z3ItpSupport.OLD)) { + return new Z3OldSmtLibItpSolver(symbolTable, transformationManager, termTransformer, solverBinary); + } + else if(itpSupport.equals(Z3ItpSupport.NEW)) { + return new Z3NewSmtLibItpSolver(symbolTable, transformationManager, termTransformer, solverBinary); + } + else { + throw new AssertionError(); + } } else { - throw new UnsupportedOperationException("Z3 interpolation supported below 4.5.0"); + throw new UnsupportedOperationException("Z3 interpolation supported below 4.5.0 and above 4.8.8"); } } } diff --git a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibSolverInstaller.java b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibSolverInstaller.java index b69d66af09..5dc684ec01 100644 --- a/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibSolverInstaller.java +++ b/subprojects/solver/solver-smtlib/src/main/java/hu/bme/mit/theta/solver/smtlib/impl/z3/Z3SmtLibSolverInstaller.java @@ -29,6 +29,13 @@ public Z3SmtLibSolverInstaller(final Logger logger) { versions = new ArrayList<>(); versions.add(SemVer.VersionDecoder.create(SemVer.of("4.8.12")) + .addString(LINUX, X64, "x64-glibc-2.31") + .addString(WINDOWS, X64, "x64-win") + .addString(WINDOWS, X86, "x86-win") + .addString(MAC, X64, "x64-osx-10.16") + .build() + ); + versions.add(SemVer.VersionDecoder.create(SemVer.of("4.8.11")) .addString(LINUX, X64, "x64-glibc-2.31") .addString(WINDOWS, X64, "x64-win") .addString(WINDOWS, X86, "x86-win") @@ -142,14 +149,23 @@ protected String[] getDefaultSolverArgs(String version) { @Override public SolverFactory getSolverFactory(final Path installDir, final String version, final Path solverPath, final String[] solverArgs) throws SmtLibSolverInstallerException { final var solverFilePath = solverPath != null ? solverPath : installDir.resolve("bin").resolve(getSolverBinaryName()); - return Z3SmtLibSolverFactory.create(solverFilePath, solverArgs, SemVer.of(version).compareTo(SemVer.of("4.5.0")) <= 0); + if(SemVer.of(version).compareTo(SemVer.of("4.5.0")) <= 0) { + return Z3SmtLibSolverFactory.create(solverFilePath, solverArgs, Z3SmtLibSolverFactory.Z3ItpSupport.OLD); + } + else if(SemVer.of(version).compareTo(SemVer.of("4.8.8")) >= 0) { + return Z3SmtLibSolverFactory.create(solverFilePath, solverArgs, Z3SmtLibSolverFactory.Z3ItpSupport.NEW); + } + else { + return Z3SmtLibSolverFactory.create(solverFilePath, solverArgs, Z3SmtLibSolverFactory.Z3ItpSupport.NONE); + } } @Override public List getSupportedVersions() { return Arrays.asList( - "4.8.12", "4.8.11", "3.8.10", "4.8.9", "4.8.8", "4.8.7", "4.8.6", "4.8.5", "4.8.4", "4.8.3", - "4.8.2", "4.8.1", "4.7.1", "4.6.0", "4.5.0", "4.4.1", "4.4.0", "4.3.2" + "4.11.2", "4.11.0", "4.10.2", "4.10.1", "4.10.0", "4.9.1", "4.9.0", + "4.8.17", "4.8.16", "4.8.15", "4.8.14", "4.8.13", "4.8.12", "4.8.11", "4.8.10", "4.8.9", "4.8.8", "4.8.7", + "4.8.6", "4.8.5", "4.8.4", "4.8.3", "4.8.2", "4.8.1", "4.7.1", "4.6.0", "4.5.0", "4.4.1", "4.4.0", "4.3.2" ); } diff --git a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibItpSolverTest.java b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibItpSolverTest.java index f8351c3899..a60d81e700 100644 --- a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibItpSolverTest.java +++ b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibItpSolverTest.java @@ -63,6 +63,8 @@ public final class SmtLibItpSolverTest { private static boolean solverInstalled = false; private static SmtLibSolverManager solverManager; private static SolverFactory solverFactory; + private static final String SOLVER = "z3"; + private static final String VERSION = "4.5.0"; @BeforeClass public static void init() throws SmtLibSolverInstallerException, IOException { @@ -71,18 +73,19 @@ public static void init() throws SmtLibSolverInstallerException, IOException { solverManager = SmtLibSolverManager.create(home, NullLogger.getInstance()); try { - solverManager.install("z3", "4.5.0", "4.5.0", null, false); + solverManager.install(SOLVER, VERSION, VERSION, null, false); solverInstalled = true; } catch (SmtLibSolverInstallerException e) { + e.printStackTrace(); } - solverFactory = solverManager.getSolverFactory("z3", "4.5.0"); + solverFactory = solverManager.getSolverFactory(SOLVER, VERSION); } } @AfterClass public static void destroy() throws SmtLibSolverInstallerException { - if(solverInstalled) solverManager.uninstall("z3", "4.5.0"); + if(solverInstalled) solverManager.uninstall(SOLVER, VERSION); } ItpSolver solver; diff --git a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverBVTest.java b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverBVTest.java index c1b3125947..263590cf6f 100644 --- a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverBVTest.java +++ b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverBVTest.java @@ -28,10 +28,10 @@ @RunWith(Parameterized.class) public class SmtLibSolverBVTest { - private static final String SOLVER = "z3"; - private static final String VERSION = "4.5.0"; private static boolean solverInstalled = false; private static SmtLibSolverManager solverManager; + private static final String SOLVER = "z3"; + private static final String VERSION = "4.11.2"; @Parameterized.Parameter(0) public Class exprType; diff --git a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverFPTest.java b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverFPTest.java index f6879af48c..8c624fc411 100644 --- a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverFPTest.java +++ b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverFPTest.java @@ -40,6 +40,9 @@ public class SmtLibSolverFPTest { private static boolean solverInstalled = false; private static SmtLibSolverManager solverManager; + private static final String SOLVER = "cvc5"; + private static final String VERSION = "1.0.2"; + @Parameterized.Parameter(0) public Class exprType; @@ -56,7 +59,7 @@ public static void init() throws SmtLibSolverInstallerException, IOException { solverManager = SmtLibSolverManager.create(home, NullLogger.getInstance()); try { - solverManager.install("z3", "4.5.0", "4.5.0", null, false); + solverManager.install(SOLVER, VERSION, VERSION, null, false); solverInstalled = true; } catch (SmtLibSolverInstallerException e) { } @@ -65,7 +68,7 @@ public static void init() throws SmtLibSolverInstallerException, IOException { @AfterClass public static void destroy() throws SmtLibSolverInstallerException { - if(solverInstalled) solverManager.uninstall("z3", "4.5.0"); + if(solverInstalled) solverManager.uninstall(SOLVER, VERSION); } @Parameters(name = "expr: {0}, expected: {1}, actual: {2}") @@ -94,7 +97,7 @@ public void testOperationEquals() throws Exception { ); // Equality check - try(final Solver solver = solverManager.getSolverFactory("z3", "latest").createSolver()) { + try(final Solver solver = solverManager.getSolverFactory(SOLVER, VERSION).createSolver()) { solver.push(); if (expected instanceof FpLitExpr && actual.getType() instanceof FpType) { diff --git a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverTest.java b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverTest.java index ecac1d4e4e..bb0d697340 100644 --- a/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverTest.java +++ b/subprojects/solver/solver-smtlib/src/test/java/hu/bme/mit/theta/solver/smtlib/SmtLibSolverTest.java @@ -57,6 +57,9 @@ public final class SmtLibSolverTest { private static SmtLibSolverManager solverManager; private static SolverFactory solverFactory; + private static final String SOLVER = "cvc5"; + private static final String VERSION = "1.0.2"; + @BeforeClass public static void init() throws SmtLibSolverInstallerException, IOException { if(OsHelper.getOs().equals(OsHelper.OperatingSystem.LINUX)) { @@ -64,18 +67,19 @@ public static void init() throws SmtLibSolverInstallerException, IOException { solverManager = SmtLibSolverManager.create(home, NullLogger.getInstance()); try { - solverManager.install("z3", "4.5.0", "4.5.0", null, false); + solverManager.install(SOLVER, VERSION, VERSION, null, false); solverInstalled = true; } catch (SmtLibSolverInstallerException e) { + e.printStackTrace(); } - solverFactory = solverManager.getSolverFactory("z3", "4.5.0"); + solverFactory = solverManager.getSolverFactory(SOLVER, VERSION); } } @AfterClass public static void destroy() throws SmtLibSolverInstallerException { - if(solverInstalled) solverManager.uninstall("z3", "4.5.0"); + if(solverInstalled) solverManager.uninstall(SOLVER, VERSION); } @Before diff --git a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3SolverFactory.java b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3SolverFactory.java index 26e0e72674..b38aba6154 100644 --- a/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3SolverFactory.java +++ b/subprojects/solver/solver-z3/src/main/java/hu/bme/mit/theta/solver/z3/Z3SolverFactory.java @@ -45,6 +45,7 @@ private static void loadLibraries() { System.loadLibrary("libz3java"); break; case LINUX: + case MAC: System.loadLibrary("z3java"); break; default: diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/common/XcfaConfigBuilder.java b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/common/XcfaConfigBuilder.java index 10550c1f18..d0babcf0db 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/common/XcfaConfigBuilder.java +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/common/XcfaConfigBuilder.java @@ -66,11 +66,7 @@ import hu.bme.mit.theta.xcfa.analysis.common.autoexpl.XcfaGlobalStaticAutoExpl; import hu.bme.mit.theta.xcfa.analysis.common.autoexpl.XcfaNewAtomsAutoExpl; import hu.bme.mit.theta.xcfa.analysis.common.autoexpl.XcfaNewOperandsAutoExpl; -import hu.bme.mit.theta.xcfa.analysis.impl.interleavings.XcfaInitFunc; -import hu.bme.mit.theta.xcfa.analysis.impl.interleavings.XcfaLts; -import hu.bme.mit.theta.xcfa.analysis.impl.interleavings.XcfaOrd; -import hu.bme.mit.theta.xcfa.analysis.impl.interleavings.XcfaPrecRefiner; -import hu.bme.mit.theta.xcfa.analysis.impl.interleavings.XcfaTransFunc; +import hu.bme.mit.theta.xcfa.analysis.impl.interleavings.*; import hu.bme.mit.theta.xcfa.analysis.impl.singlethread.XcfaDistToErrComparator; import hu.bme.mit.theta.xcfa.analysis.impl.singlethread.XcfaSTInitFunc; import hu.bme.mit.theta.xcfa.analysis.impl.singlethread.XcfaSTLts; @@ -101,7 +97,7 @@ public enum Refinement { public enum Algorithm { SINGLETHREAD { @Override - public LTS, ? extends XcfaAction> getLts() { + public LTS, ? extends XcfaAction> getLts(XCFA xcfa) { return new XcfaSTLts(); } @@ -134,7 +130,7 @@ public Analysis, ? extends XcfaAction> getLts() { + public LTS, ? extends XcfaAction> getLts(XCFA xcfa) { return new XcfaLts(); } @@ -162,9 +158,41 @@ public PartialOrd> getPartialOrder(final Part public Analysis, A, XcfaPrec

> getAnalysis(final List initLocs, final Analysis analysis) { return XcfaAnalysis.create(initLocs, getPartialOrder(analysis.getPartialOrd()), getInitFunc(initLocs, analysis.getInitFunc()), getTransFunc(analysis.getTransFunc())); } + }, + + INTERLEAVINGS_POR { + @Override + public LTS, ? extends XcfaAction> getLts(XCFA xcfa) { + return new XcfaPorLts(xcfa); + } + + @Override + public InitFunc, XcfaPrec

> getInitFunc(List initLocs, InitFunc initFunc) { + return INTERLEAVINGS.getInitFunc(initLocs, initFunc); + } + + @Override + public TransFunc, A, XcfaPrec

> getTransFunc(TransFunc transFunc) { + return INTERLEAVINGS.getTransFunc(transFunc); + } + + @Override + public

PrecRefiner, ? extends StmtAction, XcfaPrec

, R> getPrecRefiner(RefutationToPrec refToPrec) { + return INTERLEAVINGS.getPrecRefiner(refToPrec); + } + + @Override + public PartialOrd> getPartialOrder(PartialOrd partialOrd) { + return INTERLEAVINGS.getPartialOrder(partialOrd); + } + + @Override + public Analysis, ? extends A, ? extends XcfaPrec

> getAnalysis(List initLoc, Analysis analysis) { + return INTERLEAVINGS.getAnalysis(initLoc, analysis); + } }; - public abstract LTS, ? extends XcfaAction> getLts(); + public abstract LTS, ? extends XcfaAction> getLts(XCFA xcfa); public abstract InitFunc, XcfaPrec

> getInitFunc(final List initLocs, final InitFunc initFunc); @@ -299,7 +327,7 @@ public XcfaConfigBuilder pruneStrategy(final PruneStrategy pruneStrategy) { } public XcfaConfig build(final XCFA xcfa) { - final LTS lts = algorithm.getLts(); + final LTS lts = algorithm.getLts(xcfa); final Abstractor abstractor; final Refiner refiner; final XcfaPrec prec; diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/interleavings/XcfaAction.java b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/interleavings/XcfaAction.java index 527a55a581..baf1e047de 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/interleavings/XcfaAction.java +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/interleavings/XcfaAction.java @@ -29,19 +29,25 @@ public class XcfaAction extends hu.bme.mit.theta.xcfa.analysis.common.XcfaAction { private final Integer process; + private final XcfaEdge edge; private final List labels; private final XcfaLocation source; private final XcfaLocation target; - protected XcfaAction(final Integer process, final XcfaLocation source, final XcfaLocation target, final List labels) { + protected XcfaAction(final Integer process, final XcfaEdge edge, final List labels) { this.process = checkNotNull(process); - this.source = checkNotNull(source); - this.target = checkNotNull(target); + this.edge = checkNotNull(edge); + this.source = checkNotNull(edge.getSource()); + this.target = checkNotNull(edge.getTarget()); this.labels = checkNotNull(labels); } public static XcfaAction create(final Integer process, final XcfaEdge edge) { - return new XcfaAction(process, edge.getSource(), edge.getTarget(), edge.getLabels()); + return new XcfaAction(process, edge, edge.getLabels()); + } + + public XcfaEdge getEdge() { + return edge; } public XcfaLocation getSource() { @@ -75,6 +81,6 @@ public Integer getProcess() { } public XcfaAction withLabels(final List stmts) { - return new XcfaAction(process, source, target, stmts); + return new XcfaAction(process, edge, stmts); } } diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/interleavings/XcfaLts.java b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/interleavings/XcfaLts.java index f0d6166d6c..20aac2c839 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/interleavings/XcfaLts.java +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/interleavings/XcfaLts.java @@ -27,6 +27,12 @@ import java.util.List; public final class XcfaLts implements LTS, XcfaAction> { + /** + * Returns the enabled actions in the ARG from the given state. + * + * @param state the state whose enabled actions we would like to know + * @return the enabled actions + */ @Override public Collection getEnabledActionsFor(final XcfaState state) { final List xcfaActions = new ArrayList<>(); diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/interleavings/XcfaPorLts.java b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/interleavings/XcfaPorLts.java new file mode 100644 index 0000000000..5754d2bc1b --- /dev/null +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/interleavings/XcfaPorLts.java @@ -0,0 +1,150 @@ +/* + * Copyright 2022 Budapest University of Technology and Economics + * + * 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. + */ + +package hu.bme.mit.theta.xcfa.analysis.impl.interleavings; + +import hu.bme.mit.theta.analysis.algorithm.PorLts; +import hu.bme.mit.theta.core.decl.Decl; +import hu.bme.mit.theta.core.decl.VarDecl; +import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.xcfa.model.XCFA; +import hu.bme.mit.theta.xcfa.model.XcfaEdge; +import hu.bme.mit.theta.xcfa.model.XcfaLabel; +import hu.bme.mit.theta.xcfa.model.XcfaLocation; +import hu.bme.mit.theta.xcfa.model.utils.LabelUtils; + +import java.util.*; +import java.util.stream.Collectors; + +public class XcfaPorLts extends PorLts, XcfaAction, XcfaEdge> { + + private final XCFA xcfa; + + private final XcfaLts simpleXcfaLts = new XcfaLts(); + + private final Random random = new Random(); + + public XcfaPorLts(XCFA xcfa) { + this.xcfa = xcfa; + collectBackwardTransitions(); + } + + @Override + protected Collection getAllEnabledActionsFor(XcfaState state) { + return simpleXcfaLts.getEnabledActionsFor(state); + } + + @Override + protected Collection getPersistentSetFirstActions(Collection allEnabledActions) { + var enabledActionsByProcess = allEnabledActions.stream().collect(Collectors.groupingBy(XcfaAction::getProcess)); + List enabledProcesses = new ArrayList<>(enabledActionsByProcess.keySet()); + Collections.shuffle(enabledProcesses); + Collection firstActions = new HashSet<>(); + + for (Integer enabledProcess : enabledProcesses) { + var actionsByProcess = enabledActionsByProcess.get(enabledProcess); + firstActions.add(actionsByProcess.get(random.nextInt(actionsByProcess.size()))); + } + return firstActions; + } + + @Override + protected boolean canEnOrDisableEachOther(XcfaAction action1, XcfaAction action2) { + return action1.getProcess().equals(action2.getProcess()); + } + + @Override + protected XcfaEdge getTransitionOf(XcfaAction action) { + return action.getEdge(); + } + + @Override + protected Set getSuccessiveTransitions(XcfaEdge edge) { + var outgoingEdges = new HashSet<>(edge.getTarget().getOutgoingEdges()); + List startThreads = edge.getLabels().stream() + .filter(label -> label instanceof XcfaLabel.StartThreadXcfaLabel) + .map(label -> (XcfaLabel.StartThreadXcfaLabel) label).collect(Collectors.toList()); + if (startThreads.size() > 0) { // for start thread labels, the thread procedure must be explored, too! + startThreads.forEach(startThread -> + outgoingEdges.addAll(startThread.getProcess().getMainProcedure().getInitLoc().getOutgoingEdges())); + } + return outgoingEdges; + } + + /** + * Returns the global variables that an edge uses (it is present in one of its labels). + * + * @param edge whose global variables are to be returned + * @return the set of used global variables + */ + @Override + protected Set> getDirectlyUsedSharedObjects(XcfaEdge edge) { + Set> vars = new HashSet<>(); + edge.getLabels().forEach(label -> LabelUtils.getVars(label).forEach(usedVar -> { + if (xcfa.getGlobalVars().contains(usedVar)) { + vars.add(usedVar); + } + })); + return vars; + } + + /** + * Returns the global variables that an edge uses or if it is the start of an atomic block the global variables + * that are used in the atomic block. + * + * @param edge whose global variables are to be returned + * @return the set of directly or indirectly used global variables + */ + @Override + protected Set> getUsedSharedObjects(XcfaEdge edge) { + Set> vars; + var labels = edge.getLabels(); + if (labels.stream().anyMatch(label -> label instanceof XcfaLabel.AtomicBeginXcfaLabel)) { + vars = getSharedObjectsWithBFS(edge, xcfaEdge -> xcfaEdge.getLabels().stream().noneMatch(label -> label instanceof XcfaLabel.AtomicEndXcfaLabel)); + } else { + vars = getDirectlyUsedSharedObjects(edge); + } + return vars; + } + + /** + * Collects backward edges of the given XCFA. + */ + @Override + protected void collectBackwardTransitions() { + for (var process : xcfa.getProcesses()) { + for (var procedure : process.getProcedures()) { + // DFS for every procedure of the XCFA to discover backward edges + Set visitedLocations = new HashSet<>(); + Stack stack = new Stack<>(); + + stack.push(procedure.getInitLoc()); // start from the initial location of the procedure + while (!stack.isEmpty()) { + XcfaLocation visiting = stack.pop(); + visitedLocations.add(visiting); + for (var outgoingEdge : visiting.getOutgoingEdges()) { + var target = outgoingEdge.getTarget(); + if (visitedLocations.contains(target)) { // backward edge + backwardTransitions.add(outgoingEdge); + } else { + stack.push(target); + } + } + } + } + } + } +} diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTAction.java b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTAction.java index 1686ce0f23..5c0d3d62e6 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTAction.java +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTAction.java @@ -16,12 +16,16 @@ package hu.bme.mit.theta.xcfa.analysis.impl.singlethread; import hu.bme.mit.theta.common.Utils; +import hu.bme.mit.theta.core.decl.VarDecl; import hu.bme.mit.theta.core.stmt.Stmt; +import hu.bme.mit.theta.frontend.FrontendMetadata; import hu.bme.mit.theta.xcfa.model.XcfaEdge; import hu.bme.mit.theta.xcfa.model.XcfaLabel; import hu.bme.mit.theta.xcfa.model.XcfaLocation; +import hu.bme.mit.theta.xcfa.model.utils.XcfaLabelVarReplacer; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -44,6 +48,10 @@ public static XcfaSTAction create(final XcfaEdge edge) { return new XcfaSTAction(edge.getSource(), edge.getTarget(), edge.getLabels()); } + public static XcfaSTAction createWithVars(final XcfaEdge edge, Map, VarDecl> newVarLut) { + return new XcfaSTAction(edge.getSource(), edge.getTarget(), XcfaLabelVarReplacer.replaceVars(edge.getLabels(), newVarLut)); + } + public XcfaLocation getSource() { return source; } @@ -70,6 +78,13 @@ public XcfaSTAction withLabels(final List stmts) { return new XcfaSTAction(source, target, stmts); } + public static XcfaSTAction copyOf(XcfaSTAction action, Map, VarDecl> newVarLut) { + List newStmts = XcfaLabelVarReplacer.replaceVars(action.getLabels(), newVarLut); + XcfaSTAction xcfaSTAction = new XcfaSTAction(action.source, action.target, newStmts); + FrontendMetadata.lookupMetadata(action).forEach((s, o) -> FrontendMetadata.create(xcfaSTAction, s, o)); + return xcfaSTAction; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTLts.java b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTLts.java index e86d4517d1..a0d9dd5904 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTLts.java +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTLts.java @@ -19,6 +19,7 @@ import hu.bme.mit.theta.analysis.LTS; import hu.bme.mit.theta.xcfa.model.XcfaEdge; import hu.bme.mit.theta.xcfa.model.XcfaLocation; +import hu.bme.mit.theta.xcfa.passes.processpass.FunctionInlining; import java.util.ArrayList; import java.util.Collection; @@ -29,7 +30,9 @@ public Collection getEnabledActionsFor(final XcfaSTState state) final Collection xcfaActions = new ArrayList<>(); final XcfaLocation loc = state.getCurrentLoc(); for (XcfaEdge outgoingEdge : loc.getOutgoingEdges()) { - final XcfaSTAction xcfaAction = XcfaSTAction.create(outgoingEdge); + final XcfaSTAction xcfaAction = FunctionInlining.inlining == FunctionInlining.InlineFunctions.ON ? + XcfaSTAction.create(outgoingEdge) : + XcfaSTAction.createWithVars(outgoingEdge, ((XcfaSTStateStack) state).getCurrentVars()); xcfaActions.add(xcfaAction); } return xcfaActions; diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTOrd.java b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTOrd.java index de8b976954..b36c907392 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTOrd.java +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTOrd.java @@ -31,12 +31,12 @@ private XcfaSTOrd(final PartialOrd partialOrd) { } public static XcfaSTOrd create(final PartialOrd partialOrd) { - return new XcfaSTOrd(partialOrd); + return new XcfaSTOrd<>(partialOrd); } @Override public boolean isLeq(final XcfaState state1, final XcfaState state2) { - return state1.getCurrentLoc().equals(state2.getCurrentLoc()) && - partialOrd.isLeq(state1.getGlobalState(), state2.getGlobalState()); + return ((XcfaSTState) state1).equalLocations(((XcfaSTState) state2)) + && partialOrd.isLeq(state1.getGlobalState(), state2.getGlobalState()); } } diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTState.java b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTState.java index 65c5348ca9..c97c4465fc 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTState.java +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTState.java @@ -20,20 +20,19 @@ import hu.bme.mit.theta.core.type.booltype.BoolType; import hu.bme.mit.theta.xcfa.analysis.common.XcfaState; import hu.bme.mit.theta.xcfa.model.XcfaLocation; +import hu.bme.mit.theta.xcfa.passes.processpass.FunctionInlining; -import java.util.Objects; +public abstract class XcfaSTState extends XcfaState { + protected final S globalState; -public class XcfaSTState extends XcfaState { - private final XcfaLocation currentLoc; - private final S globalState; - - private XcfaSTState(final XcfaLocation currentLoc, final S globalState) { - this.currentLoc = currentLoc; + protected XcfaSTState(final S globalState) { this.globalState = globalState; } public static XcfaSTState create(final XcfaLocation currentLoc, final S globalState) { - return new XcfaSTState(currentLoc, globalState); + return FunctionInlining.inlining == FunctionInlining.InlineFunctions.ON ? + new XcfaSTStateSimple<>(currentLoc, globalState) : + new XcfaSTStateStack<>(currentLoc, globalState); } @Override @@ -52,28 +51,19 @@ public S getGlobalState() { } @Override - public XcfaLocation getCurrentLoc() { - return currentLoc; - } + public abstract XcfaLocation getCurrentLoc(); @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; XcfaSTState that = (XcfaSTState) o; - return Objects.equals(currentLoc, that.currentLoc) && globalState.equals(that.globalState); + return globalState.equals(that.globalState) && equalLocations(that); } - @Override - public int hashCode() { - return Objects.hash(currentLoc, globalState); - } + public abstract boolean equalLocations(XcfaSTState o); - public XcfaSTState withState(final S succState) { - return create(currentLoc, succState); - } + public abstract XcfaSTState withState(final S succState); - public XcfaSTState withLocation(final XcfaLocation location) { - return create(location, globalState); - } + public abstract XcfaSTState withLocation(final XcfaLocation location); } diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTStateSimple.java b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTStateSimple.java new file mode 100644 index 0000000000..359aa2827c --- /dev/null +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTStateSimple.java @@ -0,0 +1,57 @@ +/* + * Copyright 2022 Budapest University of Technology and Economics + * + * 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. + */ + +package hu.bme.mit.theta.xcfa.analysis.impl.singlethread; + +import hu.bme.mit.theta.analysis.expr.ExprState; +import hu.bme.mit.theta.xcfa.model.XcfaLocation; + +import java.util.Objects; + +public class XcfaSTStateSimple extends XcfaSTState { + private final XcfaLocation currentLocation; + + protected XcfaSTStateSimple(final XcfaLocation currentLoc, final S globalState) { + super(globalState); + this.currentLocation = currentLoc; + } + + @Override + public XcfaLocation getCurrentLoc() { + return currentLocation; + } + + @Override + public boolean equalLocations(XcfaSTState o) { + XcfaSTStateSimple that = (XcfaSTStateSimple) o; + return this.currentLocation.equals(that.currentLocation); + } + + @Override + public int hashCode() { + return Objects.hash(currentLocation, globalState); + } + + @Override + public XcfaSTState withState(S succState) { + return new XcfaSTStateSimple<>(this.currentLocation, succState); + } + + @Override + public XcfaSTState withLocation(XcfaLocation location) { + return new XcfaSTStateSimple<>(location, this.globalState); + } +} diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTStateStack.java b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTStateStack.java new file mode 100644 index 0000000000..327c527b93 --- /dev/null +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTStateStack.java @@ -0,0 +1,158 @@ +/* + * Copyright 2022 Budapest University of Technology and Economics + * + * 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. + */ + +package hu.bme.mit.theta.xcfa.analysis.impl.singlethread; + +import hu.bme.mit.theta.analysis.expr.ExprState; +import hu.bme.mit.theta.core.decl.VarDecl; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.booltype.BoolType; +import hu.bme.mit.theta.xcfa.model.XcfaLocation; + +import java.util.Map; +import java.util.Objects; +import java.util.Stack; +import java.util.stream.Collectors; + +public class XcfaSTStateStack extends XcfaSTState { + + private final Stack locationStack; + + protected XcfaSTStateStack(final XcfaLocation currentLoc, final S globalState) { + super(globalState); + this.locationStack = new Stack<>(); + this.locationStack.push(new XcfaSTStateStack.ProcedureLocation(currentLoc)); + } + + private XcfaSTStateStack(final Stack locationStack, final S globalState) { + super(globalState); + this.locationStack = new Stack<>(); + this.locationStack.addAll(locationStack); + } + + @Override + public boolean isBottom() { + return globalState.isBottom(); + } + + @Override + public Expr toExpr() { + return globalState.toExpr(); + } + + @Override + public S getGlobalState() { + return globalState; + } + + @Override + public XcfaLocation getCurrentLoc() { + return locationStack.peek().location; + } + + public Stack getCurrentStack() { + return locationStack; + } + + public Map, VarDecl> getCurrentVars() { + return locationStack.peek().varLut; + } + + public Map, VarDecl> getReverseVars() { + return this.getCurrentVars().entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey)); + } + + XcfaLocation pop() { + return locationStack.pop().location; + } + + void push(XcfaLocation location) { + Stack stack = new Stack<>(); + locationStack.forEach(procLoc -> stack.push(procLoc.location)); + Map, VarDecl> varLut = location.getParent().getInstantiatedVars(stack); + locationStack.push(new XcfaSTStateStack.ProcedureLocation(location, varLut)); + updateParams(); + } + + private void updateParams() { + Map, VarDecl> callingProcedureAltVars = locationStack.get(locationStack.size() - 2).location.getParent().getAltVars(); + Map, VarDecl> callingProcedureVars = locationStack.get(locationStack.size() - 2).varLut; + callingProcedureAltVars.forEach((var, altVar) -> { + if (callingProcedureVars.get(var) != null) // calling proc has the same var instantiated + locationStack.peek().varLut.put(altVar, callingProcedureVars.get(var)); + }); + } + + @Override + public boolean equalLocations(XcfaSTState o) { + XcfaSTStateStack that = (XcfaSTStateStack) o; + if (locationStack.size() != that.locationStack.size()) return false; + for (int i = 0; i < locationStack.size(); ++i) + if (!Objects.equals(locationStack.get(i), that.locationStack.get(i))) return false; + return true; + } + + @Override + public int hashCode() { + return Objects.hash(locationStack, globalState); + } + + public XcfaSTStateStack withState(final S succState) { + return new XcfaSTStateStack<>(this.locationStack, succState); + } + + public XcfaSTStateStack withLocation(final XcfaLocation location) { + XcfaSTStateStack state = new XcfaSTStateStack<>(this.locationStack, this.globalState); + XcfaSTStateStack.ProcedureLocation top = state.locationStack.pop(); + state.locationStack.push(top.withLocation(location)); + return state; + } + + public static class ProcedureLocation { + private final XcfaLocation location; + private final Map, VarDecl> varLut; + + ProcedureLocation(XcfaLocation location) { + this(location, location.getParent().getInstantiatedVars(new Stack<>())); + } + + ProcedureLocation(XcfaLocation location, Map, VarDecl> varLut) { + this.location = location; + this.varLut = varLut; + } + + Map, VarDecl> getUsedVars() { + return varLut; + } + + XcfaSTStateStack.ProcedureLocation withLocation(XcfaLocation location) { + return new XcfaSTStateStack.ProcedureLocation(location, varLut); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + XcfaSTStateStack.ProcedureLocation that = (XcfaSTStateStack.ProcedureLocation) o; + return location == that.location && varLut.entrySet().stream().noneMatch(entry -> that.varLut.get(entry.getKey()) != entry.getValue()); + } + + @Override + public int hashCode() { + return Objects.hash(location, varLut); + } + } +} diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTTransFunc.java b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTTransFunc.java index a6f90cd9d3..69f3cd2ca6 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTTransFunc.java +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/impl/singlethread/XcfaSTTransFunc.java @@ -18,13 +18,18 @@ import hu.bme.mit.theta.analysis.Prec; import hu.bme.mit.theta.analysis.TransFunc; +import hu.bme.mit.theta.analysis.expl.ExplPrec; import hu.bme.mit.theta.analysis.expr.ExprState; import hu.bme.mit.theta.analysis.expr.StmtAction; +import hu.bme.mit.theta.core.decl.VarDecl; import hu.bme.mit.theta.xcfa.analysis.common.XcfaPrec; import hu.bme.mit.theta.xcfa.analysis.common.XcfaState; +import hu.bme.mit.theta.xcfa.model.XcfaLabel; +import hu.bme.mit.theta.xcfa.model.XcfaProcedure; +import hu.bme.mit.theta.xcfa.model.utils.XcfaLabelVarReplacer; +import hu.bme.mit.theta.xcfa.passes.processpass.FunctionInlining; -import java.util.ArrayList; -import java.util.Collection; +import java.util.*; import static com.google.common.base.Preconditions.checkNotNull; @@ -40,13 +45,55 @@ public static XcfaST return new XcfaSTTransFunc<>(transFunc); } + private P stackVarsIntoPrec(P globalPrec, XcfaSTStateStack state) { + P combinedPrec = globalPrec; + if (globalPrec instanceof ExplPrec) { + ExplPrec explPrec = (ExplPrec) globalPrec; + for (XcfaSTStateStack.ProcedureLocation procedureLocation : state.getCurrentStack()) { + Set> localVars = new HashSet<>(); + final Set> precVars = explPrec.getVars(); + procedureLocation.getUsedVars().forEach((var, localVar) -> { + if (precVars.contains(var)) + localVars.add(localVar); + }); + if (!localVars.isEmpty()) + explPrec = explPrec.join(ExplPrec.of(localVars)); + } + combinedPrec = (P) explPrec; + } + return combinedPrec; + } + + private void handleFunctionPushPop(XcfaSTStateStack state, XcfaSTAction action, XcfaSTStateStack newState) { + if (action.getLabels().size() > 0 && action.getLabels().get(0) instanceof XcfaLabel.ProcedureCallXcfaLabel) { + XcfaLabel.ProcedureCallXcfaLabel callLabel = (XcfaLabel.ProcedureCallXcfaLabel) action.getLabels().get(0); + Optional calledProcedure = state.getCurrentLoc().getParent().getParent().getProcedures() + .stream().filter(procedure -> callLabel.getProcedure().equals(procedure.getName())).findAny(); + if (calledProcedure.isPresent()) { + Map, VarDecl> reverseVarLut = state.getReverseVars(); + XcfaLabel.ProcedureCallXcfaLabel originalCallLabel = (XcfaLabel.ProcedureCallXcfaLabel) callLabel.accept(new XcfaLabelVarReplacer(), reverseVarLut); + newState.push(calledProcedure.get().getParamInitLoc(originalCallLabel)); + } + } + if (newState.getCurrentLoc().isEndLoc() && newState.getCurrentLoc().getParent() != newState.getCurrentLoc().getParent().getParent().getMainProcedure()) { + newState.pop(); + } + } + @Override public Collection> getSuccStates(final XcfaState inState, final A inAction, final XcfaPrec

prec) { XcfaSTState state = (XcfaSTState) inState; XcfaSTAction action = (XcfaSTAction) inAction; - final Collection> newStates = new ArrayList<>(); - for (final S succState : transFunc.getSuccStates(state.getGlobalState(), inAction, prec.getGlobalPrec())) { - final XcfaState newState = state.withState(succState).withLocation(action.getTarget()); + + P globalPrec = FunctionInlining.inlining == FunctionInlining.InlineFunctions.ON ? + prec.getGlobalPrec() : + stackVarsIntoPrec(prec.getGlobalPrec(), (XcfaSTStateStack) state); + + final Collection> newStates = new ArrayList<>(); + for (final S succState : transFunc.getSuccStates(state.getGlobalState(), inAction, globalPrec)) { + final XcfaSTState newState = state.withState(succState).withLocation(action.getTarget()); + if (FunctionInlining.inlining != FunctionInlining.InlineFunctions.ON) + handleFunctionPushPop((XcfaSTStateStack) state, action, (XcfaSTStateStack) newState); newStates.add(newState); } return newStates; diff --git a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/portfolio/ComplexPortfolio.java b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/portfolio/ComplexPortfolio.java index e3be272ea4..c6b6ffa172 100644 --- a/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/portfolio/ComplexPortfolio.java +++ b/subprojects/xcfa/xcfa-analysis/src/main/java/hu/bme/mit/theta/xcfa/analysis/portfolio/ComplexPortfolio.java @@ -50,13 +50,13 @@ public class ComplexPortfolio extends AbstractPortfolio { private XcfaConfigBuilder.Search search = null; private XcfaConfigBuilder.Algorithm algorithm = null; - public ComplexPortfolio(Logger.Level logLevel, String modelName, String smtlibhome) throws Exception { + public ComplexPortfolio(Logger.Level logLevel, String modelName, String smtlibhome, XcfaConfigBuilder.Algorithm algorithm) throws Exception { super(logLevel, modelName, smtlibhome); // registers solver factories if (ArchitectureConfig.multiThreading) { - algorithm = XcfaConfigBuilder.Algorithm.INTERLEAVINGS; + this.algorithm = algorithm; search = XcfaConfigBuilder.Search.BFS; } else { - algorithm = XcfaConfigBuilder.Algorithm.SINGLETHREAD; + this.algorithm = XcfaConfigBuilder.Algorithm.SINGLETHREAD; search = XcfaConfigBuilder.Search.ERR; } } diff --git a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCli.java b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCli.java index 4da7e64d97..c2ed9969ea 100644 --- a/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCli.java +++ b/subprojects/xcfa/xcfa-cli/src/main/java/hu/bme/mit/theta/xcfa/cli/XcfaCli.java @@ -72,6 +72,7 @@ import hu.bme.mit.theta.xcfa.model.utils.FrontendXcfaBuilder; import hu.bme.mit.theta.xcfa.passes.XcfaPassManager; import hu.bme.mit.theta.xcfa.passes.procedurepass.SimpleLbePass; +import hu.bme.mit.theta.xcfa.passes.processpass.FunctionInlining; import org.antlr.v4.runtime.CharStream; import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; @@ -204,6 +205,12 @@ public class XcfaCli { @Parameter(names = "--algorithm", description = "Algorithm to use when solving multithreaded programs") XcfaConfigBuilder.Algorithm algorithm = XcfaConfigBuilder.Algorithm.SINGLETHREAD; + @Parameter(names = "--lbe", description = "Large-block encoding level") + SimpleLbePass.LBELevel lbeLevel = SimpleLbePass.LBELevel.NO_LBE; + + @Parameter(names = "--inline", description = "Turns function inlining on and off") + FunctionInlining.InlineFunctions inlining = FunctionInlining.InlineFunctions.OFF; + //////////// SMTLib options //////////// @Parameter(names = "--smt-home", description = "The path of the solver registry") @@ -221,9 +228,6 @@ public class XcfaCli { @Parameter(names = "--validate-abstraction-solver", description = "Activates a wrapper, which validates the assertions in the solver in each (SAT) check. Filters some solver issues.") boolean validateAbstractionSolver = false; - @Parameter(names = "--lbe", description = "Large-block encoding level") - SimpleLbePass.LBELevel lbeLevel = SimpleLbePass.LBELevel.NO_LBE; - //////////// CONFIGURATION OPTIONS END //////////// private Logger logger; @@ -253,7 +257,6 @@ private void run() { File inputOrModel = input == null ? model : input; logger = new ConsoleLogger(logLevel); - ; /// version if (versionInfo) { @@ -262,6 +265,7 @@ private void run() { } SimpleLbePass.level = lbeLevel; + FunctionInlining.inlining = inlining; // TODO later we might want to merge these two flags if (witnessOnly) { @@ -442,7 +446,7 @@ private void run() { } break; case COMPLEX: - ComplexPortfolio complexPortfolio = new ComplexPortfolio(logLevel, this.input.getName(), home); + ComplexPortfolio complexPortfolio = new ComplexPortfolio(logLevel, this.input.getName(), home, algorithm); try { complexPortfolio.executeAnalysis(xcfa, initTime); } catch (PortfolioTimeoutException pte) { @@ -521,7 +525,7 @@ private void executeSingleConfiguration(XCFA xcfa) throws Exception { final Solver solver1 = refinementSolverFactory.createSolver(); // TODO handle separate solvers in a nicer way final Solver solver2 = abstractionSolverFactory.createSolver(); // TODO handle separate solvers in a nicer way final ExplStmtAnalysis domainAnalysis = ExplStmtAnalysis.create(solver2, True(), maxEnum); - final LTS lts = algorithm.getLts(); + final LTS lts = algorithm.getLts(xcfa); final InitFunc, XcfaPrec> initFunc = algorithm.getInitFunc(xcfa.getProcesses().stream().map(proc -> proc.getMainProcedure().getInitLoc()).collect(Collectors.toList()), domainAnalysis.getInitFunc()); final TransFunc, StmtAction, XcfaPrec> transFunc = diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaProcedure.java b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaProcedure.java index b6bcc51209..51641a7024 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaProcedure.java +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/XcfaProcedure.java @@ -19,16 +19,13 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import hu.bme.mit.theta.core.decl.VarDecl; +import hu.bme.mit.theta.core.stmt.AssignStmt; import hu.bme.mit.theta.core.type.LitExpr; import hu.bme.mit.theta.core.type.Type; +import hu.bme.mit.theta.xcfa.model.utils.XcfaLabelVarReplacer; import hu.bme.mit.theta.xcfa.model.utils.XcfaStmtUtils; -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; import static com.google.common.base.Preconditions.checkArgument; @@ -41,19 +38,27 @@ public final class XcfaProcedure { private final String name; private final ImmutableMap, Direction> params; private final ImmutableMap, Optional>> localVars; + private final Map, Map, VarDecl>> instantiatedVars; private final ImmutableList locs; private final Type retType; + private final Map, VarDecl> altVars; + private final Map paramInitLocs; private final XcfaLocation initLoc; private final XcfaLocation errorLoc; private final XcfaLocation finalLoc; private final ImmutableList edges; private final XcfaProcess parent; + private int callCount = 0; private XcfaProcedure(final Builder builder, final XcfaProcess parent) { params = ImmutableMap.copyOf(builder.params); localVars = ImmutableMap.copyOf(builder.localVars); + instantiatedVars = new LinkedHashMap<>(); locs = ImmutableList.copyOf(builder.locs); locs.forEach(location -> location.setParent(this)); + altVars = builder.altVars; + paramInitLocs = builder.paramInitLocs; + paramInitLocs.values().forEach(loc -> loc.setParent(this)); initLoc = builder.initLoc; errorLoc = builder.errorLoc; finalLoc = builder.finalLoc; @@ -76,6 +81,9 @@ public XcfaProcedure(final XcfaProcess parent, final XcfaProcedure from, final M varLut.put(varDecl, newVar); return Map.entry(cast(newVar, varDecl.getType()), e.getValue()); }).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))); + altVars = localVars.keySet().stream().map(var -> + Map.entry(var, XcfaProcedure.getAltVar(var)) + ).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); final Map locLut = new LinkedHashMap<>(); locs = ImmutableList.copyOf(from.locs.stream().map(xcfaLocation -> { final XcfaLocation newLoc = XcfaLocation.copyOf(xcfaLocation); @@ -83,6 +91,16 @@ public XcfaProcedure(final XcfaProcess parent, final XcfaProcedure from, final M return newLoc; }).collect(Collectors.toList())); locs.forEach(location -> location.setParent(this)); + paramInitLocs = new LinkedHashMap<>(); + from.paramInitLocs.forEach((callLabel, initLoc) -> paramInitLocs.put(callLabel, locLut.get(initLoc))); + instantiatedVars = new LinkedHashMap<>(); + from.instantiatedVars.forEach((stack, localVarLut) -> { + Stack newStack = new Stack<>(); + stack.forEach(loc -> stack.push(locLut.get(loc))); + Map, VarDecl> newLocalVarLut = new LinkedHashMap<>(); + localVarLut.forEach((var, localVar) -> newLocalVarLut.put(varLut.get(var), localVar)); + instantiatedVars.put(newStack, newLocalVarLut); + }); initLoc = locLut.get(from.initLoc); errorLoc = locLut.get(from.errorLoc); finalLoc = locLut.get(from.finalLoc); @@ -162,6 +180,14 @@ public List getLocs() { return locs; } + public XcfaLocation getParamInitLoc(XcfaLabel.ProcedureCallXcfaLabel callLabel) { + return paramInitLocs.get(callLabel); + } + + public Map, VarDecl> getAltVars() { + return altVars; + } + public XcfaLocation getInitLoc() { return initLoc; } @@ -199,15 +225,34 @@ public XcfaProcedure duplicate(final XcfaProcess parent, final Map, V return new XcfaProcedure(parent, this, varLut); } + public Map, VarDecl> getInstantiatedVars(Stack locationStack) { + Map, VarDecl> varLut = instantiatedVars.get(locationStack); + if (varLut == null) { + varLut = new LinkedHashMap<>(); + for (VarDecl var : getLocalVarMap().keySet()) { + varLut.put(var, Var(var.getName() + "@" + callCount, var.getType())); + } + ++callCount; + instantiatedVars.put(locationStack, varLut); + } + return varLut; + } + + private static VarDecl getAltVar(VarDecl var) { + return Var(var.getName() + "'", var.getType()); + } + public static final class Builder { private static final String RESULT_NAME = "result"; private final LinkedHashMap, Direction> params; private final Map, Optional>> localVars; + private final Map, VarDecl> altVars; private final List locs; private final List edges; private Type retType; private String name; + private final Map paramInitLocs; private XcfaLocation initLoc; private XcfaLocation errorLoc; private XcfaLocation finalLoc; @@ -217,6 +262,8 @@ public static final class Builder { private Builder() { params = new LinkedHashMap<>(); localVars = new LinkedHashMap<>(); + altVars = new LinkedHashMap<>(); + paramInitLocs = new LinkedHashMap<>(); locs = new ArrayList<>(); edges = new ArrayList<>(); } @@ -278,6 +325,26 @@ public void createParam(final Direction direction, final VarDecl param) { params.put(param, direction); } + public void addParamInitLoc(XcfaLabel.ProcedureCallXcfaLabel callLabel, XcfaProcedure.Builder callingProcedure) { + checkNotBuilt(); + + List paramAssignments = new ArrayList<>(); + int i = 0; + for (Map.Entry, Direction> entry : params.entrySet()) { + if (entry.getValue() != Direction.OUT) + paramAssignments.add(XcfaLabel.Stmt(AssignStmt.create(entry.getKey(), XcfaLabelVarReplacer.replaceVars(callLabel.getParams().get(i), callingProcedure.altVars)))); + ++i; + } + if (paramAssignments.isEmpty()) { + paramInitLocs.put(callLabel, initLoc); + } else { + XcfaLocation paramLoc = XcfaLocation.uniqeCopyOf(initLoc); + addLoc(paramLoc); + addEdge(XcfaEdge.of(paramLoc, initLoc, paramAssignments)); + paramInitLocs.put(callLabel, paramLoc); + } + } + // localVars public Map, Optional>> getLocalVars() { return localVars; @@ -286,6 +353,12 @@ public Map, Optional>> getLocalVars() { public void createVar(final VarDecl var, final LitExpr initValue) { checkNotBuilt(); localVars.put(var, Optional.ofNullable(initValue)); + altVars.put(var, XcfaProcedure.getAltVar(var)); + } + + public void removeVar(final VarDecl var) { + localVars.remove(var); + altVars.remove(var); } // rtype diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/utils/FrontendXcfaBuilder.java b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/utils/FrontendXcfaBuilder.java index e556281eb8..c6241ce971 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/utils/FrontendXcfaBuilder.java +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/utils/FrontendXcfaBuilder.java @@ -790,39 +790,30 @@ public XcfaLocation visit(CWhile statement, ParamPack param) { builder.addLoc(outerBeforeGuard); propagateMetadata(statement, outerBeforeGuard); for (int i = 0; i < (UNROLL_COUNT == 0 ? 1 : UNROLL_COUNT); ++i) { - if (((CCompound) body).getcStatementList().size() == 0) { - final AssumeStmt assume = Assume(Eq(guard.getExpression(), CComplexType.getType(guard.getExpression()).getNullValue())); - propagateMetadata(guard, assume); - xcfaEdge = XcfaEdge.of(initLoc, endLoc, List.of(Stmt(assume))); - builder.addEdge(xcfaEdge); - propagateMetadata(statement, xcfaEdge); - return endLoc; - } else { - XcfaLocation innerLoop = getAnonymousLoc(builder); - builder.addLoc(innerLoop); - propagateMetadata(statement, innerLoop); - XcfaLocation testEndLoc = buildWithoutPostStatement(guard, new ParamPack(builder, initLoc, null, null, returnLoc)); - if (UNROLL_COUNT > 0) { - initLoc = getAnonymousLoc(builder); - builder.addLoc(initLoc); - propagateMetadata(statement, initLoc); - } - final AssumeStmt assume = Assume(Neq(guard.getExpression(), CComplexType.getType(guard.getExpression()).getNullValue())); - propagateMetadata(guard, assume); - xcfaEdge = XcfaEdge.of(testEndLoc, innerLoop, List.of(Stmt(assume))); - builder.addEdge(xcfaEdge); - propagateMetadata(statement, xcfaEdge); - final AssumeStmt assume1 = Assume(Eq(guard.getExpression(), CComplexType.getType(guard.getExpression()).getNullValue())); - propagateMetadata(guard, assume1); - xcfaEdge = XcfaEdge.of(testEndLoc, outerBeforeGuard, List.of(Stmt(assume1))); - builder.addEdge(xcfaEdge); - propagateMetadata(statement, xcfaEdge); - XcfaLocation lastGuard = buildPostStatement(guard, new ParamPack(builder, innerLoop, endLoc, initLoc, returnLoc)); - XcfaLocation lastBody = body.accept(this, new ParamPack(builder, lastGuard, endLoc, initLoc, returnLoc)); - xcfaEdge = XcfaEdge.of(lastBody, initLoc, List.of()); - builder.addEdge(xcfaEdge); - propagateMetadata(statement, xcfaEdge); + XcfaLocation innerLoop = getAnonymousLoc(builder); + builder.addLoc(innerLoop); + propagateMetadata(statement, innerLoop); + XcfaLocation testEndLoc = buildWithoutPostStatement(guard, new ParamPack(builder, initLoc, null, null, returnLoc)); + if (UNROLL_COUNT > 0) { + initLoc = getAnonymousLoc(builder); + builder.addLoc(initLoc); + propagateMetadata(statement, initLoc); } + final AssumeStmt assume = Assume(Neq(guard.getExpression(), CComplexType.getType(guard.getExpression()).getNullValue())); + propagateMetadata(guard, assume); + xcfaEdge = XcfaEdge.of(testEndLoc, innerLoop, List.of(Stmt(assume))); + builder.addEdge(xcfaEdge); + propagateMetadata(statement, xcfaEdge); + final AssumeStmt assume1 = Assume(Eq(guard.getExpression(), CComplexType.getType(guard.getExpression()).getNullValue())); + propagateMetadata(guard, assume1); + xcfaEdge = XcfaEdge.of(testEndLoc, outerBeforeGuard, List.of(Stmt(assume1))); + builder.addEdge(xcfaEdge); + propagateMetadata(statement, xcfaEdge); + XcfaLocation lastGuard = buildPostStatement(guard, new ParamPack(builder, innerLoop, endLoc, initLoc, returnLoc)); + XcfaLocation lastBody = body.accept(this, new ParamPack(builder, lastGuard, endLoc, initLoc, returnLoc)); + xcfaEdge = XcfaEdge.of(lastBody, initLoc, List.of()); + builder.addEdge(xcfaEdge); + propagateMetadata(statement, xcfaEdge); } XcfaLocation outerLastGuard = buildPostStatement(guard, new ParamPack(builder, outerBeforeGuard, null, null, null)); xcfaEdge = XcfaEdge.of(outerLastGuard, endLoc, List.of()); diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/utils/XcfaLabelVarReplacer.java b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/utils/XcfaLabelVarReplacer.java index a176bb0119..a2aebb4f4b 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/utils/XcfaLabelVarReplacer.java +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/model/utils/XcfaLabelVarReplacer.java @@ -77,6 +77,9 @@ public static Expr replaceVars(Expr expr, Map replaceVars(List labels, Map, VarDecl> varLut) { + return labels.stream().map(label -> label.accept(new XcfaLabelVarReplacer(), varLut)).collect(Collectors.toList()); + } @Override public XcfaLabel visit(SkipStmt stmt, Map, VarDecl> param) { diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/XcfaPassManager.java b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/XcfaPassManager.java index 89d0380118..707efa1d12 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/XcfaPassManager.java +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/XcfaPassManager.java @@ -37,6 +37,7 @@ import hu.bme.mit.theta.xcfa.passes.procedurepass.UnusedVarRemovalPass; import hu.bme.mit.theta.xcfa.passes.procedurepass.VerifierFunctionsToLabels; import hu.bme.mit.theta.xcfa.passes.processpass.AnalyzeCallGraph; +import hu.bme.mit.theta.xcfa.passes.processpass.AssignFunctionParam; import hu.bme.mit.theta.xcfa.passes.processpass.FunctionInlining; import hu.bme.mit.theta.xcfa.passes.processpass.ProcessPass; import hu.bme.mit.theta.xcfa.passes.xcfapass.DemoteThreadLocalGlobals; @@ -88,7 +89,9 @@ public class XcfaPassManager { )); processPasses.addAll(List.of( new AnalyzeCallGraph(), - new FunctionInlining())); + new FunctionInlining(), + new AssignFunctionParam() + )); xcfaPasses.addAll((List.of( new RemoveUnusedGlobals(), new DemoteThreadLocalGlobals()))); @@ -119,10 +122,12 @@ public static void clearXCFAPasses() { } public static XcfaProcedure.Builder run(XcfaProcedure.Builder builder) { + XcfaProcedure.Builder runningBuilder = builder; for (ProcedurePass procedurePass : procedurePasses) { - if (!procedurePass.isPostInlining() || ProcedurePass.postInlining) builder = procedurePass.run(builder); + if (FunctionInlining.inlining != FunctionInlining.InlineFunctions.ON || !procedurePass.isPostInlining() || ProcedurePass.postInlining) + runningBuilder = procedurePass.run(runningBuilder); } - return builder; + return runningBuilder; } public static XcfaProcess.Builder run(XcfaProcess.Builder builder) { diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/CallsToFinalLocs.java b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/CallsToFinalLocs.java index ea9e5dd173..26ae1d7d82 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/CallsToFinalLocs.java +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/CallsToFinalLocs.java @@ -53,20 +53,18 @@ public XcfaProcedure.Builder run(XcfaProcedure.Builder builder) { for (XcfaEdge edge : new ArrayList<>(builder.getEdges())) { Optional e = edge.getLabels().stream().filter(stmt -> stmt instanceof XcfaLabel.ProcedureCallXcfaLabel).findAny(); if (e.isPresent()) { - XcfaEdge xcfaEdge; String procedure = ((XcfaLabel.ProcedureCallXcfaLabel) e.get()).getProcedure(); if (errorFunc.contains(procedure)) { - xcfaEdge = XcfaEdge.of(edge.getSource(), errorLoc, List.of()); + XcfaEdge xcfaEdge = XcfaEdge.of(edge.getSource(), errorLoc, List.of()); + builder.addEdge(xcfaEdge); + builder.removeEdge(edge); + FrontendMetadata.lookupMetadata(edge).forEach((s, o) -> { + FrontendMetadata.create(xcfaEdge, s, o); + }); } else if (abortFunc.contains(procedure)) { - xcfaEdge = XcfaEdge.of(edge.getSource(), finalLoc, List.of()); - } else { - continue; + ArrayList edgesAfterAbort = new ArrayList<>(edge.getSource().getOutgoingEdges()); + edgesAfterAbort.forEach(builder::removeEdge); } - builder.removeEdge(edge); - builder.addEdge(xcfaEdge); - FrontendMetadata.lookupMetadata(edge).forEach((s, o) -> { - FrontendMetadata.create(xcfaEdge, s, o); - }); } } diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/CallsToHavocs.java b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/CallsToHavocs.java index fc666b3076..7afdd3f500 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/CallsToHavocs.java +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/CallsToHavocs.java @@ -26,6 +26,7 @@ import hu.bme.mit.theta.xcfa.model.XcfaEdge; import hu.bme.mit.theta.xcfa.model.XcfaLabel; import hu.bme.mit.theta.xcfa.model.XcfaProcedure; +import hu.bme.mit.theta.xcfa.passes.processpass.FunctionInlining; import java.util.ArrayList; import java.util.List; @@ -39,37 +40,39 @@ public class CallsToHavocs extends ProcedurePass { @Override public XcfaProcedure.Builder run(XcfaProcedure.Builder builder) { - boolean found = true; - while (found) { - found = false; - for (XcfaEdge edge : new ArrayList<>(builder.getEdges())) { - Optional e = edge.getLabels().stream().filter(stmt -> stmt instanceof XcfaLabel.ProcedureCallXcfaLabel && FrontendMetadata.getMetadataValue(((XcfaLabel.ProcedureCallXcfaLabel) stmt).getProcedure(), "ownFunction").isPresent() && !(Boolean) FrontendMetadata.getMetadataValue(((XcfaLabel.ProcedureCallXcfaLabel) stmt).getProcedure(), "ownFunction").get()).findAny(); - if (e.isPresent()) { - List collect = new ArrayList<>(); - for (XcfaLabel stmt : edge.getLabels()) { - if (stmt == e.get()) { // TODO: all _OUT_ params should be havoced! - if (!((XcfaLabel.ProcedureCallXcfaLabel) e.get()).getProcedure().startsWith("__VERIFIER_nondet")) { - throw new UnsupportedOperationException("Non-nondet function call used as nondet!"); - } - Expr expr = ((XcfaLabel.ProcedureCallXcfaLabel) e.get()).getParams().get(0); - checkState(expr instanceof RefExpr && ((RefExpr) expr).getDecl() instanceof VarDecl); - VarDecl var = (VarDecl) ((RefExpr) expr).getDecl(); - if (!(CComplexType.getType(var.getRef()) instanceof CVoid)) { - final HavocStmt havoc = Havoc(var); - FrontendMetadata.lookupMetadata(stmt).forEach((s, o) -> FrontendMetadata.create(havoc, s, o)); - collect.add(Stmt(havoc)); + for (XcfaEdge edge : new ArrayList<>(builder.getEdges())) { + Optional e = edge.getLabels().stream().filter(stmt -> stmt instanceof XcfaLabel.ProcedureCallXcfaLabel && FrontendMetadata.getMetadataValue(((XcfaLabel.ProcedureCallXcfaLabel) stmt).getProcedure(), "ownFunction").isPresent() && !(Boolean) FrontendMetadata.getMetadataValue(((XcfaLabel.ProcedureCallXcfaLabel) stmt).getProcedure(), "ownFunction").get()).findAny(); + if (e.isPresent()) { + XcfaLabel.ProcedureCallXcfaLabel callLabel = (XcfaLabel.ProcedureCallXcfaLabel) e.get(); + List collect = new ArrayList<>(); + for (XcfaLabel stmt : edge.getLabels()) { + if (stmt == callLabel) { + if (callLabel.getProcedure().startsWith("__VERIFIER_nondet")) { + for (Expr expr : callLabel.getParams()) { + checkState(expr instanceof RefExpr && ((RefExpr) expr).getDecl() instanceof VarDecl); + VarDecl var = (VarDecl) ((RefExpr) expr).getDecl(); + if (!(CComplexType.getType(var.getRef()) instanceof CVoid)) { + final HavocStmt havoc = Havoc(var); + FrontendMetadata.lookupMetadata(stmt).forEach((s, o) -> FrontendMetadata.create(havoc, s, o)); + collect.add(Stmt(havoc)); + } } - } else collect.add(stmt); + } else { + if (FunctionInlining.inlining == FunctionInlining.InlineFunctions.ON) + throw new UnsupportedOperationException("Non-nondet function call used as nondet!"); + collect.add(stmt); + } + } else { + collect.add(stmt); } - XcfaEdge xcfaEdge; - xcfaEdge = XcfaEdge.of(edge.getSource(), edge.getTarget(), collect); - builder.removeEdge(edge); - builder.addEdge(xcfaEdge); - found = true; - FrontendMetadata.lookupMetadata(edge).forEach((s, o) -> { - FrontendMetadata.create(xcfaEdge, s, o); - }); } + XcfaEdge xcfaEdge; + xcfaEdge = XcfaEdge.of(edge.getSource(), edge.getTarget(), collect); + builder.removeEdge(edge); + builder.addEdge(xcfaEdge); + FrontendMetadata.lookupMetadata(edge).forEach((s, o) -> { + FrontendMetadata.create(xcfaEdge, s, o); + }); } } diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/UnusedVarRemovalPass.java b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/UnusedVarRemovalPass.java index 200221b430..80723bdfce 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/UnusedVarRemovalPass.java +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/UnusedVarRemovalPass.java @@ -73,7 +73,7 @@ public static void removeUnusedVars(XcfaProcedure.Builder builder, Set> unused = builder.getLocalVars().keySet().stream().filter(var -> !vars.contains(var)).collect(Collectors.toList()); for (VarDecl varDecl : unused) { - builder.getLocalVars().remove(varDecl); + builder.removeVar(varDecl); } } } diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/VerifierFunctionsToLabels.java b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/VerifierFunctionsToLabels.java index ceec58a7b3..cefe52313d 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/VerifierFunctionsToLabels.java +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/procedurepass/VerifierFunctionsToLabels.java @@ -20,6 +20,7 @@ import hu.bme.mit.theta.xcfa.model.XcfaEdge; import hu.bme.mit.theta.xcfa.model.XcfaLabel; import hu.bme.mit.theta.xcfa.model.XcfaProcedure; +import hu.bme.mit.theta.xcfa.passes.processpass.FunctionInlining; import java.util.ArrayList; import java.util.List; @@ -41,18 +42,18 @@ public XcfaProcedure.Builder run(XcfaProcedure.Builder builder) { for (XcfaLabel label : edge.getLabels()) { if (label == e.get()) { final String procName = ((XcfaLabel.ProcedureCallXcfaLabel) label).getProcedure(); - if (procName.startsWith("__VERIFIER_nondet")) collect.add(label); - else { - switch (procName) { - case atomicBegin: - collect.add(AtomicBegin()); - break; - case atomicEnd: - collect.add(AtomicEnd()); - break; - default: + switch (procName) { + case atomicBegin: + collect.add(AtomicBegin()); + break; + case atomicEnd: + collect.add(AtomicEnd()); + break; + default: + if (FunctionInlining.inlining == FunctionInlining.InlineFunctions.ON && !procName.startsWith("__VERIFIER_nondet")) throw new UnsupportedOperationException("Not yet supported: " + procName); - } + collect.add(label); + break; } } else collect.add(label); } diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/processpass/AnalyzeCallGraph.java b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/processpass/AnalyzeCallGraph.java index d678037a56..566e629d72 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/processpass/AnalyzeCallGraph.java +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/processpass/AnalyzeCallGraph.java @@ -22,11 +22,7 @@ import hu.bme.mit.theta.xcfa.model.XcfaProcedure; import hu.bme.mit.theta.xcfa.model.XcfaProcess; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; public class AnalyzeCallGraph extends ProcessPass { diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/processpass/AssignFunctionParam.java b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/processpass/AssignFunctionParam.java new file mode 100644 index 0000000000..91d167965e --- /dev/null +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/processpass/AssignFunctionParam.java @@ -0,0 +1,123 @@ +/* + * Copyright 2022 Budapest University of Technology and Economics + * + * 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. + */ + +package hu.bme.mit.theta.xcfa.passes.processpass; + +import hu.bme.mit.theta.core.decl.VarDecl; +import hu.bme.mit.theta.core.type.Expr; +import hu.bme.mit.theta.core.type.anytype.RefExpr; +import hu.bme.mit.theta.frontend.FrontendMetadata; +import hu.bme.mit.theta.xcfa.model.*; +import hu.bme.mit.theta.xcfa.passes.XcfaPassManager; +import hu.bme.mit.theta.xcfa.passes.procedurepass.UnusedVarRemovalPass; + +import java.util.*; + +import static com.google.common.base.Preconditions.checkState; +import static hu.bme.mit.theta.core.stmt.Stmts.Assign; +import static hu.bme.mit.theta.core.utils.TypeUtils.cast; +import static hu.bme.mit.theta.xcfa.model.XcfaLabel.Stmt; +import static hu.bme.mit.theta.xcfa.passes.procedurepass.Utils.getNonModifiedVars; + +public class AssignFunctionParam extends ProcessPass { + private final List edgesToAdd = new ArrayList<>(); + private final List edgesToRemove = new ArrayList<>(); + private final Map> procedureCalls = new LinkedHashMap<>(); + + @Override + public XcfaProcess.Builder run(XcfaProcess.Builder builder) { + if (FunctionInlining.inlining == FunctionInlining.InlineFunctions.ON) return builder; + XcfaProcess.Builder builtBuilder = buildProcesses(builder); + for (XcfaProcedure.Builder procedure : builtBuilder.getProcedures()) { + edgesToAdd.clear(); + edgesToRemove.clear(); + procedureCalls.clear(); + for (XcfaEdge edge : procedure.getEdges()) { + for (XcfaLabel label : edge.getLabels()) { + if (label instanceof XcfaLabel.ProcedureCallXcfaLabel) { + XcfaLabel.ProcedureCallXcfaLabel callLabel = (XcfaLabel.ProcedureCallXcfaLabel) label; + Optional procedureOpt = builtBuilder.getProcedures().stream().filter(xcfaProcedure -> xcfaProcedure.getName().equals(callLabel.getProcedure())).findAny(); + procedureOpt.ifPresent(calledProcedure -> { + assignParams(procedure, callLabel, calledProcedure); + if (calledProcedure.getRetType() != null) { + List retStmts = getRetStmts(callLabel, calledProcedure); + assignReturns(procedure, edge, retStmts); + } + }); + } + } + } + edgesToRemove.forEach(procedure::removeEdge); + edgesToAdd.forEach(procedure::addEdge); + procedureCalls.forEach((calledProcedure, callLabels) -> callLabels.forEach(calledProcedure::addParamInitLoc)); + } + + return builtBuilder; + } + + private XcfaProcess.Builder buildProcesses(XcfaProcess.Builder builder) { + XcfaProcess.Builder newBuilder = XcfaProcess.builder(); + newBuilder.setName(builder.getName()); + newBuilder.getThreadLocalVars().putAll(builder.getThreadLocalVars()); + for (VarDecl param : builder.getParams()) { + newBuilder.createParam(param); + } + for (XcfaProcedure.Builder procBuilder : builder.getProcedures()) { + Set> usedVars = new LinkedHashSet<>(); + for (XcfaEdge edge : procBuilder.getEdges()) { + for (XcfaLabel label : edge.getLabels()) { + usedVars.addAll(getNonModifiedVars(label)); + } + } + UnusedVarRemovalPass.removeUnusedVars(procBuilder, usedVars); + newBuilder.addProcedure(XcfaPassManager.run(procBuilder)); + if (procBuilder == builder.getMainProcedure()) newBuilder.setMainProcedure(procBuilder); + } + return newBuilder; + } + + private void assignParams(XcfaProcedure.Builder callingProcedure, XcfaLabel.ProcedureCallXcfaLabel callLabel, XcfaProcedure.Builder calledProcedure) { + Map callLabels = procedureCalls.getOrDefault(calledProcedure, new HashMap<>()); + callLabels.put(callLabel, callingProcedure); + procedureCalls.put(calledProcedure, callLabels); + } + + private void assignReturns(XcfaProcedure.Builder procedure, XcfaEdge edge, List retStmts) { + XcfaLocation middle = XcfaLocation.uniqeCopyOf(edge.getSource()); + procedure.addLoc(middle); + edgesToRemove.add(edge); + edgesToAdd.add(XcfaEdge.of(edge.getSource(), middle, edge.getLabels())); + XcfaEdge retEdge = XcfaEdge.of(middle, edge.getTarget(), retStmts); + FrontendMetadata.lookupMetadata(edge).forEach((s, o) -> FrontendMetadata.create(retEdge, s, o)); + edgesToAdd.add(retEdge); + } + + private List getRetStmts(XcfaLabel.ProcedureCallXcfaLabel callLabel, XcfaProcedure.Builder calledProcedure) { + List retStmts = new ArrayList<>(); + int paramCnt = 0; + for (Map.Entry, XcfaProcedure.Direction> entry : calledProcedure.getParams().entrySet()) { + VarDecl varDecl = entry.getKey(); + XcfaProcedure.Direction direction = entry.getValue(); + if (direction != XcfaProcedure.Direction.IN) { + Expr expr = callLabel.getParams().get(paramCnt); + checkState(expr instanceof RefExpr && ((RefExpr) expr).getDecl() instanceof VarDecl); + retStmts.add(Stmt(Assign(cast((VarDecl) ((RefExpr) expr).getDecl(), varDecl.getType()), cast(varDecl.getRef(), varDecl.getType())))); + } + ++paramCnt; + } + return retStmts; + } +} diff --git a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/processpass/FunctionInlining.java b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/processpass/FunctionInlining.java index 636c435c2a..cfc4c65ab1 100644 --- a/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/processpass/FunctionInlining.java +++ b/subprojects/xcfa/xcfa/src/main/java/hu/bme/mit/theta/xcfa/passes/processpass/FunctionInlining.java @@ -51,11 +51,20 @@ import static hu.bme.mit.theta.xcfa.passes.procedurepass.Utils.getNonModifiedVars; public class FunctionInlining extends ProcessPass { + + public static InlineFunctions inlining = InlineFunctions.OFF; + + public enum InlineFunctions { + OFF, + ON + } + private final List nopFuncs = List.of("reach_error", "abort"); private final Set> alreadyHandled = new LinkedHashSet<>(); @Override public XcfaProcess.Builder run(XcfaProcess.Builder builder) { + if (inlining != InlineFunctions.ON) return builder; ProcedurePass.postInlining = true; XcfaProcess.Builder newBuilder = XcfaProcess.builder(); newBuilder.setName(builder.getName()); diff --git a/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/XstsState.java b/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/XstsState.java index acf2d2f52e..5f2f1536bb 100644 --- a/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/XstsState.java +++ b/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/XstsState.java @@ -5,6 +5,8 @@ import hu.bme.mit.theta.core.type.Expr; import hu.bme.mit.theta.core.type.booltype.BoolType; +import java.util.Objects; + public final class XstsState implements ExprState { private final S state; @@ -47,4 +49,17 @@ public boolean isBottom() { public String toString() { return Utils.lispStringBuilder(getClass().getSimpleName()).aligned().add(initialized ? "post_init" : "pre_init").add(lastActionWasEnv ? "last_env" : "last_internal").body().add(state).toString(); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + XstsState xstsState = (XstsState) o; + return lastActionWasEnv == xstsState.lastActionWasEnv && initialized == xstsState.initialized && state.equals(xstsState.state); + } + + @Override + public int hashCode() { + return Objects.hash(state, lastActionWasEnv, initialized); + } } diff --git a/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/config/XstsConfigBuilder.java b/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/config/XstsConfigBuilder.java index 7825badd5d..c3a2982fd1 100644 --- a/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/config/XstsConfigBuilder.java +++ b/subprojects/xsts/xsts-analysis/src/main/java/hu/bme/mit/theta/xsts/analysis/config/XstsConfigBuilder.java @@ -162,7 +162,8 @@ public enum OptimizeStmts { } private Logger logger = NullLogger.getInstance(); - private final SolverFactory solverFactory; + private final SolverFactory abstractionSolverFactory; + private final SolverFactory refinementSolverFactory; private final Domain domain; private final Refinement refinement; private Search search = Search.BFS; @@ -173,10 +174,11 @@ public enum OptimizeStmts { private OptimizeStmts optimizeStmts = OptimizeStmts.ON; private AutoExpl autoExpl = AutoExpl.NEWOPERANDS; - public XstsConfigBuilder(final Domain domain, final Refinement refinement, final SolverFactory solverFactory) { + public XstsConfigBuilder(final Domain domain, final Refinement refinement, final SolverFactory abstractionSolverFactory, final SolverFactory refinementSolverFactory) { this.domain = domain; this.refinement = refinement; - this.solverFactory = solverFactory; + this.abstractionSolverFactory = abstractionSolverFactory; + this.refinementSolverFactory = refinementSolverFactory; } public XstsConfigBuilder logger(final Logger logger) { @@ -220,7 +222,7 @@ public XstsConfigBuilder autoExpl(final AutoExpl autoExpl) { } public XstsConfig build(final XSTS xsts) { - final Solver abstractionSolver = solverFactory.createSolver(); + final Solver abstractionSolver = abstractionSolverFactory.createSolver(); final Expr negProp = Not(xsts.getProp()); if (domain == Domain.EXPL) { @@ -245,23 +247,23 @@ public XstsConfigBuilder autoExpl(final AutoExpl autoExpl) { switch (refinement) { case FW_BIN_ITP: - refiner = SingleExprTraceRefiner.create(ExprTraceFwBinItpChecker.create(xsts.getInitFormula(), negProp, solverFactory.createItpSolver()), + refiner = SingleExprTraceRefiner.create(ExprTraceFwBinItpChecker.create(xsts.getInitFormula(), negProp, refinementSolverFactory.createItpSolver()), JoiningPrecRefiner.create(new ItpRefToExplPrec()), pruneStrategy, logger); break; case BW_BIN_ITP: - refiner = SingleExprTraceRefiner.create(ExprTraceBwBinItpChecker.create(xsts.getInitFormula(), negProp, solverFactory.createItpSolver()), + refiner = SingleExprTraceRefiner.create(ExprTraceBwBinItpChecker.create(xsts.getInitFormula(), negProp, refinementSolverFactory.createItpSolver()), JoiningPrecRefiner.create(new ItpRefToExplPrec()), pruneStrategy, logger); break; case SEQ_ITP: - refiner = SingleExprTraceRefiner.create(ExprTraceSeqItpChecker.create(xsts.getInitFormula(), negProp, solverFactory.createItpSolver()), + refiner = SingleExprTraceRefiner.create(ExprTraceSeqItpChecker.create(xsts.getInitFormula(), negProp, refinementSolverFactory.createItpSolver()), JoiningPrecRefiner.create(new ItpRefToExplPrec()), pruneStrategy, logger); break; case MULTI_SEQ: - refiner = MultiExprTraceRefiner.create(ExprTraceSeqItpChecker.create(xsts.getInitFormula(), negProp, solverFactory.createItpSolver()), + refiner = MultiExprTraceRefiner.create(ExprTraceSeqItpChecker.create(xsts.getInitFormula(), negProp, refinementSolverFactory.createItpSolver()), JoiningPrecRefiner.create(new ItpRefToExplPrec()), pruneStrategy, logger); break; case UNSAT_CORE: - refiner = SingleExprTraceRefiner.create(ExprTraceUnsatCoreChecker.create(xsts.getInitFormula(), negProp, solverFactory.createUCSolver()), + refiner = SingleExprTraceRefiner.create(ExprTraceUnsatCoreChecker.create(xsts.getInitFormula(), negProp, refinementSolverFactory.createUCSolver()), JoiningPrecRefiner.create(new VarsRefToExplPrec()), pruneStrategy, logger); break; default: @@ -310,16 +312,16 @@ public XstsConfigBuilder autoExpl(final AutoExpl autoExpl) { ExprTraceChecker exprTraceChecker = null; switch (refinement) { case FW_BIN_ITP: - exprTraceChecker = ExprTraceFwBinItpChecker.create(xsts.getInitFormula(), negProp, solverFactory.createItpSolver()); + exprTraceChecker = ExprTraceFwBinItpChecker.create(xsts.getInitFormula(), negProp, refinementSolverFactory.createItpSolver()); break; case BW_BIN_ITP: - exprTraceChecker = ExprTraceBwBinItpChecker.create(xsts.getInitFormula(), negProp, solverFactory.createItpSolver()); + exprTraceChecker = ExprTraceBwBinItpChecker.create(xsts.getInitFormula(), negProp, refinementSolverFactory.createItpSolver()); break; case SEQ_ITP: - exprTraceChecker = ExprTraceSeqItpChecker.create(xsts.getInitFormula(), negProp, solverFactory.createItpSolver()); + exprTraceChecker = ExprTraceSeqItpChecker.create(xsts.getInitFormula(), negProp, refinementSolverFactory.createItpSolver()); break; case MULTI_SEQ: - exprTraceChecker = ExprTraceSeqItpChecker.create(xsts.getInitFormula(), negProp, solverFactory.createItpSolver()); + exprTraceChecker = ExprTraceSeqItpChecker.create(xsts.getInitFormula(), negProp, refinementSolverFactory.createItpSolver()); break; default: throw new UnsupportedOperationException( @@ -397,19 +399,19 @@ public XstsConfigBuilder autoExpl(final AutoExpl autoExpl) { switch (refinement) { case FW_BIN_ITP: - refiner = SingleExprTraceRefiner.create(ExprTraceFwBinItpChecker.create(xsts.getInitFormula(), negProp, solverFactory.createItpSolver()), + refiner = SingleExprTraceRefiner.create(ExprTraceFwBinItpChecker.create(xsts.getInitFormula(), negProp, refinementSolverFactory.createItpSolver()), JoiningPrecRefiner.create(precRefiner), pruneStrategy, logger); break; case BW_BIN_ITP: - refiner = SingleExprTraceRefiner.create(ExprTraceBwBinItpChecker.create(xsts.getInitFormula(), negProp, solverFactory.createItpSolver()), + refiner = SingleExprTraceRefiner.create(ExprTraceBwBinItpChecker.create(xsts.getInitFormula(), negProp, refinementSolverFactory.createItpSolver()), JoiningPrecRefiner.create(precRefiner), pruneStrategy, logger); break; case SEQ_ITP: - refiner = SingleExprTraceRefiner.create(ExprTraceSeqItpChecker.create(xsts.getInitFormula(), negProp, solverFactory.createItpSolver()), + refiner = SingleExprTraceRefiner.create(ExprTraceSeqItpChecker.create(xsts.getInitFormula(), negProp, refinementSolverFactory.createItpSolver()), JoiningPrecRefiner.create(precRefiner), pruneStrategy, logger); break; case MULTI_SEQ: - refiner = MultiExprTraceRefiner.create(ExprTraceSeqItpChecker.create(xsts.getInitFormula(), negProp, solverFactory.createItpSolver()), + refiner = MultiExprTraceRefiner.create(ExprTraceSeqItpChecker.create(xsts.getInitFormula(), negProp, refinementSolverFactory.createItpSolver()), JoiningPrecRefiner.create(precRefiner), pruneStrategy, logger); break; default: diff --git a/subprojects/xsts/xsts-analysis/src/test/java/hu/bme/mit/theta/xsts/analysis/PnmlTest.java b/subprojects/xsts/xsts-analysis/src/test/java/hu/bme/mit/theta/xsts/analysis/PnmlTest.java index 9743347692..6b6cc17eda 100644 --- a/subprojects/xsts/xsts-analysis/src/test/java/hu/bme/mit/theta/xsts/analysis/PnmlTest.java +++ b/subprojects/xsts/xsts-analysis/src/test/java/hu/bme/mit/theta/xsts/analysis/PnmlTest.java @@ -82,7 +82,7 @@ public void test() throws IOException, XPathExpressionException, SAXException, P xsts = PnmlToXSTS.createXSTS(pnmlNet, propStream); } - final XstsConfig configuration = new XstsConfigBuilder(domain, XstsConfigBuilder.Refinement.SEQ_ITP, Z3SolverFactory.getInstance()).predSplit(XstsConfigBuilder.PredSplit.CONJUNCTS).maxEnum(250).initPrec(XstsConfigBuilder.InitPrec.ALLVARS).logger(logger).build(xsts); + final XstsConfig configuration = new XstsConfigBuilder(domain, XstsConfigBuilder.Refinement.SEQ_ITP, Z3SolverFactory.getInstance(), Z3SolverFactory.getInstance()).predSplit(XstsConfigBuilder.PredSplit.CONJUNCTS).maxEnum(250).initPrec(XstsConfigBuilder.InitPrec.ALLVARS).logger(logger).build(xsts); final SafetyResult status = configuration.check(); if (safe) { assertTrue(status.isSafe()); diff --git a/subprojects/xsts/xsts-analysis/src/test/java/hu/bme/mit/theta/xsts/analysis/XstsTest.java b/subprojects/xsts/xsts-analysis/src/test/java/hu/bme/mit/theta/xsts/analysis/XstsTest.java index 756325f746..47310001fa 100644 --- a/subprojects/xsts/xsts-analysis/src/test/java/hu/bme/mit/theta/xsts/analysis/XstsTest.java +++ b/subprojects/xsts/xsts-analysis/src/test/java/hu/bme/mit/theta/xsts/analysis/XstsTest.java @@ -240,7 +240,7 @@ public void test() throws IOException { xsts = XstsDslManager.createXsts(inputStream); } - final XstsConfig configuration = new XstsConfigBuilder(domain, XstsConfigBuilder.Refinement.SEQ_ITP, Z3SolverFactory.getInstance()).initPrec(XstsConfigBuilder.InitPrec.CTRL).optimizeStmts(XstsConfigBuilder.OptimizeStmts.ON).predSplit(XstsConfigBuilder.PredSplit.CONJUNCTS).maxEnum(250).autoExpl(XstsConfigBuilder.AutoExpl.NEWOPERANDS).logger(logger).build(xsts); + final XstsConfig configuration = new XstsConfigBuilder(domain, XstsConfigBuilder.Refinement.SEQ_ITP, Z3SolverFactory.getInstance(), Z3SolverFactory.getInstance()).initPrec(XstsConfigBuilder.InitPrec.CTRL).optimizeStmts(XstsConfigBuilder.OptimizeStmts.ON).predSplit(XstsConfigBuilder.PredSplit.CONJUNCTS).maxEnum(250).autoExpl(XstsConfigBuilder.AutoExpl.NEWOPERANDS).logger(logger).build(xsts); final SafetyResult status = configuration.check(); if (safe) { assertTrue(status.isSafe()); diff --git a/subprojects/xsts/xsts-cli/build.gradle.kts b/subprojects/xsts/xsts-cli/build.gradle.kts index 99e4faa13e..80a0cb57d7 100644 --- a/subprojects/xsts/xsts-cli/build.gradle.kts +++ b/subprojects/xsts/xsts-cli/build.gradle.kts @@ -10,6 +10,7 @@ dependencies { implementation(project(":theta-core")) implementation(project(":theta-common")) implementation(project(":theta-solver-z3")) + implementation(project(":theta-solver-smtlib")) implementation(project(":theta-solver")) } diff --git a/subprojects/xsts/xsts-cli/src/main/java/hu/bme/mit/theta/xsts/cli/XstsCli.java b/subprojects/xsts/xsts-cli/src/main/java/hu/bme/mit/theta/xsts/cli/XstsCli.java index 1d1c5722d5..d7b6e7af71 100644 --- a/subprojects/xsts/xsts-cli/src/main/java/hu/bme/mit/theta/xsts/cli/XstsCli.java +++ b/subprojects/xsts/xsts-cli/src/main/java/hu/bme/mit/theta/xsts/cli/XstsCli.java @@ -7,15 +7,19 @@ import com.google.common.io.Files; import com.google.common.io.MoreFiles; import com.google.common.io.RecursiveDeleteOption; -import hu.bme.mit.theta.analysis.*; import hu.bme.mit.theta.analysis.algorithm.SafetyResult; import hu.bme.mit.theta.analysis.algorithm.cegar.CegarStatistics; import hu.bme.mit.theta.analysis.expl.ExplState; -import hu.bme.mit.theta.analysis.expr.ExprState; +import hu.bme.mit.theta.analysis.Action; +import hu.bme.mit.theta.analysis.Prec; +import hu.bme.mit.theta.analysis.State; +import hu.bme.mit.theta.analysis.Trace; +import hu.bme.mit.theta.analysis.algorithm.runtimecheck.ArgCexCheckHandler; import hu.bme.mit.theta.analysis.expr.refinement.PruneStrategy; import hu.bme.mit.theta.analysis.utils.ArgVisualizer; import hu.bme.mit.theta.analysis.utils.TraceVisualizer; import hu.bme.mit.theta.common.CliUtils; +import hu.bme.mit.theta.common.OsHelper; import hu.bme.mit.theta.common.logging.ConsoleLogger; import hu.bme.mit.theta.common.logging.Logger; import hu.bme.mit.theta.common.logging.NullLogger; @@ -23,10 +27,14 @@ import hu.bme.mit.theta.common.table.TableWriter; import hu.bme.mit.theta.common.visualization.Graph; import hu.bme.mit.theta.common.visualization.writer.GraphvizWriter; -import hu.bme.mit.theta.core.decl.VarDecl; +import hu.bme.mit.theta.solver.SolverFactory; +import hu.bme.mit.theta.solver.SolverManager; +import hu.bme.mit.theta.solver.smtlib.SmtLibSolverManager; import hu.bme.mit.theta.solver.z3.Z3SolverFactory; +import hu.bme.mit.theta.solver.z3.Z3SolverManager; import hu.bme.mit.theta.xsts.XSTS; -import hu.bme.mit.theta.xsts.analysis.*; +import hu.bme.mit.theta.xsts.analysis.XstsAction; +import hu.bme.mit.theta.xsts.analysis.XstsState; import hu.bme.mit.theta.xsts.analysis.concretizer.TraceGenerationXstsTraceConcretizerUtil; import hu.bme.mit.theta.xsts.analysis.concretizer.XstsStateSequence; import hu.bme.mit.theta.xsts.analysis.concretizer.XstsTraceConcretizerUtil; @@ -41,6 +49,7 @@ import hu.bme.mit.theta.xsts.pnml.elements.PnmlNet; import java.io.*; +import java.nio.file.Path; import java.util.List; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -77,7 +86,7 @@ public class XstsCli { Integer maxEnum = 0; @Parameter(names = "--autoexpl", description = "Predicate to explicit switching strategy") - AutoExpl autoExpl = AutoExpl.NEWOPERANDS; + AutoExpl autoExpl = AutoExpl.NEWOPERANDS; @Parameter(names = {"--initprec"}, description = "Initial precision") InitPrec initPrec = InitPrec.EMPTY; @@ -112,6 +121,18 @@ public class XstsCli { @Parameter(names = {"--visualize"}, description = "Write proof or counterexample to file in dot format") String dotfile = null; + @Parameter(names = {"--refinement-solver"}, description = "Refinement solver name") + String refinementSolver= "Z3"; + + @Parameter(names = {"--abstraction-solver"}, description = "Abstraction solver name") + String abstractionSolver= "Z3"; + + @Parameter(names = {"--smt-home"}, description = "The path of the solver registry") + String solverHome = SmtLibSolverManager.HOME.toAbsolutePath().toString(); + + @Parameter(names = "--no-stuck-check") + boolean noStuckCheck = false; + @Parameter(names = "--tracegen", description = "Generate all possible traces of the model (instead of verification)") boolean tracegen = false; @@ -264,8 +285,19 @@ private XSTS loadModel() throws Exception { } private XstsConfig buildConfiguration(final XSTS xsts) throws Exception { + // set up stopping analysis if it is stuck on same ARGs and precisions + if (noStuckCheck) { + ArgCexCheckHandler.instance.setArgCexCheck(false, false); + } else { + ArgCexCheckHandler.instance.setArgCexCheck(true, refinement.equals(Refinement.MULTI_SEQ)); + } + + registerAllSolverManagers(solverHome, logger); + SolverFactory abstractionSolverFactory = SolverManager.resolveSolverFactory(abstractionSolver); + SolverFactory refinementSolverFactory = SolverManager.resolveSolverFactory(refinementSolver); + try { - return new XstsConfigBuilder(domain, refinement, Z3SolverFactory.getInstance()) + return new XstsConfigBuilder(domain, refinement, abstractionSolverFactory, refinementSolverFactory) .maxEnum(maxEnum).autoExpl(autoExpl).initPrec(initPrec).pruneStrategy(pruneStrategy) .search(search).predSplit(predSplit).optimizeStmts(optimizeStmts).logger(logger).build(xsts); } catch (final Exception ex) { @@ -329,4 +361,13 @@ private void writeVisualStatus(final SafetyResult status, final String fil GraphvizWriter.getInstance().writeFile(graph, filename); } + private void registerAllSolverManagers(String home, Logger logger) throws Exception { + SolverManager.closeAll(); + SolverManager.registerSolverManager(Z3SolverManager.create()); + if (OsHelper.getOs() == OsHelper.OperatingSystem.LINUX) { + SmtLibSolverManager smtLibSolverManager = SmtLibSolverManager.create(Path.of(home), logger); + SolverManager.registerSolverManager(smtLibSolverManager); + } + } + } diff --git a/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsSpecification.java b/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsSpecification.java index fa5f3f4537..06a7342cf0 100644 --- a/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsSpecification.java +++ b/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsSpecification.java @@ -87,18 +87,19 @@ public XSTS instantiate(){ if(varDeclContext.CTRL()!=null) ctrlVars.add(var); if(varDeclContext.initValue!=null){ initExprs.add(Eq(var.getRef(),new XstsExpression(this,typeTable,varDeclContext.initValue).instantiate(env))); - } else { - initExprs.add(varToType.get(var).createBoundExpr(var)); } env.define(symbol,var); } - final Expr initFormula = ExprUtils.simplify(And(initExprs)); - final NonDetStmt tranSet = new XstsTransitionSet(this,typeTable,context.tran.transitionSet(), varToType).instantiate(env); final NonDetStmt initSet = new XstsTransitionSet(this,typeTable,context.init.transitionSet(), varToType).instantiate(env); final NonDetStmt envSet = new XstsTransitionSet(this,typeTable,context.env.transitionSet(), varToType).instantiate(env); + for(VarDecl varDecl: varToType.keySet()){ + initExprs.add(varToType.get(varDecl).createBoundExpr(varDecl)); + } + final Expr initFormula = ExprUtils.simplify(And(initExprs)); + final Expr prop = cast(new XstsExpression(this,typeTable,context.prop).instantiate(env),Bool()); return new XSTS(varToType,ctrlVars,initSet,tranSet,envSet,initFormula,prop); diff --git a/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsStatement.java b/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsStatement.java index 1ed67c92f5..9fde935438 100644 --- a/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsStatement.java +++ b/subprojects/xsts/xsts/src/main/java/hu/bme/mit/theta/xsts/dsl/XstsStatement.java @@ -199,13 +199,12 @@ public Stmt visitLocalVarDeclStmt(LocalVarDeclStmtContext ctx) { final Stmt result; if (ctx.initValue == null) { - final Stmt havoc = Havoc(decl); if (xstsType instanceof XstsCustomType) { final Expr expr = xstsType.createBoundExpr(decl); final AssumeStmt assume = Assume(expr); - result = SequenceStmt.of(List.of(havoc, assume)); + result = assume; } else { - result = havoc; + result = SkipStmt.getInstance(); } } else { var expr = new XstsExpression(currentScope, typeTable, ctx.initValue).instantiate(env); @@ -220,6 +219,7 @@ public Stmt visitLocalVarDeclStmt(LocalVarDeclStmtContext ctx) { currentScope.declare(symbol); env.define(symbol, decl); + varToType.put(decl, xstsType); return result; } diff --git a/subprojects/xta/xta-analysis/src/main/java/hu/bme/mit/theta/xta/analysis/expl/itp/ItpExplState.java b/subprojects/xta/xta-analysis/src/main/java/hu/bme/mit/theta/xta/analysis/expl/itp/ItpExplState.java index 8500442483..d5b6d49bf3 100644 --- a/subprojects/xta/xta-analysis/src/main/java/hu/bme/mit/theta/xta/analysis/expl/itp/ItpExplState.java +++ b/subprojects/xta/xta-analysis/src/main/java/hu/bme/mit/theta/xta/analysis/expl/itp/ItpExplState.java @@ -78,7 +78,7 @@ public int hashCode() { result = HASH_SEED; result = 37 * result + concrState.hashCode(); result = 37 * result + abstrState.hashCode(); - result = hashCode; + hashCode = result; } return result; } diff --git a/subprojects/xta/xta-analysis/src/main/java/hu/bme/mit/theta/xta/analysis/zone/itp/ItpZoneState.java b/subprojects/xta/xta-analysis/src/main/java/hu/bme/mit/theta/xta/analysis/zone/itp/ItpZoneState.java index 8754ba504a..dd1c834a3f 100644 --- a/subprojects/xta/xta-analysis/src/main/java/hu/bme/mit/theta/xta/analysis/zone/itp/ItpZoneState.java +++ b/subprojects/xta/xta-analysis/src/main/java/hu/bme/mit/theta/xta/analysis/zone/itp/ItpZoneState.java @@ -92,7 +92,7 @@ public int hashCode() { result = HASH_SEED; result = 37 * result + concrState.hashCode(); result = 37 * result + abstrState.hashCode(); - result = hashCode; + hashCode = result; } return result; }