From 84c4a6d7ad0468fdc10782e9ca706e944658fe72 Mon Sep 17 00:00:00 2001 From: Alex Chew Date: Tue, 11 Jan 2022 09:45:16 -0800 Subject: [PATCH] chore: import code (#1) --- LICENSE | 28 +- NOTICE | 4 + README.md | 10 +- smithy-dotnet/.github/CODEOWNERS | 5 + smithy-dotnet/.gitignore | 7 + smithy-dotnet/README.md | 73 + smithy-dotnet/build.gradle.kts | 31 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59203 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + smithy-dotnet/gradlew | 185 + smithy-dotnet/gradlew.bat | 89 + smithy-dotnet/settings.gradle | 2 + .../software/amazon/polymorph/CodegenCli.java | 189 + .../smithydafny/DafnyApiCodegen.java | 462 + .../smithydafny/DafnyNameResolver.java | 173 + .../AwsSdkDotNetNameResolver.java | 86 + .../smithydotnet/AwsSdkShimCodegen.java | 173 + .../AwsSdkTypeConversionCodegen.java | 115 + .../smithydotnet/DotNetNameResolver.java | 569 + .../smithydotnet/ServiceCodegen.java | 514 + .../polymorph/smithydotnet/ShimCodegen.java | 183 + .../smithydotnet/TypeConversionCodegen.java | 581 + .../smithydotnet/TypeConversionDirection.java | 9 + .../polymorph/traits/ClientConfigTrait.java | 104 + .../polymorph/traits/DafnyUtf8BytesTrait.java | 59 + .../polymorph/traits/PositionalTrait.java | 76 + .../polymorph/traits/ReferenceTrait.java | 146 + .../amazon/polymorph/utils/ModelUtils.java | 121 + .../amazon/polymorph/utils/Token.java | 27 + .../amazon/polymorph/utils/TokenTree.java | 103 + ...re.amazon.smithy.model.traits.TraitService | 4 + .../amazon/polymorph/antlr/CSharpLexer.java | 1301 + .../amazon/polymorph/antlr/CSharpParser.java | 20407 ++++++++++++++++ .../antlr/CSharpParserBaseListener.java | 3103 +++ .../polymorph/antlr/CSharpParserListener.java | 2644 ++ .../smithydafny/DafnyApiCodegenTest.java | 398 + .../smithydotnet/AwsSdkShimCodegenTest.java | 214 + .../AwsSdkTypeConversionCodegenTest.java | 76 + .../smithydotnet/DotNetNameResolverTest.java | 191 + .../smithydotnet/ServiceCodegenSmokeTest.java | 49 + .../smithydotnet/ServiceCodegenTest.java | 659 + .../smithydotnet/ShimCodegenTest.java | 251 + .../TypeConversionCodegenTest.java | 674 + .../amazon/polymorph/util/TestModel.java | 56 + .../amazon/polymorph/util/Tokenizer.java | 30 + smithy-dotnet/src/test/resources/enum.smithy | 33 + smithy-dotnet/src/test/resources/model.smithy | 68 + .../src/test/resources/positional.smithy | 33 + .../src/test/resources/reference.smithy | 30 + smithy-model-to-idl/.gitignore | 7 + smithy-model-to-idl/README.md | 46 + smithy-model-to-idl/build.gradle.kts | 26 + .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + smithy-model-to-idl/gradlew | 185 + smithy-model-to-idl/gradlew.bat | 89 + smithy-model-to-idl/settings.gradle | 2 + .../amazon/polymorph/SmithyModelToIdl.java | 71 + 58 files changed, 34771 insertions(+), 10 deletions(-) create mode 100644 smithy-dotnet/.github/CODEOWNERS create mode 100644 smithy-dotnet/.gitignore create mode 100644 smithy-dotnet/README.md create mode 100644 smithy-dotnet/build.gradle.kts create mode 100644 smithy-dotnet/gradle/wrapper/gradle-wrapper.jar create mode 100644 smithy-dotnet/gradle/wrapper/gradle-wrapper.properties create mode 100755 smithy-dotnet/gradlew create mode 100644 smithy-dotnet/gradlew.bat create mode 100644 smithy-dotnet/settings.gradle create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/CodegenCli.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/smithydafny/DafnyApiCodegen.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/smithydafny/DafnyNameResolver.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/AwsSdkDotNetNameResolver.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/AwsSdkShimCodegen.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/AwsSdkTypeConversionCodegen.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/DotNetNameResolver.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/ServiceCodegen.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/ShimCodegen.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/TypeConversionCodegen.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/TypeConversionDirection.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/traits/ClientConfigTrait.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/traits/DafnyUtf8BytesTrait.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/traits/PositionalTrait.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/traits/ReferenceTrait.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/utils/ModelUtils.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/utils/Token.java create mode 100644 smithy-dotnet/src/main/java/software/amazon/polymorph/utils/TokenTree.java create mode 100644 smithy-dotnet/src/main/resources/META-INF/services/software.amazon.smithy.model.traits.TraitService create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpLexer.java create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpParser.java create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpParserBaseListener.java create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpParserListener.java create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/smithydafny/DafnyApiCodegenTest.java create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/AwsSdkShimCodegenTest.java create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/AwsSdkTypeConversionCodegenTest.java create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/DotNetNameResolverTest.java create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/ServiceCodegenSmokeTest.java create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/ServiceCodegenTest.java create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/ShimCodegenTest.java create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/TypeConversionCodegenTest.java create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/util/TestModel.java create mode 100644 smithy-dotnet/src/test/java/software/amazon/polymorph/util/Tokenizer.java create mode 100644 smithy-dotnet/src/test/resources/enum.smithy create mode 100644 smithy-dotnet/src/test/resources/model.smithy create mode 100644 smithy-dotnet/src/test/resources/positional.smithy create mode 100644 smithy-dotnet/src/test/resources/reference.smithy create mode 100644 smithy-model-to-idl/.gitignore create mode 100644 smithy-model-to-idl/README.md create mode 100644 smithy-model-to-idl/build.gradle.kts create mode 100644 smithy-model-to-idl/gradle/wrapper/gradle-wrapper.jar create mode 100644 smithy-model-to-idl/gradle/wrapper/gradle-wrapper.properties create mode 100755 smithy-model-to-idl/gradlew create mode 100644 smithy-model-to-idl/gradlew.bat create mode 100644 smithy-model-to-idl/settings.gradle create mode 100644 smithy-model-to-idl/src/main/java/software/amazon/polymorph/SmithyModelToIdl.java diff --git a/LICENSE b/LICENSE index 67db858821..261eeb9e9f 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,3 @@ - Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -173,3 +172,30 @@ defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + 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. diff --git a/NOTICE b/NOTICE index 616fc58894..d8fd6595d9 100644 --- a/NOTICE +++ b/NOTICE @@ -1 +1,5 @@ +AWS Polymorph Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + +This product includes software developed by +Amazon Technologies, Inc (http://www.amazon.com/). diff --git a/README.md b/README.md index 847260ca51..5fa67402c7 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,4 @@ -## My Project - -TODO: Fill this README out! - -Be sure to: - -* Change the title in this README -* Edit your repository description on GitHub +# Polymorph ## Security @@ -14,4 +7,3 @@ See [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more inform ## License This project is licensed under the Apache-2.0 License. - diff --git a/smithy-dotnet/.github/CODEOWNERS b/smithy-dotnet/.github/CODEOWNERS new file mode 100644 index 0000000000..8068917362 --- /dev/null +++ b/smithy-dotnet/.github/CODEOWNERS @@ -0,0 +1,5 @@ +# Each line is a file pattern followed by one or more owners. +# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners + +# Default code owner for everything is our aws-crypto-tools group +* @aws/aws-crypto-tools diff --git a/smithy-dotnet/.gitignore b/smithy-dotnet/.gitignore new file mode 100644 index 0000000000..54caf66065 --- /dev/null +++ b/smithy-dotnet/.gitignore @@ -0,0 +1,7 @@ +# Gradle +/.gradle/ +/build/ +/target/ + +# IDE +/.idea/ diff --git a/smithy-dotnet/README.md b/smithy-dotnet/README.md new file mode 100644 index 0000000000..bb19ab7ce1 --- /dev/null +++ b/smithy-dotnet/README.md @@ -0,0 +1,73 @@ +# smithy-dotnet + +C#/.NET code generation for Smithy models + +## How to use + +This project requires Java 16 or above. + +```bash +$ # start in project root +$ pwd +~/src/polymorph/smithy-dotnet + +$ # build +$ ./gradlew build +BUILD SUCCESSFUL in 507ms + +$ # generate code +$ OUTPUT_DOTNET=/path/to/generated_dotnet +$ OUTPUT_DAFNY=/path/to/generated_dafny +$ MODEL=src/test/resources/model.smithy +$ SERVICE='polymorph.demo#StringLists' +$ ./gradlew run --args="--output-dotnet $OUTPUT_DOTNET --output-dafny $OUTPUT_DAFNY -m $MODEL -s $SERVICE" +[main] INFO software.amazon.polymorph.CodegenCli - .NET code generated in /.../generated-dotnet +[main] INFO software.amazon.polymorph.CodegenCli - Dafny code generated in /.../generated-dafny +``` + +You can also look at the [ServiceCodegenSmokeTest](./src/test/java/software/amazon/polymorph/smithydotnet/ServiceCodegenSmokeTest.java) as a reference for how to use the library. It reads and generates code for the [test model](./src/test/resources/model.smithy), then prints the generated code to stdout. + +## Manual build steps for .NET + +Temporary manual steps for getting the generated code into the .NET ESDK. +Soon this will be replaced by a real Polymorph build process. + +First export some variables indicating where your ESDK model and .NET ESDK live: + +```bash +export MODEL_ROOT= # e.g. ~/src/aws-encryption-sdk-dafny/model +export DOTNET_ROOT= # e.g. ~/src/aws-encryption-sdk-dafny/aws-encryption-sdk-net-formally-verified +export DAFNY_ROOT= # e.g. ~/src/aws-encryption-sdk-dafny +``` + +Then, run the following. You'll likely see a bunch of warnings about "Overwriting existing file". + +```bash +# Generate code for material providers +# NOTE: No Dafny code will be generated, since Dafny codegen doesn't currently support non-AWS-SDK models +./gradlew run --args="\ + --output-dotnet $DOTNET_ROOT/Source/API/Generated/Crypto \ + --output-dafny $DAFNY_ROOT/src/Generated \ + -m $MODEL_ROOT -s aws.crypto#AwsCryptographicMaterialProviders" + +# Generate code for KMS +./gradlew run --args="\ + --output-dotnet $DOTNET_ROOT/Source/API/Generated/Kms \ + --output-dafny $DAFNY_ROOT/src/Generated \ + --aws-sdk \ + -m $MODEL_ROOT -s com.amazonaws.kms#KeyManagementService" + +# Generate code for ESDK +# NOTE: No Dafny code will be generated, since Dafny codegen doesn't currently support non-AWS-SDK models +./gradlew run --args="\ + --output-dotnet $DOTNET_ROOT/Source/API/Generated/Esdk \ + --output-dafny $DAFNY_ROOT/src/Generated \ + -m $MODEL_ROOT -s aws.esdk#AwsEncryptionSdk" +``` + +Confirm the files were generated as expected: + +```bash +ls $DOTNET_ROOT/Source/API/Generated/Crypto +ls $DAFNY_ROOT/src/Generated +``` diff --git a/smithy-dotnet/build.gradle.kts b/smithy-dotnet/build.gradle.kts new file mode 100644 index 0000000000..591384f162 --- /dev/null +++ b/smithy-dotnet/build.gradle.kts @@ -0,0 +1,31 @@ +plugins { + java + application +} + +group = "software.amazon.polymorph" +version = "0.1.0" + +repositories { + mavenLocal() + mavenCentral() +} + +dependencies { + implementation("software.amazon.smithy:smithy-model:1.10.0") + implementation("software.amazon.smithy:smithy-codegen-core:[1.0.2,1.1.0[") + implementation("software.amazon.smithy:smithy-protocol-test-traits:[1.0.2,1.1.0[") + + implementation("com.google.guava:guava:30.1-jre") + implementation("commons-cli:commons-cli:1.4") + implementation("org.slf4j:slf4j-api:1.7.32") + implementation("org.slf4j:slf4j-simple:1.7.32") + + testImplementation("junit", "junit", "4.12") + // Used for parsing-based tests + testImplementation("org.antlr:antlr4:4.9.2") +} + +application { + mainClass.set("software.amazon.polymorph.CodegenCli") +} diff --git a/smithy-dotnet/gradle/wrapper/gradle-wrapper.jar b/smithy-dotnet/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f GIT binary patch literal 59203 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

K7UpUK$>l@ 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 E2O(~oYXATM literal 0 HcmV?d00001 diff --git a/smithy-dotnet/gradle/wrapper/gradle-wrapper.properties b/smithy-dotnet/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..f371643eed --- /dev/null +++ b/smithy-dotnet/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/smithy-dotnet/gradlew b/smithy-dotnet/gradlew new file mode 100755 index 0000000000..4f906e0c81 --- /dev/null +++ b/smithy-dotnet/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# 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 +# +# https://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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/smithy-dotnet/gradlew.bat b/smithy-dotnet/gradlew.bat new file mode 100644 index 0000000000..ac1b06f938 --- /dev/null +++ b/smithy-dotnet/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/smithy-dotnet/settings.gradle b/smithy-dotnet/settings.gradle new file mode 100644 index 0000000000..818d4ccbc8 --- /dev/null +++ b/smithy-dotnet/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'smithy-dotnet' + diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/CodegenCli.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/CodegenCli.java new file mode 100644 index 0000000000..7a7e3f3b3e --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/CodegenCli.java @@ -0,0 +1,189 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import software.amazon.polymorph.smithydafny.DafnyApiCodegen; +import software.amazon.polymorph.smithydotnet.AwsSdkShimCodegen; +import software.amazon.polymorph.smithydotnet.AwsSdkTypeConversionCodegen; +import software.amazon.polymorph.smithydotnet.ServiceCodegen; +import software.amazon.polymorph.smithydotnet.ShimCodegen; +import software.amazon.polymorph.smithydotnet.TypeConversionCodegen; +import software.amazon.polymorph.utils.TokenTree; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.loader.ModelAssembler; +import software.amazon.smithy.model.shapes.ShapeId; + +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Map; +import java.util.Optional; + +public class CodegenCli { + private static final Logger logger = LoggerFactory.getLogger(CodegenCli.class); + + public static void main(String[] args) { + Optional cliArgumentsOptional = Optional.empty(); + try { + cliArgumentsOptional = CliArguments.parse(args); + } catch (ParseException e) { + logger.error("Command-line arguments could not be parsed", e); + } + if (cliArgumentsOptional.isEmpty()) { + printHelpMessage(); + System.exit(0); + } + final CliArguments cliArguments = cliArgumentsOptional.get(); + + final Path outputDotnetDir = cliArguments.outputDotnetDir; + final Path outputDafnyDir = cliArguments.outputDafnyDir; + try { + Files.createDirectories(outputDotnetDir); + Files.createDirectories(outputDafnyDir); + } catch (IOException e) { + e.printStackTrace(); + System.exit(1); + } + + final ModelAssembler assembler = new ModelAssembler(); + final Model model = assembler.addImport(cliArguments.modelPath).assemble().unwrap(); + + if (!cliArguments.awsSdkStyle) { + final ServiceCodegen serviceCodegen = new ServiceCodegen(model, cliArguments.serviceShapeId); + writeTokenTreesIntoDir(serviceCodegen.generate(), outputDotnetDir); + + final ShimCodegen shimCodegen = new ShimCodegen(model, cliArguments.serviceShapeId); + writeTokenTreesIntoDir(shimCodegen.generate(), outputDotnetDir); + } + + final TypeConversionCodegen typeConversionCodegen = cliArguments.awsSdkStyle + ? new AwsSdkTypeConversionCodegen(model, cliArguments.serviceShapeId) + : new TypeConversionCodegen(model, cliArguments.serviceShapeId); + writeTokenTreesIntoDir(typeConversionCodegen.generate(), outputDotnetDir); + + if (cliArguments.awsSdkStyle) { + // TODO generate Dafny API for regular models too + final DafnyApiCodegen dafnyApiCodegen = new DafnyApiCodegen(model, cliArguments.serviceShapeId); + writeTokenTreesIntoDir(dafnyApiCodegen.generate(), outputDafnyDir); + + final AwsSdkShimCodegen shimCodegen = new AwsSdkShimCodegen(model, cliArguments.serviceShapeId); + writeTokenTreesIntoDir(shimCodegen.generate(), outputDotnetDir); + } + + logger.info(".NET code generated in {}", cliArguments.outputDotnetDir); + logger.info("Dafny code generated in {}", cliArguments.outputDafnyDir); + } + + private static Options getCliOptions() { + final Options cliOptions = new Options(); + cliOptions.addOption(Option.builder("h") + .longOpt("help") + .desc("print help message") + .build()); + cliOptions.addOption(Option.builder("m") + .longOpt("model") + .desc("model file (.smithy format)") + .hasArg() + .required() + .build()); + cliOptions.addOption(Option.builder("s") + .longOpt("service-id") + .desc("service ID to generate code for, such as 'com.foo#BarService'") + .hasArg() + .required() + .build()); + cliOptions.addOption(Option.builder() + .longOpt("output-dotnet") + .desc("output directory for generated .NET files") + .hasArg() + .required() + .build()); + cliOptions.addOption(Option.builder() + .longOpt("output-dafny") + .desc("output directory for generated Dafny files") + .hasArg() + .required() + .build()); + cliOptions.addOption(Option.builder() + .longOpt("aws-sdk") + .desc("generate AWS SDK-style API and shims") + .build()); + return cliOptions; + } + + private static void printHelpMessage() { + new HelpFormatter().printHelp("smithy-dotnet", getCliOptions()); + } + + private static record CliArguments( + Path modelPath, + ShapeId serviceShapeId, + Path outputDotnetDir, + Path outputDafnyDir, + boolean awsSdkStyle + ) { + /** + * @param args arguments to parse + * @return parsed arguments, or {@code Optional.empty()} if help should be printed + * @throws ParseException if command line arguments are invalid + */ + static Optional parse(String[] args) throws ParseException { + final DefaultParser parser = new DefaultParser(); + final CommandLine commandLine = parser.parse(getCliOptions(), args); + if (commandLine.hasOption("h")) { + return Optional.empty(); + } + + final Path modelPath = Path.of(commandLine.getOptionValue('m')); + final ShapeId serviceShapeId = ShapeId.from(commandLine.getOptionValue('s')); + final Path outputDotnetDir = Paths.get(commandLine.getOptionValue("output-dotnet")) + .toAbsolutePath().normalize(); + final Path outputDafnyDir = Paths.get(commandLine.getOptionValue("output-dafny")) + .toAbsolutePath().normalize(); + final boolean awsSdkStyle = commandLine.hasOption("aws-sdk"); + + return Optional.of(new CliArguments( + modelPath, serviceShapeId, outputDotnetDir, outputDafnyDir, awsSdkStyle)); + } + } + + private static void writeToFile(final String text, final File file) { + try { + if (!file.createNewFile()) { + logger.warn("Overwriting existing file {}", file); + } + final FileWriter fileWriter = new FileWriter(file); + fileWriter.write(text); + fileWriter.close(); + } catch (IOException e) { + logger.error("Could not write to file {}", file); + e.printStackTrace(); + } + } + + private static final String COPYRIGHT_HEADER = """ + // Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. + // SPDX-License-Identifier: Apache-2.0 + """; + + private static void writeTokenTreesIntoDir(final Map tokenTreeMap, final Path outputDir) { + tokenTreeMap.forEach((Path localPath, TokenTree tokens) -> { + final Path outputPath = Path.of(outputDir.toString(), localPath.toString()); + writeToFile(COPYRIGHT_HEADER + tokens.toString(), outputPath.toFile()); + }); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydafny/DafnyApiCodegen.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydafny/DafnyApiCodegen.java new file mode 100644 index 0000000000..9e252d5bb3 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydafny/DafnyApiCodegen.java @@ -0,0 +1,462 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydafny; + +import software.amazon.polymorph.traits.DafnyUtf8BytesTrait; +import software.amazon.polymorph.traits.PositionalTrait; +import software.amazon.polymorph.traits.ReferenceTrait; +import software.amazon.polymorph.utils.ModelUtils; +import software.amazon.polymorph.utils.Token; +import software.amazon.polymorph.utils.TokenTree; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.BlobShape; +import software.amazon.smithy.model.shapes.ListShape; +import software.amazon.smithy.model.shapes.MapShape; +import software.amazon.smithy.model.shapes.MemberShape; +import software.amazon.smithy.model.shapes.NumberShape; +import software.amazon.smithy.model.shapes.OperationShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.ShapeType; +import software.amazon.smithy.model.shapes.StringShape; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.traits.EnumTrait; +import software.amazon.smithy.model.traits.ErrorTrait; +import software.amazon.smithy.model.traits.LengthTrait; +import software.amazon.smithy.model.traits.RangeTrait; +import software.amazon.smithy.model.traits.TraitDefinition; + +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collection; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.TreeSet; +import java.util.stream.Collectors; + +public class DafnyApiCodegen { + private final Model model; + private final ServiceShape serviceShape; + private final DafnyNameResolver nameResolver; + + public DafnyApiCodegen(final Model model, final ShapeId serviceShapeId) { + this.model = model; + this.serviceShape = model.expectShape(serviceShapeId, ServiceShape.class); + this.nameResolver = new DafnyNameResolver(model, serviceShape); + } + + public Map generate() { + final TokenTree includeDirectives = Token.of(""" + include "../StandardLibrary/StandardLibrary.dfy" + include "../Util/UTF8.dfy" + """); + + final String serviceName = nameResolver.nameForService(); + final String externNamespace = DafnyNameResolver.dafnyExternNamespaceForShapeId(serviceShape.getId()); + final String moduleName = DafnyNameResolver.dafnyModuleForShapeId(serviceShape.getId()); + final TokenTree moduleHeader = Token.of("module {:extern \"%s\"} %s".formatted(externNamespace, moduleName)); + + final TokenTree modulePrelude = Token.of(""" + import opened Wrappers + import opened StandardLibrary.UInt + import opened UTF8 + """); + final TokenTree generatedTypes = TokenTree.of(model.shapes() + .filter(shape -> ModelUtils.isInServiceNamespace(shape.getId(), serviceShape)) + // Sort by shape ID for deterministic generated code + .collect(Collectors.toCollection(() -> new TreeSet<>(new ShapeIdComparator()))) + .stream() + .map(this::generateCodeForShape) + .flatMap(Optional::stream) + ).lineSeparated(); + + final TokenTree moduleBody = TokenTree.of(modulePrelude, generatedTypes).braced(); + + final Path path = Path.of("%s.dfy".formatted(serviceName)); + final TokenTree fullCode = TokenTree.of(includeDirectives, moduleHeader, moduleBody); + return Map.of(path, fullCode); + } + + private static class ShapeIdComparator implements Comparator { + @Override + public int compare(Shape o1, Shape o2) { + return o1.getId().compareTo(o2.getId()); + } + } + + private Optional generateCodeForShape(final Shape shape) { + final ShapeId shapeId = shape.getId(); + return Optional.ofNullable(switch (shape.getType()) { + case SERVICE -> { + if (shape != serviceShape) { + throw new IllegalStateException("Unexpected service shape found"); + } + yield TokenTree.of(generateServiceTraitDefinition(), generateServiceErrorTypeDefinition()) + .lineSeparated(); + } + case BLOB -> generateBlobTypeDefinition(shapeId); + case BOOLEAN -> generateBoolTypeDefinition(shapeId); + case STRING -> { + if (shape.hasTrait(EnumTrait.class)) { + yield generateEnumTypeDefinition(shapeId); + } else if (shape.hasTrait(DafnyUtf8BytesTrait.ID)) { + yield generateValidUTF8BytesType(shapeId); + } else { + yield generateStringTypeDefinition(shapeId); + } + } + case INTEGER, LONG -> generateNumericTypeDefinition(shapeId); + case LIST -> generateListTypeDefinition(shapeId); + case MAP -> generateMapTypeDefinition(shapeId); + case STRUCTURE -> { + if (shape.hasTrait(TraitDefinition.class) + || shape.hasTrait(ReferenceTrait.class) + || shape.hasTrait(PositionalTrait.class)) { + yield null; + } else if (shape.hasTrait(ErrorTrait.class)) { + yield generateErrorStructureTypeDefinition(shapeId); + } else { + yield generateStructureTypeDefinition(shapeId); + } + } + default -> null; + }); + } + + public TokenTree generateValidUTF8BytesType(final ShapeId shapeId) { + final StringShape stringShape = model.expectShape(shapeId, StringShape.class); + final Optional lengthConstraint = stringShape + .getTrait(LengthTrait.class) + .map(DafnyApiCodegen::generateLengthConstraint); + return generateSubsetType(shapeId, "ValidUTF8Bytes", lengthConstraint); + } + + public TokenTree generateErrorStructureTypeDefinition(final ShapeId shapeId) { + TokenTree datatype = this.generateStructureTypeDefinition(shapeId); + StructureShape errorStructure = model.expectShape(shapeId, StructureShape.class); + final TokenTree castMethod = generateCastToStringForAnErrorStructure(shapeId, errorStructure); + datatype = datatype.append(castMethod.surround(TokenTree.of("{\n"), TokenTree.of("\n }"))); + return datatype; + } + + public TokenTree generateCastToStringForAnErrorStructure(final ShapeId shapeId, final StructureShape errorStructure) { + Optional message = errorStructure.getMember("message"); + final String castToStringSignature = "\tfunction method CastToString(): string {\n\t%1$s\n\t}"; + String body; + if (message.isPresent() + && model.expectShape(message.get().getTarget()).getType() == ShapeType.STRING) { + body = "\tif message.Some? then \"%1$s: \" + message.value else \"%1$s\""; + } else { + body = "\"%1$s\""; + } + body = body.formatted(shapeId.getName(serviceShape)); + TokenTree castMethod = TokenTree.of(castToStringSignature.formatted(body)); + return castMethod; + } + + public TokenTree generateBlobTypeDefinition(final ShapeId blobShapeId) { + final BlobShape blobShape = model.expectShape(blobShapeId, BlobShape.class); + final Optional lengthConstraint = blobShape.getTrait(LengthTrait.class) + .map(DafnyApiCodegen::generateLengthConstraint); + return generateSubsetType(blobShapeId, "seq", lengthConstraint); + } + + public TokenTree generateBoolTypeDefinition(final ShapeId boolShapeId) { + return generateTypeSynonym(boolShapeId, "bool"); + } + + public TokenTree generateStringTypeDefinition(final ShapeId stringShapeId) { + final StringShape stringShape = model.expectShape(stringShapeId, StringShape.class); + final Optional lengthConstraint = stringShape.getTrait(LengthTrait.class) + .map(DafnyApiCodegen::generateLengthConstraint); + return generateSubsetType(stringShapeId, "string", lengthConstraint); + } + + public TokenTree generateEnumTypeDefinition(final ShapeId stringShapeId) { + final StringShape stringShape = model.expectShape(stringShapeId, StringShape.class); + final EnumTrait enumTrait = stringShape.getTrait(EnumTrait.class).orElseThrow(); + + if (!enumTrait.hasNames()) { + throw new UnsupportedOperationException("Unnamed enums not supported"); + } + //noinspection OptionalGetWithoutIsPresent + final TokenTree constructors = TokenTree.of(enumTrait.getValues().stream() + .map(enumDefinition -> enumDefinition.getName().get()) + .peek(name -> { + if (!ModelUtils.isValidEnumDefinitionName(name)) { + throw new UnsupportedOperationException("Invalid enum definition name: %s".formatted(name)); + } + }) + .map(name -> TokenTree.of("\n\t|", name))); + + return Token.of("datatype %s =".formatted(nameResolver.baseTypeForShape(stringShapeId))).append(constructors); + } + + public TokenTree generateNumericTypeDefinition(final ShapeId numberShapeId) { + final NumberShape numberShape = model.expectShape(numberShapeId, NumberShape.class); + final Optional rangeConstraint = numberShape.getTrait(RangeTrait.class) + .map(DafnyApiCodegen::generateRangeConstraint); + final String baseType = Objects.requireNonNull( + DafnyNameResolver.DAFNY_TYPES_BY_SIMPLE_SHAPE_TYPE.get(numberShape.getType())); + return generateSubsetType(numberShapeId, baseType, rangeConstraint); + } + + public TokenTree generateListTypeDefinition(final ShapeId listShapeId) { + final ListShape listShape = model.expectShape(listShapeId, ListShape.class); + final Optional lengthConstraint = listShape.getTrait(LengthTrait.class) + .map(DafnyApiCodegen::generateLengthConstraint); + final String baseType = "seq<%s>".formatted(nameResolver.baseTypeForShape(listShape.getMember().getId())); + return generateSubsetType(listShapeId, baseType, lengthConstraint); + } + + public TokenTree generateMapTypeDefinition(final ShapeId mapShapeId) { + final MapShape mapShape = model.expectShape(mapShapeId, MapShape.class); + final Optional lengthConstraint = mapShape.getTrait(LengthTrait.class) + .map(DafnyApiCodegen::generateLengthConstraint); + final String keyType = nameResolver.baseTypeForShape(mapShape.getKey().getId()); + final String valueType = nameResolver.baseTypeForShape(mapShape.getValue().getId()); + final String baseType = "map<%s, %s>".formatted(keyType, valueType); + return generateSubsetType(mapShapeId, baseType, lengthConstraint); + } + + public TokenTree generateStructureTypeDefinition(final ShapeId structureShapeId) { + final StructureShape structureShape = model.expectShape(structureShapeId, StructureShape.class); + final TokenTree params = TokenTree.of(ModelUtils.streamStructureMembers(structureShape) + .map(this::generateStructureTypeParameter) + ).separated(Token.of(",")).parenthesized(); + + final String typeName = structureShapeId.getName(serviceShape); + return TokenTree.of( + Token.of("datatype %1$s = %1$s".formatted(typeName)), + params); + } + + private TokenTree generateStructureTypeParameter(final MemberShape memberShape) { + return Token.of("\n\tnameonly %s: %s".formatted( + memberShape.getMemberName(), nameResolver.baseTypeForShape(memberShape.getId()))); + } + + public TokenTree generateServiceTraitDefinition() { + final TokenTree trait = TokenTree.of("trait", nameResolver.traitForServiceClient(serviceShape)); + final TokenTree predicatesAndMethods = TokenTree.of( + serviceShape.getAllOperations().stream().map(this::generateOperationPredicatesAndMethod)) + .lineSeparated(); + return TokenTree.of(trait, predicatesAndMethods.braced()); + } + + public TokenTree generateOperationPredicatesAndMethod(final ShapeId operationShapeId) { + + final OperationShape operationShape = model.expectShape(operationShapeId, OperationShape.class); + final TokenTree operationParams = operationShape.getInput() + .map(nameResolver::baseTypeForShape) + .map(inputType -> TokenTree.of("input:", inputType)) + .orElse(TokenTree.empty()) + ; + final Optional outputType = this.nameResolver.returnTypeForResult(operationShape); + TokenTree returnType = TokenTree.empty(); + if (outputType.isPresent()) { + returnType = TokenTree.of("output: %s".formatted(outputType.get())); + } + + final TokenTree wrappedReply = Token.of("output: %s" + .formatted(nameResolver.returnTypeForOperation(operationShape))); + final TokenTree calledWithPredicate = this.generatePredicateCalledWith(operationShape, operationParams); + final TokenTree succeededWithPredicate = this.generatePredicateSucceededWith(operationShape, operationParams, returnType); + final TokenTree method = this.generateOperationMethod(operationShape, operationParams, wrappedReply); + + return TokenTree.of(calledWithPredicate, succeededWithPredicate, method).lineSeparated().append(TokenTree.of("\n")); + } + + private TokenTree generateOperationMethod( + final OperationShape operationShape, + final TokenTree operationParams, + final TokenTree wrappedReply + ) { + final TokenTree name = TokenTree.of("method", nameResolver.methodForOperation(operationShape)); + final TokenTree params = operationParams.parenthesized(); + final TokenTree returns = TokenTree.of("returns ").append(wrappedReply.parenthesized()); + + // The formal Dafny name for this section of a method is "specification". + // To avoid confusion with RFC-style "specifications", instead use the term "conditions". + TokenTree conditions = TokenTree.empty(); + + TokenTree ensureCalledWith = TokenTree.of( + "\n\tensures " + + nameResolver.predicateCalledWith(operationShape) + ); + TokenTree ensureSucceededWith = TokenTree.of( + "\n\tensures output.Success? ==> " + + nameResolver.predicateSucceededWith(operationShape) + ); + TokenTree ensureCalledWithParams = TokenTree.empty(); + TokenTree ensureSucceededWithParams = TokenTree.empty(); + if (operationShape.getInput().isPresent()) { + ensureCalledWithParams = ensureCalledWithParams.append(TokenTree.of("input")); + ensureSucceededWithParams = ensureSucceededWithParams.append(TokenTree.of("input")); + } + if (operationShape.getInput().isPresent() && operationShape.getOutput().isPresent()) { + ensureSucceededWithParams = ensureSucceededWithParams.append(TokenTree.of(",")); + } + if (operationShape.getOutput().isPresent()) { + ensureSucceededWithParams = ensureSucceededWithParams.append(TokenTree.of("output.value")); + } + ensureCalledWithParams = ensureCalledWithParams.parenthesized(); + ensureSucceededWithParams = ensureSucceededWithParams.parenthesized(); + + ensureCalledWith = ensureCalledWith.append(ensureCalledWithParams); + ensureSucceededWith = ensureSucceededWith.append(ensureSucceededWithParams); + conditions = conditions.append(ensureCalledWith); + conditions = conditions.append(ensureSucceededWith); + return TokenTree.of(name, params, returns, conditions); + } + + private TokenTree generatePredicateCalledWith( + final OperationShape operationShape, + final TokenTree operationParams + ) { + final TokenTree name = TokenTree.of("predicate {:opaque}", nameResolver.predicateCalledWith(operationShape)); + TokenTree params = TokenTree.of("("); + if (operationShape.getInput().isPresent()) { + params = TokenTree.of(params, operationParams); + } + params = params.append(TokenTree.of(")")); + final TokenTree body = TokenTree.of("{true}"); + return TokenTree.of(name, params, body); + } + + private TokenTree generatePredicateSucceededWith( + final OperationShape operationShape, + final TokenTree operationParams, + final TokenTree returnType + ) { + TokenTree params = TokenTree.empty(); + if (operationShape.getInput().isPresent()) { + params = TokenTree.of(params, operationParams); + } + if (operationShape.getInput().isPresent() && operationShape.getOutput().isPresent()) { + params = params.append(TokenTree.of(",")); + } + if (operationShape.getOutput().isPresent()) { + params = params.append(returnType); + } + params = params.parenthesized(); + final TokenTree name = TokenTree.of("predicate {:opaque}", nameResolver.predicateSucceededWith(operationShape)); + final TokenTree body = TokenTree.of("{true}"); + return TokenTree.of(name, params, body); + } + + /** + * Generates a sum type for the error shapes of operations in the service. + */ + // TODO: once traits can be used as type parameters, make this a trait instead so that we don't + // need to exhaustively specify the error shapes of operations + public TokenTree generateServiceErrorTypeDefinition() { + // Collect into TreeSet so that the error shapes are lexicographically sorted, ordering them deterministically + final TreeSet errorShapeIds = ModelUtils.streamServiceErrors(model, serviceShape) + .map(Shape::getId) + .collect(Collectors.toCollection(TreeSet::new)); + + final TokenTree unknownConstructor = Token.of("| %s(unknownMessage: string)".formatted( + nameResolver.nameForServiceErrorUnknownConstructor(serviceShape))); + final TokenTree knownConstructors = TokenTree.of(errorShapeIds.stream() + .map(errorShapeId -> Token.of("| %1$s(%2$s: %2$s)".formatted( + nameResolver.nameForServiceErrorConstructor(errorShapeId), nameResolver.baseTypeForShape(errorShapeId))))) + .lineSeparated(); + final TokenTree allConstructors = TokenTree.of(unknownConstructor, knownConstructors).lineSeparated(); + TokenTree serviceErrorDatatype = TokenTree.of("datatype", nameResolver.errorTypeForService(serviceShape), "=\n") + .append(allConstructors); + + return serviceErrorDatatype + .append(generateCastToStringForErrorStructure(errorShapeIds)) + .lineSeparated(); + } + + /** + * Generates a function method to cast all subtypes of generated Service Error + * to a string. + */ + public TokenTree generateCastToStringForErrorStructure(final TreeSet errorShapeIds) { + String castToStringFunctionMethodName = "Cast" + + nameResolver.errorTypeForService(serviceShape) + + "ToString"; + TokenTree castToStringSignature = TokenTree.of("function method %1$s(error: %2$s): string".formatted( + castToStringFunctionMethodName, nameResolver.errorTypeForService(serviceShape))); + final String commonCaseBody = "\n\tcase %1$s(arg) => arg.CastToString()"; + final TokenTree body = TokenTree.of(errorShapeIds.stream() + .map(errorShapeId -> TokenTree.of(commonCaseBody.formatted( + nameResolver.nameForServiceErrorConstructor(errorShapeId))))) + .surround( + TokenTree.of("\tmatch error"), + TokenTree.of("\n\tcase %1$s(arg) => \"Unexpected Exception from AWS %2$s: \" + arg".formatted( + nameResolver.nameForServiceErrorUnknownConstructor(serviceShape), + nameResolver.nameForService()))) + .braced(); + return castToStringSignature.append(body); + } + + private static TokenTree generateLengthConstraint(final LengthTrait lengthTrait) { + final String min = lengthTrait.getMin().map("%s <="::formatted).orElse(""); + final String max = lengthTrait.getMax().map("<= %s"::formatted).orElse(""); + return TokenTree.of(min, "|x|", max); + } + + private static TokenTree generateRangeConstraint(final RangeTrait rangeTrait) { + final String min = rangeTrait.getMin().map("%s <="::formatted).orElse(""); + final String max = rangeTrait.getMax().map("<= %s"::formatted).orElse(""); + return TokenTree.of(min, "x", max); + } + + /** + * Given a name {@code TypeName}, base type {@code BaseType}, and constraint predicate expressions + * {@code c1, c2, ..., cN} over a free variable {@code x}, generates a subset type like + *

+     * type TypeName = x: BaseType | (c1) && (c2) && ... && (cN) witness *
+     * 
+ * + * If no constraint expressions are provided, then instead generates a type synonym like + *
+     * type TypeName = BaseType
+     * 
+ */ + private TokenTree generateSubsetType( + final ShapeId shapeId, final String baseType, final Collection constraints) { + final String typeName = nameResolver.generatedTypeForShape(shapeId); + if (constraints.size() == 0) { + return TokenTree.of("type", typeName, "=", baseType); + } + + final TokenTree constraintsConjunct = TokenTree.of(constraints.stream().map(TokenTree::parenthesized)) + .separated(Token.of("&&")); + final String validityPredicateName = nameResolver.validityPredicateForShape(shapeId); + final TokenTree validityPredicate = Token.of( + "predicate method %s(x: %s)".formatted(validityPredicateName, baseType)) + .append(constraintsConjunct.braced()); + final TokenTree subsetType = + Token.of("type %s = x: %s | %s(x) witness *".formatted(typeName, baseType, validityPredicateName)); + + return TokenTree.of(subsetType, validityPredicate).lineSeparated(); + } + + /** + * Like {@link DafnyApiCodegen#generateSubsetType(ShapeId, String, Collection)}, but accepts + * {@link Optional}-wrapped constraints and discards the empty ones. + */ + @SuppressWarnings("JavaDoc") + @SafeVarargs + private TokenTree generateSubsetType( + final ShapeId shapeId, final String baseType, final Optional... constraintOptionals) { + final List constraints = Arrays.stream(constraintOptionals).flatMap(Optional::stream).toList(); + return generateSubsetType(shapeId, baseType, constraints); + } + + @SuppressWarnings("SameParameterValue") + private TokenTree generateTypeSynonym( + final ShapeId shapeId, final String baseType) { + return generateSubsetType(shapeId, baseType, Optional.empty()); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydafny/DafnyNameResolver.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydafny/DafnyNameResolver.java new file mode 100644 index 0000000000..afb8b091c2 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydafny/DafnyNameResolver.java @@ -0,0 +1,173 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydafny; + +import com.google.common.base.Joiner; + +import software.amazon.polymorph.traits.ReferenceTrait; +import software.amazon.polymorph.utils.ModelUtils; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.MemberShape; +import software.amazon.smithy.model.shapes.OperationShape; +import software.amazon.smithy.model.shapes.ResourceShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.ShapeType; +import software.amazon.smithy.utils.StringUtils; + +import javax.annotation.Nullable; +import java.util.Arrays; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Stream; + +public record DafnyNameResolver(Model model, ServiceShape serviceShape) { + public static final Map DAFNY_TYPES_BY_SIMPLE_SHAPE_TYPE = Map.ofEntries( + Map.entry(ShapeType.BLOB, "seq"), + Map.entry(ShapeType.BOOLEAN, "bool"), + Map.entry(ShapeType.STRING, "string"), + // currently unused in model and unsupported in StandardLibrary.UInt +// Map.entry(ShapeType.BYTE, "int8"), +// Map.entry(ShapeType.SHORT, "int16"), + Map.entry(ShapeType.INTEGER, "int32"), + Map.entry(ShapeType.LONG, "int64") + ); + + public String nameForService(final ServiceShape serviceShape) { + return StringUtils.capitalize(serviceShape.getContextualName(this.serviceShape)); + } + + public String nameForService() { + return nameForService(serviceShape); + } + + public String nameForServiceErrorConstructor(final ShapeId errorShapeId) { + return "%1$s_%2$s".formatted(this.nameForService(), this.baseTypeForShape(errorShapeId)); + } + + public String nameForServiceErrorUnknownConstructor(final ServiceShape serviceShape) { + return "%s_Unknown".formatted(nameForService(serviceShape)); + } + + @SuppressWarnings("OptionalGetWithoutIsPresent") + public String baseTypeForShape(final ShapeId shapeId) { + final Shape shape = model.expectShape(shapeId); + final String shapeName = shapeId.getName(serviceShape); + + if (ModelUtils.isSmithyApiShape(shapeId)) { + @Nullable final String simpleShapeType = DAFNY_TYPES_BY_SIMPLE_SHAPE_TYPE.get(shape.getType()); + return Objects.requireNonNull(simpleShapeType, + () -> String.format("No Dafny type for prelude shape %s", shapeId)); + } + + return switch (shape.getType()) { + case BLOB, BOOLEAN, STRING, + // currently unused in model and unsupported in StandardLibrary.UInt + // BYTE, SHORT + INTEGER, LONG, + LIST, MAP, STRUCTURE -> shapeName; + case SERVICE -> traitForServiceClient(shape.asServiceShape().get()); + case RESOURCE -> traitForResource(shape.asResourceShape().get()); + case MEMBER -> baseTypeForMember(shape.asMemberShape().get()); + // TODO create/use better timestamp type in Dafny libraries + case TIMESTAMP -> "string"; + default -> throw new UnsupportedOperationException( + "Shape %s has unsupported type %s".formatted(shapeId, shape.getType())); + }; + } + + private String baseTypeForMember(final MemberShape memberShape) { + final String targetType = baseTypeForShape(memberShape.getTarget()); + if (!ModelUtils.memberShapeIsOptional(model, memberShape)) { + return targetType; + } + + // Entity references are represented as Dafny traits, and Dafny traits can't be type parameters. So in the + // Dafny implementation of the model, an optional entity reference member is represented as a nullable type T? + // instead of an Optional. This works around the limitation. + // TODO: remove workaround when https://github.com/dafny-lang/dafny/issues/1499 is resolved + final boolean targetIsEntityReference = Optional.of(memberShape.getTarget()) + .flatMap(model::getShape) + .flatMap(targetShape -> targetShape.getTrait(ReferenceTrait.class)) + .isPresent(); + return (targetIsEntityReference ? "%s?" : "Option<%s>").formatted(targetType); + + } + + public String generatedTypeForShape(final ShapeId shapeId) { + return StringUtils.capitalize(shapeId.getName(serviceShape)); + } + + public String traitForServiceClient(final ServiceShape serviceShape) { + return "I%sClient".formatted(nameForService(serviceShape)); + } + + public String traitForResource(final ResourceShape resourceShape) { + final String resourceName = StringUtils.capitalize(resourceShape.getId().getName(this.serviceShape)); + return "I%s".formatted(resourceName); + } + + public String errorTypeForService(final ServiceShape serviceShape) { + return "%sError".formatted(nameForService(serviceShape)); + } + + public String methodForOperation(final OperationShape operationShape) { + return StringUtils.capitalize(operationShape.getId().getName(serviceShape)); + } + + public String predicateCalledWith(final OperationShape operationShape) { + return "%sCalledWith".formatted(this.methodForOperation(operationShape)); + } + + /** + * Returns the return type for an operation of this service. + * This is {@code Result}, + * where {@code T} is either... + *
    + *
  • ... the corresponding Dafny output type, if the operation has output.
  • + *
  • ... {@code ()} ("unit"), if the operation does not have output.
  • + *
+ */ + public String returnTypeForOperation(final OperationShape operationShape) { + final String outputType = operationShape.getOutput() + .map(this::baseTypeForShape) + .orElse("()"); + return "Result<%s, %s>".formatted(outputType, errorTypeForService(serviceShape)); + } + + public Optional returnTypeForResult(final OperationShape operationShape) { + if (operationShape.getOutput().isPresent()) { + return Optional.of(this.baseTypeForShape(operationShape.getOutput().get())); + } + return Optional.empty(); + } + + public String validityPredicateForShape(final ShapeId shapeId) { + final String unqualifiedTypeName = baseTypeForShape(shapeId); + return "IsValid_%s".formatted(unqualifiedTypeName); + } + + /** + * Returns the Dafny module corresponding to the namespace of the given shape ID. + */ + public static String dafnyModuleForShapeId(final ShapeId shapeId) { + final Stream namespaceParts = Arrays + .stream(shapeId.getNamespace().split("\\.")) + .map(StringUtils::capitalize); + return Joiner.on('.').join(namespaceParts.iterator()); + } + + /** + * Returns the Dafny {@code {:extern}} namespace corresponding to the namespace of the given shape ID. + */ + public static String dafnyExternNamespaceForShapeId(final ShapeId shapeId) { + return "Dafny." + dafnyModuleForShapeId(shapeId); + } + + public String predicateSucceededWith(OperationShape operationShape) { + return "%sSucceededWith".formatted(this.methodForOperation(operationShape)); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/AwsSdkDotNetNameResolver.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/AwsSdkDotNetNameResolver.java new file mode 100644 index 0000000000..70a6e89bc7 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/AwsSdkDotNetNameResolver.java @@ -0,0 +1,86 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import software.amazon.polymorph.utils.ModelUtils; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.ListShape; +import software.amazon.smithy.model.shapes.MemberShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StringShape; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.traits.EnumTrait; +import software.amazon.smithy.model.traits.TraitDefinition; +import software.amazon.smithy.utils.StringUtils; + +public class AwsSdkDotNetNameResolver extends DotNetNameResolver { + public AwsSdkDotNetNameResolver(final Model model, final ServiceShape serviceShape) { + super(model, serviceShape); + } + + private boolean isGeneratedInSdk(final ShapeId shapeId) { + return ModelUtils.isInServiceNamespace(shapeId, getServiceShape()); + } + + @Override + protected String baseTypeForString(final StringShape stringShape) { + if (isGeneratedInSdk(stringShape.getId()) && stringShape.hasTrait(EnumTrait.class)) { + return "%s.%s".formatted(getSdkServiceNamespace(), classForEnum(stringShape.getId())); + } + + return super.baseTypeForString(stringShape); + } + + @Override + protected String baseTypeForList(final ListShape listShape) { + final MemberShape memberShape = listShape.getMember(); + final Shape targetShape = getModel().expectShape(memberShape.getTarget()); + + // The .NET AWS SDK represents a list-of-enums as a list-of-strings, even though it represents enums as the + // corresponding enum class every where else AFAICT. + final String memberType = targetShape.hasTrait(EnumTrait.class) ? "string" : baseTypeForMember(memberShape); + + return "System.Collections.Generic.List<%s>".formatted(memberType); + } + + @Override + protected String baseTypeForStructure(final StructureShape structureShape) { + if (isGeneratedInSdk(structureShape.getId()) && !structureShape.hasTrait(TraitDefinition.class)) { + return "%s.Model.%s".formatted(getSdkServiceNamespace(), classForStructure(structureShape.getId())); + } + + return super.baseTypeForStructure(structureShape); + } + + @Override + protected String baseTypeForService(final ServiceShape serviceShape) { + if (isGeneratedInSdk(serviceShape.getId())) { + return "%s.IAmazon%s".formatted(getSdkServiceNamespace(), getServiceName()); + } + + return super.baseTypeForService(serviceShape); + } + + public String implForServiceClient() { + return "%s.Amazon%sClient".formatted(getSdkServiceNamespace(), getServiceName()); + } + + private String getServiceName() { + return StringUtils.capitalize(getServiceShape().getId().getName()); + } + + private String getSdkServiceNamespace() { + return "Amazon.%s".formatted(getServiceName()); + } + + public String shimClassForService() { + return "%sShim".formatted(getServiceName()); + } + + public String baseExceptionForService() { + return "%s.Amazon%sException".formatted(getSdkServiceNamespace(), getServiceName()); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/AwsSdkShimCodegen.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/AwsSdkShimCodegen.java new file mode 100644 index 0000000000..8ea172ab3e --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/AwsSdkShimCodegen.java @@ -0,0 +1,173 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import software.amazon.polymorph.smithydafny.DafnyNameResolver; +import software.amazon.polymorph.utils.ModelUtils; +import software.amazon.polymorph.utils.Token; +import software.amazon.polymorph.utils.TokenTree; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.OperationShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StructureShape; + +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; +import java.util.TreeSet; +import java.util.stream.Collectors; + +import static software.amazon.polymorph.smithydotnet.TypeConversionDirection.FROM_DAFNY; +import static software.amazon.polymorph.smithydotnet.TypeConversionDirection.TO_DAFNY; + +public class AwsSdkShimCodegen { + private final Model model; + private final ServiceShape serviceShape; + private final AwsSdkDotNetNameResolver nameResolver; + private final DafnyNameResolver dafnyNameResolver; + + private static final String IMPL_NAME = "_impl"; + private static final String CONVERT_ERROR_METHOD = "ConvertError"; + + public AwsSdkShimCodegen(final Model model, final ShapeId serviceShapeId) { + this.model = model; + this.serviceShape = model.expectShape(serviceShapeId, ServiceShape.class); + this.nameResolver = new AwsSdkDotNetNameResolver(model, serviceShape); + this.dafnyNameResolver = new DafnyNameResolver(model, serviceShape); + } + + public Map generate() { + final Map codeByPath = new HashMap<>(); + final TokenTree prelude = TokenTree.of( + "using System;", + "using System.IO;", + "using System.Collections.Generic;" + ).lineSeparated(); + + // Service shim + final Path serviceShimPath = Path.of(String.format("%s.cs", nameResolver.shimClassForService())); + final TokenTree serviceShimCode = generateServiceShim(); + codeByPath.put(serviceShimPath, serviceShimCode.prepend(prelude)); + + return codeByPath; + } + + public TokenTree generateServiceShim() { + final TokenTree header = Token.of("internal class %s : %s".formatted( + nameResolver.shimClassForService(), + nameResolver.dafnyTypeForShape(serviceShape.getId()))); + + final TokenTree impl = Token.of("internal %s %s;".formatted(nameResolver.implForServiceClient(), IMPL_NAME)); + final TokenTree constructor = generateServiceShimConstructor(); + final TokenTree operationShims = TokenTree.of(serviceShape.getAllOperations() + .stream() + .map(this::generateOperationShim)).lineSeparated(); + final TokenTree errorTypeShim = generateErrorTypeShim(); + + final TokenTree classBody = TokenTree.of(impl, constructor, operationShims, errorTypeShim).lineSeparated(); + return header + .append(classBody.braced()) + .namespaced(Token.of(nameResolver.namespaceForService())); + } + + public TokenTree generateServiceShimConstructor() { + return Token.of(""" + internal %s(%s impl) { + this.%s = impl; + }""".formatted(nameResolver.shimClassForService(), nameResolver.implForServiceClient(), IMPL_NAME)); + } + + public TokenTree generateOperationShim(final ShapeId operationShapeId) { + final OperationShape operationShape = model.expectShape(operationShapeId, OperationShape.class); + final String dafnyOutputType = nameResolver.dafnyTypeForServiceOperationOutput(operationShape); + final String implOperationName = nameResolver.methodForOperation(operationShapeId) + "Async"; + + final TokenTree sdkRequest = Token.of(operationShape.getInput() + .map(requestShapeId -> "%s sdkRequest = %s(request);".formatted( + nameResolver.baseTypeForShape(requestShapeId), + AwsSdkDotNetNameResolver.qualifiedTypeConverter(requestShapeId, FROM_DAFNY))) + .orElse("")); + + final TokenTree assignSdkResponse = Token.of(operationShape.getOutput() + .map(responseShapeId -> "%s sdkResponse =".formatted(nameResolver.baseTypeForShape(responseShapeId))) + .orElse("")); + + final String requestArg = operationShape.getInput().isPresent() ? "sdkRequest" : ""; + final String blockOnResponse = operationShape.getOutput().isPresent() ? ".Result" : ".Wait()"; + final TokenTree callImpl = Token.of("this.%s.%s(%s)%s;".formatted( + IMPL_NAME, implOperationName, requestArg, blockOnResponse)); + + final TokenTree returnResponse = Token.of(operationShape.getOutput() + .map(responseShapeId -> "return %s.create_Success(%s(sdkResponse));".formatted( + dafnyOutputType, + AwsSdkDotNetNameResolver.qualifiedTypeConverter(responseShapeId, TO_DAFNY))) + .orElse("return %s.create_Success(new %s());".formatted( + dafnyOutputType, nameResolver.dafnyTypeForUnit()))); + + final TokenTree tryBody = TokenTree.of(assignSdkResponse, callImpl, returnResponse).lineSeparated(); + final TokenTree tryBlock = Token.of("try").append(tryBody.braced()); + final TokenTree catchBlock = Token.of(""" + catch (%s ex) { + return %s.create_Failure(this.%s(ex)); + } + """.formatted( + nameResolver.baseExceptionForService(), + dafnyOutputType, + CONVERT_ERROR_METHOD)); + + final TokenTree methodSignature = generateOperationShimSignature(operationShape); + final TokenTree methodBody = TokenTree.of(sdkRequest, tryBlock, catchBlock); + return methodSignature.append(methodBody.braced()); + } + + private TokenTree generateOperationShimSignature(final OperationShape operationShape) { + final String responseType = nameResolver.dafnyTypeForServiceOperationOutput(operationShape); + final String methodName = nameResolver.methodForOperation(operationShape.getId()); + final String requestType = operationShape.getInput() + .map(requestShapeId -> nameResolver.dafnyTypeForShape(requestShapeId) + " request") + .orElse(""); + return Token.of("public %s %s(%s)".formatted(responseType, methodName, requestType)); + } + + /** + * Generates a shim for converting from an AWS SDK-defined exception to the corresponding constructor of the Dafny + * error sum type. + *

+ * We define this here instead of in {@link AwsSdkTypeConversionCodegen} because the error sum type isn't in the + * model; it's only used here in the shims. + */ + public TokenTree generateErrorTypeShim() { + final String dafnyErrorType = nameResolver.dafnyTypeForServiceError(serviceShape); + + // Collect into TreeSet so that we generate code in a deterministic order (lexicographic, in particular) + final TreeSet errorShapes = ModelUtils.streamServiceErrors(model, serviceShape) + .collect(Collectors.toCollection(TreeSet::new)); + final TokenTree convertKnownErrors = TokenTree.of(errorShapes.stream() + .map(errorShape -> { + final ShapeId errorShapeId = errorShape.getId(); + final String sdkErrorType = nameResolver.baseTypeForShape(errorShapeId); + final String dafnyErrorCtor = DotNetNameResolver.dafnyCompiledNameForEnumDefinitionName( + dafnyNameResolver.nameForServiceErrorConstructor(errorShapeId)); + + final String errorConverter = DotNetNameResolver.qualifiedTypeConverter(errorShapeId, TO_DAFNY); + final TokenTree condition = Token.of("if (error is %s)".formatted(sdkErrorType)); + final TokenTree body = Token.of("return %s.create_%s(%s((%s) error));".formatted( + dafnyErrorType, dafnyErrorCtor, errorConverter, sdkErrorType)); + return condition.append(body.braced()); + })).lineSeparated(); + + final String stringConverter = AwsSdkDotNetNameResolver.qualifiedTypeConverter( + ShapeId.from("smithy.api#String"), TO_DAFNY); + final String dafnyUnknownErrorCtor = DotNetNameResolver.dafnyCompiledNameForEnumDefinitionName( + dafnyNameResolver.nameForServiceErrorUnknownConstructor(serviceShape)); + final TokenTree convertUnknownError = Token.of("return %s.create_%s(%s(error.Message));".formatted( + dafnyErrorType, dafnyUnknownErrorCtor, stringConverter)); + + final TokenTree signature = Token.of("private %s %s(%s error)".formatted( + dafnyErrorType, CONVERT_ERROR_METHOD, nameResolver.baseExceptionForService())); + final TokenTree body = TokenTree.of(convertKnownErrors, convertUnknownError).lineSeparated(); + return signature.append(body.braced()); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/AwsSdkTypeConversionCodegen.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/AwsSdkTypeConversionCodegen.java new file mode 100644 index 0000000000..5081c5f505 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/AwsSdkTypeConversionCodegen.java @@ -0,0 +1,115 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import software.amazon.polymorph.utils.Token; +import software.amazon.polymorph.utils.TokenTree; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.MemberShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StringShape; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.traits.ErrorTrait; +import software.amazon.smithy.model.traits.RequiredTrait; + +import java.util.List; +import java.util.Set; + +import static software.amazon.polymorph.smithydotnet.TypeConversionDirection.FROM_DAFNY; +import static software.amazon.polymorph.smithydotnet.TypeConversionDirection.TO_DAFNY; + +/** + * Generates a {@code TypeConversion} class that includes all {@link TypeConversionCodegen.TypeConverter}s needed + * for AWS SDK-specific types. + */ +public class AwsSdkTypeConversionCodegen extends TypeConversionCodegen { + private static final ShapeId SMITHY_STRING_SHAPE_ID = ShapeId.from("smithy.api#String"); + + public AwsSdkTypeConversionCodegen(final Model model, final ShapeId serviceShapeId) { + super(model, serviceShapeId, + new AwsSdkDotNetNameResolver(model, model.expectShape(serviceShapeId, ServiceShape.class))); + } + + @Override + public Set findShapeIdsToConvert() { + final Set shapeIds = super.findShapeIdsToConvert(); + shapeIds.add(SMITHY_STRING_SHAPE_ID); // needed for converting the message of an unknown error type + return shapeIds; + } + + @Override + public TypeConverter generateStructureConverter(final StructureShape structureShape) { + if (structureShape.hasTrait(ErrorTrait.class)) { + return generateErrorStructureConverter(structureShape); + } + + return super.generateStructureConverter(structureShape); + } + + @Override + protected boolean enumListMembersAreStringsInCSharp() { + return true; + } + + private TypeConverter generateErrorStructureConverter(final StructureShape structureShape) { + // KMS error structures all include a 'message' member and nothing else + // TODO support members other than 'message' + if (!List.of("message").equals(structureShape.getMemberNames())) { + throw new UnsupportedOperationException( + "Error structures must include a 'message' member and no others"); + } + final MemberShape messageMember = structureShape.getMember("message").orElseThrow(); + + // KMS error structures' 'message' member are always optional + // TODO support required 'message' members + if (messageMember.hasTrait(RequiredTrait.class)) { + throw new UnsupportedOperationException("An error structure's 'message' member must be optional"); + } + + final StringShape messageTarget = model.getShape(messageMember.getTarget()) + .flatMap(Shape::asStringShape) + .orElseThrow(() -> new IllegalArgumentException("An error structure's 'message' member must be a string")); + + final TokenTree fromDafnyBody = Token.of(""" + string message = value.message.is_Some ? null : %s(value.message.Extract()); + return new %s(message); + """.formatted( + AwsSdkDotNetNameResolver.typeConverterForShape(messageTarget.getId(), FROM_DAFNY), + nameResolver.baseTypeForShape(structureShape.getId()))); + + final TokenTree toDafnyBody = Token.of(""" + %1$s message = System.String.IsNullOrEmpty(value.Message) + ? %1$s.create_None() + : %1$s.create_Some(%2$s(value.Message)); + return new %3$s(message); + """.formatted( + nameResolver.dafnyTypeForShape(messageMember.getId()), + AwsSdkDotNetNameResolver.typeConverterForShape(messageTarget.getId(), TO_DAFNY), + nameResolver.dafnyTypeForShape(structureShape.getId()))); + + return buildConverterFromMethodBodies(structureShape, fromDafnyBody, toDafnyBody); + } + + TypeConverter generateAwsSdkServiceReferenceStructureConverter(final StructureShape structureShape) { + final String sdkServiceImpl = ((AwsSdkDotNetNameResolver) nameResolver).implForServiceClient(); + final String serviceClientShim = "%s.%s".formatted( + nameResolver.namespaceForService(), + ((AwsSdkDotNetNameResolver) nameResolver).shimClassForService()); + final String serviceInterfaceType = nameResolver.baseTypeForShape(serviceShape.getId()); + + final String throwCustomImplException = + "throw new System.ArgumentException(\"Custom implementations of %s are not supported yet\");" + .formatted(serviceInterfaceType); + final TokenTree fromDafnyBody = Token.of( + "if (value is %s shim) { return shim._impl; }".formatted(serviceClientShim), + throwCustomImplException); + final TokenTree toDafnyBody = TokenTree.of( + "if (value is %s impl) { return new %s(impl); }".formatted(sdkServiceImpl, serviceClientShim), + throwCustomImplException); + + return buildConverterFromMethodBodies(structureShape, fromDafnyBody, toDafnyBody); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/DotNetNameResolver.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/DotNetNameResolver.java new file mode 100644 index 0000000000..89ae022aee --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/DotNetNameResolver.java @@ -0,0 +1,569 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; +import software.amazon.polymorph.smithydafny.DafnyNameResolver; +import software.amazon.polymorph.utils.ModelUtils; +import software.amazon.polymorph.traits.DafnyUtf8BytesTrait; +import software.amazon.polymorph.traits.PositionalTrait; +import software.amazon.polymorph.traits.ReferenceTrait; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.ListShape; +import software.amazon.smithy.model.shapes.MapShape; +import software.amazon.smithy.model.shapes.MemberShape; +import software.amazon.smithy.model.shapes.OperationShape; +import software.amazon.smithy.model.shapes.ResourceShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.ShapeType; +import software.amazon.smithy.model.shapes.StringShape; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.traits.EnumTrait; +import software.amazon.smithy.utils.StringUtils; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Stream; + +/** + * Provides a consistent mapping between names of model Shapes and generated identifiers. + */ +public class DotNetNameResolver { + private final Model model; + private final ServiceShape serviceShape; + + public DotNetNameResolver(Model model, ServiceShape serviceShape) { + this.model = model; + this.serviceShape = serviceShape; + } + + private static final Set C_SHARP_BUILT_IN_VALUE_TYPES = Set.of( + // integral numeric types + "sbyte", "byte", "short", "ushort", "int", "uint", "long", "ulong", "nint", "nuint", + // floating-point numeric types + "float", "double", "decimal", + // other primitives + "bool", "char", + // other non-primitive value types + "System.DateTime" + ); + + public static final String TYPE_CONVERSION_CLASS_NAME = "TypeConversion"; + + /** + * Returns the C# namespace containing the C# implementation/interface for the given shape ID. + */ + public String namespaceForShapeId(final ShapeId shapeId) { + Stream parts = Splitter.on('.') + .splitToList(shapeId.getNamespace()) + .stream() + .map(StringUtils::capitalize); + return Joiner.on('.').join(parts.iterator()); + } + + public String namespaceForService() { + return namespaceForShapeId(serviceShape.getId()); + } + + public String clientForService() { + return serviceShape.getId().getName(serviceShape) + "Client"; + } + + public String baseClientForService() { + return clientForService() + "Base"; + } + + public String interfaceForService() { + return interfaceForService(serviceShape.getId()); + } + + public String interfaceForService(final ShapeId serviceShapeId) { + return "I" + serviceShapeId.getName(serviceShape); + } + + public String methodForOperation(final ShapeId operationShapeId) { + return model.expectShape(operationShapeId, OperationShape.class).getId().getName(serviceShape); + } + + public String abstractMethodForOperation(final ShapeId operationShapeId) { + return String.format("_%s", methodForOperation(operationShapeId)); + } + + /** + * Returns the name of the class generated for the given structure shape. Note that this method is only valid for + * structure shapes that will have a corresponding generated class. + */ + public String classForStructure(final ShapeId structureShapeId) { + final StructureShape structureShape = model.expectShape(structureShapeId, StructureShape.class); + + // Sanity check that we aren't using this method for non-generated structures + assert !structureShape.hasTrait(ReferenceTrait.class); + assert !structureShape.hasTrait(PositionalTrait.class); + + return model.expectShape(structureShapeId, StructureShape.class).getId().getName(serviceShape); + } + + private static final Map NATIVE_TYPES_BY_SMITHY_PRELUDE_SHAPE_NAME; + private static final Map NATIVE_TYPES_BY_SIMPLE_SHAPE_TYPE; + static { + NATIVE_TYPES_BY_SMITHY_PRELUDE_SHAPE_NAME = Map.ofEntries( + Map.entry("String", "string"), + Map.entry("Blob", "System.IO.MemoryStream"), + Map.entry("Boolean", "bool"), + Map.entry("PrimitiveBoolean", "bool"), + Map.entry("Byte", "sbyte"), + Map.entry("PrimitiveByte", "sbyte"), + Map.entry("Short", "short"), + Map.entry("PrimitiveShort", "short"), + Map.entry("Integer", "int"), + Map.entry("PrimitiveInteger", "int"), + Map.entry("Long", "long"), + Map.entry("PrimitiveLong", "long"), + Map.entry("Float", "float"), + Map.entry("PrimitiveFloat", "float"), + Map.entry("Double", "double"), + Map.entry("PrimitiveDouble", "double"), + Map.entry("Timestamp", "System.DateTime") + ); + NATIVE_TYPES_BY_SIMPLE_SHAPE_TYPE = Map.ofEntries( + Map.entry(ShapeType.BLOB, "System.IO.MemoryStream"), + Map.entry(ShapeType.BOOLEAN, "bool"), + Map.entry(ShapeType.STRING, "string"), + Map.entry(ShapeType.BYTE, "sbyte"), + Map.entry(ShapeType.SHORT, "short"), + Map.entry(ShapeType.INTEGER, "int"), + Map.entry(ShapeType.LONG, "long"), + Map.entry(ShapeType.FLOAT, "float"), + Map.entry(ShapeType.DOUBLE, "double"), + Map.entry(ShapeType.TIMESTAMP, "System.DateTime") + ); + } + + /** + * Returns the C# type used to store values of the given member shape within a structure class. + * + * This is always nullable, so it can represent uninitialized values. + */ + public String classFieldTypeForStructureMember(final MemberShape memberShape) { + return nullableTypeForStructureMember(memberShape); + } + + /** + * Returns the C# type used to expose values of the given member shape as a property of its structure class. + * + * This is always non-nullable. + */ + public String classPropertyTypeForStructureMember(final MemberShape memberShape) { + return baseTypeForShape(memberShape.getTarget()); + } + + protected String baseTypeForString(final StringShape stringShape) { + final ShapeId shapeId = stringShape.getId(); + final String namespace = namespaceForShapeId(shapeId); + return stringShape.hasTrait(EnumTrait.class) + ? "%s.%s".formatted(namespace, classForEnum(shapeId)) + : "string"; + } + + protected String baseTypeForList(final ListShape listShape) { + return "System.Collections.Generic.List<%s>".formatted(baseTypeForMember(listShape.getMember())); + } + + protected String baseTypeForMap(final MapShape mapShape) { + return "System.Collections.Generic.Dictionary<%s, %s>".formatted( + baseTypeForMember(mapShape.getKey()), + baseTypeForMember(mapShape.getValue())); + } + + protected String baseTypeForStructure(final StructureShape structureShape) { + // The base type of a reference structure is the base trait for its referent + final Optional referenceTraitOptional = structureShape.getTrait(ReferenceTrait.class); + if (referenceTraitOptional.isPresent()) { + final ReferenceTrait referenceTrait = referenceTraitOptional.get(); + final ShapeId referentShapeId = referenceTrait.getReferentId(); + if (model.getShape(referentShapeId).isEmpty()) { + // TODO: support external referents + throw new IllegalStateException("Structure %s has external referent %s, this is unsupported" + .formatted(structureShape.getId(), referentShapeId)); + } + return baseTypeForShape(referentShapeId); + } + + // The base type of a positional structure is the base type of its sole member + final Optional positionalMember = ModelUtils.getPositionalStructureMember(structureShape); + if (positionalMember.isPresent()) { + return baseTypeForShape(positionalMember.get()); + } + + // The base type of any other structure is the name of the corresponding generated class + final String structureNamespace = namespaceForShapeId(structureShape.getId()); + return "%s.%s".formatted(structureNamespace, classForStructure(structureShape.getId())); + } + + protected String baseTypeForMember(final MemberShape memberShape) { + final String baseType = baseTypeForShape(memberShape.getTarget()); + final boolean isOptional = memberShapeIsOptional(memberShape); + return isOptional ? baseTypeForOptionalMember(memberShape) : baseType; + } + + protected String baseTypeForOptionalMember(final MemberShape memberShape) { + final String baseType = baseTypeForShape(memberShape.getTarget()); + // We annotate C# value types with `?` to make them nullable. + // We cannot do the same for C# reference types since those types are already nullable by design. + // TODO: nullable reference types appear to be supported in C# 8.0+. Maybe revisit this. + // https://issues.amazon.com/issues/CrypTool-4156 + return isValueType(memberShape.getTarget()) ? baseType + "?" : baseType; + } + + protected String baseTypeForService(final ServiceShape serviceShape) { + final ShapeId shapeId = serviceShape.getId(); + + // TODO better way to determine if AWS SDK + if (shapeId.getNamespace().startsWith("com.amazonaws.")) { + return new AwsSdkDotNetNameResolver(model, serviceShape).baseTypeForService(serviceShape); + } + + return "%s.%s".formatted( + namespaceForShapeId(shapeId), interfaceForService(shapeId)); + } + + protected String baseTypeForResource(final ResourceShape resourceShape) { + final ShapeId shapeId = resourceShape.getId(); + return "%s.%s".formatted( + namespaceForShapeId(shapeId), interfaceForResource(shapeId)); + } + + public boolean isValueType(final ShapeId shapeId) { + final String baseType = baseTypeForShape(shapeId); + return C_SHARP_BUILT_IN_VALUE_TYPES.contains(baseType); + } + + @SuppressWarnings("OptionalGetWithoutIsPresent") + public String baseTypeForShape(final ShapeId shapeId) { + final Shape shape = model.expectShape(shapeId); + + // First check if this is a built-in Smithy shape. If so, we just map it to the native type and return + if (ModelUtils.isSmithyApiShape(shapeId)) { + @Nullable final String nativeTypeName = NATIVE_TYPES_BY_SMITHY_PRELUDE_SHAPE_NAME.get(shapeId.getName(serviceShape)); + return Objects.requireNonNull(nativeTypeName, + () -> String.format("No native type for prelude shape %s", shapeId)); + } + + return switch (shape.getType()) { + // For supported simple shapes, just map to native types + case BLOB, BOOLEAN, INTEGER, LONG, TIMESTAMP -> { + @Nullable final String nativeTypeName = NATIVE_TYPES_BY_SIMPLE_SHAPE_TYPE.get(shape.getType()); + yield Objects.requireNonNull(nativeTypeName, + () -> String.format("No native type for shape type %s", shape.getType())); + } + + case STRING -> baseTypeForString(shape.asStringShape().get()); + case LIST -> baseTypeForList(shape.asListShape().get()); + case MAP -> baseTypeForMap(shape.asMapShape().get()); + case STRUCTURE -> baseTypeForStructure(shape.asStructureShape().get()); + case MEMBER -> baseTypeForMember(shape.asMemberShape().get()); + case SERVICE -> baseTypeForService(shape.asServiceShape().get()); + case RESOURCE -> baseTypeForResource(shape.asResourceShape().get()); + + default -> throw new UnsupportedOperationException("Shape %s has unsupported type %s" + .formatted(shapeId, shape.getType())); + }; + } + + private String nullableTypeForStructureMember(final MemberShape memberShape) { + return baseTypeForOptionalMember(memberShape); + } + + /** + * Returns the name of the (private) structure class field for the given member shape. + */ + public String classFieldForStructureMember(final MemberShape memberShape) { + return "_%s".formatted(StringUtils.uncapitalize(memberShape.getMemberName())); + } + + /** + * Returns the name of the (public) structure class property for the given member shape. + */ + public String classPropertyForStructureMember(final MemberShape memberShape) { + return StringUtils.capitalize(memberShape.getMemberName()); + } + + public String interfaceForResource(final ShapeId resourceShapeId) { + return String.format("I%s", StringUtils.capitalize(resourceShapeId.getName(serviceShape))); + } + + public String baseClassForResource(final ShapeId resourceShapeId) { + return String.format("%sBase", StringUtils.capitalize(resourceShapeId.getName(serviceShape))); + } + + public String shimClassForResource(final ShapeId resourceShapeId) { + return StringUtils.capitalize(resourceShapeId.getName(serviceShape)); + } + + public String classForEnum(final ShapeId enumShapeId) { + return StringUtils.capitalize(enumShapeId.getName(serviceShape)); + } + + /** + * Implements {@code DafnyAst.NonglobalVariable.CompilerizeName} for strings which are valid enum definition names + * according to {@link ModelUtils#isValidEnumDefinitionName(String)}. + * + * @see CompilerizeName + */ + public static String dafnyCompiledNameForEnumDefinitionName(final String name) { + if (!ModelUtils.isValidEnumDefinitionName(name)) { + throw new IllegalArgumentException("The enum definition name '%s' is forbidden".formatted(name)); + } + + // We only allow uppercase ASCII letters and underscores in enum definition names, so it suffices to replace + // each underscore with two underscores. + return name.replace("_", "__"); + } + + /** + * Returns a unique type converter method name for the given shape and type conversion direction. + *

+ * This is necessary because all type converter methods for a given model will coexist in a single class. There is a + * one-to-one mapping between shapes used in the model and type converters in the class, so the function that names + * converter methods must also be one-to-one. + */ + public static String typeConverterForShape(final ShapeId shapeId, final TypeConversionDirection direction) { + final String directionStr = switch (direction) { + case TO_DAFNY -> "ToDafny"; + case FROM_DAFNY -> "FromDafny"; + }; + final String encodedShapeId = encodedIdentForShapeId(shapeId); + return String.format("%s_%s", directionStr, encodedShapeId); + } + + /** + * Returns the converter method name for the given shape and type conversion direction, qualified with the type + * conversion class name. + */ + public static String qualifiedTypeConverter(final ShapeId shapeId, final TypeConversionDirection direction) { + final String methodName = DotNetNameResolver.typeConverterForShape(shapeId, direction); + return "%s.%s".formatted(DotNetNameResolver.TYPE_CONVERSION_CLASS_NAME, methodName); + } + + /** + * Returns the abstract Dafny-compiled-C# type corresponding to the given shape, or the concrete type if no such + * abstract type exists. For example, a list shape is a {@code Dafny.ISequence} rather than a + * {@code Dafny.Sequence}, but an integer shape is simply an {@code int}. + *

+ * Note that this method is mutually recursive with the "dafnyTypeForA" methods (for aggregate shape types A), but + * termination is guaranteed. This is because the Smithy specification requires that if an aggregate shape has a + * path to itself (by recursively traversing through members and their targets), then the path must include a + * structure or union shape (which have no type variables). The core Smithy validation logic takes responsibility to + * ensure this. + */ + @SuppressWarnings("OptionalGetWithoutIsPresent") + public String dafnyTypeForShape(final ShapeId shapeId) { + final Shape shape = model.getShape(shapeId) + .orElseThrow(() -> new IllegalStateException("Cannot find shape " + shapeId)); + + return switch (shape.getType()) { + case BLOB -> "Dafny.ISequence"; + case BOOLEAN -> "bool"; + case STRING -> dafnyTypeForString(shape.asStringShape().get()); + case INTEGER -> "int"; + case LONG -> "long"; + // TODO create/use better timestamp type in Dafny libraries + case TIMESTAMP -> "Dafny.ISequence"; + case LIST -> dafnyTypeForList(shape.asListShape().get()); + case MAP -> dafnyTypeForMap(shape.asMapShape().get()); + case STRUCTURE -> dafnyTypeForStructure(shape.asStructureShape().get()); + case MEMBER -> dafnyTypeForMember(shape.asMemberShape().get()); + case SERVICE -> dafnyTypeForService(shape.asServiceShape().get()); + case RESOURCE -> dafnyTypeForResource(shape.asResourceShape().get()); + default -> throw new UnsupportedOperationException("Unsupported shape " + shapeId); + }; + } + + // We explicitly specify the Dafny namespace just in case of collisions. + private String dafnyTypeForShapeWithExplicitDatatype(final ShapeId shapeId) { + return "%s.%s".formatted(DafnyNameResolver.dafnyExternNamespaceForShapeId(shapeId), shapeId.getName(serviceShape)); + } + + private String dafnyTypeForString(final StringShape stringShape) { + final ShapeId shapeId = stringShape.getId(); + if (stringShape.hasTrait(EnumTrait.class)) { + return dafnyTypeForShapeWithExplicitDatatype(shapeId); + } + if (stringShape.hasTrait(DafnyUtf8BytesTrait.class)) { + return "Dafny.ISequence"; + } + return "Dafny.ISequence"; + } + + private String dafnyTypeForList(final ListShape listShape) { + return "Dafny.ISequence<%s>".formatted(dafnyTypeForMember(listShape.getMember())); + } + + private String dafnyTypeForMap(final MapShape mapShape) { + return "Dafny.IMap<%s, %s>".formatted( + dafnyTypeForMember(mapShape.getKey()), + dafnyTypeForMember(mapShape.getValue())); + } + + private String dafnyTypeForStructure(final StructureShape structureShape) { + // The Dafny type of a reference structure is the Dafny trait for its referent + final Optional referenceTrait = structureShape.getTrait(ReferenceTrait.class); + if (referenceTrait.isPresent()) { + return dafnyTypeForShape(referenceTrait.get().getReferentId()); + } + + // The Dafny type of a positional structure is the Dafny type of its sole member + final Optional positionalMember = ModelUtils.getPositionalStructureMember(structureShape); + if (positionalMember.isPresent()) { + return dafnyTypeForShape(positionalMember.get()); + } + + // The Dafny type of other structures is simply the structure's name. + return dafnyTypeForShapeWithExplicitDatatype(structureShape.getId()); + } + + private String dafnyTypeForMember(final MemberShape memberShape) { + final String baseType = dafnyTypeForShape(memberShape.getTarget()); + final boolean isOptional = memberShapeIsOptional(memberShape); + + // Entity references are represented as Dafny traits, and Dafny traits can't be type parameters. So in the + // Dafny implementation of the model, an optional entity reference member is represented as a nullable type T? + // instead of an Optional. This works around the limitation. + // TODO: remove workaround when https://github.com/dafny-lang/dafny/issues/1499 is resolved + if (isOptional && !ModelUtils.memberShapeTargetsEntityReference(model, memberShape)) { + return "Wrappers_Compile.Option<%s>".formatted(baseType); + } + return baseType; + } + + private String dafnyTypeForService(final ServiceShape serviceShape) { + final ShapeId serviceShapeId = serviceShape.getId(); + return "%s.%sClient".formatted(DafnyNameResolver.dafnyExternNamespaceForShapeId(serviceShapeId), interfaceForService(serviceShapeId)); + } + + private String dafnyTypeForResource(final ResourceShape resourceShape) { + final ShapeId resourceShapeId = resourceShape.getId(); + return "%s.%s".formatted(DafnyNameResolver.dafnyExternNamespaceForShapeId(resourceShapeId), interfaceForResource(resourceShapeId)); + } + + public String dafnyTypeForServiceError(final ServiceShape serviceShape) { + return "%s.%sError".formatted( + DafnyNameResolver.dafnyExternNamespaceForShapeId(serviceShape.getId()), + serviceShape.getContextualName(serviceShape)); + } + + /** + * Returns the compiled-Dafny return type for an operation of this service. + * If the operation has no associated errors... + *

    + *
  • ... and the operation has output, this is the corresponding compiled-Dafny output type.
  • + *
  • ... and the operation has no output, this is the compiled-Dafny {@code ()} ("unit").
  • + *
+ * Otherwise, if the operation does have associated errors, + * then the this is the compiled-Dafny {@code Result}, + * where {@code T} is either {@code ()} or the corresponding Dafny-compiled output type, + * as determined above. + */ + public String dafnyTypeForServiceOperationOutput(final OperationShape operationShape) { + final String outputType = operationShape.getOutput() + .map(this::dafnyTypeForShape) + .orElse(dafnyTypeForUnit()); + return operationShape.getErrors().isEmpty() + ? outputType + : "Wrappers_Compile.Result<%s, %s>".formatted(outputType, dafnyTypeForServiceError(serviceShape)); + }; + + public String dafnyTypeForUnit() { + return "_System.Tuple0"; + } + + /** + * Returns the name of the compiled-Dafny implementation of the service client. + * + * Note that the service client lives in a sub-namespace of the same name. This is because the generated Dafny API + * skeleton uses the plain "Dafny.(service namespace)" namespace, and implementations cannot use the same extern + * namespace. + * + * FIXME: remove this workaround once Dafny allows duplicate extern namespaces + */ + public String dafnyImplForServiceClient() { + return "%1$s.%2$s.%2$s".formatted(DafnyNameResolver.dafnyExternNamespaceForShapeId(serviceShape.getId()), clientForService()); + } + + public boolean memberShapeIsOptional(final MemberShape memberShape) { + return ModelUtils.memberShapeIsOptional(model, memberShape); + } + + /** + * Encodes a shape ID as a unique valid C# identifier. + *

+ * The encoding of a shape ID consists of type-length-value encodings of each of its "parts", separated by two + * underscores. For example, "foo.bar#Shape$Member" is encoded as N3_foo__N3_bar__S5_Shape__M6_Member. + *

+ * The encoding scheme has some redundancy in order to aid legibility of encoded "normal" shape IDs, such as the + * redundant double-underscore between "parts". But even an inscrutable encoding (arising from a pathological shape + * ID) has a unique parse, so there is no concern for an encoding collision. + *

+ * (Note: we never need to actually parse this identifier.) + */ + @VisibleForTesting + public static String encodedIdentForShapeId(final ShapeId shapeId) { + final String namespace = shapeId.getNamespace(); + final String relativeShape = shapeId.getName(); + final Optional memberOptional = shapeId.getMember(); + + // "N" for namespace + final List encodedParts = new ArrayList<>(); + for (final String namespacePart : namespace.split("\\.")) { + encodedParts.add(String.format("N%d_%s", namespacePart.length(), namespacePart)); + } + // "S" for relative shape + encodedParts.add(String.format("S%d_%s", relativeShape.length(), relativeShape)); + // "M" for member + if (memberOptional.isPresent()) { + final String member = memberOptional.get(); + encodedParts.add(String.format("M%d_%s", member.length(), member)); + } + + return Joiner.on("__").join(encodedParts); + } + + public Model getModel() { + return model; + } + + public ServiceShape getServiceShape() { + return serviceShape; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (DotNetNameResolver) obj; + return Objects.equals(this.model, that.model) && + Objects.equals(this.serviceShape, that.serviceShape); + } + + @Override + public int hashCode() { + return Objects.hash(model, serviceShape); + } + + @Override + public String toString() { + return "CSharpNameResolver[" + + "model=" + model + ", " + + "serviceShape=" + serviceShape + ']'; + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/ServiceCodegen.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/ServiceCodegen.java new file mode 100644 index 0000000000..1760809ab1 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/ServiceCodegen.java @@ -0,0 +1,514 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import com.google.common.annotations.VisibleForTesting; +import software.amazon.polymorph.utils.ModelUtils; +import software.amazon.polymorph.traits.ClientConfigTrait; +import software.amazon.polymorph.traits.PositionalTrait; +import software.amazon.polymorph.traits.ReferenceTrait; +import software.amazon.polymorph.utils.Token; +import software.amazon.polymorph.utils.TokenTree; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.EntityShape; +import software.amazon.smithy.model.shapes.MemberShape; +import software.amazon.smithy.model.shapes.OperationShape; +import software.amazon.smithy.model.shapes.ResourceShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StringShape; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.traits.EnumDefinition; +import software.amazon.smithy.model.traits.EnumTrait; +import software.amazon.smithy.model.traits.TraitDefinition; + +import java.nio.file.Path; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Stream; + +/** + * Codegen for a service's API skeleton (service interface and structures). + * + * Note: this code generator does not aim to generate "nicely-formatted" code. That responsibility is left to external code formatters. + */ +public class ServiceCodegen { + private final Model model; + private final ServiceShape serviceShape; + private final DotNetNameResolver nameResolver; + + public ServiceCodegen(final Model model, final ShapeId serviceShapeId) { + this.model = model; + + this.serviceShape = model.expectShape(serviceShapeId, ServiceShape.class); + this.nameResolver = new DotNetNameResolver(model, serviceShape); + } + + /** + * @return map of skeleton's file paths to generated ASTs + */ + public Map generate() { + final Map codeByPath = new HashMap<>(); + final TokenTree prelude = TokenTree.of( + "using System;", + // Conditional imports. + // TODO: not all files will need these, and some of them result in duplicates (e.g. Aws.Crypto + // must be imported in the Esdk module, but is obviously not necessary in the Crypto module). + // Get smarter about generating imports. + "using Aws.Crypto;", + // end conditional imports + "using", + nameResolver.namespaceForService(), + ";" + ).lineSeparated(); + + // Service interface + final Path serviceInterfacePath = Path.of(String.format("%s.cs", nameResolver.interfaceForService())); + final TokenTree serviceInterfaceCode = generateServiceInterface(); + codeByPath.put(serviceInterfacePath, serviceInterfaceCode.prepend(prelude)); + + // Service client base + final Path serviceClientBasePath = Path.of(String.format("%s.cs", nameResolver.baseClientForService())); + final TokenTree serviceClientBaseCode = generateServiceClientBase(serviceShape); + codeByPath.put(serviceClientBasePath, serviceClientBaseCode.prepend(prelude)); + + // Structures + model.getStructureShapes() + .stream() + .filter(this::shouldGenerateStructure) + .filter(shape -> ModelUtils.isInServiceNamespace(shape.getId(), serviceShape)) + .forEach(shape -> { + final Path structureClassPath = Path.of(String.format("%s.cs", nameResolver.classForStructure(shape.getId()))); + final TokenTree structureCode = generateStructureClass(shape); + codeByPath.put(structureClassPath, structureCode.prepend(prelude)); + }); + + // Enums + model.getStringShapesWithTrait(EnumTrait.class) + .stream() + .map(Shape::getId) + .filter(enumShapeId -> ModelUtils.isInServiceNamespace(enumShapeId, serviceShape)) + .forEach(enumShapeId -> { + final Path enumClassPath = Path.of(String.format("%s.cs", nameResolver.classForEnum(enumShapeId))); + final TokenTree enumCode = generateEnumClass(enumShapeId); + codeByPath.put(enumClassPath, enumCode.prepend(prelude)); + }); + + // Resources + model.getResourceShapes() + .stream() + .map(ResourceShape::getId) + .filter(resourceShapeId -> ModelUtils.isInServiceNamespace(resourceShapeId, serviceShape)) + .forEach(resourceShapeId -> { + final Path resourceInterfacePath = Path.of(String.format("%s.cs", nameResolver.interfaceForResource(resourceShapeId))); + final TokenTree resourceInterface = generateResourceInterface(resourceShapeId); + codeByPath.put(resourceInterfacePath, resourceInterface.prepend(prelude)); + + final Path resourceClassPath = Path.of(String.format("%s.cs", nameResolver.baseClassForResource(resourceShapeId))); + final TokenTree resourceClass = generateResourceClass(resourceShapeId); + codeByPath.put(resourceClassPath, resourceClass.prepend(prelude)); + }); + + return codeByPath; + } + + @VisibleForTesting + boolean shouldGenerateStructure(final StructureShape structureShape) { + return + // Traits are structures, but aren't needed outside Smithy + !structureShape.hasTrait(TraitDefinition.class) + // References are transparent in C#, so we don't need to generate a class for them + && !structureShape.hasTrait(ReferenceTrait.class) + // Structures marked with positional are intended to be unwrapped, so we don't need + // to generate the wrapper structure + && !structureShape.hasTrait(PositionalTrait.class); + } + + /** + * Generates the interface (skeleton) for a service shape, which includes a method stub for each of its operations. + */ + public TokenTree generateServiceInterface() { + final TokenTree methodsTokens = TokenTree.of(serviceShape.getOperations() + .stream() + .map(this::generateInterfaceMethod)) + .lineSeparated(); + final TokenTree interfaceTokens = TokenTree.of( + Token.of("public interface"), + Token.of(nameResolver.interfaceForService()), + methodsTokens.braced() + ); + return interfaceTokens.namespaced(Token.of(nameResolver.namespaceForService())); + } + + /** + * Generates the config field and constructor for our base client classes. + */ + public TokenTree generateClientConstructor(final ServiceShape serviceShape) { + final Optional configTraitOptional = serviceShape.getTrait(ClientConfigTrait.class); + + final String configFieldName = "Config"; + final Optional configTypeOptional = configTraitOptional + .map(ClientConfigTrait::getClientConfigId) + .map(nameResolver::baseTypeForShape); + + final TokenTree configFieldVariable = configTypeOptional + .map(configType -> TokenTree.of("public", configType, configFieldName, "{ get; private set; }")) + .orElse(TokenTree.empty()); + + final TokenTree constructorParams = configTypeOptional + .map(configType -> TokenTree.of(configType, configFieldName)) + .orElse(TokenTree.empty()); + final TokenTree constructorSignature = TokenTree + .of("protected", nameResolver.baseClientForService()) + .append(constructorParams.parenthesized()); + + final TokenTree constructorBody; + if (!configTraitOptional.isPresent()) { + constructorBody = TokenTree.empty(); + } else { + constructorBody = TokenTree.of( + "this." + configFieldName, + "=", + configFieldName, + ";"); + } + + return TokenTree.of( + configFieldVariable, + constructorSignature, + constructorBody.braced() + ).lineSeparated(); + } + + /** + * Generates the abstract client base class for the service + */ + public TokenTree generateServiceClientBase(final ServiceShape serviceShape) { + final TokenTree constructor = generateClientConstructor(serviceShape); + final TokenTree operationBody = generateEntityClassBody(serviceShape.toShapeId()); + + final TokenTree completeBody = TokenTree.of(constructor, operationBody).lineSeparated().braced(); + + final TokenTree classDeclaration = TokenTree.of( + "public abstract class", + nameResolver.baseClientForService(), + ":", + nameResolver.interfaceForService() + ); + + return classDeclaration + .append(completeBody) + .namespaced(Token.of(nameResolver.namespaceForService())); + } + + /** + * Generates the signature of a method + * e.g. EncryptOutput Encrypt ( EncryptInput input ) + * Extracted into its own method because we want to generate this both for the interface and for the base class + * + * NOTE: The return has no modifiers or access level. If callers need to set a method as public/protected/etc, + * they are responsible for doing so. + */ + public TokenTree generateOperationSignature(final ShapeId operationShapeId) { + final OperationShape operationShape = model.expectShape(operationShapeId, OperationShape.class); + + final TokenTree outputType = generateOperationReturnType(operationShape); + final TokenTree paramTokens = generateOperationParameter(operationShape); + + return TokenTree.of( + outputType, + Token.of(nameResolver.methodForOperation(operationShapeId)), + paramTokens.parenthesized() + ); + + } + + public TokenTree generateInterfaceMethod(final ShapeId operationShapeId) { + // For interfaces (which don't have bodies for operations), we just take the basic operation + // and end the statement with a ';' + return TokenTree.of( + generateOperationSignature(operationShapeId), + Token.of(';') + ); + } + + /** + * @return a data class for the given structure shape + */ + public TokenTree generateStructureClass(final StructureShape structureShape) { + final Token structureClassName = Token.of(nameResolver.classForStructure(structureShape.getId())); + + final TokenTree fields = TokenTree.of(ModelUtils.streamStructureMembers(structureShape) + .map(this::generateStructureClassField)).lineSeparated(); + final TokenTree properties = TokenTree.of(ModelUtils.streamStructureMembers(structureShape) + .map(this::generateStructureClassProperty)).lineSeparated(); + + // This is a no-op for now, because the only constraint trait we're currently using is @required, and that's + // checked upon construction (in the corresponding Builder). + // TODO: support other constraint traits as needed + final TokenTree validateMethod = Token.of("public void Validate() {}"); + + final TokenTree bodyTokens = TokenTree.of(fields, properties, validateMethod).lineSeparated().braced(); + + final TokenTree namespace = Token.of(nameResolver.namespaceForService()); + return TokenTree.of(Token.of("public class"), structureClassName, bodyTokens).namespaced(namespace); + } + + /** + * @return field declaration for the given structure member + */ + public TokenTree generateStructureClassField(final MemberShape memberShape) { + final TokenTree typeToken = Token.of(nameResolver.classFieldTypeForStructureMember(memberShape)); + return TokenTree.of( + Token.of("private"), + typeToken, + Token.of(nameResolver.classFieldForStructureMember(memberShape)), + Token.of(';')); + } + + /** + * @return property for the given structure member, with a getter and setter + */ + public TokenTree generateStructureClassProperty(final MemberShape memberShape) { + final String fieldName = nameResolver.classFieldForStructureMember(memberShape); + + // Class fields are always nullable, so we need to provide a default value for value types + final boolean isValueType = nameResolver.isValueType(memberShape.getTarget()); + final String unwrapValue = isValueType ? ".GetValueOrDefault()" : ""; + + final TokenTree getter = Token.of("get { return this.%s%s; }".formatted(fieldName, unwrapValue)); + final TokenTree setter = Token.of("set { this.%s = value; }".formatted(fieldName)); + + final String type = nameResolver.classPropertyTypeForStructureMember(memberShape); + final String propertyName = nameResolver.classPropertyForStructureMember(memberShape); + final TokenTree body = TokenTree.of(getter, setter).lineSeparated(); + return TokenTree.of("public", type, propertyName).append(body.braced()); + } + + public TokenTree generateResourceInterface(final ShapeId resourceShapeId) { + final ResourceShape resourceShape = model.expectShape(resourceShapeId, ResourceShape.class); + + final TokenTree bodyTokens = TokenTree.of( + resourceShape.getOperations().stream().map( + operationShapeId -> generateInterfaceMethod(operationShapeId) + )).lineSeparated(); + + return TokenTree.of( + Token.of("public interface"), + Token.of(nameResolver.interfaceForResource(resourceShapeId)), + bodyTokens.braced() + ).namespaced(Token.of(nameResolver.namespaceForService())); + } + + /** + * Takes a resource or service shape and generates the body of an abstract base class which implements operations + * and declares abstract operations which should be overridden. + * + * @param entityShapeId The id of the service or resource shape + * @return A token tree with the class body + */ + public TokenTree generateEntityClassBody(final ShapeId entityShapeId) { + final EntityShape entityShape = model.expectShape(entityShapeId, EntityShape.class); + + final TokenTree bodyTokens = TokenTree.of(entityShape.getOperations().stream().map(operationShapeId -> { + final OperationShape operationShape = model.expectShape(operationShapeId, OperationShape.class); + + final TokenTree concreteMethodSignature = TokenTree.of( + TokenTree.of("public"), + generateOperationSignature(operationShapeId) + ); + + final TokenTree returnType = generateOperationReturnType(operationShape); + final TokenTree param = generateOperationParameter(operationShape); + final Token abstractMethodName = Token.of(nameResolver.abstractMethodForOperation(operationShapeId)); + + final Token validate = Token.of(operationShape.getInput().isPresent() ? "input.Validate();" : ""); + final Token abstractArg = Token.of(operationShape.getInput().isPresent() ? "input" : ""); + final Token returnOrBlank = Token.of(operationShape.getOutput().isPresent() ? "return" : ""); + final TokenTree concreteMethodBody = TokenTree.of( + validate, + returnOrBlank, abstractMethodName, abstractArg.parenthesized(), Token.of(';') + ).braced(); + + final TokenTree abstractMethodSignature = TokenTree.of( + Token.of("protected abstract"), + returnType, + abstractMethodName, + param.parenthesized(), + Token.of(';') + ); + + return TokenTree.of(concreteMethodSignature, concreteMethodBody, abstractMethodSignature).lineSeparated(); + })).lineSeparated(); + + return bodyTokens; + } + + public TokenTree generateResourceClass(final ShapeId resourceShapeId) { + final TokenTree bodyTokens = generateEntityClassBody(resourceShapeId); + + final TokenTree classDeclaration = TokenTree.of( + "public abstract class", + nameResolver.baseClassForResource(resourceShapeId), + ":", + nameResolver.interfaceForResource(resourceShapeId) + ); + return classDeclaration + .append(bodyTokens.braced()) + .namespaced(Token.of(nameResolver.namespaceForService())); + } + + /** + * @return either "OperationInput input" if the given operation shape has input OperationInput, or "" otherwise + */ + public TokenTree generateOperationParameter(final OperationShape operationShape) { + return operationShape.getInput() + .map(inputShapeId -> TokenTree.of(nameResolver.baseTypeForShape(inputShapeId), "input")) + .orElse(TokenTree.empty()); + } + + /** + * @return either "OperationOutput" if the given operation shape has output OperationOutput, or "void" otherwise + */ + public TokenTree generateOperationReturnType(final OperationShape operationShape) { + return operationShape.getOutput() + .map(outputShapeId -> Token.of(nameResolver.baseTypeForShape(outputShapeId))) + .orElse(Token.of("void")); + } + + private EnumTrait getAndValidateEnumTrait(final StringShape stringShape) { + final EnumTrait enumTrait = stringShape.getTrait(EnumTrait.class) + .orElseThrow(() -> new IllegalStateException("EnumTrait absent on provided string shape")); + if (enumTrait.hasNames() && hasInvalidEnumNames(enumTrait)) { + throw new IllegalStateException("Enum definition names must be uppercase alphanumeric and begin with a letter"); + } + if (!enumTrait.hasNames() && hasInvalidMembersForUnnamedEnum(enumTrait)) { + throw new IllegalStateException("Unnamed enum definitions cannot have documentation or tags, and can't be deprecated"); + } + return enumTrait; + } + + /** + * Note: + * - we don't currently do anything with tags + * - doc comments aren't generated for unnamed enum variants + * + * @return a class containing constants for the enum members + */ + public TokenTree generateEnumClass(final ShapeId stringShapeId) { + final StringShape stringShape = model.expectShape(stringShapeId, StringShape.class); + final EnumTrait enumTrait = getAndValidateEnumTrait(stringShape); + + final String enumClassName = nameResolver.classForEnum(stringShapeId); + final String enumValueTypeName = enumTrait.hasNames() ? enumClassName : "string"; + final TokenTree namedEnumValues = enumTrait.hasNames() + ? generateNamedEnumValues(enumTrait, enumClassName) + : TokenTree.empty(); + final TokenTree enumValuesArray = generateEnumValuesArray(enumTrait, enumValueTypeName); + + // For enums, the constructor does nothing except extend the parent ConstantClass constructor + final TokenTree constructor = TokenTree.of( + "public", + enumClassName, + "(string value)", + ": base(value)", + "{}" + ); + + final TokenTree classBody = TokenTree.of( + namedEnumValues, + enumValuesArray, + constructor + ).lineSeparated().braced(); + + final TokenTree constantClassImport = enumTrait.hasNames() ? Token.of("using Amazon.Runtime;") : TokenTree.empty(); + final TokenTree extendsConstantClass = enumTrait.hasNames() ? Token.of(": ConstantClass") : TokenTree.empty(); + + return TokenTree.of( + constantClassImport, + Token.of("public class"), + Token.of(enumClassName), + extendsConstantClass, + classBody + ).namespaced(Token.of(nameResolver.namespaceForService())); + } + + private boolean hasInvalidEnumNames(final EnumTrait enumTrait) { + return !enumTrait.getValues().stream() + .map(EnumDefinition::getName) + .map(Optional::get) + .allMatch(ModelUtils::isValidEnumDefinitionName); + } + + private boolean hasInvalidMembersForUnnamedEnum(final EnumTrait enumTrait) { + return enumTrait.getValues() + .stream() + .anyMatch(enumDefinition -> + enumDefinition.getDocumentation().isPresent() + || !enumDefinition.getTags().isEmpty() + || enumDefinition.isDeprecated() + ); + } + + private TokenTree generateNamedEnumValues(final EnumTrait enumTrait, final String enumClassName) { + return TokenTree.of(enumTrait.getValues().stream().map(enumDefinition -> { + assert enumDefinition.getName().isPresent(); + final String definitionName = enumDefinition.getName().get(); + + final TokenTree docComment = enumDefinition.getDocumentation() + .map(this::formatDocComment) + .orElse(TokenTree.empty()); + final TokenTree obsoleteAnnotation = enumDefinition.isDeprecated() + ? Token.of("[System.Obsolete]") + : TokenTree.empty(); + final TokenTree constDefinition = TokenTree.of( + "public static readonly", + enumClassName, + definitionName, + "= new", + enumClassName, + String.format("(\"%s\");", enumDefinition.getValue()) + ); + + return TokenTree.of(docComment, obsoleteAnnotation, constDefinition).lineSeparated(); + })); + } + + private TokenTree generateEnumValuesArray(final EnumTrait enumTrait, final String valueTypeName) { + final Stream valueStrings; + if (enumTrait.hasNames()) { + valueStrings = enumTrait.getValues() + .stream() + .map(EnumDefinition::getName) + .map(Optional::get) + .sorted() // Sort values for sane diffs + .map(Token::of); + } else { + valueStrings = enumTrait.getEnumDefinitionValues() + .stream() + .sorted() // Sort values for sane diffs + .map(value -> Token.of(String.format("\"%s\"", value))); + } + final TokenTree valuesArrayLiteral = TokenTree.of(valueStrings).separated(Token.of(",")).braced(); + return TokenTree.of( + Token.of("public static readonly "), + Token.of(valueTypeName), + Token.of("[] Values = "), + valuesArrayLiteral, + Token.of(';') + ); + } + + private TokenTree formatDocComment(final String docComment) { + final TokenTree start = Token.of("///

"); + final TokenTree body = TokenTree.of( + Arrays.stream(docComment.split("\n")) + .map(docLine -> TokenTree.of("///", docLine))).lineSeparated(); + final TokenTree end = Token.of("/// "); + return TokenTree.of(start, body, end).lineSeparated(); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/ShimCodegen.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/ShimCodegen.java new file mode 100644 index 0000000000..f4a17721b1 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/ShimCodegen.java @@ -0,0 +1,183 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import software.amazon.polymorph.utils.ModelUtils; +import software.amazon.polymorph.traits.ClientConfigTrait; +import software.amazon.polymorph.utils.Token; +import software.amazon.polymorph.utils.TokenTree; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.EntityShape; +import software.amazon.smithy.model.shapes.OperationShape; +import software.amazon.smithy.model.shapes.ResourceShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.ShapeId; + +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +public class ShimCodegen { + private final Model model; + private final ServiceShape serviceShape; + private final DotNetNameResolver nameResolver; + + private static final String IMPL_NAME = "_impl"; + + public ShimCodegen(final Model model, final ShapeId serviceShapeId) { + this.model = model; + this.serviceShape = model.expectShape(serviceShapeId, ServiceShape.class); + this.nameResolver = new DotNetNameResolver(model, serviceShape); + } + + /** + * Returns a map of service's and all resources' shim file paths to their generated ASTs. + */ + public Map generate() { + final Map codeByPath = new HashMap<>(); + final TokenTree prelude = TokenTree.of( + "using System;", + // Conditional imports. + // TODO: get smarter about imports. maybe just fully qualify all model-agnostic types? + "using System.IO;", + "using System.Collections.Generic;", + "using Aws.Crypto;", + // end conditional imports + "using", + nameResolver.namespaceForService(), + ";" + ).lineSeparated(); + + // Service shim + final Path serviceShimPath = Path.of(String.format("%s.cs", nameResolver.clientForService())); + final TokenTree serviceShimCode = generateServiceShim(); + codeByPath.put(serviceShimPath, serviceShimCode.prepend(prelude)); + + // Resource shims + model.getResourceShapes() + .stream() + .map(ResourceShape::getId) + .filter(resourceShapeId -> ModelUtils.isInServiceNamespace(resourceShapeId, serviceShape)) + .forEach(resourceShapeId -> { + final Path resourceShimPath = Path.of( + String.format("%s.cs", nameResolver.shimClassForResource(resourceShapeId))); + final TokenTree resourceShim = generateResourceShim(resourceShapeId); + codeByPath.put(resourceShimPath, resourceShim.prepend(prelude)); + }); + + return codeByPath; + } + + public TokenTree generateServiceShim() { + final TokenTree header = Token.of("public class %s : %s".formatted( + nameResolver.clientForService(), + nameResolver.baseClientForService())); + final TokenTree body = TokenTree.of( + generateServiceImplDeclaration(), + generateServiceConstructor(), + generateOperationShims(serviceShape.getId()) + ).lineSeparated(); + return header + .append(body.braced()) + .namespaced(Token.of(nameResolver.namespaceForService())); + } + + public TokenTree generateServiceConstructor() { + final Optional configShapeIdOptional = serviceShape.getTrait(ClientConfigTrait.class) + .map(ClientConfigTrait::getClientConfigId); + + final TokenTree configParam = configShapeIdOptional.map(shapeId -> TokenTree.of( + nameResolver.baseTypeForShape(shapeId), + "config" + )).orElse(TokenTree.empty()); + final TokenTree baseCtorCall = configShapeIdOptional.isPresent() + ? Token.of(": base(config)") : TokenTree.empty(); + final TokenTree configArg = configShapeIdOptional.map(shapeId -> TokenTree.of( + DotNetNameResolver.qualifiedTypeConverter(shapeId, TypeConversionDirection.TO_DAFNY), + "(config)" + )).orElse(TokenTree.empty()); + return Token.of("public %s(%s) %s { this.%s = new %s(%s); }".formatted( + nameResolver.clientForService(), + configParam, + baseCtorCall, + IMPL_NAME, + nameResolver.dafnyImplForServiceClient(), + configArg)); + } + + public TokenTree generateServiceImplDeclaration() { + return Token.of("private %s %s;".formatted(nameResolver.dafnyImplForServiceClient(), IMPL_NAME)); + } + + /** + * Generate a shim that wraps a Dafny-compiled implementation of the given resource interface. + * + * TODO: generate a shim that wraps a native C# implementation (i.e. customer-implemented) + */ + public TokenTree generateResourceShim(final ShapeId resourceShapeId) { + final TokenTree header = Token.of("internal class %s : %s".formatted( + nameResolver.shimClassForResource(resourceShapeId), + nameResolver.baseClassForResource(resourceShapeId))); + final TokenTree body = TokenTree.of( + generateResourceImplDeclaration(resourceShapeId), + generateResourceConstructor(resourceShapeId), + generateOperationShims(resourceShapeId) + ).lineSeparated(); + return header + .append(body.braced()) + .namespaced(Token.of(nameResolver.namespaceForService())); + } + + public TokenTree generateResourceConstructor(final ShapeId resourceShapeId) { + return Token.of("internal %s(%s impl) { this.%s = impl; }".formatted( + nameResolver.shimClassForResource(resourceShapeId), + nameResolver.dafnyTypeForShape(resourceShapeId), + IMPL_NAME)); + } + + public TokenTree generateResourceImplDeclaration(final ShapeId entityShapeId) { + return Token.of("internal %s %s { get; }".formatted( + nameResolver.dafnyTypeForShape(entityShapeId), IMPL_NAME)); + } + + public TokenTree generateOperationShims(final ShapeId entityShapeId) { + final EntityShape entityShape = model.expectShape(entityShapeId, EntityShape.class); + return TokenTree.of(entityShape.getAllOperations().stream().map(this::generateOperationShim)).lineSeparated(); + } + + public TokenTree generateOperationShim(final ShapeId operationShapeId) { + final OperationShape operationShape = model.expectShape(operationShapeId, OperationShape.class); + + final String outputType = operationShape.getOutput().map(nameResolver::baseTypeForShape).orElse("void"); + final String methodName = nameResolver.abstractMethodForOperation(operationShapeId); + final String param = operationShape.getInput() + .map(inputShapeId -> nameResolver.baseTypeForShape(inputShapeId) + " input") + .orElse(""); + final TokenTree signature = Token.of("protected override %s %s(%s)".formatted(outputType, methodName, param)); + + final TokenTree convertInput = Token.of(operationShape.getInput() + .map(inputShapeId -> "%s internalInput = %s(input);".formatted( + nameResolver.dafnyTypeForShape(inputShapeId), + DotNetNameResolver.qualifiedTypeConverter(inputShapeId, TypeConversionDirection.TO_DAFNY))) + .orElse("")); + final TokenTree assignInternalOutput = operationShape.getOutput() + .map(outputShapeId -> TokenTree.of(nameResolver.dafnyTypeForShape(outputShapeId), "internalOutput =")) + .orElse(TokenTree.empty()); + final TokenTree callImpl = Token.of("this.%s.%s(%s);".formatted( + IMPL_NAME, + nameResolver.methodForOperation(operationShapeId), + operationShape.getInput().isPresent() ? "internalInput" : "" + )); + final TokenTree convertAndReturnOutput = Token.of(operationShape.getOutput() + .map(outputShapeId -> "return %s(internalOutput);".formatted( + DotNetNameResolver.qualifiedTypeConverter(outputShapeId, TypeConversionDirection.FROM_DAFNY))) + .orElse("")); + + return TokenTree.of(convertInput, assignInternalOutput, callImpl, convertAndReturnOutput) + .lineSeparated() + .braced() + .prepend(signature); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/TypeConversionCodegen.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/TypeConversionCodegen.java new file mode 100644 index 0000000000..496d4e5671 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/TypeConversionCodegen.java @@ -0,0 +1,581 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.Sets; +import software.amazon.polymorph.utils.ModelUtils; +import software.amazon.polymorph.traits.ClientConfigTrait; +import software.amazon.polymorph.traits.DafnyUtf8BytesTrait; +import software.amazon.polymorph.traits.PositionalTrait; +import software.amazon.polymorph.traits.ReferenceTrait; +import software.amazon.polymorph.utils.Token; +import software.amazon.polymorph.utils.TokenTree; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.BlobShape; +import software.amazon.smithy.model.shapes.BooleanShape; +import software.amazon.smithy.model.shapes.IntegerShape; +import software.amazon.smithy.model.shapes.ListShape; +import software.amazon.smithy.model.shapes.LongShape; +import software.amazon.smithy.model.shapes.MapShape; +import software.amazon.smithy.model.shapes.MemberShape; +import software.amazon.smithy.model.shapes.OperationShape; +import software.amazon.smithy.model.shapes.ResourceShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StringShape; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.shapes.TimestampShape; +import software.amazon.smithy.model.traits.EnumTrait; + +import java.nio.file.Path; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Queue; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static software.amazon.polymorph.smithydotnet.DotNetNameResolver.TYPE_CONVERSION_CLASS_NAME; +import static software.amazon.polymorph.smithydotnet.TypeConversionDirection.FROM_DAFNY; +import static software.amazon.polymorph.smithydotnet.TypeConversionDirection.TO_DAFNY; + +/** + * Generates a {@code TypeConversion} class that includes all {@link TypeConverter}s needed for the operations in the + * provided {@link Model}. + */ +public class TypeConversionCodegen { + /** + * A pair of type converter methods that converts between the compiled Dafny representation and the idiomatic C# + * representation of a given {@link software.amazon.smithy.model.shapes.Shape} value. + */ + public static record TypeConverter(ShapeId shapeId, TokenTree fromDafny, TokenTree toDafny) {} + + public static final Path TYPE_CONVERSION_CLASS_PATH = Path.of(TYPE_CONVERSION_CLASS_NAME + ".cs"); + + protected final Model model; + protected final ServiceShape serviceShape; + protected final DotNetNameResolver nameResolver; + + public TypeConversionCodegen(final Model model, final ShapeId serviceShapeId) { + this(model, serviceShapeId, + new DotNetNameResolver(model, model.expectShape(serviceShapeId, ServiceShape.class))); + } + + public TypeConversionCodegen(final Model model, final ShapeId serviceShapeId, final DotNetNameResolver nameResolver) { + this.model = model; + this.serviceShape = model.expectShape(serviceShapeId, ServiceShape.class); + this.nameResolver = nameResolver; + } + + public Map generate() { + final TokenTree prelude = TokenTree.of( + // needed for LINQ operators like Select + "using System.Linq;", + // TODO: fully qualify types to avoid needing this + "using Aws.Crypto;" + ); + final Stream converters = findShapeIdsToConvert() + .stream() + .map(model::expectShape) + .map(this::generateConverter); + final TokenTree conversionClassBody = TokenTree.of(converters + .flatMap(typeConverter -> Stream.of(typeConverter.fromDafny, typeConverter.toDafny))) + .lineSeparated() + .braced(); + final TokenTree conversionClass = conversionClassBody + .prepend(TokenTree.of("internal static class", TYPE_CONVERSION_CLASS_NAME)) + .namespaced(Token.of(nameResolver.namespaceForService())); + return Map.of(TYPE_CONVERSION_CLASS_PATH, conversionClass.prepend(prelude)); + } + + /** + * Returns all shape IDs that require converters. + */ + @VisibleForTesting + public Set findShapeIdsToConvert() { + final Set shapesToConvert = new HashSet<>(); + + // Breadth-first search via getDependencyShapeIds + final Queue toTraverse = new LinkedList<>(findInitialShapeIdsToConvert()); + while (!toTraverse.isEmpty()) { + final ShapeId currentShapeId = toTraverse.remove(); + if (shapesToConvert.add(currentShapeId)) { + final Shape currentShape = model.expectShape(currentShapeId); + getDependencyShapeIds(currentShape).forEach(toTraverse::add); + } + } + return shapesToConvert; + } + + /** + * Returns a set of shape IDs for which to start generating type converter pairs, by recursively traversing + * services, resources, and operations defined in the model. + * + * Since type converters are only necessary when calling API operations, it suffices to find the shape IDs of all + * operation input and output structures. + */ + private Set findInitialShapeIdsToConvert() { + // Collect services + final Set serviceShapes = model.getServiceShapes().stream() + .filter(serviceShape -> isInServiceNamespace(serviceShape.getId())) + .collect(Collectors.toSet()); + + // Collect resources defined in model... + final Stream topLevelResourceShapes = model.getResourceShapes().stream() + .filter(resourceShape -> isInServiceNamespace(resourceShape.getId())); + // ... and resources of collected services. + final Stream serviceResourceShapes = serviceShapes.stream() + .flatMap(serviceShape -> serviceShape.getResources().stream()) + .map(resourceShapeId -> model.expectShape(resourceShapeId, ResourceShape.class)); + final Set resourceShapes = Stream.concat(topLevelResourceShapes, serviceResourceShapes) + .collect(Collectors.toSet()); + + // Collect operations defined in model... + final Stream topLevelOperationShapes = model.getOperationShapes().stream() + .filter(operationShape -> isInServiceNamespace(operationShape.getId())); + // ... and operations of collected services... + final Stream serviceOperationShapes = serviceShapes.stream() + .flatMap(serviceShape -> serviceShape.getAllOperations().stream()) + .map(operationShapeId -> model.expectShape(operationShapeId, OperationShape.class)); + // ... and operations of collected resources. + final Stream resourceOperationShapes = resourceShapes.stream() + .flatMap(resourceShape -> resourceShape.getAllOperations().stream()) + .map(operationShapeId -> model.expectShape(operationShapeId, OperationShape.class)); + final Set operationShapes = Stream + .of(topLevelOperationShapes, serviceOperationShapes, resourceOperationShapes) + .flatMap(Function.identity()) + .collect(Collectors.toSet()); + + // Collect inputs/output/error structures for collected operations + final Set operationStructures = operationShapes.stream() + .flatMap(operationShape -> { + final Stream inputOutput = Stream + .of(operationShape.getInput(), operationShape.getOutput()) + .flatMap(Optional::stream); + final Stream errors = operationShape.getErrors().stream(); + return Stream.concat(inputOutput, errors); + }) + .collect(Collectors.toSet()); + // Collect service client config structures + final Set clientConfigStructures = serviceShapes.stream() + .map(serviceShape -> serviceShape.getTrait(ClientConfigTrait.class)) + .flatMap(Optional::stream) + .map(ClientConfigTrait::getClientConfigId) + .collect(Collectors.toSet()); + return Sets.union(operationStructures, clientConfigStructures); + } + + private boolean isInServiceNamespace(final ShapeId shapeId) { + return shapeId.getNamespace().equals(serviceShape.getId().getNamespace()); + } + + /** + * Generates a {@link TypeConverter} for the given shape. + */ + @SuppressWarnings("OptionalGetWithoutIsPresent") + private TypeConverter generateConverter(final Shape shape) { + return switch (shape.getType()) { + case BLOB -> generateBlobConverter(shape.asBlobShape().get()); + case BOOLEAN -> generateBooleanConverter(shape.asBooleanShape().get()); + case STRING -> generateStringConverter(shape.asStringShape().get()); + case INTEGER -> generateIntegerConverter(shape.asIntegerShape().get()); + case LONG -> generateLongConverter(shape.asLongShape().get()); + case TIMESTAMP -> generateTimestampConverter(shape.asTimestampShape().get()); + case LIST -> generateListConverter(shape.asListShape().get()); + case MAP -> generateMapConverter(shape.asMapShape().get()); + case STRUCTURE -> generateStructureConverter(shape.asStructureShape().get()); + case MEMBER -> generateMemberConverter(shape.asMemberShape().get()); + default -> throw new IllegalStateException(); + }; + } + + /** + * Returns dependency shape IDs for the given shape. A shape {@code S} has a dependency shape {@code D} if a type + * converter for {@code S} requires the existence of a type converter for {@code D}. + */ + @SuppressWarnings("OptionalGetWithoutIsPresent") + private Stream getDependencyShapeIds(final Shape shape) { + return switch (shape.getType()) { + case LIST -> Stream.of(shape.asListShape().get().getMember().getId()); + case MAP -> { + final MapShape mapShape = shape.asMapShape().get(); + yield Stream.of(mapShape.getKey().getId(), mapShape.getValue().getId()); + } + case STRUCTURE -> ModelUtils.streamStructureMembers(shape.asStructureShape().get()).map(Shape::getId); + case MEMBER -> Stream.of(shape.asMemberShape().get().getTarget()); + default -> Stream.empty(); + }; + } + + public TypeConverter generateBlobConverter(final BlobShape blobShape) { + final TokenTree fromDafnyBody = Token.of("return new System.IO.MemoryStream(value.Elements);"); + final TokenTree toDafnyBody = Token.of("return Dafny.Sequence.FromArray(value.ToArray());"); + return buildConverterFromMethodBodies(blobShape, fromDafnyBody, toDafnyBody); + } + + public TypeConverter generateBooleanConverter(final BooleanShape booleanShape) { + final TokenTree fromDafnyBody = Token.of("return value;"); + final TokenTree toDafnyBody = Token.of("return value;"); + return buildConverterFromMethodBodies(booleanShape, fromDafnyBody, toDafnyBody); + } + + public TypeConverter generateStringConverter(final StringShape stringShape) { + if (stringShape.hasTrait(EnumTrait.class)) { + return generateEnumConverter(stringShape, stringShape.expectTrait(EnumTrait.class)); + } + + if (stringShape.hasTrait(DafnyUtf8BytesTrait.class)) { + return generateUtf8BytesConverter(stringShape); + } + + final TokenTree fromDafnyBody = Token.of("return new string(value.Elements);"); + final TokenTree toDafnyBody = Token.of("return Dafny.Sequence.FromString(value);"); + return buildConverterFromMethodBodies(stringShape, fromDafnyBody, toDafnyBody); + } + + public TypeConverter generateIntegerConverter(final IntegerShape integerShape) { + final TokenTree fromDafnyBody = Token.of("return value;"); + final TokenTree toDafnyBody = Token.of("return value;"); + return buildConverterFromMethodBodies(integerShape, fromDafnyBody, toDafnyBody); + } + + public TypeConverter generateLongConverter(final LongShape longShape) { + final TokenTree fromDafnyBody = Token.of("return value;"); + final TokenTree toDafnyBody = Token.of("return value;"); + return buildConverterFromMethodBodies(longShape, fromDafnyBody, toDafnyBody); + } + + public TypeConverter generateTimestampConverter(final TimestampShape timestampShape) { + final TokenTree fromDafnyBody = Token.of(""" + System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(""); + string timestampString = new string(value.Elements); + return System.DateTime.ParseExact(timestampString, "s", culture); + """); + final TokenTree toDafnyBody = Token.of(""" + System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(""); + string timestampString = value.ToString("s", culture); + return Dafny.Sequence.FromString(timestampString); + """); + return buildConverterFromMethodBodies(timestampShape, fromDafnyBody, toDafnyBody); + } + + protected boolean enumListMembersAreStringsInCSharp() { + return false; + } + + public TypeConverter generateListConverter(final ListShape listShape) { + final String listCSharpType = nameResolver.baseTypeForList(listShape); + + final MemberShape memberShape = listShape.getMember(); + final String memberDafnyType = nameResolver.dafnyTypeForShape(memberShape.getId()); + final String memberCSharpType = nameResolver.baseTypeForMember(memberShape);; + + final String memberToDafnyConverterName = DotNetNameResolver.typeConverterForShape(memberShape.getId(), TO_DAFNY); + final String memberFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(memberShape.getId(), FROM_DAFNY); + + final boolean convertMemberEnumToString = enumListMembersAreStringsInCSharp() + && model.expectShape(memberShape.getTarget()).hasTrait(EnumTrait.class); + final String fromDafnyEnumConversion = convertMemberEnumToString + ? ".Select<%s, string>(x => x)".formatted(memberCSharpType) + : ""; + final String toDafnyEnumConversion = convertMemberEnumToString + ? ".Select(x => x)".formatted(memberCSharpType) + : ""; + + final TokenTree fromDafnyBody = Token.of( + "return new %s(value.Elements.Select(%s)%s);".formatted( + listCSharpType, + memberFromDafnyConverterName, + fromDafnyEnumConversion)); + + final TokenTree toDafnyBody = Token.of( + "return Dafny.Sequence<%s>.FromArray(value%s.Select(%s).ToArray());".formatted( + memberDafnyType, + toDafnyEnumConversion, + memberToDafnyConverterName)); + + return buildConverterFromMethodBodies(listShape, fromDafnyBody, toDafnyBody); + } + + public TypeConverter generateMapConverter(final MapShape mapShape) { + final MemberShape keyShape = mapShape.getKey(); + final MemberShape valueShape = mapShape.getValue(); + final String keyDafnyType = nameResolver.dafnyTypeForShape(keyShape.getId()); + final String valueDafnyType = nameResolver.dafnyTypeForShape(valueShape.getId()); + + final String keyToDafnyConverterName = DotNetNameResolver.typeConverterForShape(keyShape.getId(), TO_DAFNY); + final String keyFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(keyShape.getId(), FROM_DAFNY); + final String valueToDafnyConverterName = DotNetNameResolver.typeConverterForShape(valueShape.getId(), TO_DAFNY); + final String valueFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(valueShape.getId(), FROM_DAFNY); + + final TokenTree fromDafnyBody = Token.of( + "return value.ItemEnumerable.ToDictionary(pair => %s(pair.Car), pair => %s(pair.Cdr));" + .formatted(keyFromDafnyConverterName, valueFromDafnyConverterName)); + + final String dafnyMapTypeArgs = "<%s, %s>".formatted(keyDafnyType, valueDafnyType); + final TokenTree toDafnyBody = Token.of(""" + return Dafny.Map%s.FromCollection(value.Select(pair => + new Dafny.Pair%s(%s(pair.Key), %s(pair.Value)) + ));""" + .formatted(dafnyMapTypeArgs, dafnyMapTypeArgs, keyToDafnyConverterName, valueToDafnyConverterName)); + return buildConverterFromMethodBodies(mapShape, fromDafnyBody, toDafnyBody); + } + + public TypeConverter generateStructureConverter(final StructureShape structureShape) { + final Optional referenceTraitOptional = structureShape.getTrait(ReferenceTrait.class); + if (referenceTraitOptional.isPresent()) { + return generateReferenceStructureConverter(structureShape, referenceTraitOptional.get()); + } + + final Optional positionalTraitOptional = structureShape.getTrait(PositionalTrait.class); + if (positionalTraitOptional.isPresent()) { + return generatePositionalStructureConverter(structureShape); + } + + return generateRegularStructureConverter(structureShape); + } + + /** + * This should not be called directly, instead call + * {@link TypeConversionCodegen#generateStructureConverter(StructureShape)}. + */ + private TypeConverter generateRegularStructureConverter(final StructureShape structureShape) { + final TokenTree assignments = TokenTree.of(ModelUtils.streamStructureMembers(structureShape) + .map(memberShape -> { + final String dafnyMemberName = memberShape.getMemberName(); + final String propertyName = nameResolver.classPropertyForStructureMember(memberShape); + final String propertyType = nameResolver.classPropertyTypeForStructureMember(memberShape); + final String memberFromDafnyConverterName = DotNetNameResolver.typeConverterForShape( + memberShape.getId(), FROM_DAFNY); + + final TokenTree checkIfPresent; + if (nameResolver.memberShapeIsOptional(memberShape)) { + final String isPresent = ModelUtils.memberShapeTargetsEntityReference(model, memberShape) + ? "!= null" + : ".is_Some"; + checkIfPresent = Token.of("if (value.%s %s)".formatted(dafnyMemberName, isPresent)); + } else { + checkIfPresent = TokenTree.empty(); + } + final TokenTree assign = Token.of("converted.%s = (%s) %s(value.%s);".formatted( + propertyName, propertyType, memberFromDafnyConverterName, dafnyMemberName)); + return TokenTree.of(checkIfPresent, assign); + })).lineSeparated(); + final String structureType = nameResolver.baseTypeForShape(structureShape.getId()); + final TokenTree fromDafnyBody = TokenTree.of( + Token.of("%1$s converted = new %1$s();".formatted(structureType)), + assignments, + Token.of("return converted;") + ); + + final TokenTree constructorArgs = TokenTree.of(ModelUtils.streamStructureMembers(structureShape) + .map(memberShape -> "%s(value.%s)".formatted( + DotNetNameResolver.typeConverterForShape(memberShape.getId(), TO_DAFNY), + nameResolver.classPropertyForStructureMember(memberShape))) + .map(Token::of) + ).separated(Token.of(',')); + final TokenTree toDafnyBody = TokenTree.of( + Token.of("return new"), + Token.of(nameResolver.dafnyTypeForShape(structureShape.getId())), + constructorArgs.parenthesized(), + Token.of(';') + ); + + return buildConverterFromMethodBodies(structureShape, fromDafnyBody, toDafnyBody); + } + + public TypeConverter generateMemberConverter(final MemberShape memberShape) { + final Shape targetShape = model.expectShape(memberShape.getTarget()); + + final String targetFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(targetShape.getId(), FROM_DAFNY); + final String targetToDafnyConverterName = DotNetNameResolver.typeConverterForShape(targetShape.getId(), TO_DAFNY); + + // Entity references are represented as Dafny traits, and Dafny traits can't be type parameters. So in the + // Dafny implementation of the model, an optional entity reference member is represented as a nullable type T? + // instead of an Optional. This works around the limitation. + // TODO: remove workaround when https://github.com/dafny-lang/dafny/issues/1499 is resolved + final boolean targetIsEntityReference = targetShape.hasTrait(ReferenceTrait.class); + + if (!nameResolver.memberShapeIsOptional(memberShape) || targetIsEntityReference) { + final TokenTree fromDafnyBody = Token.of("return %s(value);".formatted(targetFromDafnyConverterName)); + final TokenTree toDafnyBody = Token.of("return %s(value);".formatted(targetToDafnyConverterName)); + return buildConverterFromMethodBodies(memberShape, fromDafnyBody, toDafnyBody); + } + + final String cSharpType = nameResolver.baseTypeForShape(targetShape.getId()); + final String cSharpOptionType = nameResolver.baseTypeForShape(memberShape.getId()); + final String dafnyOptionType = nameResolver.dafnyTypeForShape(memberShape.getId()); + final TokenTree fromDafnyBody = Token.of("return value.is_None ? (%s) null : %s(value.Extract());" + .formatted(cSharpOptionType, targetFromDafnyConverterName)); + final TokenTree toDafnyBody = Token.of( + "return value == null ? %s.create_None() : %s.create_Some(%s((%s) value));" + .formatted(dafnyOptionType, dafnyOptionType, targetToDafnyConverterName, cSharpType)); + return buildConverterFromMethodBodies(memberShape, fromDafnyBody, toDafnyBody); + } + + /** + * This should not be called directly, instead call + * {@link TypeConversionCodegen#generateStructureConverter(StructureShape)}. + */ + protected TypeConverter generateReferenceStructureConverter( + final StructureShape structureShape, final ReferenceTrait referenceTrait) { + final ShapeId referentId = referenceTrait.getReferentId(); + return switch (referenceTrait.getReferentType()) { + case SERVICE -> generateServiceReferenceStructureConverter( + structureShape, model.expectShape(referentId, ServiceShape.class)); + case RESOURCE -> generateResourceReferenceStructureConverter( + structureShape, model.expectShape(referentId, ResourceShape.class)); + }; + } + + /** + * This should not be called directly, instead call + * {@link TypeConversionCodegen#generateStructureConverter(StructureShape)}. + * + * Note that this currently only allows for C# implementations of AWS SDK service interfaces. + */ + protected TypeConverter generateServiceReferenceStructureConverter( + final StructureShape structureShape, final ServiceShape serviceShape) { + // TODO is this actually a good filter for AWS SDK services? + if (!serviceShape.getId().getNamespace().startsWith("com.amazonaws.")) { + throw new UnsupportedOperationException("Only AWS SDK service client converters are supported"); + } + + final AwsSdkTypeConversionCodegen awsSdkTypeConversionCodegen = + new AwsSdkTypeConversionCodegen(model, serviceShape.getId()); + return awsSdkTypeConversionCodegen.generateAwsSdkServiceReferenceStructureConverter(structureShape); + } + + /** + * This should not be called directly, instead call + * {@link TypeConversionCodegen#generateStructureConverter(StructureShape)}. + * + * Note that this currently only allows for Dafny-compiled implementations of the resource interface. + * + * TODO: allow for native C# implementations (i.e. customer-implemented) of resources + */ + protected TypeConverter generateResourceReferenceStructureConverter( + final StructureShape structureShape, final ResourceShape resourceShape) { + final ShapeId resourceShapeId = resourceShape.getId(); + + final TokenTree fromDafnyBody = Token.of("return new %s(value);" + .formatted(nameResolver.shimClassForResource(resourceShapeId))); + final TokenTree toDafnyBody = Token.of(""" + if (value is %s valueWithImpl) { + return valueWithImpl._impl; + } + throw new System.ArgumentException(\"Custom implementations of %s are not supported yet\"); + """.formatted( + nameResolver.shimClassForResource(resourceShapeId), + nameResolver.baseTypeForShape(resourceShapeId))); + + return buildConverterFromMethodBodies(structureShape, fromDafnyBody, toDafnyBody); + } + + /** + * This should not be called directly, instead call + * {@link TypeConversionCodegen#generateStructureConverter(StructureShape)}. + */ + private TypeConverter generatePositionalStructureConverter(final StructureShape structureShape) { + final ShapeId memberShapeId = ModelUtils.getPositionalStructureMember(structureShape).orElseThrow(); + + final String memberFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(memberShapeId, FROM_DAFNY); + final String memberToDafnyConverterName = DotNetNameResolver.typeConverterForShape(memberShapeId, TO_DAFNY); + final TokenTree fromDafnyBody = Token.of("return %s(value);".formatted(memberFromDafnyConverterName)); + final TokenTree toDafnyBody = Token.of("return %s(value);".formatted(memberToDafnyConverterName)); + + return buildConverterFromMethodBodies(structureShape, fromDafnyBody, toDafnyBody); + } + + /** + * A pair of names for a {@link software.amazon.smithy.model.traits.EnumDefinition}, consisting of the + * Smithy-defined name (the {@link EnumDefNames#defName}) and the Dafny-compiler-generated name (the + * {@link EnumDefNames#dafnyName}). + */ + private static record EnumDefNames(String defName, String dafnyName) {} + + /** + * This should not be called directly, instead call + * {@link TypeConversionCodegen#generateStringConverter(StringShape)}. + */ + private TypeConverter generateEnumConverter(final StringShape stringShape, final EnumTrait enumTrait) { + assert enumTrait.hasNames(); + //noinspection OptionalGetWithoutIsPresent + final List defNames = enumTrait.getValues().stream() + .map(enumDefinition -> enumDefinition.getName().get()) + .map(name -> new EnumDefNames(name, DotNetNameResolver.dafnyCompiledNameForEnumDefinitionName(name))) + .toList(); + final String enumClass = nameResolver.baseTypeForShape(stringShape.getId()); + final String dafnyEnumBaseClass = nameResolver.dafnyTypeForShape(stringShape.getId()); + final Token throwInvalidEnumValue = Token.of("\nthrow new System.ArgumentException(\"Invalid %s value\");" + .formatted(enumClass)); + + final TokenTree fromDafnyBody = TokenTree.of(defNames.stream() + .map(names -> "if (value.is_%s) return %s.%s;".formatted(names.dafnyName, enumClass, names.defName)) + .map(Token::of)) + .lineSeparated() + .append(throwInvalidEnumValue); + + final TokenTree toDafnyBody = TokenTree.of(defNames.stream() + .map(names -> { + final String condition = "%s.%s.Equals(value)".formatted(enumClass, names.defName); + // Dafny doesn't generate a "create_FOOBAR" ctor if there's only one ctor + final String construct = defNames.size() == 1 + ? "new %s()".formatted(dafnyEnumBaseClass) + : "%s.create_%s()".formatted(dafnyEnumBaseClass, names.dafnyName); + return "if (%s) return %s;".formatted(condition, construct); + }) + .map(Token::of)) + .lineSeparated() + .append(throwInvalidEnumValue); + + return buildConverterFromMethodBodies(stringShape, fromDafnyBody, toDafnyBody); + } + + /** + * @see DafnyUtf8BytesTrait + */ + private TypeConverter generateUtf8BytesConverter(final StringShape stringShape) { + final TokenTree fromDafnyBody = Token.of(""" + System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding(false, true); + return utf8.GetString(value.Elements);"""); + final TokenTree toDafnyBody = Token.of(""" + System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding(false, true); + return Dafny.Sequence.FromArray(utf8.GetBytes(value));"""); + return buildConverterFromMethodBodies(stringShape, fromDafnyBody, toDafnyBody); + } + + /** + * Build a {@link TypeConverter} by surrounding the given type converter method bodies with appropriate method + * signatures. Each method body should assume the sole argument (the value to convert) is named {@code value}. + */ + protected TypeConverter buildConverterFromMethodBodies( + final Shape shape, final TokenTree fromDafnyBody, final TokenTree toDafnyBody) { + final String dafnyType = nameResolver.dafnyTypeForShape(shape.getId()); + final String cSharpType = nameResolver.baseTypeForShape(shape.getId()); + + final String fromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shape.getId(), FROM_DAFNY); + final TokenTree fromDafnyConverterSignature = TokenTree.of( + "public static", cSharpType, fromDafnyConverterName, "(%s value)".formatted(dafnyType)); + final TokenTree fromDafnyConverterMethod = TokenTree.of(fromDafnyConverterSignature, fromDafnyBody.braced()); + + final String toDafnyConverterName = DotNetNameResolver.typeConverterForShape(shape.getId(), TO_DAFNY); + final TokenTree toDafnyConverterSignature = TokenTree.of( + "public static", dafnyType, toDafnyConverterName, "(%s value)".formatted(cSharpType)); + final TokenTree toDafnyConverterMethod = TokenTree.of(toDafnyConverterSignature, toDafnyBody.braced()); + + return new TypeConverter(shape.getId(), fromDafnyConverterMethod, toDafnyConverterMethod); + } + + @VisibleForTesting + public Model getModel() { + return model; + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/TypeConversionDirection.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/TypeConversionDirection.java new file mode 100644 index 0000000000..0b9fe6def9 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/smithydotnet/TypeConversionDirection.java @@ -0,0 +1,9 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +public enum TypeConversionDirection { + TO_DAFNY, + FROM_DAFNY +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/traits/ClientConfigTrait.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/traits/ClientConfigTrait.java new file mode 100644 index 0000000000..81073791ef --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/traits/ClientConfigTrait.java @@ -0,0 +1,104 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.traits; + +import software.amazon.smithy.model.node.Node; +import software.amazon.smithy.model.node.ObjectNode; +import software.amazon.smithy.model.node.StringNode; +import software.amazon.smithy.model.selector.Selector; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.traits.AbstractTrait; +import software.amazon.smithy.model.traits.AbstractTraitBuilder; +import software.amazon.smithy.model.traits.Trait; +import software.amazon.smithy.model.traits.TraitDefinition; +import software.amazon.smithy.utils.SmithyBuilder; +import software.amazon.smithy.utils.ToSmithyBuilder; + +import java.util.Optional; + +/** + * A trait indicating the structure that should be used as the client configuration object when generating the client + * code for a service structure. + */ +public class ClientConfigTrait extends AbstractTrait implements ToSmithyBuilder { + public static final ShapeId ID = ShapeId.from("aws.polymorph#clientConfig"); + + private final ShapeId clientConfigId; + + private static final String CONFIG = "config"; + + private ClientConfigTrait(Builder builder) { + super(ID, builder.getSourceLocation()); + this.clientConfigId = builder.clientConfigId; + } + + public static final class Provider extends AbstractTrait.Provider { + public Provider() { + super(ID); + } + + @Override + public Trait createTrait(ShapeId target, Node value) { + ObjectNode objectNode = value.expectObjectNode(); + Optional configIdOptional = objectNode.getStringMember(CONFIG).map(StringNode::expectShapeId); + ShapeId configId = configIdOptional.orElseThrow(() -> new IllegalStateException("Must specify a config")); + + return builder() + .clientConfigId(configId) + .build(); + } + } + + public static Builder builder() { + return new Builder(); + } + + public ShapeId getClientConfigId() { + return this.clientConfigId; + } + + @Override + protected Node createNode() { + return Node.objectNodeBuilder() + .sourceLocation(getSourceLocation()) + .withMember(CONFIG, this.clientConfigId.toString()) + .build(); + } + + @Override + public SmithyBuilder toBuilder() { + return builder() + .sourceLocation(getSourceLocation()); + } + + /** Builder for {@link ClientConfigTrait}. */ + public static final class Builder extends AbstractTraitBuilder { + private ShapeId clientConfigId; + + private Builder() {} + + @Override + public ClientConfigTrait build() { + return new ClientConfigTrait(this); + } + + public Builder clientConfigId(ShapeId clientConfigId) { + this.clientConfigId = clientConfigId; + return this; + } + } + + public static Shape getDefinition() { + final Trait clientConfigTraitDefinition = TraitDefinition.builder() + .selector(Selector.parse("service")) + .build(); + return StructureShape.builder() + .id(ClientConfigTrait.ID) + .addTrait(clientConfigTraitDefinition) + .addMember(CONFIG, ShapeId.from("smithy.api#String")) + .build(); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/traits/DafnyUtf8BytesTrait.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/traits/DafnyUtf8BytesTrait.java new file mode 100644 index 0000000000..dabd3e9957 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/traits/DafnyUtf8BytesTrait.java @@ -0,0 +1,59 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.traits; + +import software.amazon.smithy.model.node.Node; +import software.amazon.smithy.model.node.ObjectNode; +import software.amazon.smithy.model.selector.Selector; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.traits.AnnotationTrait; +import software.amazon.smithy.model.traits.Trait; +import software.amazon.smithy.model.traits.TraitDefinition; + +/** + * Indicates that a string is represented as a sequence of UTF-8 encoded bytes in Dafny, rather than the default + * sequence of UTF-16 chars. + *

+ * This trait is a workaround. Smithy "string" types represent UTF-8, but Dafny and C# natively use UTF-16 as the + * primary char and string primitive types. So normally, generated/compiled Dafny and C# code would just use UTF-16 to + * represent string types. But the Dafny implementation (and generated API) use explicit UTF-8 byte arrays where doing + * so makes verification easier. So we need this mechanism in the model to tell codegen which Dafny representation will + * be used: sequences of UTF-16 chars or UTF-8 bytes. + *

+ * The current plan is to change the definition of string in Dafny 4.0 to support Unicode in general better. When that + * lands we should be able to make the necessary changes to clean this up in the codegen/model without affecting any + * customers (who WILL be using their idiomatic representation of strings). + *

+ * See: dafny-lang/dafny#413: Revisit definition of Dafny strings + */ +// TODO: remove this trait +public final class DafnyUtf8BytesTrait extends AnnotationTrait { + public static final ShapeId ID = ShapeId.from("aws.polymorph#dafnyUtf8Bytes"); + + public DafnyUtf8BytesTrait(ObjectNode node) { + super(ID, node); + } + + public DafnyUtf8BytesTrait() { + this(Node.objectNode()); + } + + public static final class Provider extends AnnotationTrait.Provider { + public Provider() { + super(ID, DafnyUtf8BytesTrait::new); + } + } + + public static Shape getDefinition() { + final Trait traitDefinition = TraitDefinition.builder() + .selector(Selector.parse("string")) + .build(); + return StructureShape.builder() + .id(DafnyUtf8BytesTrait.ID) + .addTrait(traitDefinition) + .build(); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/traits/PositionalTrait.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/traits/PositionalTrait.java new file mode 100644 index 0000000000..eead9d7bb9 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/traits/PositionalTrait.java @@ -0,0 +1,76 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.traits; + +import software.amazon.smithy.model.node.Node; +import software.amazon.smithy.model.selector.Selector; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.traits.AbstractTrait; +import software.amazon.smithy.model.traits.AbstractTraitBuilder; +import software.amazon.smithy.model.traits.Trait; +import software.amazon.smithy.model.traits.TraitDefinition; +import software.amazon.smithy.utils.SmithyBuilder; +import software.amazon.smithy.utils.ToSmithyBuilder; + +/** + * A trait representing that a structure should be "unwrapped" to its member whenever it is referenced. + */ +public class PositionalTrait extends AbstractTrait implements ToSmithyBuilder { + public static final ShapeId ID = ShapeId.from("aws.polymorph#positional"); + + private PositionalTrait(Builder builder) { + super(ID, builder.getSourceLocation()); + } + + public static final class Provider extends AbstractTrait.Provider { + public Provider() { + super(ID); + } + + @Override + public Trait createTrait(ShapeId target, Node value) { + return builder().build(); + } + } + + public static Builder builder() { + return new Builder(); + } + + @Override + protected Node createNode() { + return Node.objectNodeBuilder() + .sourceLocation(getSourceLocation()) + .build(); + } + + @Override + public SmithyBuilder toBuilder() { + return builder() + .sourceLocation(getSourceLocation()); + } + + /** Builder for {@link PositionalTrait}. */ + public static final class Builder extends AbstractTraitBuilder { + + private Builder() {} + + @Override + public PositionalTrait build() { + return new PositionalTrait(this); + } + } + + public static Shape getDefinition() { + final Trait positionalTraitDefinition = TraitDefinition.builder() + .selector(Selector.parse("structure")) + .build(); + return StructureShape.builder() + .id(PositionalTrait.ID) + .addTrait(positionalTraitDefinition) + .build(); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/traits/ReferenceTrait.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/traits/ReferenceTrait.java new file mode 100644 index 0000000000..dd038310f2 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/traits/ReferenceTrait.java @@ -0,0 +1,146 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.traits; + +import software.amazon.smithy.model.node.Node; +import software.amazon.smithy.model.node.ObjectNode; +import software.amazon.smithy.model.node.StringNode; +import software.amazon.smithy.model.selector.Selector; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.traits.AbstractTrait; +import software.amazon.smithy.model.traits.AbstractTraitBuilder; +import software.amazon.smithy.model.traits.Trait; +import software.amazon.smithy.model.traits.TraitDefinition; +import software.amazon.smithy.utils.SmithyBuilder; +import software.amazon.smithy.utils.ToSmithyBuilder; + +import java.util.Optional; + +/** + * A trait representing a reference to either a service or resource, which we call the referent. A process holding such + * a reference can invoke operations on the referent. + */ +public class ReferenceTrait extends AbstractTrait implements ToSmithyBuilder { + public static final ShapeId ID = ShapeId.from("aws.polymorph#reference"); + + private static final String SERVICE = "service"; + private static final String RESOURCE = "resource"; + + private final ReferentType referentType; + private final ShapeId referentId; + + private ReferenceTrait(Builder builder) { + super(ID, builder.getSourceLocation()); + this.referentType = builder.referentType; + this.referentId = builder.referentId; + } + + public static final class Provider extends AbstractTrait.Provider { + public Provider() { + super(ID); + } + + @Override + public Trait createTrait(ShapeId target, Node value) { + ObjectNode objectNode = value.expectObjectNode(); + Optional serviceId = objectNode.getStringMember(SERVICE).map(StringNode::expectShapeId); + Optional resourceId = objectNode.getStringMember(RESOURCE).map(StringNode::expectShapeId); + if (serviceId.isPresent() == resourceId.isPresent()) { + throw new IllegalStateException("Must specify either service or resource, but not both"); + } + ReferentType referentType = serviceId.isPresent() ? ReferentType.SERVICE : ReferentType.RESOURCE; + ShapeId referentId = serviceId.orElseGet(resourceId::get); + + return builder() + .referentType(referentType) + .referentId(referentId) + .build(); + } + } + + public static Builder builder() { + return new Builder(); + } + + public ReferentType getReferentType() { + return referentType; + } + + public ShapeId getReferentId() { + return referentId; + } + + public enum ReferentType { + SERVICE, RESOURCE; + + @Override + public String toString() { + return switch (this) { + case SERVICE -> ReferenceTrait.SERVICE; + case RESOURCE -> ReferenceTrait.RESOURCE; + }; + } + + public static ReferentType fromString(String referentTypeStr) { + return switch (referentTypeStr) { + case ReferenceTrait.SERVICE -> SERVICE; + case ReferenceTrait.RESOURCE -> RESOURCE; + default -> throw new UnsupportedOperationException(); + }; + } + } + + @Override + protected Node createNode() { + return Node.objectNodeBuilder() + .sourceLocation(getSourceLocation()) + .withMember(this.referentType.toString(), this.referentId.toString()) + .build(); + } + + @Override + public SmithyBuilder toBuilder() { + return builder() + .sourceLocation(getSourceLocation()) + .referentType(this.getReferentType()) + .referentId(this.getReferentId()); + } + + /** Builder for {@link ReferenceTrait}. */ + public static final class Builder extends AbstractTraitBuilder { + private ReferentType referentType; + private ShapeId referentId; + + private Builder() {} + + @Override + public ReferenceTrait build() { + return new ReferenceTrait(this); + } + + public Builder referentType(ReferentType referentType) { + this.referentType = referentType; + return this; + } + + public Builder referentId(ShapeId referentId) { + this.referentId = referentId; + return this; + } + } + + public static Shape getDefinition() { + final Trait referenceTraitDefinition = TraitDefinition.builder() + .selector(Selector.parse("structure")) + .build(); + return StructureShape.builder() + .id(ReferenceTrait.ID) + .addTrait(referenceTraitDefinition) + .addMember("service", ShapeId.from("smithy.api#String")) + .addMember("resource", ShapeId.from("smithy.api#String")) + .build(); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/utils/ModelUtils.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/utils/ModelUtils.java new file mode 100644 index 0000000000..be8af8d6a9 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/utils/ModelUtils.java @@ -0,0 +1,121 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.utils; + +import com.google.common.base.Joiner; +import software.amazon.polymorph.traits.ClientConfigTrait; +import software.amazon.polymorph.traits.PositionalTrait; +import software.amazon.polymorph.traits.ReferenceTrait; +import software.amazon.polymorph.traits.DafnyUtf8BytesTrait; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.loader.ModelAssembler; +import software.amazon.smithy.model.shapes.MemberShape; +import software.amazon.smithy.model.shapes.OperationShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.Shape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.utils.StringUtils; + +import java.util.Arrays; +import java.util.Optional; +import java.util.TreeSet; +import java.util.regex.Pattern; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class ModelUtils { + // Require title-case alphanumeric names, so we don't need to check for keyword conflicts. + // + // The spec recommends a similar stricter definition for consistency (uppercase instead of title-case): + // https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html?highlight=enum#enum-trait + private static final Pattern ENUM_NAME_PATTERN = Pattern.compile("^[A-Z]+[A-Za-z_0-9]*$"); + + /** + * Adds our custom traits (and their definitions) to a {@link ModelAssembler}. + * + * Note that this only needs to be called if the model file(s) being processed do not define these traits + * (for example, in unit tests). If the model file does define the traits, adding them again does nothing. + */ + public static void addCustomTraitsToModelAssembler(final ModelAssembler assembler) { + assembler.addShape(ReferenceTrait.getDefinition()); + assembler.addShape(PositionalTrait.getDefinition()); + assembler.addShape(ClientConfigTrait.getDefinition()); + assembler.addShape(DafnyUtf8BytesTrait.getDefinition()); + } + + /** + * @return a stream of members of the given structure shape + */ + public static Stream streamStructureMembers(final StructureShape structureShape) { + return structureShape.getAllMembers().values().stream(); + } + + /** + * @return a stream of error structures in the given service shape + */ + public static Stream streamServiceErrors(final Model model, final ServiceShape serviceShape) { + return serviceShape.getAllOperations() + .stream() + .map(shapeId -> model.expectShape(shapeId, OperationShape.class)) + .flatMap(operationShape -> operationShape.getErrors().stream()) + .map(errorShapeId -> model.expectShape(errorShapeId, StructureShape.class)); + } + + /** + * @return true if the given shape ID is in the given service's namespace + */ + public static boolean isInServiceNamespace(final ShapeId shapeId, final ServiceShape serviceShape) { + return shapeId.getNamespace().equals(serviceShape.getId().getNamespace()); + } + + /** + * Returns the sole member of the given positional structure shape, or {@link Optional#empty()} if the given shape + * isn't a positional structure. + */ + public static Optional getPositionalStructureMember(final Shape shape) { + if (!shape.hasTrait(PositionalTrait.class)) { + return Optional.empty(); + } + + if (shape.members().size() != 1) { + // For now, we only intend this trait to be used for operation returns, so we therefore only allow one + // member. Eventually if we also want to use this to unwrap operation inputs (or any more general + // unwrapping) we'll need to relax this constraint. + throw new IllegalStateException("Structures marked with '@positional' must have exactly one member"); + } + + //noinspection OptionalGetWithoutIsPresent + final MemberShape memberShape = shape.members() + .stream() + .findFirst() + .get(); + return Optional.of(memberShape.getId()); + } + + public static boolean memberShapeIsOptional(final Model model, final MemberShape memberShape) { + final Shape containerShape = model.expectShape(memberShape.getContainer()); + return containerShape.isStructureShape() + && !containerShape.hasTrait(PositionalTrait.class) + && !memberShape.isRequired(); + } + + public static boolean memberShapeTargetsEntityReference(final Model model, final MemberShape memberShape) { + return Optional.of(memberShape.getTarget()) + .flatMap(model::getShape) + .flatMap(targetShape -> targetShape.getTrait(ReferenceTrait.class)) + .isPresent(); + } + + /** + * Returns true if the given shape ID is in the {@code smithy.api} namespace, or false otherwise. + */ + public static boolean isSmithyApiShape(final ShapeId shapeId) { + return shapeId.getNamespace().equals("smithy.api"); + } + + public static boolean isValidEnumDefinitionName(final String name) { + return ENUM_NAME_PATTERN.matcher(name).matches(); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/utils/Token.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/utils/Token.java new file mode 100644 index 0000000000..53779e8385 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/utils/Token.java @@ -0,0 +1,27 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.utils; + +public class Token extends TokenTree { + public static final Token NEWLINE = Token.of("\n"); + + private final CharSequence chars; + + public Token(final CharSequence chars) { + this.chars = chars; + } + + public static Token of(char singleChar) { + return new Token(String.valueOf(singleChar)); + } + + public static Token of(final CharSequence chars) { + return new Token(chars); + } + + @Override + public String toString() { + return chars == null ? "" : chars.toString(); + } +} diff --git a/smithy-dotnet/src/main/java/software/amazon/polymorph/utils/TokenTree.java b/smithy-dotnet/src/main/java/software/amazon/polymorph/utils/TokenTree.java new file mode 100644 index 0000000000..4cd1ecdab5 --- /dev/null +++ b/smithy-dotnet/src/main/java/software/amazon/polymorph/utils/TokenTree.java @@ -0,0 +1,103 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.utils; + +import com.google.common.collect.ImmutableList; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +/** + * An immutable rose tree (unbounded branches) for generated code. + */ +public class TokenTree { + private static final TokenTree EMPTY = new TokenTree(); + + private final List children; + + protected TokenTree() { + this.children = ImmutableList.of(); + } + + private TokenTree(ImmutableList children) { + this.children = children; + } + + public static TokenTree empty() { + return EMPTY; + } + + public static TokenTree of(final TokenTree... trees) { + return new TokenTree(ImmutableList.copyOf(trees)); + } + + public static TokenTree of(final Stream trees) { + return new TokenTree(ImmutableList.copyOf(trees.iterator())); + } + + public static TokenTree of(final CharSequence... charSequences) { + return TokenTree.of(Arrays.stream(charSequences).map(Token::of)); + } + + public TokenTree surround(final TokenTree prefix, final TokenTree suffix) { + return TokenTree.of(prefix, this, suffix); + } + + public TokenTree braced() { + return surround(Token.of("{\n"), Token.of("\n}")); + } + + public TokenTree parenthesized() { + return surround(Token.of('('), Token.of(')')); + } + + public TokenTree angleBracketed() { + return surround(Token.of('<'), Token.of('>')); + } + + public TokenTree prepend(final TokenTree toPrepend) { + return TokenTree.of(toPrepend, this); + } + + public TokenTree append(final TokenTree toAppend) { + return TokenTree.of(this, toAppend); + } + + public TokenTree namespaced(final TokenTree namespace) { + return TokenTree.of(Token.of("namespace"), namespace, this.braced()); + } + + public TokenTree separated(final TokenTree separator) { + if (children.size() < 2) { + return this; + } + Stream separatedTokens = children + .stream() + .flatMap(tokenTree -> Stream.of(separator, tokenTree)) + .skip(1); + return new TokenTree(ImmutableList.copyOf(separatedTokens.iterator())); + } + + public TokenTree lineSeparated() { + return separated(Token.NEWLINE); + } + + @Override + public String toString() { + if (children.size() == 0) { + return ""; + } + + final StringBuilder builder = new StringBuilder(children.get(0).toString()); + children.stream().skip(1).forEach(tokenTree -> { + final String treeAsString = tokenTree.toString(); + if (!treeAsString.startsWith("\n")) { + builder.append(' '); + } + builder.append(treeAsString); + }); + return builder.toString(); + } +} diff --git a/smithy-dotnet/src/main/resources/META-INF/services/software.amazon.smithy.model.traits.TraitService b/smithy-dotnet/src/main/resources/META-INF/services/software.amazon.smithy.model.traits.TraitService new file mode 100644 index 0000000000..17be3441a8 --- /dev/null +++ b/smithy-dotnet/src/main/resources/META-INF/services/software.amazon.smithy.model.traits.TraitService @@ -0,0 +1,4 @@ +software.amazon.polymorph.traits.ReferenceTrait$Provider +software.amazon.polymorph.traits.PositionalTrait$Provider +software.amazon.polymorph.traits.ClientConfigTrait$Provider +software.amazon.polymorph.traits.DafnyUtf8BytesTrait$Provider diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpLexer.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpLexer.java new file mode 100644 index 0000000000..677b9e3c43 --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpLexer.java @@ -0,0 +1,1301 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.antlr; + +// Generated from CSharpLexer.g4 by ANTLR 4.9.2 +import java.util.Stack; +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 CSharpLexer extends Lexer { + static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + BYTE_ORDER_MARK=1, SINGLE_LINE_DOC_COMMENT=2, EMPTY_DELIMITED_DOC_COMMENT=3, + DELIMITED_DOC_COMMENT=4, SINGLE_LINE_COMMENT=5, DELIMITED_COMMENT=6, WHITESPACES=7, + SHARP=8, ABSTRACT=9, ADD=10, ALIAS=11, ARGLIST=12, AS=13, ASCENDING=14, + ASYNC=15, AWAIT=16, BASE=17, BOOL=18, BREAK=19, BY=20, BYTE=21, CASE=22, + CATCH=23, CHAR=24, CHECKED=25, CLASS=26, CONST=27, CONTINUE=28, DECIMAL=29, + DEFAULT=30, DELEGATE=31, DESCENDING=32, DO=33, DOUBLE=34, DYNAMIC=35, + ELSE=36, ENUM=37, EQUALS=38, EVENT=39, EXPLICIT=40, EXTERN=41, FALSE=42, + FINALLY=43, FIXED=44, FLOAT=45, FOR=46, FOREACH=47, FROM=48, GET=49, GOTO=50, + GROUP=51, IF=52, IMPLICIT=53, IN=54, INT=55, INTERFACE=56, INTERNAL=57, + INTO=58, IS=59, JOIN=60, LET=61, LOCK=62, LONG=63, NAMEOF=64, NAMESPACE=65, + NEW=66, NULL_=67, OBJECT=68, ON=69, OPERATOR=70, ORDERBY=71, OUT=72, OVERRIDE=73, + PARAMS=74, PARTIAL=75, PRIVATE=76, PROTECTED=77, PUBLIC=78, READONLY=79, + REF=80, REMOVE=81, RETURN=82, SBYTE=83, SEALED=84, SELECT=85, SET=86, + SHORT=87, SIZEOF=88, STACKALLOC=89, STATIC=90, STRING=91, STRUCT=92, SWITCH=93, + THIS=94, THROW=95, TRUE=96, TRY=97, TYPEOF=98, UINT=99, ULONG=100, UNCHECKED=101, + UNMANAGED=102, UNSAFE=103, USHORT=104, USING=105, VAR=106, VIRTUAL=107, + VOID=108, VOLATILE=109, WHEN=110, WHERE=111, WHILE=112, YIELD=113, IDENTIFIER=114, + LITERAL_ACCESS=115, INTEGER_LITERAL=116, HEX_INTEGER_LITERAL=117, BIN_INTEGER_LITERAL=118, + REAL_LITERAL=119, CHARACTER_LITERAL=120, REGULAR_STRING=121, VERBATIUM_STRING=122, + INTERPOLATED_REGULAR_STRING_START=123, INTERPOLATED_VERBATIUM_STRING_START=124, + OPEN_BRACE=125, CLOSE_BRACE=126, OPEN_BRACKET=127, CLOSE_BRACKET=128, + OPEN_PARENS=129, CLOSE_PARENS=130, DOT=131, COMMA=132, COLON=133, SEMICOLON=134, + PLUS=135, MINUS=136, STAR=137, DIV=138, PERCENT=139, AMP=140, BITWISE_OR=141, + CARET=142, BANG=143, TILDE=144, ASSIGNMENT=145, LT=146, GT=147, INTERR=148, + DOUBLE_COLON=149, OP_COALESCING=150, OP_INC=151, OP_DEC=152, OP_AND=153, + OP_OR=154, OP_PTR=155, OP_EQ=156, OP_NE=157, OP_LE=158, OP_GE=159, OP_ADD_ASSIGNMENT=160, + OP_SUB_ASSIGNMENT=161, OP_MULT_ASSIGNMENT=162, OP_DIV_ASSIGNMENT=163, + OP_MOD_ASSIGNMENT=164, OP_AND_ASSIGNMENT=165, OP_OR_ASSIGNMENT=166, OP_XOR_ASSIGNMENT=167, + OP_LEFT_SHIFT=168, OP_LEFT_SHIFT_ASSIGNMENT=169, OP_COALESCING_ASSIGNMENT=170, + OP_RANGE=171, DOUBLE_CURLY_INSIDE=172, OPEN_BRACE_INSIDE=173, REGULAR_CHAR_INSIDE=174, + VERBATIUM_DOUBLE_QUOTE_INSIDE=175, DOUBLE_QUOTE_INSIDE=176, REGULAR_STRING_INSIDE=177, + VERBATIUM_INSIDE_STRING=178, CLOSE_BRACE_INSIDE=179, FORMAT_STRING=180, + DIRECTIVE_WHITESPACES=181, DIGITS=182, DEFINE=183, UNDEF=184, ELIF=185, + ENDIF=186, LINE=187, ERROR=188, WARNING=189, REGION=190, ENDREGION=191, + PRAGMA=192, NULLABLE=193, DIRECTIVE_HIDDEN=194, CONDITIONAL_SYMBOL=195, + DIRECTIVE_NEW_LINE=196, TEXT=197, DOUBLE_CURLY_CLOSE_INSIDE=198; + public static final int + COMMENTS_CHANNEL=2, DIRECTIVE=3; + public static final int + INTERPOLATION_STRING=1, INTERPOLATION_FORMAT=2, DIRECTIVE_MODE=3, DIRECTIVE_TEXT=4; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN", "COMMENTS_CHANNEL", "DIRECTIVE" + }; + + public static String[] modeNames = { + "DEFAULT_MODE", "INTERPOLATION_STRING", "INTERPOLATION_FORMAT", "DIRECTIVE_MODE", + "DIRECTIVE_TEXT" + }; + + private static String[] makeRuleNames() { + return new String[] { + "BYTE_ORDER_MARK", "SINGLE_LINE_DOC_COMMENT", "EMPTY_DELIMITED_DOC_COMMENT", + "DELIMITED_DOC_COMMENT", "SINGLE_LINE_COMMENT", "DELIMITED_COMMENT", + "WHITESPACES", "SHARP", "ABSTRACT", "ADD", "ALIAS", "ARGLIST", "AS", + "ASCENDING", "ASYNC", "AWAIT", "BASE", "BOOL", "BREAK", "BY", "BYTE", + "CASE", "CATCH", "CHAR", "CHECKED", "CLASS", "CONST", "CONTINUE", "DECIMAL", + "DEFAULT", "DELEGATE", "DESCENDING", "DO", "DOUBLE", "DYNAMIC", "ELSE", + "ENUM", "EQUALS", "EVENT", "EXPLICIT", "EXTERN", "FALSE", "FINALLY", + "FIXED", "FLOAT", "FOR", "FOREACH", "FROM", "GET", "GOTO", "GROUP", "IF", + "IMPLICIT", "IN", "INT", "INTERFACE", "INTERNAL", "INTO", "IS", "JOIN", + "LET", "LOCK", "LONG", "NAMEOF", "NAMESPACE", "NEW", "NULL_", "OBJECT", + "ON", "OPERATOR", "ORDERBY", "OUT", "OVERRIDE", "PARAMS", "PARTIAL", + "PRIVATE", "PROTECTED", "PUBLIC", "READONLY", "REF", "REMOVE", "RETURN", + "SBYTE", "SEALED", "SELECT", "SET", "SHORT", "SIZEOF", "STACKALLOC", + "STATIC", "STRING", "STRUCT", "SWITCH", "THIS", "THROW", "TRUE", "TRY", + "TYPEOF", "UINT", "ULONG", "UNCHECKED", "UNMANAGED", "UNSAFE", "USHORT", + "USING", "VAR", "VIRTUAL", "VOID", "VOLATILE", "WHEN", "WHERE", "WHILE", + "YIELD", "IDENTIFIER", "LITERAL_ACCESS", "INTEGER_LITERAL", "HEX_INTEGER_LITERAL", + "BIN_INTEGER_LITERAL", "REAL_LITERAL", "CHARACTER_LITERAL", "REGULAR_STRING", + "VERBATIUM_STRING", "INTERPOLATED_REGULAR_STRING_START", "INTERPOLATED_VERBATIUM_STRING_START", + "OPEN_BRACE", "CLOSE_BRACE", "OPEN_BRACKET", "CLOSE_BRACKET", "OPEN_PARENS", + "CLOSE_PARENS", "DOT", "COMMA", "COLON", "SEMICOLON", "PLUS", "MINUS", + "STAR", "DIV", "PERCENT", "AMP", "BITWISE_OR", "CARET", "BANG", "TILDE", + "ASSIGNMENT", "LT", "GT", "INTERR", "DOUBLE_COLON", "OP_COALESCING", + "OP_INC", "OP_DEC", "OP_AND", "OP_OR", "OP_PTR", "OP_EQ", "OP_NE", "OP_LE", + "OP_GE", "OP_ADD_ASSIGNMENT", "OP_SUB_ASSIGNMENT", "OP_MULT_ASSIGNMENT", + "OP_DIV_ASSIGNMENT", "OP_MOD_ASSIGNMENT", "OP_AND_ASSIGNMENT", "OP_OR_ASSIGNMENT", + "OP_XOR_ASSIGNMENT", "OP_LEFT_SHIFT", "OP_LEFT_SHIFT_ASSIGNMENT", "OP_COALESCING_ASSIGNMENT", + "OP_RANGE", "DOUBLE_CURLY_INSIDE", "OPEN_BRACE_INSIDE", "REGULAR_CHAR_INSIDE", + "VERBATIUM_DOUBLE_QUOTE_INSIDE", "DOUBLE_QUOTE_INSIDE", "REGULAR_STRING_INSIDE", + "VERBATIUM_INSIDE_STRING", "DOUBLE_CURLY_CLOSE_INSIDE", "CLOSE_BRACE_INSIDE", + "FORMAT_STRING", "DIRECTIVE_WHITESPACES", "DIGITS", "DIRECTIVE_TRUE", + "DIRECTIVE_FALSE", "DEFINE", "UNDEF", "DIRECTIVE_IF", "ELIF", "DIRECTIVE_ELSE", + "ENDIF", "LINE", "ERROR", "WARNING", "REGION", "ENDREGION", "PRAGMA", + "NULLABLE", "DIRECTIVE_DEFAULT", "DIRECTIVE_HIDDEN", "DIRECTIVE_OPEN_PARENS", + "DIRECTIVE_CLOSE_PARENS", "DIRECTIVE_BANG", "DIRECTIVE_OP_EQ", "DIRECTIVE_OP_NE", + "DIRECTIVE_OP_AND", "DIRECTIVE_OP_OR", "DIRECTIVE_STRING", "CONDITIONAL_SYMBOL", + "DIRECTIVE_SINGLE_LINE_COMMENT", "DIRECTIVE_NEW_LINE", "TEXT", "TEXT_NEW_LINE", + "InputCharacter", "NewLineCharacter", "IntegerTypeSuffix", "ExponentPart", + "CommonCharacter", "SimpleEscapeSequence", "HexEscapeSequence", "NewLine", + "Whitespace", "UnicodeClassZS", "IdentifierOrKeyword", "IdentifierStartCharacter", + "IdentifierPartCharacter", "LetterCharacter", "DecimalDigitCharacter", + "ConnectingCharacter", "CombiningCharacter", "FormattingCharacter", "UnicodeEscapeSequence", + "HexDigit", "UnicodeClassLU", "UnicodeClassLL", "UnicodeClassLT", "UnicodeClassLM", + "UnicodeClassLO", "UnicodeClassNL", "UnicodeClassMN", "UnicodeClassMC", + "UnicodeClassCF", "UnicodeClassPC", "UnicodeClassND" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, "'\u00EF\u00BB\u00BF'", null, "'/***/'", null, null, null, null, + "'#'", "'abstract'", "'add'", "'alias'", "'__arglist'", "'as'", "'ascending'", + "'async'", "'await'", "'base'", "'bool'", "'break'", "'by'", "'byte'", + "'case'", "'catch'", "'char'", "'checked'", "'class'", "'const'", "'continue'", + "'decimal'", "'default'", "'delegate'", "'descending'", "'do'", "'double'", + "'dynamic'", "'else'", "'enum'", "'equals'", "'event'", "'explicit'", + "'extern'", "'false'", "'finally'", "'fixed'", "'float'", "'for'", "'foreach'", + "'from'", "'get'", "'goto'", "'group'", "'if'", "'implicit'", "'in'", + "'int'", "'interface'", "'internal'", "'into'", "'is'", "'join'", "'let'", + "'lock'", "'long'", "'nameof'", "'namespace'", "'new'", "'null'", "'object'", + "'on'", "'operator'", "'orderby'", "'out'", "'override'", "'params'", + "'partial'", "'private'", "'protected'", "'public'", "'readonly'", "'ref'", + "'remove'", "'return'", "'sbyte'", "'sealed'", "'select'", "'set'", "'short'", + "'sizeof'", "'stackalloc'", "'static'", "'string'", "'struct'", "'switch'", + "'this'", "'throw'", "'true'", "'try'", "'typeof'", "'uint'", "'ulong'", + "'unchecked'", "'unmanaged'", "'unsafe'", "'ushort'", "'using'", "'var'", + "'virtual'", "'void'", "'volatile'", "'when'", "'where'", "'while'", + "'yield'", null, null, null, null, null, null, null, null, null, null, + null, "'{'", "'}'", "'['", "']'", "'('", "')'", "'.'", "','", "':'", + "';'", "'+'", "'-'", "'*'", "'/'", "'%'", "'&'", "'|'", "'^'", "'!'", + "'~'", "'='", "'<'", "'>'", "'?'", "'::'", "'??'", "'++'", "'--'", "'&&'", + "'||'", "'->'", "'=='", "'!='", "'<='", "'>='", "'+='", "'-='", "'*='", + "'/='", "'%='", "'&='", "'|='", "'^='", "'<<'", "'<<='", "'??='", "'..'", + "'{{'", null, null, null, null, null, null, null, null, null, null, "'define'", + "'undef'", "'elif'", "'endif'", "'line'", null, null, null, null, null, + null, "'hidden'", null, null, null, "'}}'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "BYTE_ORDER_MARK", "SINGLE_LINE_DOC_COMMENT", "EMPTY_DELIMITED_DOC_COMMENT", + "DELIMITED_DOC_COMMENT", "SINGLE_LINE_COMMENT", "DELIMITED_COMMENT", + "WHITESPACES", "SHARP", "ABSTRACT", "ADD", "ALIAS", "ARGLIST", "AS", + "ASCENDING", "ASYNC", "AWAIT", "BASE", "BOOL", "BREAK", "BY", "BYTE", + "CASE", "CATCH", "CHAR", "CHECKED", "CLASS", "CONST", "CONTINUE", "DECIMAL", + "DEFAULT", "DELEGATE", "DESCENDING", "DO", "DOUBLE", "DYNAMIC", "ELSE", + "ENUM", "EQUALS", "EVENT", "EXPLICIT", "EXTERN", "FALSE", "FINALLY", + "FIXED", "FLOAT", "FOR", "FOREACH", "FROM", "GET", "GOTO", "GROUP", "IF", + "IMPLICIT", "IN", "INT", "INTERFACE", "INTERNAL", "INTO", "IS", "JOIN", + "LET", "LOCK", "LONG", "NAMEOF", "NAMESPACE", "NEW", "NULL_", "OBJECT", + "ON", "OPERATOR", "ORDERBY", "OUT", "OVERRIDE", "PARAMS", "PARTIAL", + "PRIVATE", "PROTECTED", "PUBLIC", "READONLY", "REF", "REMOVE", "RETURN", + "SBYTE", "SEALED", "SELECT", "SET", "SHORT", "SIZEOF", "STACKALLOC", + "STATIC", "STRING", "STRUCT", "SWITCH", "THIS", "THROW", "TRUE", "TRY", + "TYPEOF", "UINT", "ULONG", "UNCHECKED", "UNMANAGED", "UNSAFE", "USHORT", + "USING", "VAR", "VIRTUAL", "VOID", "VOLATILE", "WHEN", "WHERE", "WHILE", + "YIELD", "IDENTIFIER", "LITERAL_ACCESS", "INTEGER_LITERAL", "HEX_INTEGER_LITERAL", + "BIN_INTEGER_LITERAL", "REAL_LITERAL", "CHARACTER_LITERAL", "REGULAR_STRING", + "VERBATIUM_STRING", "INTERPOLATED_REGULAR_STRING_START", "INTERPOLATED_VERBATIUM_STRING_START", + "OPEN_BRACE", "CLOSE_BRACE", "OPEN_BRACKET", "CLOSE_BRACKET", "OPEN_PARENS", + "CLOSE_PARENS", "DOT", "COMMA", "COLON", "SEMICOLON", "PLUS", "MINUS", + "STAR", "DIV", "PERCENT", "AMP", "BITWISE_OR", "CARET", "BANG", "TILDE", + "ASSIGNMENT", "LT", "GT", "INTERR", "DOUBLE_COLON", "OP_COALESCING", + "OP_INC", "OP_DEC", "OP_AND", "OP_OR", "OP_PTR", "OP_EQ", "OP_NE", "OP_LE", + "OP_GE", "OP_ADD_ASSIGNMENT", "OP_SUB_ASSIGNMENT", "OP_MULT_ASSIGNMENT", + "OP_DIV_ASSIGNMENT", "OP_MOD_ASSIGNMENT", "OP_AND_ASSIGNMENT", "OP_OR_ASSIGNMENT", + "OP_XOR_ASSIGNMENT", "OP_LEFT_SHIFT", "OP_LEFT_SHIFT_ASSIGNMENT", "OP_COALESCING_ASSIGNMENT", + "OP_RANGE", "DOUBLE_CURLY_INSIDE", "OPEN_BRACE_INSIDE", "REGULAR_CHAR_INSIDE", + "VERBATIUM_DOUBLE_QUOTE_INSIDE", "DOUBLE_QUOTE_INSIDE", "REGULAR_STRING_INSIDE", + "VERBATIUM_INSIDE_STRING", "CLOSE_BRACE_INSIDE", "FORMAT_STRING", "DIRECTIVE_WHITESPACES", + "DIGITS", "DEFINE", "UNDEF", "ELIF", "ENDIF", "LINE", "ERROR", "WARNING", + "REGION", "ENDREGION", "PRAGMA", "NULLABLE", "DIRECTIVE_HIDDEN", "CONDITIONAL_SYMBOL", + "DIRECTIVE_NEW_LINE", "TEXT", "DOUBLE_CURLY_CLOSE_INSIDE" + }; + } + 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; + } + + private int interpolatedStringLevel; + private Stack interpolatedVerbatiums = new Stack(); + private Stack curlyLevels = new Stack(); + private boolean verbatium; + + + public CSharpLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "CSharpLexer.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; } + + @Override + public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { + switch (ruleIndex) { + case 122: + INTERPOLATED_REGULAR_STRING_START_action((RuleContext)_localctx, actionIndex); + break; + case 123: + INTERPOLATED_VERBATIUM_STRING_START_action((RuleContext)_localctx, actionIndex); + break; + case 124: + OPEN_BRACE_action((RuleContext)_localctx, actionIndex); + break; + case 125: + CLOSE_BRACE_action((RuleContext)_localctx, actionIndex); + break; + case 132: + COLON_action((RuleContext)_localctx, actionIndex); + break; + case 172: + OPEN_BRACE_INSIDE_action((RuleContext)_localctx, actionIndex); + break; + case 175: + DOUBLE_QUOTE_INSIDE_action((RuleContext)_localctx, actionIndex); + break; + case 179: + CLOSE_BRACE_INSIDE_action((RuleContext)_localctx, actionIndex); + break; + } + } + private void INTERPOLATED_REGULAR_STRING_START_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 0: + interpolatedStringLevel++; interpolatedVerbatiums.push(false); verbatium = false; + break; + } + } + private void INTERPOLATED_VERBATIUM_STRING_START_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 1: + interpolatedStringLevel++; interpolatedVerbatiums.push(true); verbatium = true; + break; + } + } + private void OPEN_BRACE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 2: + + if (interpolatedStringLevel > 0) + { + curlyLevels.push(curlyLevels.pop() + 1); + } + break; + } + } + private void CLOSE_BRACE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 3: + + if (interpolatedStringLevel > 0) + { + curlyLevels.push(curlyLevels.pop() - 1); + if (curlyLevels.peek() == 0) + { + curlyLevels.pop(); + skip(); + popMode(); + } + } + + break; + } + } + private void COLON_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 4: + + if (interpolatedStringLevel > 0) + { + int ind = 1; + boolean switchToFormatString = true; + while ((char)_input.LA(ind) != '}') + { + if (_input.LA(ind) == ':' || _input.LA(ind) == ')') + { + switchToFormatString = false; + break; + } + ind++; + } + if (switchToFormatString) + { + mode(INTERPOLATION_FORMAT); + } + } + + break; + } + } + private void OPEN_BRACE_INSIDE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 5: + curlyLevels.push(1); + break; + } + } + private void DOUBLE_QUOTE_INSIDE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 6: + interpolatedStringLevel--; interpolatedVerbatiums.pop(); + verbatium = (interpolatedVerbatiums.size() > 0 ? interpolatedVerbatiums.peek() : false); + break; + } + } + private void CLOSE_BRACE_INSIDE_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 7: + curlyLevels.pop(); + break; + } + } + @Override + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 173: + return REGULAR_CHAR_INSIDE_sempred((RuleContext)_localctx, predIndex); + case 174: + return VERBATIUM_DOUBLE_QUOTE_INSIDE_sempred((RuleContext)_localctx, predIndex); + case 176: + return REGULAR_STRING_INSIDE_sempred((RuleContext)_localctx, predIndex); + case 177: + return VERBATIUM_INSIDE_STRING_sempred((RuleContext)_localctx, predIndex); + } + return true; + } + private boolean REGULAR_CHAR_INSIDE_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return !verbatium ; + } + return true; + } + private boolean VERBATIUM_DOUBLE_QUOTE_INSIDE_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 1: + return verbatium ; + } + return true; + } + private boolean REGULAR_STRING_INSIDE_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 2: + return !verbatium ; + } + return true; + } + private boolean VERBATIUM_INSIDE_STRING_sempred(RuleContext _localctx, int predIndex) { + switch (predIndex) { + case 3: + return verbatium ; + } + return true; + } + + public static final String _serializedATN = + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u00c8\u0816\b\1\b"+ + "\1\b\1\b\1\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b"+ + "\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t"+ + "\20\4\21\t\21\4\22\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t"+ + "\27\4\30\t\30\4\31\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t"+ + "\36\4\37\t\37\4 \t \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t"+ + "(\4)\t)\4*\t*\4+\t+\4,\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t"+ + "\62\4\63\t\63\4\64\t\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t"+ + ":\4;\t;\4<\t<\4=\t=\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4"+ + "F\tF\4G\tG\4H\tH\4I\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\t"+ + "Q\4R\tR\4S\tS\4T\tT\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\"+ + "\4]\t]\4^\t^\4_\t_\4`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h"+ + "\th\4i\ti\4j\tj\4k\tk\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts"+ + "\4t\tt\4u\tu\4v\tv\4w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177"+ + "\t\177\4\u0080\t\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083"+ + "\4\u0084\t\u0084\4\u0085\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088"+ + "\t\u0088\4\u0089\t\u0089\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c"+ + "\4\u008d\t\u008d\4\u008e\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091"+ + "\t\u0091\4\u0092\t\u0092\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095"+ + "\4\u0096\t\u0096\4\u0097\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a"+ + "\t\u009a\4\u009b\t\u009b\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e"+ + "\4\u009f\t\u009f\4\u00a0\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3"+ + "\t\u00a3\4\u00a4\t\u00a4\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7"+ + "\4\u00a8\t\u00a8\4\u00a9\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac"+ + "\t\u00ac\4\u00ad\t\u00ad\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0"+ + "\4\u00b1\t\u00b1\4\u00b2\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4\4\u00b5"+ + "\t\u00b5\4\u00b6\t\u00b6\4\u00b7\t\u00b7\4\u00b8\t\u00b8\4\u00b9\t\u00b9"+ + "\4\u00ba\t\u00ba\4\u00bb\t\u00bb\4\u00bc\t\u00bc\4\u00bd\t\u00bd\4\u00be"+ + "\t\u00be\4\u00bf\t\u00bf\4\u00c0\t\u00c0\4\u00c1\t\u00c1\4\u00c2\t\u00c2"+ + "\4\u00c3\t\u00c3\4\u00c4\t\u00c4\4\u00c5\t\u00c5\4\u00c6\t\u00c6\4\u00c7"+ + "\t\u00c7\4\u00c8\t\u00c8\4\u00c9\t\u00c9\4\u00ca\t\u00ca\4\u00cb\t\u00cb"+ + "\4\u00cc\t\u00cc\4\u00cd\t\u00cd\4\u00ce\t\u00ce\4\u00cf\t\u00cf\4\u00d0"+ + "\t\u00d0\4\u00d1\t\u00d1\4\u00d2\t\u00d2\4\u00d3\t\u00d3\4\u00d4\t\u00d4"+ + "\4\u00d5\t\u00d5\4\u00d6\t\u00d6\4\u00d7\t\u00d7\4\u00d8\t\u00d8\4\u00d9"+ + "\t\u00d9\4\u00da\t\u00da\4\u00db\t\u00db\4\u00dc\t\u00dc\4\u00dd\t\u00dd"+ + "\4\u00de\t\u00de\4\u00df\t\u00df\4\u00e0\t\u00e0\4\u00e1\t\u00e1\4\u00e2"+ + "\t\u00e2\4\u00e3\t\u00e3\4\u00e4\t\u00e4\4\u00e5\t\u00e5\4\u00e6\t\u00e6"+ + "\4\u00e7\t\u00e7\4\u00e8\t\u00e8\4\u00e9\t\u00e9\4\u00ea\t\u00ea\4\u00eb"+ + "\t\u00eb\4\u00ec\t\u00ec\4\u00ed\t\u00ed\4\u00ee\t\u00ee\4\u00ef\t\u00ef"+ + "\4\u00f0\t\u00f0\4\u00f1\t\u00f1\4\u00f2\t\u00f2\4\u00f3\t\u00f3\4\u00f4"+ + "\t\u00f4\4\u00f5\t\u00f5\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\3\3\3\7\3\u01f9"+ + "\n\3\f\3\16\3\u01fc\13\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\5\3"+ + "\5\3\5\3\5\3\5\3\5\7\5\u020e\n\5\f\5\16\5\u0211\13\5\3\5\3\5\3\5\3\5\3"+ + "\5\3\6\3\6\3\6\3\6\7\6\u021c\n\6\f\6\16\6\u021f\13\6\3\6\3\6\3\7\3\7\3"+ + "\7\3\7\7\7\u0227\n\7\f\7\16\7\u022a\13\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\6"+ + "\b\u0233\n\b\r\b\16\b\u0234\3\b\3\b\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3"+ + "\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r"+ + "\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3"+ + "\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3"+ + "\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3"+ + "\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3"+ + "\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3"+ + "\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\3"+ + "\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3"+ + "\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3"+ + "\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3"+ + "!\3!\3!\3!\3!\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3$\3"+ + "$\3%\3%\3%\3%\3%\3&\3&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3"+ + "(\3(\3(\3)\3)\3)\3)\3)\3)\3)\3)\3)\3*\3*\3*\3*\3*\3*\3*\3+\3+\3+\3+\3"+ + "+\3+\3,\3,\3,\3,\3,\3,\3,\3,\3-\3-\3-\3-\3-\3-\3.\3.\3.\3.\3.\3.\3/\3"+ + "/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\61\3\61\3"+ + "\61\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3"+ + "\64\3\64\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3"+ + "\67\3\67\3\67\38\38\38\38\39\39\39\39\39\39\39\39\39\39\3:\3:\3:\3:\3"+ + ":\3:\3:\3:\3:\3;\3;\3;\3;\3;\3<\3<\3<\3=\3=\3=\3=\3=\3>\3>\3>\3>\3?\3"+ + "?\3?\3?\3?\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3B\3B\3B\3B\3B\3B\3B\3"+ + "B\3B\3B\3C\3C\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3G\3"+ + "G\3G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3J\3J\3J\3"+ + "J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3"+ + "M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3O\3"+ + "P\3P\3P\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3"+ + "S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3V\3"+ + "V\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3"+ + "Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3]\3"+ + "]\3]\3]\3]\3]\3]\3^\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3"+ + "`\3a\3a\3a\3a\3a\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3c\3d\3d\3d\3d\3d\3e\3"+ + "e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3g\3g\3g\3"+ + "g\3g\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3j\3j\3k\3"+ + "k\3k\3k\3l\3l\3l\3l\3l\3l\3l\3l\3m\3m\3m\3m\3m\3n\3n\3n\3n\3n\3n\3n\3"+ + "n\3n\3o\3o\3o\3o\3o\3p\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3"+ + "r\3r\3s\5s\u04e1\ns\3s\3s\3t\3t\7t\u04e7\nt\ft\16t\u04ea\13t\3t\7t\u04ed"+ + "\nt\ft\16t\u04f0\13t\3t\5t\u04f3\nt\3t\3t\5t\u04f7\nt\3t\3t\3u\3u\7u\u04fd"+ + "\nu\fu\16u\u0500\13u\3u\7u\u0503\nu\fu\16u\u0506\13u\3u\5u\u0509\nu\3"+ + "v\3v\3v\7v\u050e\nv\fv\16v\u0511\13v\3v\6v\u0514\nv\rv\16v\u0515\3v\5"+ + "v\u0519\nv\3w\3w\3w\7w\u051e\nw\fw\16w\u0521\13w\3w\6w\u0524\nw\rw\16"+ + "w\u0525\3w\5w\u0529\nw\3x\3x\7x\u052d\nx\fx\16x\u0530\13x\3x\7x\u0533"+ + "\nx\fx\16x\u0536\13x\5x\u0538\nx\3x\3x\3x\7x\u053d\nx\fx\16x\u0540\13"+ + "x\3x\7x\u0543\nx\fx\16x\u0546\13x\3x\5x\u0549\nx\3x\5x\u054c\nx\3x\3x"+ + "\7x\u0550\nx\fx\16x\u0553\13x\3x\7x\u0556\nx\fx\16x\u0559\13x\3x\3x\3"+ + "x\5x\u055e\nx\5x\u0560\nx\5x\u0562\nx\3y\3y\3y\5y\u0567\ny\3y\3y\3z\3"+ + "z\3z\7z\u056e\nz\fz\16z\u0571\13z\3z\3z\3{\3{\3{\3{\3{\3{\7{\u057b\n{"+ + "\f{\16{\u057e\13{\3{\3{\3|\3|\3|\3|\3|\3|\3|\3}\3}\3}\3}\3}\3}\3}\3}\3"+ + "~\3~\3~\3\177\3\177\3\177\3\u0080\3\u0080\3\u0081\3\u0081\3\u0082\3\u0082"+ + "\3\u0083\3\u0083\3\u0084\3\u0084\3\u0085\3\u0085\3\u0086\3\u0086\3\u0086"+ + "\3\u0087\3\u0087\3\u0088\3\u0088\3\u0089\3\u0089\3\u008a\3\u008a\3\u008b"+ + "\3\u008b\3\u008c\3\u008c\3\u008d\3\u008d\3\u008e\3\u008e\3\u008f\3\u008f"+ + "\3\u0090\3\u0090\3\u0091\3\u0091\3\u0092\3\u0092\3\u0093\3\u0093\3\u0094"+ + "\3\u0094\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0097\3\u0097\3\u0097"+ + "\3\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u009a\3\u009a\3\u009a"+ + "\3\u009b\3\u009b\3\u009b\3\u009c\3\u009c\3\u009c\3\u009d\3\u009d\3\u009d"+ + "\3\u009e\3\u009e\3\u009e\3\u009f\3\u009f\3\u009f\3\u00a0\3\u00a0\3\u00a0"+ + "\3\u00a1\3\u00a1\3\u00a1\3\u00a2\3\u00a2\3\u00a2\3\u00a3\3\u00a3\3\u00a3"+ + "\3\u00a4\3\u00a4\3\u00a4\3\u00a5\3\u00a5\3\u00a5\3\u00a6\3\u00a6\3\u00a6"+ + "\3\u00a7\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8\3\u00a9\3\u00a9\3\u00a9"+ + "\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00ab\3\u00ab\3\u00ab\3\u00ab\3\u00ac"+ + "\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ae\3\u00ae\3\u00ae\3\u00ae"+ + "\3\u00ae\3\u00ae\3\u00af\3\u00af\3\u00af\3\u00b0\3\u00b0\3\u00b0\3\u00b0"+ + "\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b1\3\u00b2\3\u00b2\6\u00b2\u0622"+ + "\n\u00b2\r\u00b2\16\u00b2\u0623\3\u00b3\3\u00b3\6\u00b3\u0628\n\u00b3"+ + "\r\u00b3\16\u00b3\u0629\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b4\3\u00b5"+ + "\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b6\6\u00b6\u0638\n\u00b6"+ + "\r\u00b6\16\u00b6\u0639\3\u00b7\6\u00b7\u063d\n\u00b7\r\u00b7\16\u00b7"+ + "\u063e\3\u00b7\3\u00b7\3\u00b8\6\u00b8\u0644\n\u00b8\r\u00b8\16\u00b8"+ + "\u0645\3\u00b8\3\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9\3\u00b9"+ + "\3\u00b9\3\u00b9\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba\3\u00ba"+ + "\3\u00ba\3\u00ba\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb"+ + "\3\u00bb\3\u00bb\3\u00bc\3\u00bc\3\u00bc\3\u00bc\3\u00bc\3\u00bc\3\u00bc"+ + "\3\u00bc\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00bd\3\u00be\3\u00be"+ + "\3\u00be\3\u00be\3\u00be\3\u00be\3\u00be\3\u00bf\3\u00bf\3\u00bf\3\u00bf"+ + "\3\u00bf\3\u00bf\3\u00bf\3\u00bf\3\u00c0\3\u00c0\3\u00c0\3\u00c0\3\u00c0"+ + "\3\u00c0\3\u00c0\3\u00c0\3\u00c1\3\u00c1\3\u00c1\3\u00c1\3\u00c1\3\u00c1"+ + "\3\u00c1\3\u00c2\3\u00c2\3\u00c2\3\u00c2\3\u00c2\3\u00c2\3\u00c2\6\u00c2"+ + "\u0697\n\u00c2\r\u00c2\16\u00c2\u0698\3\u00c2\3\u00c2\3\u00c2\3\u00c3"+ + "\3\u00c3\3\u00c3\3\u00c3\3\u00c3\3\u00c3\3\u00c3\3\u00c3\3\u00c3\6\u00c3"+ + "\u06a7\n\u00c3\r\u00c3\16\u00c3\u06a8\3\u00c3\3\u00c3\3\u00c3\3\u00c4"+ + "\3\u00c4\3\u00c4\3\u00c4\3\u00c4\3\u00c4\3\u00c4\3\u00c4\7\u00c4\u06b6"+ + "\n\u00c4\f\u00c4\16\u00c4\u06b9\13\u00c4\3\u00c4\3\u00c4\3\u00c4\3\u00c5"+ + "\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5\3\u00c5"+ + "\3\u00c5\7\u00c5\u06c9\n\u00c5\f\u00c5\16\u00c5\u06cc\13\u00c5\3\u00c5"+ + "\3\u00c5\3\u00c5\3\u00c6\3\u00c6\3\u00c6\3\u00c6\3\u00c6\3\u00c6\3\u00c6"+ + "\3\u00c6\6\u00c6\u06d9\n\u00c6\r\u00c6\16\u00c6\u06da\3\u00c6\3\u00c6"+ + "\3\u00c6\3\u00c7\3\u00c7\3\u00c7\3\u00c7\3\u00c7\3\u00c7\3\u00c7\3\u00c7"+ + "\3\u00c7\3\u00c7\6\u00c7\u06ea\n\u00c7\r\u00c7\16\u00c7\u06eb\3\u00c7"+ + "\3\u00c7\3\u00c7\3\u00c8\3\u00c8\3\u00c8\3\u00c8\3\u00c8\3\u00c8\3\u00c8"+ + "\3\u00c8\3\u00c8\3\u00c8\3\u00c8\3\u00c9\3\u00c9\3\u00c9\3\u00c9\3\u00c9"+ + "\3\u00c9\3\u00c9\3\u00c9\3\u00c9\3\u00ca\3\u00ca\3\u00ca\3\u00ca\3\u00ca"+ + "\3\u00cb\3\u00cb\3\u00cb\3\u00cb\3\u00cb\3\u00cc\3\u00cc\3\u00cc\3\u00cc"+ + "\3\u00cc\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00cd\3\u00ce\3\u00ce"+ + "\3\u00ce\3\u00ce\3\u00ce\3\u00ce\3\u00cf\3\u00cf\3\u00cf\3\u00cf\3\u00cf"+ + "\3\u00cf\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d1\3\u00d1"+ + "\7\u00d1\u072e\n\u00d1\f\u00d1\16\u00d1\u0731\13\u00d1\3\u00d1\3\u00d1"+ + "\3\u00d1\3\u00d1\3\u00d1\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d3\3\u00d3"+ + "\3\u00d3\3\u00d3\7\u00d3\u0740\n\u00d3\f\u00d3\16\u00d3\u0743\13\u00d3"+ + "\3\u00d3\3\u00d3\3\u00d3\3\u00d4\3\u00d4\3\u00d4\3\u00d4\3\u00d4\3\u00d5"+ + "\6\u00d5\u074e\n\u00d5\r\u00d5\16\u00d5\u074f\3\u00d5\3\u00d5\3\u00d6"+ + "\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d6\3\u00d7\3\u00d7\3\u00d8\3\u00d8"+ + "\3\u00d9\5\u00d9\u075f\n\u00d9\3\u00d9\3\u00d9\5\u00d9\u0763\n\u00d9\3"+ + "\u00d9\5\u00d9\u0766\n\u00d9\3\u00da\3\u00da\5\u00da\u076a\n\u00da\3\u00da"+ + "\3\u00da\7\u00da\u076e\n\u00da\f\u00da\16\u00da\u0771\13\u00da\3\u00da"+ + "\7\u00da\u0774\n\u00da\f\u00da\16\u00da\u0777\13\u00da\3\u00db\3\u00db"+ + "\3\u00db\5\u00db\u077c\n\u00db\3\u00dc\3\u00dc\3\u00dc\3\u00dc\3\u00dc"+ + "\3\u00dc\3\u00dc\3\u00dc\3\u00dc\3\u00dc\3\u00dc\3\u00dc\3\u00dc\3\u00dc"+ + "\3\u00dc\3\u00dc\3\u00dc\3\u00dc\3\u00dc\3\u00dc\3\u00dc\3\u00dc\5\u00dc"+ + "\u0794\n\u00dc\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd"+ + "\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd"+ + "\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd\3\u00dd"+ + "\5\u00dd\u07af\n\u00dd\3\u00de\3\u00de\3\u00de\5\u00de\u07b4\n\u00de\3"+ + "\u00df\3\u00df\5\u00df\u07b8\n\u00df\3\u00e0\3\u00e0\3\u00e1\3\u00e1\7"+ + "\u00e1\u07be\n\u00e1\f\u00e1\16\u00e1\u07c1\13\u00e1\3\u00e2\3\u00e2\5"+ + "\u00e2\u07c5\n\u00e2\3\u00e3\3\u00e3\3\u00e3\3\u00e3\3\u00e3\5\u00e3\u07cc"+ + "\n\u00e3\3\u00e4\3\u00e4\3\u00e4\3\u00e4\3\u00e4\3\u00e4\3\u00e4\5\u00e4"+ + "\u07d5\n\u00e4\3\u00e5\3\u00e5\5\u00e5\u07d9\n\u00e5\3\u00e6\3\u00e6\5"+ + "\u00e6\u07dd\n\u00e6\3\u00e7\3\u00e7\3\u00e7\5\u00e7\u07e2\n\u00e7\3\u00e8"+ + "\3\u00e8\5\u00e8\u07e6\n\u00e8\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9"+ + "\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9"+ + "\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9\3\u00e9\5\u00e9\u07fc\n\u00e9"+ + "\3\u00ea\5\u00ea\u07ff\n\u00ea\3\u00eb\3\u00eb\3\u00ec\3\u00ec\3\u00ed"+ + "\3\u00ed\3\u00ee\3\u00ee\3\u00ef\3\u00ef\3\u00f0\3\u00f0\3\u00f1\3\u00f1"+ + "\3\u00f2\3\u00f2\3\u00f3\3\u00f3\3\u00f4\3\u00f4\3\u00f5\3\u00f5\4\u020f"+ + "\u0228\2\u00f6\7\3\t\4\13\5\r\6\17\7\21\b\23\t\25\n\27\13\31\f\33\r\35"+ + "\16\37\17!\20#\21%\22\'\23)\24+\25-\26/\27\61\30\63\31\65\32\67\339\34"+ + ";\35=\36?\37A C!E\"G#I$K%M&O\'Q(S)U*W+Y,[-]._/a\60c\61e\62g\63i\64k\65"+ + "m\66o\67q8s9u:w;y<{=}>\177?\u0081@\u0083A\u0085B\u0087C\u0089D\u008bE"+ + "\u008dF\u008fG\u0091H\u0093I\u0095J\u0097K\u0099L\u009bM\u009dN\u009f"+ + "O\u00a1P\u00a3Q\u00a5R\u00a7S\u00a9T\u00abU\u00adV\u00afW\u00b1X\u00b3"+ + "Y\u00b5Z\u00b7[\u00b9\\\u00bb]\u00bd^\u00bf_\u00c1`\u00c3a\u00c5b\u00c7"+ + "c\u00c9d\u00cbe\u00cdf\u00cfg\u00d1h\u00d3i\u00d5j\u00d7k\u00d9l\u00db"+ + "m\u00ddn\u00dfo\u00e1p\u00e3q\u00e5r\u00e7s\u00e9t\u00ebu\u00edv\u00ef"+ + "w\u00f1x\u00f3y\u00f5z\u00f7{\u00f9|\u00fb}\u00fd~\u00ff\177\u0101\u0080"+ + "\u0103\u0081\u0105\u0082\u0107\u0083\u0109\u0084\u010b\u0085\u010d\u0086"+ + "\u010f\u0087\u0111\u0088\u0113\u0089\u0115\u008a\u0117\u008b\u0119\u008c"+ + "\u011b\u008d\u011d\u008e\u011f\u008f\u0121\u0090\u0123\u0091\u0125\u0092"+ + "\u0127\u0093\u0129\u0094\u012b\u0095\u012d\u0096\u012f\u0097\u0131\u0098"+ + "\u0133\u0099\u0135\u009a\u0137\u009b\u0139\u009c\u013b\u009d\u013d\u009e"+ + "\u013f\u009f\u0141\u00a0\u0143\u00a1\u0145\u00a2\u0147\u00a3\u0149\u00a4"+ + "\u014b\u00a5\u014d\u00a6\u014f\u00a7\u0151\u00a8\u0153\u00a9\u0155\u00aa"+ + "\u0157\u00ab\u0159\u00ac\u015b\u00ad\u015d\u00ae\u015f\u00af\u0161\u00b0"+ + "\u0163\u00b1\u0165\u00b2\u0167\u00b3\u0169\u00b4\u016b\u00c8\u016d\u00b5"+ + "\u016f\u00b6\u0171\u00b7\u0173\u00b8\u0175\2\u0177\2\u0179\u00b9\u017b"+ + "\u00ba\u017d\2\u017f\u00bb\u0181\2\u0183\u00bc\u0185\u00bd\u0187\u00be"+ + "\u0189\u00bf\u018b\u00c0\u018d\u00c1\u018f\u00c2\u0191\u00c3\u0193\2\u0195"+ + "\u00c4\u0197\2\u0199\2\u019b\2\u019d\2\u019f\2\u01a1\2\u01a3\2\u01a5\2"+ + "\u01a7\u00c5\u01a9\2\u01ab\u00c6\u01ad\u00c7\u01af\2\u01b1\2\u01b3\2\u01b5"+ + "\2\u01b7\2\u01b9\2\u01bb\2\u01bd\2\u01bf\2\u01c1\2\u01c3\2\u01c5\2\u01c7"+ + "\2\u01c9\2\u01cb\2\u01cd\2\u01cf\2\u01d1\2\u01d3\2\u01d5\2\u01d7\2\u01d9"+ + "\2\u01db\2\u01dd\2\u01df\2\u01e1\2\u01e3\2\u01e5\2\u01e7\2\u01e9\2\u01eb"+ + "\2\u01ed\2\7\2\3\4\5\6!\3\2\61\61\3\2\62;\4\2ZZzz\4\2DDdd\3\2\62\63\b"+ + "\2FFHHOOffhhoo\b\2\f\f\17\17))^^\u0087\u0087\u202a\u202b\b\2\f\f\17\17"+ + "$$^^\u0087\u0087\u202a\u202b\3\2$$\5\2$$^^}}\4\2$$}}\3\2\177\177\7\2\f"+ + "\f\17\17$$\u0087\u0087\u202a\u202b\6\2\f\f\17\17\u0087\u0087\u202a\u202b"+ + "\4\2NNnn\4\2WWww\4\2GGgg\4\2--//\4\2\13\13\r\16\13\2\"\"\u00a2\u00a2\u1682"+ + "\u1682\u1810\u1810\u2002\u2008\u200a\u200c\u2031\u2031\u2061\u2061\u3002"+ + "\u3002\5\2\62;CHchT\2C\\\u00c2\u00d8\u00da\u00e0\u0102\u0138\u013b\u0149"+ + "\u014c\u017f\u0183\u0184\u0186\u018d\u0190\u0193\u0195\u0196\u0198\u019a"+ + "\u019e\u019f\u01a1\u01a2\u01a4\u01ab\u01ae\u01b5\u01b7\u01be\u01c6\u01cf"+ + "\u01d1\u01dd\u01e0\u01f0\u01f3\u01f6\u01f8\u01fa\u01fc\u0234\u023c\u023d"+ + "\u023f\u0240\u0243\u0248\u024a\u0250\u0372\u0374\u0378\u0381\u0388\u038c"+ + "\u038e\u03a3\u03a5\u03ad\u03d1\u03d6\u03da\u03f0\u03f6\u03f9\u03fb\u03fc"+ + "\u03ff\u0431\u0462\u0482\u048c\u04cf\u04d2\u0530\u0533\u0558\u10a2\u10c7"+ + "\u10c9\u10cf\u1e02\u1e96\u1ea0\u1f00\u1f0a\u1f11\u1f1a\u1f1f\u1f2a\u1f31"+ + "\u1f3a\u1f41\u1f4a\u1f4f\u1f5b\u1f61\u1f6a\u1f71\u1fba\u1fbd\u1fca\u1fcd"+ + "\u1fda\u1fdd\u1fea\u1fee\u1ffa\u1ffd\u2104\u2109\u210d\u210f\u2112\u2114"+ + "\u2117\u211f\u2126\u212f\u2132\u2135\u2140\u2141\u2147\u2185\u2c02\u2c30"+ + "\u2c62\u2c66\u2c69\u2c72\u2c74\u2c77\u2c80\u2c82\u2c84\u2ce4\u2ced\u2cef"+ + "\u2cf4\ua642\ua644\ua66e\ua682\ua69c\ua724\ua730\ua734\ua770\ua77b\ua788"+ + "\ua78d\ua78f\ua792\ua794\ua798\ua7af\ua7b2\ua7b3\uff23\uff3cS\2c|\u00b7"+ + "\u00f8\u00fa\u0101\u0103\u0179\u017c\u0182\u0185\u0187\u018a\u0194\u0197"+ + "\u019d\u01a0\u01a3\u01a5\u01a7\u01aa\u01af\u01b2\u01b6\u01b8\u01c1\u01c8"+ + "\u01ce\u01d0\u01f5\u01f7\u01fb\u01fd\u023b\u023e\u0244\u0249\u0295\u0297"+ + "\u02b1\u0373\u0375\u0379\u037f\u0392\u03d0\u03d2\u03d3\u03d7\u03d9\u03db"+ + "\u03f5\u03f7\u0461\u0463\u0483\u048d\u04c1\u04c4\u0531\u0563\u0589\u1d02"+ + "\u1d2d\u1d6d\u1d79\u1d7b\u1d9c\u1e03\u1e9f\u1ea1\u1f09\u1f12\u1f17\u1f22"+ + "\u1f29\u1f32\u1f39\u1f42\u1f47\u1f52\u1f59\u1f62\u1f69\u1f72\u1f7f\u1f82"+ + "\u1f89\u1f92\u1f99\u1fa2\u1fa9\u1fb2\u1fb6\u1fb8\u1fb9\u1fc0\u1fc6\u1fc8"+ + "\u1fc9\u1fd2\u1fd5\u1fd8\u1fd9\u1fe2\u1fe9\u1ff4\u1ff6\u1ff8\u1ff9\u210c"+ + "\u2115\u2131\u213b\u213e\u213f\u2148\u214b\u2150\u2186\u2c32\u2c60\u2c63"+ + "\u2c6e\u2c73\u2c7d\u2c83\u2cee\u2cf0\u2cf5\u2d02\u2d27\u2d29\u2d2f\ua643"+ + "\ua66f\ua683\ua69d\ua725\ua733\ua735\ua77a\ua77c\ua77e\ua781\ua789\ua78e"+ + "\ua790\ua793\ua797\ua799\ua7ab\ua7fc\uab5c\uab66\uab67\ufb02\ufb08\ufb15"+ + "\ufb19\uff43\uff5c\b\2\u01c7\u01cd\u01f4\u1f91\u1f9a\u1fa1\u1faa\u1fb1"+ + "\u1fbe\u1fce\u1ffe\u1ffe#\2\u02b2\u02c3\u02c8\u02d3\u02e2\u02e6\u02ee"+ + "\u02f0\u0376\u037c\u055b\u0642\u06e7\u06e8\u07f6\u07f7\u07fc\u081c\u0826"+ + "\u082a\u0973\u0e48\u0ec8\u10fe\u17d9\u1845\u1aa9\u1c7f\u1d2e\u1d6c\u1d7a"+ + "\u1dc1\u2073\u2081\u2092\u209e\u2c7e\u2c7f\u2d71\u2e31\u3007\u3037\u303d"+ + "\u3100\ua017\ua4ff\ua60e\ua681\ua69e\ua69f\ua719\ua721\ua772\ua78a\ua7fa"+ + "\ua7fb\ua9d1\ua9e8\uaa72\uaadf\uaaf5\uaaf6\uab5e\uab61\uff72\uffa1\u00ec"+ + "\2\u00ac\u00bc\u01bd\u01c5\u0296\u05ec\u05f2\u05f4\u0622\u0641\u0643\u064c"+ + "\u0670\u0671\u0673\u06d5\u06d7\u06fe\u0701\u0712\u0714\u0731\u074f\u07a7"+ + "\u07b3\u07ec\u0802\u0817\u0842\u085a\u08a2\u08b4\u0906\u093b\u093f\u0952"+ + "\u095a\u0963\u0974\u0982\u0987\u098e\u0991\u0992\u0995\u09aa\u09ac\u09b2"+ + "\u09b4\u09bb\u09bf\u09d0\u09de\u09df\u09e1\u09e3\u09f2\u09f3\u0a07\u0a0c"+ + "\u0a11\u0a12\u0a15\u0a2a\u0a2c\u0a32\u0a34\u0a35\u0a37\u0a38\u0a3a\u0a3b"+ + "\u0a5b\u0a5e\u0a60\u0a76\u0a87\u0a8f\u0a91\u0a93\u0a95\u0aaa\u0aac\u0ab2"+ + "\u0ab4\u0ab5\u0ab7\u0abb\u0abf\u0ad2\u0ae2\u0ae3\u0b07\u0b0e\u0b11\u0b12"+ + "\u0b15\u0b2a\u0b2c\u0b32\u0b34\u0b35\u0b37\u0b3b\u0b3f\u0b63\u0b73\u0b85"+ + "\u0b87\u0b8c\u0b90\u0b92\u0b94\u0b97\u0b9b\u0b9c\u0b9e\u0bac\u0bb0\u0bbb"+ + "\u0bd2\u0c0e\u0c10\u0c12\u0c14\u0c2a\u0c2c\u0c3b\u0c3f\u0c8e\u0c90\u0c92"+ + "\u0c94\u0caa\u0cac\u0cb5\u0cb7\u0cbb\u0cbf\u0ce0\u0ce2\u0ce3\u0cf3\u0cf4"+ + "\u0d07\u0d0e\u0d10\u0d12\u0d14\u0d3c\u0d3f\u0d50\u0d62\u0d63\u0d7c\u0d81"+ + "\u0d87\u0d98\u0d9c\u0db3\u0db5\u0dbd\u0dbf\u0dc8\u0e03\u0e32\u0e34\u0e35"+ + "\u0e42\u0e47\u0e83\u0e84\u0e86\u0e8c\u0e8f\u0e99\u0e9b\u0ea1\u0ea3\u0ea5"+ + "\u0ea7\u0ea9\u0eac\u0ead\u0eaf\u0eb2\u0eb4\u0eb5\u0ebf\u0ec6\u0ede\u0ee1"+ + "\u0f02\u0f49\u0f4b\u0f6e\u0f8a\u0f8e\u1002\u102c\u1041\u1057\u105c\u105f"+ + "\u1063\u1072\u1077\u1083\u1090\u10fc\u10ff\u124a\u124c\u124f\u1252\u1258"+ + "\u125a\u125f\u1262\u128a\u128c\u128f\u1292\u12b2\u12b4\u12b7\u12ba\u12c0"+ + "\u12c2\u12c7\u12ca\u12d8\u12da\u1312\u1314\u1317\u131a\u135c\u1382\u1391"+ + "\u13a2\u13f6\u1403\u166e\u1671\u1681\u1683\u169c\u16a2\u16ec\u16f3\u16fa"+ + "\u1702\u170e\u1710\u1713\u1722\u1733\u1742\u1753\u1762\u176e\u1770\u1772"+ + "\u1782\u17b5\u17de\u1844\u1846\u1879\u1882\u18aa\u18ac\u18f7\u1902\u1920"+ + "\u1952\u196f\u1972\u1976\u1982\u19ad\u19c3\u19c9\u1a02\u1a18\u1a22\u1a56"+ + "\u1b07\u1b35\u1b47\u1b4d\u1b85\u1ba2\u1bb0\u1bb1\u1bbc\u1be7\u1c02\u1c25"+ + "\u1c4f\u1c51\u1c5c\u1c79\u1ceb\u1cee\u1cf0\u1cf3\u1cf7\u1cf8\u2137\u213a"+ + "\u2d32\u2d69\u2d82\u2d98\u2da2\u2da8\u2daa\u2db0\u2db2\u2db8\u2dba\u2dc0"+ + "\u2dc2\u2dc8\u2dca\u2dd0\u2dd2\u2dd8\u2dda\u2de0\u3008\u303e\u3043\u3098"+ + "\u30a1\u30fc\u3101\u312f\u3133\u3190\u31a2\u31bc\u31f2\u3201\u3402\u4db7"+ + "\u4e02\u9fce\ua002\ua016\ua018\ua48e\ua4d2\ua4f9\ua502\ua60d\ua612\ua621"+ + "\ua62c\ua62d\ua670\ua6e7\ua7f9\ua803\ua805\ua807\ua809\ua80c\ua80e\ua824"+ + "\ua842\ua875\ua884\ua8b5\ua8f4\ua8f9\ua8fd\ua927\ua932\ua948\ua962\ua97e"+ + "\ua986\ua9b4\ua9e2\ua9e6\ua9e9\ua9f1\ua9fc\uaa00\uaa02\uaa2a\uaa42\uaa44"+ + "\uaa46\uaa4d\uaa62\uaa71\uaa73\uaa78\uaa7c\uaab1\uaab3\uaabf\uaac2\uaac4"+ + "\uaadd\uaade\uaae2\uaaec\uaaf4\uab08\uab0b\uab10\uab13\uab18\uab22\uab28"+ + "\uab2a\uab30\uabc2\uabe4\uac02\ud7a5\ud7b2\ud7c8\ud7cd\ud7fd\uf902\ufa6f"+ + "\ufa72\ufadb\ufb1f\ufb2a\ufb2c\ufb38\ufb3a\ufb3e\ufb40\ufbb3\ufbd5\ufd3f"+ + "\ufd52\ufd91\ufd94\ufdc9\ufdf2\ufdfd\ufe72\ufe76\ufe78\ufefe\uff68\uff71"+ + "\uff73\uff9f\uffa2\uffc0\uffc4\uffc9\uffcc\uffd1\uffd4\uffd9\uffdc\uffde"+ + "\4\2\u16f0\u16f2\u2162\u2171\5\2\u0905\u0905\u0940\u0942\u094b\u094e\5"+ + "\2\u00af\u00af\u0602\u0605\u06df\u06df\b\2aa\u2041\u2042\u2056\u2056\ufe35"+ + "\ufe36\ufe4f\ufe51\uff41\uff41\'\2\62;\u0662\u066b\u06f2\u06fb\u07c2\u07cb"+ + "\u0968\u0971\u09e8\u09f1\u0a68\u0a71\u0ae8\u0af1\u0b68\u0b71\u0be8\u0bf1"+ + "\u0c68\u0c71\u0ce8\u0cf1\u0d68\u0d71\u0de8\u0df1\u0e52\u0e5b\u0ed2\u0edb"+ + "\u0f22\u0f2b\u1042\u104b\u1092\u109b\u17e2\u17eb\u1812\u181b\u1948\u1951"+ + "\u19d2\u19db\u1a82\u1a8b\u1a92\u1a9b\u1b52\u1b5b\u1bb2\u1bbb\u1c42\u1c4b"+ + "\u1c52\u1c5b\ua622\ua62b\ua8d2\ua8db\ua902\ua90b\ua9d2\ua9db\ua9f2\ua9fb"+ + "\uaa52\uaa5b\uabf2\uabfb\uff12\uff1b\2\u084e\2\7\3\2\2\2\2\t\3\2\2\2\2"+ + "\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3"+ + "\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2"+ + "\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2"+ + "\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2"+ + "\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2"+ + "\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q"+ + "\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2"+ + "\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2"+ + "\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w"+ + "\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2"+ + "\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b"+ + "\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2"+ + "\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d"+ + "\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2"+ + "\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af"+ + "\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2"+ + "\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1"+ + "\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2"+ + "\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1\3\2\2\2\2\u00d3"+ + "\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2\2\2\u00db\3\2\2"+ + "\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3\3\2\2\2\2\u00e5"+ + "\3\2\2\2\2\u00e7\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2"+ + "\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7"+ + "\3\2\2\2\2\u00f9\3\2\2\2\2\u00fb\3\2\2\2\2\u00fd\3\2\2\2\2\u00ff\3\2\2"+ + "\2\2\u0101\3\2\2\2\2\u0103\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\2\u0109"+ + "\3\2\2\2\2\u010b\3\2\2\2\2\u010d\3\2\2\2\2\u010f\3\2\2\2\2\u0111\3\2\2"+ + "\2\2\u0113\3\2\2\2\2\u0115\3\2\2\2\2\u0117\3\2\2\2\2\u0119\3\2\2\2\2\u011b"+ + "\3\2\2\2\2\u011d\3\2\2\2\2\u011f\3\2\2\2\2\u0121\3\2\2\2\2\u0123\3\2\2"+ + "\2\2\u0125\3\2\2\2\2\u0127\3\2\2\2\2\u0129\3\2\2\2\2\u012b\3\2\2\2\2\u012d"+ + "\3\2\2\2\2\u012f\3\2\2\2\2\u0131\3\2\2\2\2\u0133\3\2\2\2\2\u0135\3\2\2"+ + "\2\2\u0137\3\2\2\2\2\u0139\3\2\2\2\2\u013b\3\2\2\2\2\u013d\3\2\2\2\2\u013f"+ + "\3\2\2\2\2\u0141\3\2\2\2\2\u0143\3\2\2\2\2\u0145\3\2\2\2\2\u0147\3\2\2"+ + "\2\2\u0149\3\2\2\2\2\u014b\3\2\2\2\2\u014d\3\2\2\2\2\u014f\3\2\2\2\2\u0151"+ + "\3\2\2\2\2\u0153\3\2\2\2\2\u0155\3\2\2\2\2\u0157\3\2\2\2\2\u0159\3\2\2"+ + "\2\2\u015b\3\2\2\2\3\u015d\3\2\2\2\3\u015f\3\2\2\2\3\u0161\3\2\2\2\3\u0163"+ + "\3\2\2\2\3\u0165\3\2\2\2\3\u0167\3\2\2\2\3\u0169\3\2\2\2\4\u016b\3\2\2"+ + "\2\4\u016d\3\2\2\2\4\u016f\3\2\2\2\5\u0171\3\2\2\2\5\u0173\3\2\2\2\5\u0175"+ + "\3\2\2\2\5\u0177\3\2\2\2\5\u0179\3\2\2\2\5\u017b\3\2\2\2\5\u017d\3\2\2"+ + "\2\5\u017f\3\2\2\2\5\u0181\3\2\2\2\5\u0183\3\2\2\2\5\u0185\3\2\2\2\5\u0187"+ + "\3\2\2\2\5\u0189\3\2\2\2\5\u018b\3\2\2\2\5\u018d\3\2\2\2\5\u018f\3\2\2"+ + "\2\5\u0191\3\2\2\2\5\u0193\3\2\2\2\5\u0195\3\2\2\2\5\u0197\3\2\2\2\5\u0199"+ + "\3\2\2\2\5\u019b\3\2\2\2\5\u019d\3\2\2\2\5\u019f\3\2\2\2\5\u01a1\3\2\2"+ + "\2\5\u01a3\3\2\2\2\5\u01a5\3\2\2\2\5\u01a7\3\2\2\2\5\u01a9\3\2\2\2\5\u01ab"+ + "\3\2\2\2\6\u01ad\3\2\2\2\6\u01af\3\2\2\2\7\u01ef\3\2\2\2\t\u01f3\3\2\2"+ + "\2\13\u01ff\3\2\2\2\r\u0207\3\2\2\2\17\u0217\3\2\2\2\21\u0222\3\2\2\2"+ + "\23\u0232\3\2\2\2\25\u0238\3\2\2\2\27\u023c\3\2\2\2\31\u0245\3\2\2\2\33"+ + "\u0249\3\2\2\2\35\u024f\3\2\2\2\37\u0259\3\2\2\2!\u025c\3\2\2\2#\u0266"+ + "\3\2\2\2%\u026c\3\2\2\2\'\u0272\3\2\2\2)\u0277\3\2\2\2+\u027c\3\2\2\2"+ + "-\u0282\3\2\2\2/\u0285\3\2\2\2\61\u028a\3\2\2\2\63\u028f\3\2\2\2\65\u0295"+ + "\3\2\2\2\67\u029a\3\2\2\29\u02a2\3\2\2\2;\u02a8\3\2\2\2=\u02ae\3\2\2\2"+ + "?\u02b7\3\2\2\2A\u02bf\3\2\2\2C\u02c7\3\2\2\2E\u02d0\3\2\2\2G\u02db\3"+ + "\2\2\2I\u02de\3\2\2\2K\u02e5\3\2\2\2M\u02ed\3\2\2\2O\u02f2\3\2\2\2Q\u02f7"+ + "\3\2\2\2S\u02fe\3\2\2\2U\u0304\3\2\2\2W\u030d\3\2\2\2Y\u0314\3\2\2\2["+ + "\u031a\3\2\2\2]\u0322\3\2\2\2_\u0328\3\2\2\2a\u032e\3\2\2\2c\u0332\3\2"+ + "\2\2e\u033a\3\2\2\2g\u033f\3\2\2\2i\u0343\3\2\2\2k\u0348\3\2\2\2m\u034e"+ + "\3\2\2\2o\u0351\3\2\2\2q\u035a\3\2\2\2s\u035d\3\2\2\2u\u0361\3\2\2\2w"+ + "\u036b\3\2\2\2y\u0374\3\2\2\2{\u0379\3\2\2\2}\u037c\3\2\2\2\177\u0381"+ + "\3\2\2\2\u0081\u0385\3\2\2\2\u0083\u038a\3\2\2\2\u0085\u038f\3\2\2\2\u0087"+ + "\u0396\3\2\2\2\u0089\u03a0\3\2\2\2\u008b\u03a4\3\2\2\2\u008d\u03a9\3\2"+ + "\2\2\u008f\u03b0\3\2\2\2\u0091\u03b3\3\2\2\2\u0093\u03bc\3\2\2\2\u0095"+ + "\u03c4\3\2\2\2\u0097\u03c8\3\2\2\2\u0099\u03d1\3\2\2\2\u009b\u03d8\3\2"+ + "\2\2\u009d\u03e0\3\2\2\2\u009f\u03e8\3\2\2\2\u00a1\u03f2\3\2\2\2\u00a3"+ + "\u03f9\3\2\2\2\u00a5\u0402\3\2\2\2\u00a7\u0406\3\2\2\2\u00a9\u040d\3\2"+ + "\2\2\u00ab\u0414\3\2\2\2\u00ad\u041a\3\2\2\2\u00af\u0421\3\2\2\2\u00b1"+ + "\u0428\3\2\2\2\u00b3\u042c\3\2\2\2\u00b5\u0432\3\2\2\2\u00b7\u0439\3\2"+ + "\2\2\u00b9\u0444\3\2\2\2\u00bb\u044b\3\2\2\2\u00bd\u0452\3\2\2\2\u00bf"+ + "\u0459\3\2\2\2\u00c1\u0460\3\2\2\2\u00c3\u0465\3\2\2\2\u00c5\u046b\3\2"+ + "\2\2\u00c7\u0470\3\2\2\2\u00c9\u0474\3\2\2\2\u00cb\u047b\3\2\2\2\u00cd"+ + "\u0480\3\2\2\2\u00cf\u0486\3\2\2\2\u00d1\u0490\3\2\2\2\u00d3\u049a\3\2"+ + "\2\2\u00d5\u04a1\3\2\2\2\u00d7\u04a8\3\2\2\2\u00d9\u04ae\3\2\2\2\u00db"+ + "\u04b2\3\2\2\2\u00dd\u04ba\3\2\2\2\u00df\u04bf\3\2\2\2\u00e1\u04c8\3\2"+ + "\2\2\u00e3\u04cd\3\2\2\2\u00e5\u04d3\3\2\2\2\u00e7\u04d9\3\2\2\2\u00e9"+ + "\u04e0\3\2\2\2\u00eb\u04e4\3\2\2\2\u00ed\u04fa\3\2\2\2\u00ef\u050a\3\2"+ + "\2\2\u00f1\u051a\3\2\2\2\u00f3\u0561\3\2\2\2\u00f5\u0563\3\2\2\2\u00f7"+ + "\u056a\3\2\2\2\u00f9\u0574\3\2\2\2\u00fb\u0581\3\2\2\2\u00fd\u0588\3\2"+ + "\2\2\u00ff\u0590\3\2\2\2\u0101\u0593\3\2\2\2\u0103\u0596\3\2\2\2\u0105"+ + "\u0598\3\2\2\2\u0107\u059a\3\2\2\2\u0109\u059c\3\2\2\2\u010b\u059e\3\2"+ + "\2\2\u010d\u05a0\3\2\2\2\u010f\u05a2\3\2\2\2\u0111\u05a5\3\2\2\2\u0113"+ + "\u05a7\3\2\2\2\u0115\u05a9\3\2\2\2\u0117\u05ab\3\2\2\2\u0119\u05ad\3\2"+ + "\2\2\u011b\u05af\3\2\2\2\u011d\u05b1\3\2\2\2\u011f\u05b3\3\2\2\2\u0121"+ + "\u05b5\3\2\2\2\u0123\u05b7\3\2\2\2\u0125\u05b9\3\2\2\2\u0127\u05bb\3\2"+ + "\2\2\u0129\u05bd\3\2\2\2\u012b\u05bf\3\2\2\2\u012d\u05c1\3\2\2\2\u012f"+ + "\u05c3\3\2\2\2\u0131\u05c6\3\2\2\2\u0133\u05c9\3\2\2\2\u0135\u05cc\3\2"+ + "\2\2\u0137\u05cf\3\2\2\2\u0139\u05d2\3\2\2\2\u013b\u05d5\3\2\2\2\u013d"+ + "\u05d8\3\2\2\2\u013f\u05db\3\2\2\2\u0141\u05de\3\2\2\2\u0143\u05e1\3\2"+ + "\2\2\u0145\u05e4\3\2\2\2\u0147\u05e7\3\2\2\2\u0149\u05ea\3\2\2\2\u014b"+ + "\u05ed\3\2\2\2\u014d\u05f0\3\2\2\2\u014f\u05f3\3\2\2\2\u0151\u05f6\3\2"+ + "\2\2\u0153\u05f9\3\2\2\2\u0155\u05fc\3\2\2\2\u0157\u05ff\3\2\2\2\u0159"+ + "\u0603\3\2\2\2\u015b\u0607\3\2\2\2\u015d\u060a\3\2\2\2\u015f\u060d\3\2"+ + "\2\2\u0161\u0613\3\2\2\2\u0163\u0616\3\2\2\2\u0165\u061a\3\2\2\2\u0167"+ + "\u061f\3\2\2\2\u0169\u0625\3\2\2\2\u016b\u062b\3\2\2\2\u016d\u0630\3\2"+ + "\2\2\u016f\u0637\3\2\2\2\u0171\u063c\3\2\2\2\u0173\u0643\3\2\2\2\u0175"+ + "\u0649\3\2\2\2\u0177\u0651\3\2\2\2\u0179\u065a\3\2\2\2\u017b\u0663\3\2"+ + "\2\2\u017d\u066b\3\2\2\2\u017f\u0671\3\2\2\2\u0181\u0678\3\2\2\2\u0183"+ + "\u0680\3\2\2\2\u0185\u0688\3\2\2\2\u0187\u068f\3\2\2\2\u0189\u069d\3\2"+ + "\2\2\u018b\u06ad\3\2\2\2\u018d\u06bd\3\2\2\2\u018f\u06d0\3\2\2\2\u0191"+ + "\u06df\3\2\2\2\u0193\u06f0\3\2\2\2\u0195\u06fb\3\2\2\2\u0197\u0704\3\2"+ + "\2\2\u0199\u0709\3\2\2\2\u019b\u070e\3\2\2\2\u019d\u0713\3\2\2\2\u019f"+ + "\u0719\3\2\2\2\u01a1\u071f\3\2\2\2\u01a3\u0725\3\2\2\2\u01a5\u072b\3\2"+ + "\2\2\u01a7\u0737\3\2\2\2\u01a9\u073b\3\2\2\2\u01ab\u0747\3\2\2\2\u01ad"+ + "\u074d\3\2\2\2\u01af\u0753\3\2\2\2\u01b1\u0759\3\2\2\2\u01b3\u075b\3\2"+ + "\2\2\u01b5\u0765\3\2\2\2\u01b7\u0767\3\2\2\2\u01b9\u077b\3\2\2\2\u01bb"+ + "\u0793\3\2\2\2\u01bd\u07ae\3\2\2\2\u01bf\u07b3\3\2\2\2\u01c1\u07b7\3\2"+ + "\2\2\u01c3\u07b9\3\2\2\2\u01c5\u07bb\3\2\2\2\u01c7\u07c4\3\2\2\2\u01c9"+ + "\u07cb\3\2\2\2\u01cb\u07d4\3\2\2\2\u01cd\u07d8\3\2\2\2\u01cf\u07dc\3\2"+ + "\2\2\u01d1\u07e1\3\2\2\2\u01d3\u07e5\3\2\2\2\u01d5\u07fb\3\2\2\2\u01d7"+ + "\u07fe\3\2\2\2\u01d9\u0800\3\2\2\2\u01db\u0802\3\2\2\2\u01dd\u0804\3\2"+ + "\2\2\u01df\u0806\3\2\2\2\u01e1\u0808\3\2\2\2\u01e3\u080a\3\2\2\2\u01e5"+ + "\u080c\3\2\2\2\u01e7\u080e\3\2\2\2\u01e9\u0810\3\2\2\2\u01eb\u0812\3\2"+ + "\2\2\u01ed\u0814\3\2\2\2\u01ef\u01f0\7\u00f1\2\2\u01f0\u01f1\7\u00bd\2"+ + "\2\u01f1\u01f2\7\u00c1\2\2\u01f2\b\3\2\2\2\u01f3\u01f4\7\61\2\2\u01f4"+ + "\u01f5\7\61\2\2\u01f5\u01f6\7\61\2\2\u01f6\u01fa\3\2\2\2\u01f7\u01f9\5"+ + "\u01b1\u00d7\2\u01f8\u01f7\3\2\2\2\u01f9\u01fc\3\2\2\2\u01fa\u01f8\3\2"+ + "\2\2\u01fa\u01fb\3\2\2\2\u01fb\u01fd\3\2\2\2\u01fc\u01fa\3\2\2\2\u01fd"+ + "\u01fe\b\3\2\2\u01fe\n\3\2\2\2\u01ff\u0200\7\61\2\2\u0200\u0201\7,\2\2"+ + "\u0201\u0202\7,\2\2\u0202\u0203\7,\2\2\u0203\u0204\7\61\2\2\u0204\u0205"+ + "\3\2\2\2\u0205\u0206\b\4\2\2\u0206\f\3\2\2\2\u0207\u0208\7\61\2\2\u0208"+ + "\u0209\7,\2\2\u0209\u020a\7,\2\2\u020a\u020b\3\2\2\2\u020b\u020f\n\2\2"+ + "\2\u020c\u020e\13\2\2\2\u020d\u020c\3\2\2\2\u020e\u0211\3\2\2\2\u020f"+ + "\u0210\3\2\2\2\u020f\u020d\3\2\2\2\u0210\u0212\3\2\2\2\u0211\u020f\3\2"+ + "\2\2\u0212\u0213\7,\2\2\u0213\u0214\7\61\2\2\u0214\u0215\3\2\2\2\u0215"+ + "\u0216\b\5\2\2\u0216\16\3\2\2\2\u0217\u0218\7\61\2\2\u0218\u0219\7\61"+ + "\2\2\u0219\u021d\3\2\2\2\u021a\u021c\5\u01b1\u00d7\2\u021b\u021a\3\2\2"+ + "\2\u021c\u021f\3\2\2\2\u021d\u021b\3\2\2\2\u021d\u021e\3\2\2\2\u021e\u0220"+ + "\3\2\2\2\u021f\u021d\3\2\2\2\u0220\u0221\b\6\2\2\u0221\20\3\2\2\2\u0222"+ + "\u0223\7\61\2\2\u0223\u0224\7,\2\2\u0224\u0228\3\2\2\2\u0225\u0227\13"+ + "\2\2\2\u0226\u0225\3\2\2\2\u0227\u022a\3\2\2\2\u0228\u0229\3\2\2\2\u0228"+ + "\u0226\3\2\2\2\u0229\u022b\3\2\2\2\u022a\u0228\3\2\2\2\u022b\u022c\7,"+ + "\2\2\u022c\u022d\7\61\2\2\u022d\u022e\3\2\2\2\u022e\u022f\b\7\2\2\u022f"+ + "\22\3\2\2\2\u0230\u0233\5\u01c1\u00df\2\u0231\u0233\5\u01bf\u00de\2\u0232"+ + "\u0230\3\2\2\2\u0232\u0231\3\2\2\2\u0233\u0234\3\2\2\2\u0234\u0232\3\2"+ + "\2\2\u0234\u0235\3\2\2\2\u0235\u0236\3\2\2\2\u0236\u0237\b\b\3\2\u0237"+ + "\24\3\2\2\2\u0238\u0239\7%\2\2\u0239\u023a\3\2\2\2\u023a\u023b\b\t\4\2"+ + "\u023b\26\3\2\2\2\u023c\u023d\7c\2\2\u023d\u023e\7d\2\2\u023e\u023f\7"+ + "u\2\2\u023f\u0240\7v\2\2\u0240\u0241\7t\2\2\u0241\u0242\7c\2\2\u0242\u0243"+ + "\7e\2\2\u0243\u0244\7v\2\2\u0244\30\3\2\2\2\u0245\u0246\7c\2\2\u0246\u0247"+ + "\7f\2\2\u0247\u0248\7f\2\2\u0248\32\3\2\2\2\u0249\u024a\7c\2\2\u024a\u024b"+ + "\7n\2\2\u024b\u024c\7k\2\2\u024c\u024d\7c\2\2\u024d\u024e\7u\2\2\u024e"+ + "\34\3\2\2\2\u024f\u0250\7a\2\2\u0250\u0251\7a\2\2\u0251\u0252\7c\2\2\u0252"+ + "\u0253\7t\2\2\u0253\u0254\7i\2\2\u0254\u0255\7n\2\2\u0255\u0256\7k\2\2"+ + "\u0256\u0257\7u\2\2\u0257\u0258\7v\2\2\u0258\36\3\2\2\2\u0259\u025a\7"+ + "c\2\2\u025a\u025b\7u\2\2\u025b \3\2\2\2\u025c\u025d\7c\2\2\u025d\u025e"+ + "\7u\2\2\u025e\u025f\7e\2\2\u025f\u0260\7g\2\2\u0260\u0261\7p\2\2\u0261"+ + "\u0262\7f\2\2\u0262\u0263\7k\2\2\u0263\u0264\7p\2\2\u0264\u0265\7i\2\2"+ + "\u0265\"\3\2\2\2\u0266\u0267\7c\2\2\u0267\u0268\7u\2\2\u0268\u0269\7{"+ + "\2\2\u0269\u026a\7p\2\2\u026a\u026b\7e\2\2\u026b$\3\2\2\2\u026c\u026d"+ + "\7c\2\2\u026d\u026e\7y\2\2\u026e\u026f\7c\2\2\u026f\u0270\7k\2\2\u0270"+ + "\u0271\7v\2\2\u0271&\3\2\2\2\u0272\u0273\7d\2\2\u0273\u0274\7c\2\2\u0274"+ + "\u0275\7u\2\2\u0275\u0276\7g\2\2\u0276(\3\2\2\2\u0277\u0278\7d\2\2\u0278"+ + "\u0279\7q\2\2\u0279\u027a\7q\2\2\u027a\u027b\7n\2\2\u027b*\3\2\2\2\u027c"+ + "\u027d\7d\2\2\u027d\u027e\7t\2\2\u027e\u027f\7g\2\2\u027f\u0280\7c\2\2"+ + "\u0280\u0281\7m\2\2\u0281,\3\2\2\2\u0282\u0283\7d\2\2\u0283\u0284\7{\2"+ + "\2\u0284.\3\2\2\2\u0285\u0286\7d\2\2\u0286\u0287\7{\2\2\u0287\u0288\7"+ + "v\2\2\u0288\u0289\7g\2\2\u0289\60\3\2\2\2\u028a\u028b\7e\2\2\u028b\u028c"+ + "\7c\2\2\u028c\u028d\7u\2\2\u028d\u028e\7g\2\2\u028e\62\3\2\2\2\u028f\u0290"+ + "\7e\2\2\u0290\u0291\7c\2\2\u0291\u0292\7v\2\2\u0292\u0293\7e\2\2\u0293"+ + "\u0294\7j\2\2\u0294\64\3\2\2\2\u0295\u0296\7e\2\2\u0296\u0297\7j\2\2\u0297"+ + "\u0298\7c\2\2\u0298\u0299\7t\2\2\u0299\66\3\2\2\2\u029a\u029b\7e\2\2\u029b"+ + "\u029c\7j\2\2\u029c\u029d\7g\2\2\u029d\u029e\7e\2\2\u029e\u029f\7m\2\2"+ + "\u029f\u02a0\7g\2\2\u02a0\u02a1\7f\2\2\u02a18\3\2\2\2\u02a2\u02a3\7e\2"+ + "\2\u02a3\u02a4\7n\2\2\u02a4\u02a5\7c\2\2\u02a5\u02a6\7u\2\2\u02a6\u02a7"+ + "\7u\2\2\u02a7:\3\2\2\2\u02a8\u02a9\7e\2\2\u02a9\u02aa\7q\2\2\u02aa\u02ab"+ + "\7p\2\2\u02ab\u02ac\7u\2\2\u02ac\u02ad\7v\2\2\u02ad<\3\2\2\2\u02ae\u02af"+ + "\7e\2\2\u02af\u02b0\7q\2\2\u02b0\u02b1\7p\2\2\u02b1\u02b2\7v\2\2\u02b2"+ + "\u02b3\7k\2\2\u02b3\u02b4\7p\2\2\u02b4\u02b5\7w\2\2\u02b5\u02b6\7g\2\2"+ + "\u02b6>\3\2\2\2\u02b7\u02b8\7f\2\2\u02b8\u02b9\7g\2\2\u02b9\u02ba\7e\2"+ + "\2\u02ba\u02bb\7k\2\2\u02bb\u02bc\7o\2\2\u02bc\u02bd\7c\2\2\u02bd\u02be"+ + "\7n\2\2\u02be@\3\2\2\2\u02bf\u02c0\7f\2\2\u02c0\u02c1\7g\2\2\u02c1\u02c2"+ + "\7h\2\2\u02c2\u02c3\7c\2\2\u02c3\u02c4\7w\2\2\u02c4\u02c5\7n\2\2\u02c5"+ + "\u02c6\7v\2\2\u02c6B\3\2\2\2\u02c7\u02c8\7f\2\2\u02c8\u02c9\7g\2\2\u02c9"+ + "\u02ca\7n\2\2\u02ca\u02cb\7g\2\2\u02cb\u02cc\7i\2\2\u02cc\u02cd\7c\2\2"+ + "\u02cd\u02ce\7v\2\2\u02ce\u02cf\7g\2\2\u02cfD\3\2\2\2\u02d0\u02d1\7f\2"+ + "\2\u02d1\u02d2\7g\2\2\u02d2\u02d3\7u\2\2\u02d3\u02d4\7e\2\2\u02d4\u02d5"+ + "\7g\2\2\u02d5\u02d6\7p\2\2\u02d6\u02d7\7f\2\2\u02d7\u02d8\7k\2\2\u02d8"+ + "\u02d9\7p\2\2\u02d9\u02da\7i\2\2\u02daF\3\2\2\2\u02db\u02dc\7f\2\2\u02dc"+ + "\u02dd\7q\2\2\u02ddH\3\2\2\2\u02de\u02df\7f\2\2\u02df\u02e0\7q\2\2\u02e0"+ + "\u02e1\7w\2\2\u02e1\u02e2\7d\2\2\u02e2\u02e3\7n\2\2\u02e3\u02e4\7g\2\2"+ + "\u02e4J\3\2\2\2\u02e5\u02e6\7f\2\2\u02e6\u02e7\7{\2\2\u02e7\u02e8\7p\2"+ + "\2\u02e8\u02e9\7c\2\2\u02e9\u02ea\7o\2\2\u02ea\u02eb\7k\2\2\u02eb\u02ec"+ + "\7e\2\2\u02ecL\3\2\2\2\u02ed\u02ee\7g\2\2\u02ee\u02ef\7n\2\2\u02ef\u02f0"+ + "\7u\2\2\u02f0\u02f1\7g\2\2\u02f1N\3\2\2\2\u02f2\u02f3\7g\2\2\u02f3\u02f4"+ + "\7p\2\2\u02f4\u02f5\7w\2\2\u02f5\u02f6\7o\2\2\u02f6P\3\2\2\2\u02f7\u02f8"+ + "\7g\2\2\u02f8\u02f9\7s\2\2\u02f9\u02fa\7w\2\2\u02fa\u02fb\7c\2\2\u02fb"+ + "\u02fc\7n\2\2\u02fc\u02fd\7u\2\2\u02fdR\3\2\2\2\u02fe\u02ff\7g\2\2\u02ff"+ + "\u0300\7x\2\2\u0300\u0301\7g\2\2\u0301\u0302\7p\2\2\u0302\u0303\7v\2\2"+ + "\u0303T\3\2\2\2\u0304\u0305\7g\2\2\u0305\u0306\7z\2\2\u0306\u0307\7r\2"+ + "\2\u0307\u0308\7n\2\2\u0308\u0309\7k\2\2\u0309\u030a\7e\2\2\u030a\u030b"+ + "\7k\2\2\u030b\u030c\7v\2\2\u030cV\3\2\2\2\u030d\u030e\7g\2\2\u030e\u030f"+ + "\7z\2\2\u030f\u0310\7v\2\2\u0310\u0311\7g\2\2\u0311\u0312\7t\2\2\u0312"+ + "\u0313\7p\2\2\u0313X\3\2\2\2\u0314\u0315\7h\2\2\u0315\u0316\7c\2\2\u0316"+ + "\u0317\7n\2\2\u0317\u0318\7u\2\2\u0318\u0319\7g\2\2\u0319Z\3\2\2\2\u031a"+ + "\u031b\7h\2\2\u031b\u031c\7k\2\2\u031c\u031d\7p\2\2\u031d\u031e\7c\2\2"+ + "\u031e\u031f\7n\2\2\u031f\u0320\7n\2\2\u0320\u0321\7{\2\2\u0321\\\3\2"+ + "\2\2\u0322\u0323\7h\2\2\u0323\u0324\7k\2\2\u0324\u0325\7z\2\2\u0325\u0326"+ + "\7g\2\2\u0326\u0327\7f\2\2\u0327^\3\2\2\2\u0328\u0329\7h\2\2\u0329\u032a"+ + "\7n\2\2\u032a\u032b\7q\2\2\u032b\u032c\7c\2\2\u032c\u032d\7v\2\2\u032d"+ + "`\3\2\2\2\u032e\u032f\7h\2\2\u032f\u0330\7q\2\2\u0330\u0331\7t\2\2\u0331"+ + "b\3\2\2\2\u0332\u0333\7h\2\2\u0333\u0334\7q\2\2\u0334\u0335\7t\2\2\u0335"+ + "\u0336\7g\2\2\u0336\u0337\7c\2\2\u0337\u0338\7e\2\2\u0338\u0339\7j\2\2"+ + "\u0339d\3\2\2\2\u033a\u033b\7h\2\2\u033b\u033c\7t\2\2\u033c\u033d\7q\2"+ + "\2\u033d\u033e\7o\2\2\u033ef\3\2\2\2\u033f\u0340\7i\2\2\u0340\u0341\7"+ + "g\2\2\u0341\u0342\7v\2\2\u0342h\3\2\2\2\u0343\u0344\7i\2\2\u0344\u0345"+ + "\7q\2\2\u0345\u0346\7v\2\2\u0346\u0347\7q\2\2\u0347j\3\2\2\2\u0348\u0349"+ + "\7i\2\2\u0349\u034a\7t\2\2\u034a\u034b\7q\2\2\u034b\u034c\7w\2\2\u034c"+ + "\u034d\7r\2\2\u034dl\3\2\2\2\u034e\u034f\7k\2\2\u034f\u0350\7h\2\2\u0350"+ + "n\3\2\2\2\u0351\u0352\7k\2\2\u0352\u0353\7o\2\2\u0353\u0354\7r\2\2\u0354"+ + "\u0355\7n\2\2\u0355\u0356\7k\2\2\u0356\u0357\7e\2\2\u0357\u0358\7k\2\2"+ + "\u0358\u0359\7v\2\2\u0359p\3\2\2\2\u035a\u035b\7k\2\2\u035b\u035c\7p\2"+ + "\2\u035cr\3\2\2\2\u035d\u035e\7k\2\2\u035e\u035f\7p\2\2\u035f\u0360\7"+ + "v\2\2\u0360t\3\2\2\2\u0361\u0362\7k\2\2\u0362\u0363\7p\2\2\u0363\u0364"+ + "\7v\2\2\u0364\u0365\7g\2\2\u0365\u0366\7t\2\2\u0366\u0367\7h\2\2\u0367"+ + "\u0368\7c\2\2\u0368\u0369\7e\2\2\u0369\u036a\7g\2\2\u036av\3\2\2\2\u036b"+ + "\u036c\7k\2\2\u036c\u036d\7p\2\2\u036d\u036e\7v\2\2\u036e\u036f\7g\2\2"+ + "\u036f\u0370\7t\2\2\u0370\u0371\7p\2\2\u0371\u0372\7c\2\2\u0372\u0373"+ + "\7n\2\2\u0373x\3\2\2\2\u0374\u0375\7k\2\2\u0375\u0376\7p\2\2\u0376\u0377"+ + "\7v\2\2\u0377\u0378\7q\2\2\u0378z\3\2\2\2\u0379\u037a\7k\2\2\u037a\u037b"+ + "\7u\2\2\u037b|\3\2\2\2\u037c\u037d\7l\2\2\u037d\u037e\7q\2\2\u037e\u037f"+ + "\7k\2\2\u037f\u0380\7p\2\2\u0380~\3\2\2\2\u0381\u0382\7n\2\2\u0382\u0383"+ + "\7g\2\2\u0383\u0384\7v\2\2\u0384\u0080\3\2\2\2\u0385\u0386\7n\2\2\u0386"+ + "\u0387\7q\2\2\u0387\u0388\7e\2\2\u0388\u0389\7m\2\2\u0389\u0082\3\2\2"+ + "\2\u038a\u038b\7n\2\2\u038b\u038c\7q\2\2\u038c\u038d\7p\2\2\u038d\u038e"+ + "\7i\2\2\u038e\u0084\3\2\2\2\u038f\u0390\7p\2\2\u0390\u0391\7c\2\2\u0391"+ + "\u0392\7o\2\2\u0392\u0393\7g\2\2\u0393\u0394\7q\2\2\u0394\u0395\7h\2\2"+ + "\u0395\u0086\3\2\2\2\u0396\u0397\7p\2\2\u0397\u0398\7c\2\2\u0398\u0399"+ + "\7o\2\2\u0399\u039a\7g\2\2\u039a\u039b\7u\2\2\u039b\u039c\7r\2\2\u039c"+ + "\u039d\7c\2\2\u039d\u039e\7e\2\2\u039e\u039f\7g\2\2\u039f\u0088\3\2\2"+ + "\2\u03a0\u03a1\7p\2\2\u03a1\u03a2\7g\2\2\u03a2\u03a3\7y\2\2\u03a3\u008a"+ + "\3\2\2\2\u03a4\u03a5\7p\2\2\u03a5\u03a6\7w\2\2\u03a6\u03a7\7n\2\2\u03a7"+ + "\u03a8\7n\2\2\u03a8\u008c\3\2\2\2\u03a9\u03aa\7q\2\2\u03aa\u03ab\7d\2"+ + "\2\u03ab\u03ac\7l\2\2\u03ac\u03ad\7g\2\2\u03ad\u03ae\7e\2\2\u03ae\u03af"+ + "\7v\2\2\u03af\u008e\3\2\2\2\u03b0\u03b1\7q\2\2\u03b1\u03b2\7p\2\2\u03b2"+ + "\u0090\3\2\2\2\u03b3\u03b4\7q\2\2\u03b4\u03b5\7r\2\2\u03b5\u03b6\7g\2"+ + "\2\u03b6\u03b7\7t\2\2\u03b7\u03b8\7c\2\2\u03b8\u03b9\7v\2\2\u03b9\u03ba"+ + "\7q\2\2\u03ba\u03bb\7t\2\2\u03bb\u0092\3\2\2\2\u03bc\u03bd\7q\2\2\u03bd"+ + "\u03be\7t\2\2\u03be\u03bf\7f\2\2\u03bf\u03c0\7g\2\2\u03c0\u03c1\7t\2\2"+ + "\u03c1\u03c2\7d\2\2\u03c2\u03c3\7{\2\2\u03c3\u0094\3\2\2\2\u03c4\u03c5"+ + "\7q\2\2\u03c5\u03c6\7w\2\2\u03c6\u03c7\7v\2\2\u03c7\u0096\3\2\2\2\u03c8"+ + "\u03c9\7q\2\2\u03c9\u03ca\7x\2\2\u03ca\u03cb\7g\2\2\u03cb\u03cc\7t\2\2"+ + "\u03cc\u03cd\7t\2\2\u03cd\u03ce\7k\2\2\u03ce\u03cf\7f\2\2\u03cf\u03d0"+ + "\7g\2\2\u03d0\u0098\3\2\2\2\u03d1\u03d2\7r\2\2\u03d2\u03d3\7c\2\2\u03d3"+ + "\u03d4\7t\2\2\u03d4\u03d5\7c\2\2\u03d5\u03d6\7o\2\2\u03d6\u03d7\7u\2\2"+ + "\u03d7\u009a\3\2\2\2\u03d8\u03d9\7r\2\2\u03d9\u03da\7c\2\2\u03da\u03db"+ + "\7t\2\2\u03db\u03dc\7v\2\2\u03dc\u03dd\7k\2\2\u03dd\u03de\7c\2\2\u03de"+ + "\u03df\7n\2\2\u03df\u009c\3\2\2\2\u03e0\u03e1\7r\2\2\u03e1\u03e2\7t\2"+ + "\2\u03e2\u03e3\7k\2\2\u03e3\u03e4\7x\2\2\u03e4\u03e5\7c\2\2\u03e5\u03e6"+ + "\7v\2\2\u03e6\u03e7\7g\2\2\u03e7\u009e\3\2\2\2\u03e8\u03e9\7r\2\2\u03e9"+ + "\u03ea\7t\2\2\u03ea\u03eb\7q\2\2\u03eb\u03ec\7v\2\2\u03ec\u03ed\7g\2\2"+ + "\u03ed\u03ee\7e\2\2\u03ee\u03ef\7v\2\2\u03ef\u03f0\7g\2\2\u03f0\u03f1"+ + "\7f\2\2\u03f1\u00a0\3\2\2\2\u03f2\u03f3\7r\2\2\u03f3\u03f4\7w\2\2\u03f4"+ + "\u03f5\7d\2\2\u03f5\u03f6\7n\2\2\u03f6\u03f7\7k\2\2\u03f7\u03f8\7e\2\2"+ + "\u03f8\u00a2\3\2\2\2\u03f9\u03fa\7t\2\2\u03fa\u03fb\7g\2\2\u03fb\u03fc"+ + "\7c\2\2\u03fc\u03fd\7f\2\2\u03fd\u03fe\7q\2\2\u03fe\u03ff\7p\2\2\u03ff"+ + "\u0400\7n\2\2\u0400\u0401\7{\2\2\u0401\u00a4\3\2\2\2\u0402\u0403\7t\2"+ + "\2\u0403\u0404\7g\2\2\u0404\u0405\7h\2\2\u0405\u00a6\3\2\2\2\u0406\u0407"+ + "\7t\2\2\u0407\u0408\7g\2\2\u0408\u0409\7o\2\2\u0409\u040a\7q\2\2\u040a"+ + "\u040b\7x\2\2\u040b\u040c\7g\2\2\u040c\u00a8\3\2\2\2\u040d\u040e\7t\2"+ + "\2\u040e\u040f\7g\2\2\u040f\u0410\7v\2\2\u0410\u0411\7w\2\2\u0411\u0412"+ + "\7t\2\2\u0412\u0413\7p\2\2\u0413\u00aa\3\2\2\2\u0414\u0415\7u\2\2\u0415"+ + "\u0416\7d\2\2\u0416\u0417\7{\2\2\u0417\u0418\7v\2\2\u0418\u0419\7g\2\2"+ + "\u0419\u00ac\3\2\2\2\u041a\u041b\7u\2\2\u041b\u041c\7g\2\2\u041c\u041d"+ + "\7c\2\2\u041d\u041e\7n\2\2\u041e\u041f\7g\2\2\u041f\u0420\7f\2\2\u0420"+ + "\u00ae\3\2\2\2\u0421\u0422\7u\2\2\u0422\u0423\7g\2\2\u0423\u0424\7n\2"+ + "\2\u0424\u0425\7g\2\2\u0425\u0426\7e\2\2\u0426\u0427\7v\2\2\u0427\u00b0"+ + "\3\2\2\2\u0428\u0429\7u\2\2\u0429\u042a\7g\2\2\u042a\u042b\7v\2\2\u042b"+ + "\u00b2\3\2\2\2\u042c\u042d\7u\2\2\u042d\u042e\7j\2\2\u042e\u042f\7q\2"+ + "\2\u042f\u0430\7t\2\2\u0430\u0431\7v\2\2\u0431\u00b4\3\2\2\2\u0432\u0433"+ + "\7u\2\2\u0433\u0434\7k\2\2\u0434\u0435\7|\2\2\u0435\u0436\7g\2\2\u0436"+ + "\u0437\7q\2\2\u0437\u0438\7h\2\2\u0438\u00b6\3\2\2\2\u0439\u043a\7u\2"+ + "\2\u043a\u043b\7v\2\2\u043b\u043c\7c\2\2\u043c\u043d\7e\2\2\u043d\u043e"+ + "\7m\2\2\u043e\u043f\7c\2\2\u043f\u0440\7n\2\2\u0440\u0441\7n\2\2\u0441"+ + "\u0442\7q\2\2\u0442\u0443\7e\2\2\u0443\u00b8\3\2\2\2\u0444\u0445\7u\2"+ + "\2\u0445\u0446\7v\2\2\u0446\u0447\7c\2\2\u0447\u0448\7v\2\2\u0448\u0449"+ + "\7k\2\2\u0449\u044a\7e\2\2\u044a\u00ba\3\2\2\2\u044b\u044c\7u\2\2\u044c"+ + "\u044d\7v\2\2\u044d\u044e\7t\2\2\u044e\u044f\7k\2\2\u044f\u0450\7p\2\2"+ + "\u0450\u0451\7i\2\2\u0451\u00bc\3\2\2\2\u0452\u0453\7u\2\2\u0453\u0454"+ + "\7v\2\2\u0454\u0455\7t\2\2\u0455\u0456\7w\2\2\u0456\u0457\7e\2\2\u0457"+ + "\u0458\7v\2\2\u0458\u00be\3\2\2\2\u0459\u045a\7u\2\2\u045a\u045b\7y\2"+ + "\2\u045b\u045c\7k\2\2\u045c\u045d\7v\2\2\u045d\u045e\7e\2\2\u045e\u045f"+ + "\7j\2\2\u045f\u00c0\3\2\2\2\u0460\u0461\7v\2\2\u0461\u0462\7j\2\2\u0462"+ + "\u0463\7k\2\2\u0463\u0464\7u\2\2\u0464\u00c2\3\2\2\2\u0465\u0466\7v\2"+ + "\2\u0466\u0467\7j\2\2\u0467\u0468\7t\2\2\u0468\u0469\7q\2\2\u0469\u046a"+ + "\7y\2\2\u046a\u00c4\3\2\2\2\u046b\u046c\7v\2\2\u046c\u046d\7t\2\2\u046d"+ + "\u046e\7w\2\2\u046e\u046f\7g\2\2\u046f\u00c6\3\2\2\2\u0470\u0471\7v\2"+ + "\2\u0471\u0472\7t\2\2\u0472\u0473\7{\2\2\u0473\u00c8\3\2\2\2\u0474\u0475"+ + "\7v\2\2\u0475\u0476\7{\2\2\u0476\u0477\7r\2\2\u0477\u0478\7g\2\2\u0478"+ + "\u0479\7q\2\2\u0479\u047a\7h\2\2\u047a\u00ca\3\2\2\2\u047b\u047c\7w\2"+ + "\2\u047c\u047d\7k\2\2\u047d\u047e\7p\2\2\u047e\u047f\7v\2\2\u047f\u00cc"+ + "\3\2\2\2\u0480\u0481\7w\2\2\u0481\u0482\7n\2\2\u0482\u0483\7q\2\2\u0483"+ + "\u0484\7p\2\2\u0484\u0485\7i\2\2\u0485\u00ce\3\2\2\2\u0486\u0487\7w\2"+ + "\2\u0487\u0488\7p\2\2\u0488\u0489\7e\2\2\u0489\u048a\7j\2\2\u048a\u048b"+ + "\7g\2\2\u048b\u048c\7e\2\2\u048c\u048d\7m\2\2\u048d\u048e\7g\2\2\u048e"+ + "\u048f\7f\2\2\u048f\u00d0\3\2\2\2\u0490\u0491\7w\2\2\u0491\u0492\7p\2"+ + "\2\u0492\u0493\7o\2\2\u0493\u0494\7c\2\2\u0494\u0495\7p\2\2\u0495\u0496"+ + "\7c\2\2\u0496\u0497\7i\2\2\u0497\u0498\7g\2\2\u0498\u0499\7f\2\2\u0499"+ + "\u00d2\3\2\2\2\u049a\u049b\7w\2\2\u049b\u049c\7p\2\2\u049c\u049d\7u\2"+ + "\2\u049d\u049e\7c\2\2\u049e\u049f\7h\2\2\u049f\u04a0\7g\2\2\u04a0\u00d4"+ + "\3\2\2\2\u04a1\u04a2\7w\2\2\u04a2\u04a3\7u\2\2\u04a3\u04a4\7j\2\2\u04a4"+ + "\u04a5\7q\2\2\u04a5\u04a6\7t\2\2\u04a6\u04a7\7v\2\2\u04a7\u00d6\3\2\2"+ + "\2\u04a8\u04a9\7w\2\2\u04a9\u04aa\7u\2\2\u04aa\u04ab\7k\2\2\u04ab\u04ac"+ + "\7p\2\2\u04ac\u04ad\7i\2\2\u04ad\u00d8\3\2\2\2\u04ae\u04af\7x\2\2\u04af"+ + "\u04b0\7c\2\2\u04b0\u04b1\7t\2\2\u04b1\u00da\3\2\2\2\u04b2\u04b3\7x\2"+ + "\2\u04b3\u04b4\7k\2\2\u04b4\u04b5\7t\2\2\u04b5\u04b6\7v\2\2\u04b6\u04b7"+ + "\7w\2\2\u04b7\u04b8\7c\2\2\u04b8\u04b9\7n\2\2\u04b9\u00dc\3\2\2\2\u04ba"+ + "\u04bb\7x\2\2\u04bb\u04bc\7q\2\2\u04bc\u04bd\7k\2\2\u04bd\u04be\7f\2\2"+ + "\u04be\u00de\3\2\2\2\u04bf\u04c0\7x\2\2\u04c0\u04c1\7q\2\2\u04c1\u04c2"+ + "\7n\2\2\u04c2\u04c3\7c\2\2\u04c3\u04c4\7v\2\2\u04c4\u04c5\7k\2\2\u04c5"+ + "\u04c6\7n\2\2\u04c6\u04c7\7g\2\2\u04c7\u00e0\3\2\2\2\u04c8\u04c9\7y\2"+ + "\2\u04c9\u04ca\7j\2\2\u04ca\u04cb\7g\2\2\u04cb\u04cc\7p\2\2\u04cc\u00e2"+ + "\3\2\2\2\u04cd\u04ce\7y\2\2\u04ce\u04cf\7j\2\2\u04cf\u04d0\7g\2\2\u04d0"+ + "\u04d1\7t\2\2\u04d1\u04d2\7g\2\2\u04d2\u00e4\3\2\2\2\u04d3\u04d4\7y\2"+ + "\2\u04d4\u04d5\7j\2\2\u04d5\u04d6\7k\2\2\u04d6\u04d7\7n\2\2\u04d7\u04d8"+ + "\7g\2\2\u04d8\u00e6\3\2\2\2\u04d9\u04da\7{\2\2\u04da\u04db\7k\2\2\u04db"+ + "\u04dc\7g\2\2\u04dc\u04dd\7n\2\2\u04dd\u04de\7f\2\2\u04de\u00e8\3\2\2"+ + "\2\u04df\u04e1\7B\2\2\u04e0\u04df\3\2\2\2\u04e0\u04e1\3\2\2\2\u04e1\u04e2"+ + "\3\2\2\2\u04e2\u04e3\5\u01c5\u00e1\2\u04e3\u00ea\3\2\2\2\u04e4\u04ee\t"+ + "\3\2\2\u04e5\u04e7\7a\2\2\u04e6\u04e5\3\2\2\2\u04e7\u04ea\3\2\2\2\u04e8"+ + "\u04e6\3\2\2\2\u04e8\u04e9\3\2\2\2\u04e9\u04eb\3\2\2\2\u04ea\u04e8\3\2"+ + "\2\2\u04eb\u04ed\t\3\2\2\u04ec\u04e8\3\2\2\2\u04ed\u04f0\3\2\2\2\u04ee"+ + "\u04ec\3\2\2\2\u04ee\u04ef\3\2\2\2\u04ef\u04f2\3\2\2\2\u04f0\u04ee\3\2"+ + "\2\2\u04f1\u04f3\5\u01b5\u00d9\2\u04f2\u04f1\3\2\2\2\u04f2\u04f3\3\2\2"+ + "\2\u04f3\u04f4\3\2\2\2\u04f4\u04f6\7\60\2\2\u04f5\u04f7\7B\2\2\u04f6\u04f5"+ + "\3\2\2\2\u04f6\u04f7\3\2\2\2\u04f7\u04f8\3\2\2\2\u04f8\u04f9\5\u01c5\u00e1"+ + "\2\u04f9\u00ec\3\2\2\2\u04fa\u0504\t\3\2\2\u04fb\u04fd\7a\2\2\u04fc\u04fb"+ + "\3\2\2\2\u04fd\u0500\3\2\2\2\u04fe\u04fc\3\2\2\2\u04fe\u04ff\3\2\2\2\u04ff"+ + "\u0501\3\2\2\2\u0500\u04fe\3\2\2\2\u0501\u0503\t\3\2\2\u0502\u04fe\3\2"+ + "\2\2\u0503\u0506\3\2\2\2\u0504\u0502\3\2\2\2\u0504\u0505\3\2\2\2\u0505"+ + "\u0508\3\2\2\2\u0506\u0504\3\2\2\2\u0507\u0509\5\u01b5\u00d9\2\u0508\u0507"+ + "\3\2\2\2\u0508\u0509\3\2\2\2\u0509\u00ee\3\2\2\2\u050a\u050b\7\62\2\2"+ + "\u050b\u0513\t\4\2\2\u050c\u050e\7a\2\2\u050d\u050c\3\2\2\2\u050e\u0511"+ + "\3\2\2\2\u050f\u050d\3\2\2\2\u050f\u0510\3\2\2\2\u0510\u0512\3\2\2\2\u0511"+ + "\u050f\3\2\2\2\u0512\u0514\5\u01d7\u00ea\2\u0513\u050f\3\2\2\2\u0514\u0515"+ + "\3\2\2\2\u0515\u0513\3\2\2\2\u0515\u0516\3\2\2\2\u0516\u0518\3\2\2\2\u0517"+ + "\u0519\5\u01b5\u00d9\2\u0518\u0517\3\2\2\2\u0518\u0519\3\2\2\2\u0519\u00f0"+ + "\3\2\2\2\u051a\u051b\7\62\2\2\u051b\u0523\t\5\2\2\u051c\u051e\7a\2\2\u051d"+ + "\u051c\3\2\2\2\u051e\u0521\3\2\2\2\u051f\u051d\3\2\2\2\u051f\u0520\3\2"+ + "\2\2\u0520\u0522\3\2\2\2\u0521\u051f\3\2\2\2\u0522\u0524\t\6\2\2\u0523"+ + "\u051f\3\2\2\2\u0524\u0525\3\2\2\2\u0525\u0523\3\2\2\2\u0525\u0526\3\2"+ + "\2\2\u0526\u0528\3\2\2\2\u0527\u0529\5\u01b5\u00d9\2\u0528\u0527\3\2\2"+ + "\2\u0528\u0529\3\2\2\2\u0529\u00f2\3\2\2\2\u052a\u0534\t\3\2\2\u052b\u052d"+ + "\7a\2\2\u052c\u052b\3\2\2\2\u052d\u0530\3\2\2\2\u052e\u052c\3\2\2\2\u052e"+ + "\u052f\3\2\2\2\u052f\u0531\3\2\2\2\u0530\u052e\3\2\2\2\u0531\u0533\t\3"+ + "\2\2\u0532\u052e\3\2\2\2\u0533\u0536\3\2\2\2\u0534\u0532\3\2\2\2\u0534"+ + "\u0535\3\2\2\2\u0535\u0538\3\2\2\2\u0536\u0534\3\2\2\2\u0537\u052a\3\2"+ + "\2\2\u0537\u0538\3\2\2\2\u0538\u0539\3\2\2\2\u0539\u053a\7\60\2\2\u053a"+ + "\u0544\t\3\2\2\u053b\u053d\7a\2\2\u053c\u053b\3\2\2\2\u053d\u0540\3\2"+ + "\2\2\u053e\u053c\3\2\2\2\u053e\u053f\3\2\2\2\u053f\u0541\3\2\2\2\u0540"+ + "\u053e\3\2\2\2\u0541\u0543\t\3\2\2\u0542\u053e\3\2\2\2\u0543\u0546\3\2"+ + "\2\2\u0544\u0542\3\2\2\2\u0544\u0545\3\2\2\2\u0545\u0548\3\2\2\2\u0546"+ + "\u0544\3\2\2\2\u0547\u0549\5\u01b7\u00da\2\u0548\u0547\3\2\2\2\u0548\u0549"+ + "\3\2\2\2\u0549\u054b\3\2\2\2\u054a\u054c\t\7\2\2\u054b\u054a\3\2\2\2\u054b"+ + "\u054c\3\2\2\2\u054c\u0562\3\2\2\2\u054d\u0557\t\3\2\2\u054e\u0550\7a"+ + "\2\2\u054f\u054e\3\2\2\2\u0550\u0553\3\2\2\2\u0551\u054f\3\2\2\2\u0551"+ + "\u0552\3\2\2\2\u0552\u0554\3\2\2\2\u0553\u0551\3\2\2\2\u0554\u0556\t\3"+ + "\2\2\u0555\u0551\3\2\2\2\u0556\u0559\3\2\2\2\u0557\u0555\3\2\2\2\u0557"+ + "\u0558\3\2\2\2\u0558\u055f\3\2\2\2\u0559\u0557\3\2\2\2\u055a\u0560\t\7"+ + "\2\2\u055b\u055d\5\u01b7\u00da\2\u055c\u055e\t\7\2\2\u055d\u055c\3\2\2"+ + "\2\u055d\u055e\3\2\2\2\u055e\u0560\3\2\2\2\u055f\u055a\3\2\2\2\u055f\u055b"+ + "\3\2\2\2\u0560\u0562\3\2\2\2\u0561\u0537\3\2\2\2\u0561\u054d\3\2\2\2\u0562"+ + "\u00f4\3\2\2\2\u0563\u0566\7)\2\2\u0564\u0567\n\b\2\2\u0565\u0567\5\u01b9"+ + "\u00db\2\u0566\u0564\3\2\2\2\u0566\u0565\3\2\2\2\u0567\u0568\3\2\2\2\u0568"+ + "\u0569\7)\2\2\u0569\u00f6\3\2\2\2\u056a\u056f\7$\2\2\u056b\u056e\n\t\2"+ + "\2\u056c\u056e\5\u01b9\u00db\2\u056d\u056b\3\2\2\2\u056d\u056c\3\2\2\2"+ + "\u056e\u0571\3\2\2\2\u056f\u056d\3\2\2\2\u056f\u0570\3\2\2\2\u0570\u0572"+ + "\3\2\2\2\u0571\u056f\3\2\2\2\u0572\u0573\7$\2\2\u0573\u00f8\3\2\2\2\u0574"+ + "\u0575\7B\2\2\u0575\u0576\7$\2\2\u0576\u057c\3\2\2\2\u0577\u057b\n\n\2"+ + "\2\u0578\u0579\7$\2\2\u0579\u057b\7$\2\2\u057a\u0577\3\2\2\2\u057a\u0578"+ + "\3\2\2\2\u057b\u057e\3\2\2\2\u057c\u057a\3\2\2\2\u057c\u057d\3\2\2\2\u057d"+ + "\u057f\3\2\2\2\u057e\u057c\3\2\2\2\u057f\u0580\7$\2\2\u0580\u00fa\3\2"+ + "\2\2\u0581\u0582\7&\2\2\u0582\u0583\7$\2\2\u0583\u0584\3\2\2\2\u0584\u0585"+ + "\b|\5\2\u0585\u0586\3\2\2\2\u0586\u0587\b|\6\2\u0587\u00fc\3\2\2\2\u0588"+ + "\u0589\7&\2\2\u0589\u058a\7B\2\2\u058a\u058b\7$\2\2\u058b\u058c\3\2\2"+ + "\2\u058c\u058d\b}\7\2\u058d\u058e\3\2\2\2\u058e\u058f\b}\6\2\u058f\u00fe"+ + "\3\2\2\2\u0590\u0591\7}\2\2\u0591\u0592\b~\b\2\u0592\u0100\3\2\2\2\u0593"+ + "\u0594\7\177\2\2\u0594\u0595\b\177\t\2\u0595\u0102\3\2\2\2\u0596\u0597"+ + "\7]\2\2\u0597\u0104\3\2\2\2\u0598\u0599\7_\2\2\u0599\u0106\3\2\2\2\u059a"+ + "\u059b\7*\2\2\u059b\u0108\3\2\2\2\u059c\u059d\7+\2\2\u059d\u010a\3\2\2"+ + "\2\u059e\u059f\7\60\2\2\u059f\u010c\3\2\2\2\u05a0\u05a1\7.\2\2\u05a1\u010e"+ + "\3\2\2\2\u05a2\u05a3\7<\2\2\u05a3\u05a4\b\u0086\n\2\u05a4\u0110\3\2\2"+ + "\2\u05a5\u05a6\7=\2\2\u05a6\u0112\3\2\2\2\u05a7\u05a8\7-\2\2\u05a8\u0114"+ + "\3\2\2\2\u05a9\u05aa\7/\2\2\u05aa\u0116\3\2\2\2\u05ab\u05ac\7,\2\2\u05ac"+ + "\u0118\3\2\2\2\u05ad\u05ae\7\61\2\2\u05ae\u011a\3\2\2\2\u05af\u05b0\7"+ + "\'\2\2\u05b0\u011c\3\2\2\2\u05b1\u05b2\7(\2\2\u05b2\u011e\3\2\2\2\u05b3"+ + "\u05b4\7~\2\2\u05b4\u0120\3\2\2\2\u05b5\u05b6\7`\2\2\u05b6\u0122\3\2\2"+ + "\2\u05b7\u05b8\7#\2\2\u05b8\u0124\3\2\2\2\u05b9\u05ba\7\u0080\2\2\u05ba"+ + "\u0126\3\2\2\2\u05bb\u05bc\7?\2\2\u05bc\u0128\3\2\2\2\u05bd\u05be\7>\2"+ + "\2\u05be\u012a\3\2\2\2\u05bf\u05c0\7@\2\2\u05c0\u012c\3\2\2\2\u05c1\u05c2"+ + "\7A\2\2\u05c2\u012e\3\2\2\2\u05c3\u05c4\7<\2\2\u05c4\u05c5\7<\2\2\u05c5"+ + "\u0130\3\2\2\2\u05c6\u05c7\7A\2\2\u05c7\u05c8\7A\2\2\u05c8\u0132\3\2\2"+ + "\2\u05c9\u05ca\7-\2\2\u05ca\u05cb\7-\2\2\u05cb\u0134\3\2\2\2\u05cc\u05cd"+ + "\7/\2\2\u05cd\u05ce\7/\2\2\u05ce\u0136\3\2\2\2\u05cf\u05d0\7(\2\2\u05d0"+ + "\u05d1\7(\2\2\u05d1\u0138\3\2\2\2\u05d2\u05d3\7~\2\2\u05d3\u05d4\7~\2"+ + "\2\u05d4\u013a\3\2\2\2\u05d5\u05d6\7/\2\2\u05d6\u05d7\7@\2\2\u05d7\u013c"+ + "\3\2\2\2\u05d8\u05d9\7?\2\2\u05d9\u05da\7?\2\2\u05da\u013e\3\2\2\2\u05db"+ + "\u05dc\7#\2\2\u05dc\u05dd\7?\2\2\u05dd\u0140\3\2\2\2\u05de\u05df\7>\2"+ + "\2\u05df\u05e0\7?\2\2\u05e0\u0142\3\2\2\2\u05e1\u05e2\7@\2\2\u05e2\u05e3"+ + "\7?\2\2\u05e3\u0144\3\2\2\2\u05e4\u05e5\7-\2\2\u05e5\u05e6\7?\2\2\u05e6"+ + "\u0146\3\2\2\2\u05e7\u05e8\7/\2\2\u05e8\u05e9\7?\2\2\u05e9\u0148\3\2\2"+ + "\2\u05ea\u05eb\7,\2\2\u05eb\u05ec\7?\2\2\u05ec\u014a\3\2\2\2\u05ed\u05ee"+ + "\7\61\2\2\u05ee\u05ef\7?\2\2\u05ef\u014c\3\2\2\2\u05f0\u05f1\7\'\2\2\u05f1"+ + "\u05f2\7?\2\2\u05f2\u014e\3\2\2\2\u05f3\u05f4\7(\2\2\u05f4\u05f5\7?\2"+ + "\2\u05f5\u0150\3\2\2\2\u05f6\u05f7\7~\2\2\u05f7\u05f8\7?\2\2\u05f8\u0152"+ + "\3\2\2\2\u05f9\u05fa\7`\2\2\u05fa\u05fb\7?\2\2\u05fb\u0154\3\2\2\2\u05fc"+ + "\u05fd\7>\2\2\u05fd\u05fe\7>\2\2\u05fe\u0156\3\2\2\2\u05ff\u0600\7>\2"+ + "\2\u0600\u0601\7>\2\2\u0601\u0602\7?\2\2\u0602\u0158\3\2\2\2\u0603\u0604"+ + "\7A\2\2\u0604\u0605\7A\2\2\u0605\u0606\7?\2\2\u0606\u015a\3\2\2\2\u0607"+ + "\u0608\7\60\2\2\u0608\u0609\7\60\2\2\u0609\u015c\3\2\2\2\u060a\u060b\7"+ + "}\2\2\u060b\u060c\7}\2\2\u060c\u015e\3\2\2\2\u060d\u060e\7}\2\2\u060e"+ + "\u060f\b\u00ae\13\2\u060f\u0610\3\2\2\2\u0610\u0611\b\u00ae\f\2\u0611"+ + "\u0612\b\u00ae\r\2\u0612\u0160\3\2\2\2\u0613\u0614\6\u00af\2\2\u0614\u0615"+ + "\5\u01bb\u00dc\2\u0615\u0162\3\2\2\2\u0616\u0617\6\u00b0\3\2\u0617\u0618"+ + "\7$\2\2\u0618\u0619\7$\2\2\u0619\u0164\3\2\2\2\u061a\u061b\7$\2\2\u061b"+ + "\u061c\b\u00b1\16\2\u061c\u061d\3\2\2\2\u061d\u061e\b\u00b1\17\2\u061e"+ + "\u0166\3\2\2\2\u061f\u0621\6\u00b2\4\2\u0620\u0622\n\13\2\2\u0621\u0620"+ + "\3\2\2\2\u0622\u0623\3\2\2\2\u0623\u0621\3\2\2\2\u0623\u0624\3\2\2\2\u0624"+ + "\u0168\3\2\2\2\u0625\u0627\6\u00b3\5\2\u0626\u0628\n\f\2\2\u0627\u0626"+ + "\3\2\2\2\u0628\u0629\3\2\2\2\u0629\u0627\3\2\2\2\u0629\u062a\3\2\2\2\u062a"+ + "\u016a\3\2\2\2\u062b\u062c\7\177\2\2\u062c\u062d\7\177\2\2\u062d\u062e"+ + "\3\2\2\2\u062e\u062f\b\u00b4\20\2\u062f\u016c\3\2\2\2\u0630\u0631\7\177"+ + "\2\2\u0631\u0632\b\u00b5\21\2\u0632\u0633\3\2\2\2\u0633\u0634\b\u00b5"+ + "\f\2\u0634\u0635\b\u00b5\17\2\u0635\u016e\3\2\2\2\u0636\u0638\n\r\2\2"+ + "\u0637\u0636\3\2\2\2\u0638\u0639\3\2\2\2\u0639\u0637\3\2\2\2\u0639\u063a"+ + "\3\2\2\2\u063a\u0170\3\2\2\2\u063b\u063d\5\u01c1\u00df\2\u063c\u063b\3"+ + "\2\2\2\u063d\u063e\3\2\2\2\u063e\u063c\3\2\2\2\u063e\u063f\3\2\2\2\u063f"+ + "\u0640\3\2\2\2\u0640\u0641\b\u00b7\3\2\u0641\u0172\3\2\2\2\u0642\u0644"+ + "\t\3\2\2\u0643\u0642\3\2\2\2\u0644\u0645\3\2\2\2\u0645\u0643\3\2\2\2\u0645"+ + "\u0646\3\2\2\2\u0646\u0647\3\2\2\2\u0647\u0648\b\u00b8\22\2\u0648\u0174"+ + "\3\2\2\2\u0649\u064a\7v\2\2\u064a\u064b\7t\2\2\u064b\u064c\7w\2\2\u064c"+ + "\u064d\7g\2\2\u064d\u064e\3\2\2\2\u064e\u064f\b\u00b9\22\2\u064f\u0650"+ + "\b\u00b9\23\2\u0650\u0176\3\2\2\2\u0651\u0652\7h\2\2\u0652\u0653\7c\2"+ + "\2\u0653\u0654\7n\2\2\u0654\u0655\7u\2\2\u0655\u0656\7g\2\2\u0656\u0657"+ + "\3\2\2\2\u0657\u0658\b\u00ba\22\2\u0658\u0659\b\u00ba\24\2\u0659\u0178"+ + "\3\2\2\2\u065a\u065b\7f\2\2\u065b\u065c\7g\2\2\u065c\u065d\7h\2\2\u065d"+ + "\u065e\7k\2\2\u065e\u065f\7p\2\2\u065f\u0660\7g\2\2\u0660\u0661\3\2\2"+ + "\2\u0661\u0662\b\u00bb\22\2\u0662\u017a\3\2\2\2\u0663\u0664\7w\2\2\u0664"+ + "\u0665\7p\2\2\u0665\u0666\7f\2\2\u0666\u0667\7g\2\2\u0667\u0668\7h\2\2"+ + "\u0668\u0669\3\2\2\2\u0669\u066a\b\u00bc\22\2\u066a\u017c\3\2\2\2\u066b"+ + "\u066c\7k\2\2\u066c\u066d\7h\2\2\u066d\u066e\3\2\2\2\u066e\u066f\b\u00bd"+ + "\22\2\u066f\u0670\b\u00bd\25\2\u0670\u017e\3\2\2\2\u0671\u0672\7g\2\2"+ + "\u0672\u0673\7n\2\2\u0673\u0674\7k\2\2\u0674\u0675\7h\2\2\u0675\u0676"+ + "\3\2\2\2\u0676\u0677\b\u00be\22\2\u0677\u0180\3\2\2\2\u0678\u0679\7g\2"+ + "\2\u0679\u067a\7n\2\2\u067a\u067b\7u\2\2\u067b\u067c\7g\2\2\u067c\u067d"+ + "\3\2\2\2\u067d\u067e\b\u00bf\22\2\u067e\u067f\b\u00bf\26\2\u067f\u0182"+ + "\3\2\2\2\u0680\u0681\7g\2\2\u0681\u0682\7p\2\2\u0682\u0683\7f\2\2\u0683"+ + "\u0684\7k\2\2\u0684\u0685\7h\2\2\u0685\u0686\3\2\2\2\u0686\u0687\b\u00c0"+ + "\22\2\u0687\u0184\3\2\2\2\u0688\u0689\7n\2\2\u0689\u068a\7k\2\2\u068a"+ + "\u068b\7p\2\2\u068b\u068c\7g\2\2\u068c\u068d\3\2\2\2\u068d\u068e\b\u00c1"+ + "\22\2\u068e\u0186\3\2\2\2\u068f\u0690\7g\2\2\u0690\u0691\7t\2\2\u0691"+ + "\u0692\7t\2\2\u0692\u0693\7q\2\2\u0693\u0694\7t\2\2\u0694\u0696\3\2\2"+ + "\2\u0695\u0697\5\u01c1\u00df\2\u0696\u0695\3\2\2\2\u0697\u0698\3\2\2\2"+ + "\u0698\u0696\3\2\2\2\u0698\u0699\3\2\2\2\u0699\u069a\3\2\2\2\u069a\u069b"+ + "\b\u00c2\22\2\u069b\u069c\b\u00c2\27\2\u069c\u0188\3\2\2\2\u069d\u069e"+ + "\7y\2\2\u069e\u069f\7c\2\2\u069f\u06a0\7t\2\2\u06a0\u06a1\7p\2\2\u06a1"+ + "\u06a2\7k\2\2\u06a2\u06a3\7p\2\2\u06a3\u06a4\7i\2\2\u06a4\u06a6\3\2\2"+ + "\2\u06a5\u06a7\5\u01c1\u00df\2\u06a6\u06a5\3\2\2\2\u06a7\u06a8\3\2\2\2"+ + "\u06a8\u06a6\3\2\2\2\u06a8\u06a9\3\2\2\2\u06a9\u06aa\3\2\2\2\u06aa\u06ab"+ + "\b\u00c3\22\2\u06ab\u06ac\b\u00c3\27\2\u06ac\u018a\3\2\2\2\u06ad\u06ae"+ + "\7t\2\2\u06ae\u06af\7g\2\2\u06af\u06b0\7i\2\2\u06b0\u06b1\7k\2\2\u06b1"+ + "\u06b2\7q\2\2\u06b2\u06b3\7p\2\2\u06b3\u06b7\3\2\2\2\u06b4\u06b6\5\u01c1"+ + "\u00df\2\u06b5\u06b4\3\2\2\2\u06b6\u06b9\3\2\2\2\u06b7\u06b5\3\2\2\2\u06b7"+ + "\u06b8\3\2\2\2\u06b8\u06ba\3\2\2\2\u06b9\u06b7\3\2\2\2\u06ba\u06bb\b\u00c4"+ + "\22\2\u06bb\u06bc\b\u00c4\27\2\u06bc\u018c\3\2\2\2\u06bd\u06be\7g\2\2"+ + "\u06be\u06bf\7p\2\2\u06bf\u06c0\7f\2\2\u06c0\u06c1\7t\2\2\u06c1\u06c2"+ + "\7g\2\2\u06c2\u06c3\7i\2\2\u06c3\u06c4\7k\2\2\u06c4\u06c5\7q\2\2\u06c5"+ + "\u06c6\7p\2\2\u06c6\u06ca\3\2\2\2\u06c7\u06c9\5\u01c1\u00df\2\u06c8\u06c7"+ + "\3\2\2\2\u06c9\u06cc\3\2\2\2\u06ca\u06c8\3\2\2\2\u06ca\u06cb\3\2\2\2\u06cb"+ + "\u06cd\3\2\2\2\u06cc\u06ca\3\2\2\2\u06cd\u06ce\b\u00c5\22\2\u06ce\u06cf"+ + "\b\u00c5\27\2\u06cf\u018e\3\2\2\2\u06d0\u06d1\7r\2\2\u06d1\u06d2\7t\2"+ + "\2\u06d2\u06d3\7c\2\2\u06d3\u06d4\7i\2\2\u06d4\u06d5\7o\2\2\u06d5\u06d6"+ + "\7c\2\2\u06d6\u06d8\3\2\2\2\u06d7\u06d9\5\u01c1\u00df\2\u06d8\u06d7\3"+ + "\2\2\2\u06d9\u06da\3\2\2\2\u06da\u06d8\3\2\2\2\u06da\u06db\3\2\2\2\u06db"+ + "\u06dc\3\2\2\2\u06dc\u06dd\b\u00c6\22\2\u06dd\u06de\b\u00c6\27\2\u06de"+ + "\u0190\3\2\2\2\u06df\u06e0\7p\2\2\u06e0\u06e1\7w\2\2\u06e1\u06e2\7n\2"+ + "\2\u06e2\u06e3\7n\2\2\u06e3\u06e4\7c\2\2\u06e4\u06e5\7d\2\2\u06e5\u06e6"+ + "\7n\2\2\u06e6\u06e7\7g\2\2\u06e7\u06e9\3\2\2\2\u06e8\u06ea\5\u01c1\u00df"+ + "\2\u06e9\u06e8\3\2\2\2\u06ea\u06eb\3\2\2\2\u06eb\u06e9\3\2\2\2\u06eb\u06ec"+ + "\3\2\2\2\u06ec\u06ed\3\2\2\2\u06ed\u06ee\b\u00c7\22\2\u06ee\u06ef\b\u00c7"+ + "\27\2\u06ef\u0192\3\2\2\2\u06f0\u06f1\7f\2\2\u06f1\u06f2\7g\2\2\u06f2"+ + "\u06f3\7h\2\2\u06f3\u06f4\7c\2\2\u06f4\u06f5\7w\2\2\u06f5\u06f6\7n\2\2"+ + "\u06f6\u06f7\7v\2\2\u06f7\u06f8\3\2\2\2\u06f8\u06f9\b\u00c8\22\2\u06f9"+ + "\u06fa\b\u00c8\30\2\u06fa\u0194\3\2\2\2\u06fb\u06fc\7j\2\2\u06fc\u06fd"+ + "\7k\2\2\u06fd\u06fe\7f\2\2\u06fe\u06ff\7f\2\2\u06ff\u0700\7g\2\2\u0700"+ + "\u0701\7p\2\2\u0701\u0702\3\2\2\2\u0702\u0703\b\u00c9\22\2\u0703\u0196"+ + "\3\2\2\2\u0704\u0705\7*\2\2\u0705\u0706\3\2\2\2\u0706\u0707\b\u00ca\22"+ + "\2\u0707\u0708\b\u00ca\31\2\u0708\u0198\3\2\2\2\u0709\u070a\7+\2\2\u070a"+ + "\u070b\3\2\2\2\u070b\u070c\b\u00cb\22\2\u070c\u070d\b\u00cb\32\2\u070d"+ + "\u019a\3\2\2\2\u070e\u070f\7#\2\2\u070f\u0710\3\2\2\2\u0710\u0711\b\u00cc"+ + "\22\2\u0711\u0712\b\u00cc\33\2\u0712\u019c\3\2\2\2\u0713\u0714\7?\2\2"+ + "\u0714\u0715\7?\2\2\u0715\u0716\3\2\2\2\u0716\u0717\b\u00cd\22\2\u0717"+ + "\u0718\b\u00cd\34\2\u0718\u019e\3\2\2\2\u0719\u071a\7#\2\2\u071a\u071b"+ + "\7?\2\2\u071b\u071c\3\2\2\2\u071c\u071d\b\u00ce\22\2\u071d\u071e\b\u00ce"+ + "\35\2\u071e\u01a0\3\2\2\2\u071f\u0720\7(\2\2\u0720\u0721\7(\2\2\u0721"+ + "\u0722\3\2\2\2\u0722\u0723\b\u00cf\22\2\u0723\u0724\b\u00cf\36\2\u0724"+ + "\u01a2\3\2\2\2\u0725\u0726\7~\2\2\u0726\u0727\7~\2\2\u0727\u0728\3\2\2"+ + "\2\u0728\u0729\b\u00d0\22\2\u0729\u072a\b\u00d0\37\2\u072a\u01a4\3\2\2"+ + "\2\u072b\u072f\7$\2\2\u072c\u072e\n\16\2\2\u072d\u072c\3\2\2\2\u072e\u0731"+ + "\3\2\2\2\u072f\u072d\3\2\2\2\u072f\u0730\3\2\2\2\u0730\u0732\3\2\2\2\u0731"+ + "\u072f\3\2\2\2\u0732\u0733\7$\2\2\u0733\u0734\3\2\2\2\u0734\u0735\b\u00d1"+ + "\22\2\u0735\u0736\b\u00d1 \2\u0736\u01a6\3\2\2\2\u0737\u0738\5\u01c5\u00e1"+ + "\2\u0738\u0739\3\2\2\2\u0739\u073a\b\u00d2\22\2\u073a\u01a8\3\2\2\2\u073b"+ + "\u073c\7\61\2\2\u073c\u073d\7\61\2\2\u073d\u0741\3\2\2\2\u073e\u0740\n"+ + "\17\2\2\u073f\u073e\3\2\2\2\u0740\u0743\3\2\2\2\u0741\u073f\3\2\2\2\u0741"+ + "\u0742\3\2\2\2\u0742\u0744\3\2\2\2\u0743\u0741\3\2\2\2\u0744\u0745\b\u00d3"+ + "\2\2\u0745\u0746\b\u00d3!\2\u0746\u01aa\3\2\2\2\u0747\u0748\5\u01bf\u00de"+ + "\2\u0748\u0749\3\2\2\2\u0749\u074a\b\u00d4\22\2\u074a\u074b\b\u00d4\""+ + "\2\u074b\u01ac\3\2\2\2\u074c\u074e\n\17\2\2\u074d\u074c\3\2\2\2\u074e"+ + "\u074f\3\2\2\2\u074f\u074d\3\2\2\2\u074f\u0750\3\2\2\2\u0750\u0751\3\2"+ + "\2\2\u0751\u0752\b\u00d5\22\2\u0752\u01ae\3\2\2\2\u0753\u0754\5\u01bf"+ + "\u00de\2\u0754\u0755\3\2\2\2\u0755\u0756\b\u00d6\22\2\u0756\u0757\b\u00d6"+ + "#\2\u0757\u0758\b\u00d6\"\2\u0758\u01b0\3\2\2\2\u0759\u075a\n\17\2\2\u075a"+ + "\u01b2\3\2\2\2\u075b\u075c\t\17\2\2\u075c\u01b4\3\2\2\2\u075d\u075f\t"+ + "\20\2\2\u075e\u075d\3\2\2\2\u075e\u075f\3\2\2\2\u075f\u0760\3\2\2\2\u0760"+ + "\u0766\t\21\2\2\u0761\u0763\t\21\2\2\u0762\u0761\3\2\2\2\u0762\u0763\3"+ + "\2\2\2\u0763\u0764\3\2\2\2\u0764\u0766\t\20\2\2\u0765\u075e\3\2\2\2\u0765"+ + "\u0762\3\2\2\2\u0766\u01b6\3\2\2\2\u0767\u0769\t\22\2\2\u0768\u076a\t"+ + "\23\2\2\u0769\u0768\3\2\2\2\u0769\u076a\3\2\2\2\u076a\u076b\3\2\2\2\u076b"+ + "\u0775\t\3\2\2\u076c\u076e\7a\2\2\u076d\u076c\3\2\2\2\u076e\u0771\3\2"+ + "\2\2\u076f\u076d\3\2\2\2\u076f\u0770\3\2\2\2\u0770\u0772\3\2\2\2\u0771"+ + "\u076f\3\2\2\2\u0772\u0774\t\3\2\2\u0773\u076f\3\2\2\2\u0774\u0777\3\2"+ + "\2\2\u0775\u0773\3\2\2\2\u0775\u0776\3\2\2\2\u0776\u01b8\3\2\2\2\u0777"+ + "\u0775\3\2\2\2\u0778\u077c\5\u01bb\u00dc\2\u0779\u077c\5\u01bd\u00dd\2"+ + "\u077a\u077c\5\u01d5\u00e9\2\u077b\u0778\3\2\2\2\u077b\u0779\3\2\2\2\u077b"+ + "\u077a\3\2\2\2\u077c\u01ba\3\2\2\2\u077d\u077e\7^\2\2\u077e\u0794\7)\2"+ + "\2\u077f\u0780\7^\2\2\u0780\u0794\7$\2\2\u0781\u0782\7^\2\2\u0782\u0794"+ + "\7^\2\2\u0783\u0784\7^\2\2\u0784\u0794\7\62\2\2\u0785\u0786\7^\2\2\u0786"+ + "\u0794\7c\2\2\u0787\u0788\7^\2\2\u0788\u0794\7d\2\2\u0789\u078a\7^\2\2"+ + "\u078a\u0794\7h\2\2\u078b\u078c\7^\2\2\u078c\u0794\7p\2\2\u078d\u078e"+ + "\7^\2\2\u078e\u0794\7t\2\2\u078f\u0790\7^\2\2\u0790\u0794\7v\2\2\u0791"+ + "\u0792\7^\2\2\u0792\u0794\7x\2\2\u0793\u077d\3\2\2\2\u0793\u077f\3\2\2"+ + "\2\u0793\u0781\3\2\2\2\u0793\u0783\3\2\2\2\u0793\u0785\3\2\2\2\u0793\u0787"+ + "\3\2\2\2\u0793\u0789\3\2\2\2\u0793\u078b\3\2\2\2\u0793\u078d\3\2\2\2\u0793"+ + "\u078f\3\2\2\2\u0793\u0791\3\2\2\2\u0794\u01bc\3\2\2\2\u0795\u0796\7^"+ + "\2\2\u0796\u0797\7z\2\2\u0797\u0798\3\2\2\2\u0798\u07af\5\u01d7\u00ea"+ + "\2\u0799\u079a\7^\2\2\u079a\u079b\7z\2\2\u079b\u079c\3\2\2\2\u079c\u079d"+ + "\5\u01d7\u00ea\2\u079d\u079e\5\u01d7\u00ea\2\u079e\u07af\3\2\2\2\u079f"+ + "\u07a0\7^\2\2\u07a0\u07a1\7z\2\2\u07a1\u07a2\3\2\2\2\u07a2\u07a3\5\u01d7"+ + "\u00ea\2\u07a3\u07a4\5\u01d7\u00ea\2\u07a4\u07a5\5\u01d7\u00ea\2\u07a5"+ + "\u07af\3\2\2\2\u07a6\u07a7\7^\2\2\u07a7\u07a8\7z\2\2\u07a8\u07a9\3\2\2"+ + "\2\u07a9\u07aa\5\u01d7\u00ea\2\u07aa\u07ab\5\u01d7\u00ea\2\u07ab\u07ac"+ + "\5\u01d7\u00ea\2\u07ac\u07ad\5\u01d7\u00ea\2\u07ad\u07af\3\2\2\2\u07ae"+ + "\u0795\3\2\2\2\u07ae\u0799\3\2\2\2\u07ae\u079f\3\2\2\2\u07ae\u07a6\3\2"+ + "\2\2\u07af\u01be\3\2\2\2\u07b0\u07b1\7\17\2\2\u07b1\u07b4\7\f\2\2\u07b2"+ + "\u07b4\t\17\2\2\u07b3\u07b0\3\2\2\2\u07b3\u07b2\3\2\2\2\u07b4\u01c0\3"+ + "\2\2\2\u07b5\u07b8\5\u01c3\u00e0\2\u07b6\u07b8\t\24\2\2\u07b7\u07b5\3"+ + "\2\2\2\u07b7\u07b6\3\2\2\2\u07b8\u01c2\3\2\2\2\u07b9\u07ba\t\25\2\2\u07ba"+ + "\u01c4\3\2\2\2\u07bb\u07bf\5\u01c7\u00e2\2\u07bc\u07be\5\u01c9\u00e3\2"+ + "\u07bd\u07bc\3\2\2\2\u07be\u07c1\3\2\2\2\u07bf\u07bd\3\2\2\2\u07bf\u07c0"+ + "\3\2\2\2\u07c0\u01c6\3\2\2\2\u07c1\u07bf\3\2\2\2\u07c2\u07c5\5\u01cb\u00e4"+ + "\2\u07c3\u07c5\7a\2\2\u07c4\u07c2\3\2\2\2\u07c4\u07c3\3\2\2\2\u07c5\u01c8"+ + "\3\2\2\2\u07c6\u07cc\5\u01cb\u00e4\2\u07c7\u07cc\5\u01cd\u00e5\2\u07c8"+ + "\u07cc\5\u01cf\u00e6\2\u07c9\u07cc\5\u01d1\u00e7\2\u07ca\u07cc\5\u01d3"+ + "\u00e8\2\u07cb\u07c6\3\2\2\2\u07cb\u07c7\3\2\2\2\u07cb\u07c8\3\2\2\2\u07cb"+ + "\u07c9\3\2\2\2\u07cb\u07ca\3\2\2\2\u07cc\u01ca\3\2\2\2\u07cd\u07d5\5\u01d9"+ + "\u00eb\2\u07ce\u07d5\5\u01db\u00ec\2\u07cf\u07d5\5\u01dd\u00ed\2\u07d0"+ + "\u07d5\5\u01df\u00ee\2\u07d1\u07d5\5\u01e1\u00ef\2\u07d2\u07d5\5\u01e3"+ + "\u00f0\2\u07d3\u07d5\5\u01d5\u00e9\2\u07d4\u07cd\3\2\2\2\u07d4\u07ce\3"+ + "\2\2\2\u07d4\u07cf\3\2\2\2\u07d4\u07d0\3\2\2\2\u07d4\u07d1\3\2\2\2\u07d4"+ + "\u07d2\3\2\2\2\u07d4\u07d3\3\2\2\2\u07d5\u01cc\3\2\2\2\u07d6\u07d9\5\u01ed"+ + "\u00f5\2\u07d7\u07d9\5\u01d5\u00e9\2\u07d8\u07d6\3\2\2\2\u07d8\u07d7\3"+ + "\2\2\2\u07d9\u01ce\3\2\2\2\u07da\u07dd\5\u01eb\u00f4\2\u07db\u07dd\5\u01d5"+ + "\u00e9\2\u07dc\u07da\3\2\2\2\u07dc\u07db\3\2\2\2\u07dd\u01d0\3\2\2\2\u07de"+ + "\u07e2\5\u01e5\u00f1\2\u07df\u07e2\5\u01e7\u00f2\2\u07e0\u07e2\5\u01d5"+ + "\u00e9\2\u07e1\u07de\3\2\2\2\u07e1\u07df\3\2\2\2\u07e1\u07e0\3\2\2\2\u07e2"+ + "\u01d2\3\2\2\2\u07e3\u07e6\5\u01e9\u00f3\2\u07e4\u07e6\5\u01d5\u00e9\2"+ + "\u07e5\u07e3\3\2\2\2\u07e5\u07e4\3\2\2\2\u07e6\u01d4\3\2\2\2\u07e7\u07e8"+ + "\7^\2\2\u07e8\u07e9\7w\2\2\u07e9\u07ea\3\2\2\2\u07ea\u07eb\5\u01d7\u00ea"+ + "\2\u07eb\u07ec\5\u01d7\u00ea\2\u07ec\u07ed\5\u01d7\u00ea\2\u07ed\u07ee"+ + "\5\u01d7\u00ea\2\u07ee\u07fc\3\2\2\2\u07ef\u07f0\7^\2\2\u07f0\u07f1\7"+ + "W\2\2\u07f1\u07f2\3\2\2\2\u07f2\u07f3\5\u01d7\u00ea\2\u07f3\u07f4\5\u01d7"+ + "\u00ea\2\u07f4\u07f5\5\u01d7\u00ea\2\u07f5\u07f6\5\u01d7\u00ea\2\u07f6"+ + "\u07f7\5\u01d7\u00ea\2\u07f7\u07f8\5\u01d7\u00ea\2\u07f8\u07f9\5\u01d7"+ + "\u00ea\2\u07f9\u07fa\5\u01d7\u00ea\2\u07fa\u07fc\3\2\2\2\u07fb\u07e7\3"+ + "\2\2\2\u07fb\u07ef\3\2\2\2\u07fc\u01d6\3\2\2\2\u07fd\u07ff\t\26\2\2\u07fe"+ + "\u07fd\3\2\2\2\u07ff\u01d8\3\2\2\2\u0800\u0801\t\27\2\2\u0801\u01da\3"+ + "\2\2\2\u0802\u0803\t\30\2\2\u0803\u01dc\3\2\2\2\u0804\u0805\t\31\2\2\u0805"+ + "\u01de\3\2\2\2\u0806\u0807\t\32\2\2\u0807\u01e0\3\2\2\2\u0808\u0809\t"+ + "\33\2\2\u0809\u01e2\3\2\2\2\u080a\u080b\t\34\2\2\u080b\u01e4\3\2\2\2\u080c"+ + "\u080d\4\u0302\u0312\2\u080d\u01e6\3\2\2\2\u080e\u080f\t\35\2\2\u080f"+ + "\u01e8\3\2\2\2\u0810\u0811\t\36\2\2\u0811\u01ea\3\2\2\2\u0812\u0813\t"+ + "\37\2\2\u0813\u01ec\3\2\2\2\u0814\u0815\t \2\2\u0815\u01ee\3\2\2\2O\2"+ + "\3\4\5\6\u01fa\u020f\u021d\u0228\u0232\u0234\u04e0\u04e8\u04ee\u04f2\u04f6"+ + "\u04fe\u0504\u0508\u050f\u0515\u0518\u051f\u0525\u0528\u052e\u0534\u0537"+ + "\u053e\u0544\u0548\u054b\u0551\u0557\u055d\u055f\u0561\u0566\u056d\u056f"+ + "\u057a\u057c\u0623\u0629\u0639\u063e\u0645\u0698\u06a8\u06b7\u06ca\u06da"+ + "\u06eb\u072f\u0741\u074f\u075e\u0762\u0765\u0769\u076f\u0775\u077b\u0793"+ + "\u07ae\u07b3\u07b7\u07bf\u07c4\u07cb\u07d4\u07d8\u07dc\u07e1\u07e5\u07fb"+ + "\u07fe$\2\4\2\2\3\2\4\5\2\3|\2\7\3\2\3}\3\3~\4\3\177\5\3\u0086\6\3\u00ae"+ + "\7\b\2\2\7\2\2\3\u00b1\b\6\2\2\t\u00b6\2\3\u00b5\t\2\5\2\tb\2\t,\2\t\66"+ + "\2\t&\2\4\6\2\t \2\t\u0083\2\t\u0084\2\t\u0091\2\t\u009e\2\t\u009f\2\t"+ + "\u009b\2\t\u009c\2\t]\2\t\7\2\4\2\2\t\u00c6\2"; + 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); + } + } +} diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpParser.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpParser.java new file mode 100644 index 0000000000..9ab49d0715 --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpParser.java @@ -0,0 +1,20407 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.antlr; + +// Generated from CSharpParser.g4 by ANTLR 4.9.2 +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; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class CSharpParser extends Parser { + static { RuntimeMetaData.checkVersion("4.9.2", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + BYTE_ORDER_MARK=1, SINGLE_LINE_DOC_COMMENT=2, EMPTY_DELIMITED_DOC_COMMENT=3, + DELIMITED_DOC_COMMENT=4, SINGLE_LINE_COMMENT=5, DELIMITED_COMMENT=6, WHITESPACES=7, + SHARP=8, ABSTRACT=9, ADD=10, ALIAS=11, ARGLIST=12, AS=13, ASCENDING=14, + ASYNC=15, AWAIT=16, BASE=17, BOOL=18, BREAK=19, BY=20, BYTE=21, CASE=22, + CATCH=23, CHAR=24, CHECKED=25, CLASS=26, CONST=27, CONTINUE=28, DECIMAL=29, + DEFAULT=30, DELEGATE=31, DESCENDING=32, DO=33, DOUBLE=34, DYNAMIC=35, + ELSE=36, ENUM=37, EQUALS=38, EVENT=39, EXPLICIT=40, EXTERN=41, FALSE=42, + FINALLY=43, FIXED=44, FLOAT=45, FOR=46, FOREACH=47, FROM=48, GET=49, GOTO=50, + GROUP=51, IF=52, IMPLICIT=53, IN=54, INT=55, INTERFACE=56, INTERNAL=57, + INTO=58, IS=59, JOIN=60, LET=61, LOCK=62, LONG=63, NAMEOF=64, NAMESPACE=65, + NEW=66, NULL_=67, OBJECT=68, ON=69, OPERATOR=70, ORDERBY=71, OUT=72, OVERRIDE=73, + PARAMS=74, PARTIAL=75, PRIVATE=76, PROTECTED=77, PUBLIC=78, READONLY=79, + REF=80, REMOVE=81, RETURN=82, SBYTE=83, SEALED=84, SELECT=85, SET=86, + SHORT=87, SIZEOF=88, STACKALLOC=89, STATIC=90, STRING=91, STRUCT=92, SWITCH=93, + THIS=94, THROW=95, TRUE=96, TRY=97, TYPEOF=98, UINT=99, ULONG=100, UNCHECKED=101, + UNMANAGED=102, UNSAFE=103, USHORT=104, USING=105, VAR=106, VIRTUAL=107, + VOID=108, VOLATILE=109, WHEN=110, WHERE=111, WHILE=112, YIELD=113, IDENTIFIER=114, + LITERAL_ACCESS=115, INTEGER_LITERAL=116, HEX_INTEGER_LITERAL=117, BIN_INTEGER_LITERAL=118, + REAL_LITERAL=119, CHARACTER_LITERAL=120, REGULAR_STRING=121, VERBATIUM_STRING=122, + INTERPOLATED_REGULAR_STRING_START=123, INTERPOLATED_VERBATIUM_STRING_START=124, + OPEN_BRACE=125, CLOSE_BRACE=126, OPEN_BRACKET=127, CLOSE_BRACKET=128, + OPEN_PARENS=129, CLOSE_PARENS=130, DOT=131, COMMA=132, COLON=133, SEMICOLON=134, + PLUS=135, MINUS=136, STAR=137, DIV=138, PERCENT=139, AMP=140, BITWISE_OR=141, + CARET=142, BANG=143, TILDE=144, ASSIGNMENT=145, LT=146, GT=147, INTERR=148, + DOUBLE_COLON=149, OP_COALESCING=150, OP_INC=151, OP_DEC=152, OP_AND=153, + OP_OR=154, OP_PTR=155, OP_EQ=156, OP_NE=157, OP_LE=158, OP_GE=159, OP_ADD_ASSIGNMENT=160, + OP_SUB_ASSIGNMENT=161, OP_MULT_ASSIGNMENT=162, OP_DIV_ASSIGNMENT=163, + OP_MOD_ASSIGNMENT=164, OP_AND_ASSIGNMENT=165, OP_OR_ASSIGNMENT=166, OP_XOR_ASSIGNMENT=167, + OP_LEFT_SHIFT=168, OP_LEFT_SHIFT_ASSIGNMENT=169, OP_COALESCING_ASSIGNMENT=170, + OP_RANGE=171, DOUBLE_CURLY_INSIDE=172, OPEN_BRACE_INSIDE=173, REGULAR_CHAR_INSIDE=174, + VERBATIUM_DOUBLE_QUOTE_INSIDE=175, DOUBLE_QUOTE_INSIDE=176, REGULAR_STRING_INSIDE=177, + VERBATIUM_INSIDE_STRING=178, CLOSE_BRACE_INSIDE=179, FORMAT_STRING=180, + DIRECTIVE_WHITESPACES=181, DIGITS=182, DEFINE=183, UNDEF=184, ELIF=185, + ENDIF=186, LINE=187, ERROR=188, WARNING=189, REGION=190, ENDREGION=191, + PRAGMA=192, NULLABLE=193, DIRECTIVE_HIDDEN=194, CONDITIONAL_SYMBOL=195, + DIRECTIVE_NEW_LINE=196, TEXT=197, DOUBLE_CURLY_CLOSE_INSIDE=198; + public static final int + RULE_compilation_unit = 0, RULE_namespace_or_type_name = 1, RULE_type_ = 2, + RULE_base_type = 3, RULE_tuple_type = 4, RULE_tuple_element = 5, RULE_simple_type = 6, + RULE_numeric_type = 7, RULE_integral_type = 8, RULE_floating_point_type = 9, + RULE_class_type = 10, RULE_type_argument_list = 11, RULE_argument_list = 12, + RULE_argument = 13, RULE_expression = 14, RULE_non_assignment_expression = 15, + RULE_assignment = 16, RULE_assignment_operator = 17, RULE_conditional_expression = 18, + RULE_null_coalescing_expression = 19, RULE_conditional_or_expression = 20, + RULE_conditional_and_expression = 21, RULE_inclusive_or_expression = 22, + RULE_exclusive_or_expression = 23, RULE_and_expression = 24, RULE_equality_expression = 25, + RULE_relational_expression = 26, RULE_shift_expression = 27, RULE_additive_expression = 28, + RULE_multiplicative_expression = 29, RULE_switch_expression = 30, RULE_switch_expression_arms = 31, + RULE_switch_expression_arm = 32, RULE_range_expression = 33, RULE_unary_expression = 34, + RULE_primary_expression = 35, RULE_primary_expression_start = 36, RULE_throwable_expression = 37, + RULE_throw_expression = 38, RULE_member_access = 39, RULE_bracket_expression = 40, + RULE_indexer_argument = 41, RULE_predefined_type = 42, RULE_expression_list = 43, + RULE_object_or_collection_initializer = 44, RULE_object_initializer = 45, + RULE_member_initializer_list = 46, RULE_member_initializer = 47, RULE_initializer_value = 48, + RULE_collection_initializer = 49, RULE_element_initializer = 50, RULE_anonymous_object_initializer = 51, + RULE_member_declarator_list = 52, RULE_member_declarator = 53, RULE_unbound_type_name = 54, + RULE_generic_dimension_specifier = 55, RULE_isType = 56, RULE_isTypePatternArms = 57, + RULE_isTypePatternArm = 58, RULE_lambda_expression = 59, RULE_anonymous_function_signature = 60, + RULE_explicit_anonymous_function_parameter_list = 61, RULE_explicit_anonymous_function_parameter = 62, + RULE_implicit_anonymous_function_parameter_list = 63, RULE_anonymous_function_body = 64, + RULE_query_expression = 65, RULE_from_clause = 66, RULE_query_body = 67, + RULE_query_body_clause = 68, RULE_let_clause = 69, RULE_where_clause = 70, + RULE_combined_join_clause = 71, RULE_orderby_clause = 72, RULE_ordering = 73, + RULE_select_or_group_clause = 74, RULE_query_continuation = 75, RULE_statement = 76, + RULE_declarationStatement = 77, RULE_local_function_declaration = 78, + RULE_local_function_header = 79, RULE_local_function_modifiers = 80, RULE_local_function_body = 81, + RULE_labeled_Statement = 82, RULE_embedded_statement = 83, RULE_simple_embedded_statement = 84, + RULE_block = 85, RULE_local_variable_declaration = 86, RULE_local_variable_type = 87, + RULE_local_variable_declarator = 88, RULE_local_variable_initializer = 89, + RULE_local_constant_declaration = 90, RULE_if_body = 91, RULE_switch_section = 92, + RULE_switch_label = 93, RULE_case_guard = 94, RULE_statement_list = 95, + RULE_for_initializer = 96, RULE_for_iterator = 97, RULE_catch_clauses = 98, + RULE_specific_catch_clause = 99, RULE_general_catch_clause = 100, RULE_exception_filter = 101, + RULE_finally_clause = 102, RULE_resource_acquisition = 103, RULE_namespace_declaration = 104, + RULE_qualified_identifier = 105, RULE_namespace_body = 106, RULE_extern_alias_directives = 107, + RULE_extern_alias_directive = 108, RULE_using_directives = 109, RULE_using_directive = 110, + RULE_namespace_member_declarations = 111, RULE_namespace_member_declaration = 112, + RULE_type_declaration = 113, RULE_qualified_alias_member = 114, RULE_type_parameter_list = 115, + RULE_type_parameter = 116, RULE_class_base = 117, RULE_interface_type_list = 118, + RULE_type_parameter_constraints_clauses = 119, RULE_type_parameter_constraints_clause = 120, + RULE_type_parameter_constraints = 121, RULE_primary_constraint = 122, + RULE_secondary_constraints = 123, RULE_constructor_constraint = 124, RULE_class_body = 125, + RULE_class_member_declarations = 126, RULE_class_member_declaration = 127, + RULE_all_member_modifiers = 128, RULE_all_member_modifier = 129, RULE_common_member_declaration = 130, + RULE_typed_member_declaration = 131, RULE_constant_declarators = 132, + RULE_constant_declarator = 133, RULE_variable_declarators = 134, RULE_variable_declarator = 135, + RULE_variable_initializer = 136, RULE_return_type = 137, RULE_member_name = 138, + RULE_method_body = 139, RULE_formal_parameter_list = 140, RULE_fixed_parameters = 141, + RULE_fixed_parameter = 142, RULE_parameter_modifier = 143, RULE_parameter_array = 144, + RULE_accessor_declarations = 145, RULE_get_accessor_declaration = 146, + RULE_set_accessor_declaration = 147, RULE_accessor_modifier = 148, RULE_accessor_body = 149, + RULE_event_accessor_declarations = 150, RULE_add_accessor_declaration = 151, + RULE_remove_accessor_declaration = 152, RULE_overloadable_operator = 153, + RULE_conversion_operator_declarator = 154, RULE_constructor_initializer = 155, + RULE_body = 156, RULE_struct_interfaces = 157, RULE_struct_body = 158, + RULE_struct_member_declaration = 159, RULE_array_type = 160, RULE_rank_specifier = 161, + RULE_array_initializer = 162, RULE_variant_type_parameter_list = 163, + RULE_variant_type_parameter = 164, RULE_variance_annotation = 165, RULE_interface_base = 166, + RULE_interface_body = 167, RULE_interface_member_declaration = 168, RULE_interface_accessors = 169, + RULE_enum_base = 170, RULE_enum_body = 171, RULE_enum_member_declaration = 172, + RULE_global_attribute_section = 173, RULE_global_attribute_target = 174, + RULE_attributes = 175, RULE_attribute_section = 176, RULE_attribute_target = 177, + RULE_attribute_list = 178, RULE_attribute = 179, RULE_attribute_argument = 180, + RULE_pointer_type = 181, RULE_fixed_pointer_declarators = 182, RULE_fixed_pointer_declarator = 183, + RULE_fixed_pointer_initializer = 184, RULE_fixed_size_buffer_declarator = 185, + RULE_stackalloc_initializer = 186, RULE_right_arrow = 187, RULE_right_shift = 188, + RULE_right_shift_assignment = 189, RULE_literal = 190, RULE_boolean_literal = 191, + RULE_string_literal = 192, RULE_interpolated_regular_string = 193, RULE_interpolated_verbatium_string = 194, + RULE_interpolated_regular_string_part = 195, RULE_interpolated_verbatium_string_part = 196, + RULE_interpolated_string_expression = 197, RULE_keyword = 198, RULE_class_definition = 199, + RULE_struct_definition = 200, RULE_interface_definition = 201, RULE_enum_definition = 202, + RULE_delegate_definition = 203, RULE_event_declaration = 204, RULE_field_declaration = 205, + RULE_property_declaration = 206, RULE_constant_declaration = 207, RULE_indexer_declaration = 208, + RULE_destructor_definition = 209, RULE_constructor_declaration = 210, + RULE_method_declaration = 211, RULE_method_member_name = 212, RULE_operator_declaration = 213, + RULE_arg_declaration = 214, RULE_method_invocation = 215, RULE_object_creation_expression = 216, + RULE_identifier = 217; + private static String[] makeRuleNames() { + return new String[] { + "compilation_unit", "namespace_or_type_name", "type_", "base_type", "tuple_type", + "tuple_element", "simple_type", "numeric_type", "integral_type", "floating_point_type", + "class_type", "type_argument_list", "argument_list", "argument", "expression", + "non_assignment_expression", "assignment", "assignment_operator", "conditional_expression", + "null_coalescing_expression", "conditional_or_expression", "conditional_and_expression", + "inclusive_or_expression", "exclusive_or_expression", "and_expression", + "equality_expression", "relational_expression", "shift_expression", "additive_expression", + "multiplicative_expression", "switch_expression", "switch_expression_arms", + "switch_expression_arm", "range_expression", "unary_expression", "primary_expression", + "primary_expression_start", "throwable_expression", "throw_expression", + "member_access", "bracket_expression", "indexer_argument", "predefined_type", + "expression_list", "object_or_collection_initializer", "object_initializer", + "member_initializer_list", "member_initializer", "initializer_value", + "collection_initializer", "element_initializer", "anonymous_object_initializer", + "member_declarator_list", "member_declarator", "unbound_type_name", "generic_dimension_specifier", + "isType", "isTypePatternArms", "isTypePatternArm", "lambda_expression", + "anonymous_function_signature", "explicit_anonymous_function_parameter_list", + "explicit_anonymous_function_parameter", "implicit_anonymous_function_parameter_list", + "anonymous_function_body", "query_expression", "from_clause", "query_body", + "query_body_clause", "let_clause", "where_clause", "combined_join_clause", + "orderby_clause", "ordering", "select_or_group_clause", "query_continuation", + "statement", "declarationStatement", "local_function_declaration", "local_function_header", + "local_function_modifiers", "local_function_body", "labeled_Statement", + "embedded_statement", "simple_embedded_statement", "block", "local_variable_declaration", + "local_variable_type", "local_variable_declarator", "local_variable_initializer", + "local_constant_declaration", "if_body", "switch_section", "switch_label", + "case_guard", "statement_list", "for_initializer", "for_iterator", "catch_clauses", + "specific_catch_clause", "general_catch_clause", "exception_filter", + "finally_clause", "resource_acquisition", "namespace_declaration", "qualified_identifier", + "namespace_body", "extern_alias_directives", "extern_alias_directive", + "using_directives", "using_directive", "namespace_member_declarations", + "namespace_member_declaration", "type_declaration", "qualified_alias_member", + "type_parameter_list", "type_parameter", "class_base", "interface_type_list", + "type_parameter_constraints_clauses", "type_parameter_constraints_clause", + "type_parameter_constraints", "primary_constraint", "secondary_constraints", + "constructor_constraint", "class_body", "class_member_declarations", + "class_member_declaration", "all_member_modifiers", "all_member_modifier", + "common_member_declaration", "typed_member_declaration", "constant_declarators", + "constant_declarator", "variable_declarators", "variable_declarator", + "variable_initializer", "return_type", "member_name", "method_body", + "formal_parameter_list", "fixed_parameters", "fixed_parameter", "parameter_modifier", + "parameter_array", "accessor_declarations", "get_accessor_declaration", + "set_accessor_declaration", "accessor_modifier", "accessor_body", "event_accessor_declarations", + "add_accessor_declaration", "remove_accessor_declaration", "overloadable_operator", + "conversion_operator_declarator", "constructor_initializer", "body", + "struct_interfaces", "struct_body", "struct_member_declaration", "array_type", + "rank_specifier", "array_initializer", "variant_type_parameter_list", + "variant_type_parameter", "variance_annotation", "interface_base", "interface_body", + "interface_member_declaration", "interface_accessors", "enum_base", "enum_body", + "enum_member_declaration", "global_attribute_section", "global_attribute_target", + "attributes", "attribute_section", "attribute_target", "attribute_list", + "attribute", "attribute_argument", "pointer_type", "fixed_pointer_declarators", + "fixed_pointer_declarator", "fixed_pointer_initializer", "fixed_size_buffer_declarator", + "stackalloc_initializer", "right_arrow", "right_shift", "right_shift_assignment", + "literal", "boolean_literal", "string_literal", "interpolated_regular_string", + "interpolated_verbatium_string", "interpolated_regular_string_part", + "interpolated_verbatium_string_part", "interpolated_string_expression", + "keyword", "class_definition", "struct_definition", "interface_definition", + "enum_definition", "delegate_definition", "event_declaration", "field_declaration", + "property_declaration", "constant_declaration", "indexer_declaration", + "destructor_definition", "constructor_declaration", "method_declaration", + "method_member_name", "operator_declaration", "arg_declaration", "method_invocation", + "object_creation_expression", "identifier" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, "'\u00EF\u00BB\u00BF'", null, "'/***/'", null, null, null, null, + "'#'", "'abstract'", "'add'", "'alias'", "'__arglist'", "'as'", "'ascending'", + "'async'", "'await'", "'base'", "'bool'", "'break'", "'by'", "'byte'", + "'case'", "'catch'", "'char'", "'checked'", "'class'", "'const'", "'continue'", + "'decimal'", "'default'", "'delegate'", "'descending'", "'do'", "'double'", + "'dynamic'", "'else'", "'enum'", "'equals'", "'event'", "'explicit'", + "'extern'", "'false'", "'finally'", "'fixed'", "'float'", "'for'", "'foreach'", + "'from'", "'get'", "'goto'", "'group'", "'if'", "'implicit'", "'in'", + "'int'", "'interface'", "'internal'", "'into'", "'is'", "'join'", "'let'", + "'lock'", "'long'", "'nameof'", "'namespace'", "'new'", "'null'", "'object'", + "'on'", "'operator'", "'orderby'", "'out'", "'override'", "'params'", + "'partial'", "'private'", "'protected'", "'public'", "'readonly'", "'ref'", + "'remove'", "'return'", "'sbyte'", "'sealed'", "'select'", "'set'", "'short'", + "'sizeof'", "'stackalloc'", "'static'", "'string'", "'struct'", "'switch'", + "'this'", "'throw'", "'true'", "'try'", "'typeof'", "'uint'", "'ulong'", + "'unchecked'", "'unmanaged'", "'unsafe'", "'ushort'", "'using'", "'var'", + "'virtual'", "'void'", "'volatile'", "'when'", "'where'", "'while'", + "'yield'", null, null, null, null, null, null, null, null, null, null, + null, "'{'", "'}'", "'['", "']'", "'('", "')'", "'.'", "','", "':'", + "';'", "'+'", "'-'", "'*'", "'/'", "'%'", "'&'", "'|'", "'^'", "'!'", + "'~'", "'='", "'<'", "'>'", "'?'", "'::'", "'??'", "'++'", "'--'", "'&&'", + "'||'", "'->'", "'=='", "'!='", "'<='", "'>='", "'+='", "'-='", "'*='", + "'/='", "'%='", "'&='", "'|='", "'^='", "'<<'", "'<<='", "'??='", "'..'", + "'{{'", null, null, null, null, null, null, null, null, null, null, "'define'", + "'undef'", "'elif'", "'endif'", "'line'", null, null, null, null, null, + null, "'hidden'", null, null, null, "'}}'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, "BYTE_ORDER_MARK", "SINGLE_LINE_DOC_COMMENT", "EMPTY_DELIMITED_DOC_COMMENT", + "DELIMITED_DOC_COMMENT", "SINGLE_LINE_COMMENT", "DELIMITED_COMMENT", + "WHITESPACES", "SHARP", "ABSTRACT", "ADD", "ALIAS", "ARGLIST", "AS", + "ASCENDING", "ASYNC", "AWAIT", "BASE", "BOOL", "BREAK", "BY", "BYTE", + "CASE", "CATCH", "CHAR", "CHECKED", "CLASS", "CONST", "CONTINUE", "DECIMAL", + "DEFAULT", "DELEGATE", "DESCENDING", "DO", "DOUBLE", "DYNAMIC", "ELSE", + "ENUM", "EQUALS", "EVENT", "EXPLICIT", "EXTERN", "FALSE", "FINALLY", + "FIXED", "FLOAT", "FOR", "FOREACH", "FROM", "GET", "GOTO", "GROUP", "IF", + "IMPLICIT", "IN", "INT", "INTERFACE", "INTERNAL", "INTO", "IS", "JOIN", + "LET", "LOCK", "LONG", "NAMEOF", "NAMESPACE", "NEW", "NULL_", "OBJECT", + "ON", "OPERATOR", "ORDERBY", "OUT", "OVERRIDE", "PARAMS", "PARTIAL", + "PRIVATE", "PROTECTED", "PUBLIC", "READONLY", "REF", "REMOVE", "RETURN", + "SBYTE", "SEALED", "SELECT", "SET", "SHORT", "SIZEOF", "STACKALLOC", + "STATIC", "STRING", "STRUCT", "SWITCH", "THIS", "THROW", "TRUE", "TRY", + "TYPEOF", "UINT", "ULONG", "UNCHECKED", "UNMANAGED", "UNSAFE", "USHORT", + "USING", "VAR", "VIRTUAL", "VOID", "VOLATILE", "WHEN", "WHERE", "WHILE", + "YIELD", "IDENTIFIER", "LITERAL_ACCESS", "INTEGER_LITERAL", "HEX_INTEGER_LITERAL", + "BIN_INTEGER_LITERAL", "REAL_LITERAL", "CHARACTER_LITERAL", "REGULAR_STRING", + "VERBATIUM_STRING", "INTERPOLATED_REGULAR_STRING_START", "INTERPOLATED_VERBATIUM_STRING_START", + "OPEN_BRACE", "CLOSE_BRACE", "OPEN_BRACKET", "CLOSE_BRACKET", "OPEN_PARENS", + "CLOSE_PARENS", "DOT", "COMMA", "COLON", "SEMICOLON", "PLUS", "MINUS", + "STAR", "DIV", "PERCENT", "AMP", "BITWISE_OR", "CARET", "BANG", "TILDE", + "ASSIGNMENT", "LT", "GT", "INTERR", "DOUBLE_COLON", "OP_COALESCING", + "OP_INC", "OP_DEC", "OP_AND", "OP_OR", "OP_PTR", "OP_EQ", "OP_NE", "OP_LE", + "OP_GE", "OP_ADD_ASSIGNMENT", "OP_SUB_ASSIGNMENT", "OP_MULT_ASSIGNMENT", + "OP_DIV_ASSIGNMENT", "OP_MOD_ASSIGNMENT", "OP_AND_ASSIGNMENT", "OP_OR_ASSIGNMENT", + "OP_XOR_ASSIGNMENT", "OP_LEFT_SHIFT", "OP_LEFT_SHIFT_ASSIGNMENT", "OP_COALESCING_ASSIGNMENT", + "OP_RANGE", "DOUBLE_CURLY_INSIDE", "OPEN_BRACE_INSIDE", "REGULAR_CHAR_INSIDE", + "VERBATIUM_DOUBLE_QUOTE_INSIDE", "DOUBLE_QUOTE_INSIDE", "REGULAR_STRING_INSIDE", + "VERBATIUM_INSIDE_STRING", "CLOSE_BRACE_INSIDE", "FORMAT_STRING", "DIRECTIVE_WHITESPACES", + "DIGITS", "DEFINE", "UNDEF", "ELIF", "ENDIF", "LINE", "ERROR", "WARNING", + "REGION", "ENDREGION", "PRAGMA", "NULLABLE", "DIRECTIVE_HIDDEN", "CONDITIONAL_SYMBOL", + "DIRECTIVE_NEW_LINE", "TEXT", "DOUBLE_CURLY_CLOSE_INSIDE" + }; + } + 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 "CSharpParser.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public CSharpParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + public static class Compilation_unitContext extends ParserRuleContext { + public TerminalNode EOF() { return getToken(CSharpParser.EOF, 0); } + public TerminalNode BYTE_ORDER_MARK() { return getToken(CSharpParser.BYTE_ORDER_MARK, 0); } + public Extern_alias_directivesContext extern_alias_directives() { + return getRuleContext(Extern_alias_directivesContext.class,0); + } + public Using_directivesContext using_directives() { + return getRuleContext(Using_directivesContext.class,0); + } + public List global_attribute_section() { + return getRuleContexts(Global_attribute_sectionContext.class); + } + public Global_attribute_sectionContext global_attribute_section(int i) { + return getRuleContext(Global_attribute_sectionContext.class,i); + } + public Namespace_member_declarationsContext namespace_member_declarations() { + return getRuleContext(Namespace_member_declarationsContext.class,0); + } + public Compilation_unitContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_compilation_unit; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterCompilation_unit(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitCompilation_unit(this); + } + } + + public final Compilation_unitContext compilation_unit() throws RecognitionException { + Compilation_unitContext _localctx = new Compilation_unitContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_compilation_unit); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(437); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==BYTE_ORDER_MARK) { + { + setState(436); + match(BYTE_ORDER_MARK); + } + } + + setState(440); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,1,_ctx) ) { + case 1: + { + setState(439); + extern_alias_directives(); + } + break; + } + setState(443); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==USING) { + { + setState(442); + using_directives(); + } + } + + setState(448); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,3,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(445); + global_attribute_section(); + } + } + } + setState(450); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,3,_ctx); + } + setState(452); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ABSTRACT) | (1L << ASYNC) | (1L << CLASS) | (1L << DELEGATE) | (1L << ENUM) | (1L << EXTERN) | (1L << INTERFACE) | (1L << INTERNAL))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (NAMESPACE - 65)) | (1L << (NEW - 65)) | (1L << (OVERRIDE - 65)) | (1L << (PARTIAL - 65)) | (1L << (PRIVATE - 65)) | (1L << (PROTECTED - 65)) | (1L << (PUBLIC - 65)) | (1L << (READONLY - 65)) | (1L << (REF - 65)) | (1L << (SEALED - 65)) | (1L << (STATIC - 65)) | (1L << (STRUCT - 65)) | (1L << (UNSAFE - 65)) | (1L << (VIRTUAL - 65)) | (1L << (VOLATILE - 65)) | (1L << (OPEN_BRACKET - 65)))) != 0)) { + { + setState(451); + namespace_member_declarations(); + } + } + + setState(454); + match(EOF); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Namespace_or_type_nameContext extends ParserRuleContext { + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public Qualified_alias_memberContext qualified_alias_member() { + return getRuleContext(Qualified_alias_memberContext.class,0); + } + public List DOT() { return getTokens(CSharpParser.DOT); } + public TerminalNode DOT(int i) { + return getToken(CSharpParser.DOT, i); + } + public List type_argument_list() { + return getRuleContexts(Type_argument_listContext.class); + } + public Type_argument_listContext type_argument_list(int i) { + return getRuleContext(Type_argument_listContext.class,i); + } + public Namespace_or_type_nameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namespace_or_type_name; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterNamespace_or_type_name(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitNamespace_or_type_name(this); + } + } + + public final Namespace_or_type_nameContext namespace_or_type_name() throws RecognitionException { + Namespace_or_type_nameContext _localctx = new Namespace_or_type_nameContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_namespace_or_type_name); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(461); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { + case 1: + { + setState(456); + identifier(); + setState(458); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) { + case 1: + { + setState(457); + type_argument_list(); + } + break; + } + } + break; + case 2: + { + setState(460); + qualified_alias_member(); + } + break; + } + setState(470); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,8,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(463); + match(DOT); + setState(464); + identifier(); + setState(466); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { + case 1: + { + setState(465); + type_argument_list(); + } + break; + } + } + } + } + setState(472); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,8,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Type_Context extends ParserRuleContext { + public Base_typeContext base_type() { + return getRuleContext(Base_typeContext.class,0); + } + public List INTERR() { return getTokens(CSharpParser.INTERR); } + public TerminalNode INTERR(int i) { + return getToken(CSharpParser.INTERR, i); + } + public List rank_specifier() { + return getRuleContexts(Rank_specifierContext.class); + } + public Rank_specifierContext rank_specifier(int i) { + return getRuleContext(Rank_specifierContext.class,i); + } + public List STAR() { return getTokens(CSharpParser.STAR); } + public TerminalNode STAR(int i) { + return getToken(CSharpParser.STAR, i); + } + public Type_Context(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_type_; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterType_(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitType_(this); + } + } + + public final Type_Context type_() throws RecognitionException { + Type_Context _localctx = new Type_Context(_ctx, getState()); + enterRule(_localctx, 4, RULE_type_); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(473); + base_type(); + setState(479); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,10,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + setState(477); + _errHandler.sync(this); + switch (_input.LA(1)) { + case INTERR: + { + setState(474); + match(INTERR); + } + break; + case OPEN_BRACKET: + { + setState(475); + rank_specifier(); + } + break; + case STAR: + { + setState(476); + match(STAR); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + setState(481); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,10,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Base_typeContext extends ParserRuleContext { + public Simple_typeContext simple_type() { + return getRuleContext(Simple_typeContext.class,0); + } + public Class_typeContext class_type() { + return getRuleContext(Class_typeContext.class,0); + } + public TerminalNode VOID() { return getToken(CSharpParser.VOID, 0); } + public TerminalNode STAR() { return getToken(CSharpParser.STAR, 0); } + public Tuple_typeContext tuple_type() { + return getRuleContext(Tuple_typeContext.class,0); + } + public Base_typeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_base_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterBase_type(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitBase_type(this); + } + } + + public final Base_typeContext base_type() throws RecognitionException { + Base_typeContext _localctx = new Base_typeContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_base_type); + try { + setState(487); + _errHandler.sync(this); + switch (_input.LA(1)) { + case BOOL: + case BYTE: + case CHAR: + case DECIMAL: + case DOUBLE: + case FLOAT: + case INT: + case LONG: + case SBYTE: + case SHORT: + case UINT: + case ULONG: + case USHORT: + enterOuterAlt(_localctx, 1); + { + setState(482); + simple_type(); + } + break; + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BY: + case DESCENDING: + case DYNAMIC: + case EQUALS: + case FROM: + case GET: + case GROUP: + case INTO: + case JOIN: + case LET: + case NAMEOF: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REMOVE: + case SELECT: + case SET: + case STRING: + case UNMANAGED: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + enterOuterAlt(_localctx, 2); + { + setState(483); + class_type(); + } + break; + case VOID: + enterOuterAlt(_localctx, 3); + { + setState(484); + match(VOID); + setState(485); + match(STAR); + } + break; + case OPEN_PARENS: + enterOuterAlt(_localctx, 4); + { + setState(486); + tuple_type(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Tuple_typeContext extends ParserRuleContext { + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public List tuple_element() { + return getRuleContexts(Tuple_elementContext.class); + } + public Tuple_elementContext tuple_element(int i) { + return getRuleContext(Tuple_elementContext.class,i); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Tuple_typeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_tuple_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterTuple_type(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitTuple_type(this); + } + } + + public final Tuple_typeContext tuple_type() throws RecognitionException { + Tuple_typeContext _localctx = new Tuple_typeContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_tuple_type); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(489); + match(OPEN_PARENS); + setState(490); + tuple_element(); + setState(493); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(491); + match(COMMA); + setState(492); + tuple_element(); + } + } + setState(495); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==COMMA ); + setState(497); + match(CLOSE_PARENS); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Tuple_elementContext extends ParserRuleContext { + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public Tuple_elementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_tuple_element; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterTuple_element(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitTuple_element(this); + } + } + + public final Tuple_elementContext tuple_element() throws RecognitionException { + Tuple_elementContext _localctx = new Tuple_elementContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_tuple_element); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(499); + type_(); + setState(501); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BY) | (1L << DESCENDING) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INTO) | (1L << JOIN) | (1L << LET))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REMOVE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (UNMANAGED - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)))) != 0)) { + { + setState(500); + identifier(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Simple_typeContext extends ParserRuleContext { + public Numeric_typeContext numeric_type() { + return getRuleContext(Numeric_typeContext.class,0); + } + public TerminalNode BOOL() { return getToken(CSharpParser.BOOL, 0); } + public Simple_typeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_simple_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterSimple_type(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitSimple_type(this); + } + } + + public final Simple_typeContext simple_type() throws RecognitionException { + Simple_typeContext _localctx = new Simple_typeContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_simple_type); + try { + setState(505); + _errHandler.sync(this); + switch (_input.LA(1)) { + case BYTE: + case CHAR: + case DECIMAL: + case DOUBLE: + case FLOAT: + case INT: + case LONG: + case SBYTE: + case SHORT: + case UINT: + case ULONG: + case USHORT: + enterOuterAlt(_localctx, 1); + { + setState(503); + numeric_type(); + } + break; + case BOOL: + enterOuterAlt(_localctx, 2); + { + setState(504); + match(BOOL); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Numeric_typeContext extends ParserRuleContext { + public Integral_typeContext integral_type() { + return getRuleContext(Integral_typeContext.class,0); + } + public Floating_point_typeContext floating_point_type() { + return getRuleContext(Floating_point_typeContext.class,0); + } + public TerminalNode DECIMAL() { return getToken(CSharpParser.DECIMAL, 0); } + public Numeric_typeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_numeric_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterNumeric_type(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitNumeric_type(this); + } + } + + public final Numeric_typeContext numeric_type() throws RecognitionException { + Numeric_typeContext _localctx = new Numeric_typeContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_numeric_type); + try { + setState(510); + _errHandler.sync(this); + switch (_input.LA(1)) { + case BYTE: + case CHAR: + case INT: + case LONG: + case SBYTE: + case SHORT: + case UINT: + case ULONG: + case USHORT: + enterOuterAlt(_localctx, 1); + { + setState(507); + integral_type(); + } + break; + case DOUBLE: + case FLOAT: + enterOuterAlt(_localctx, 2); + { + setState(508); + floating_point_type(); + } + break; + case DECIMAL: + enterOuterAlt(_localctx, 3); + { + setState(509); + match(DECIMAL); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Integral_typeContext extends ParserRuleContext { + public TerminalNode SBYTE() { return getToken(CSharpParser.SBYTE, 0); } + public TerminalNode BYTE() { return getToken(CSharpParser.BYTE, 0); } + public TerminalNode SHORT() { return getToken(CSharpParser.SHORT, 0); } + public TerminalNode USHORT() { return getToken(CSharpParser.USHORT, 0); } + public TerminalNode INT() { return getToken(CSharpParser.INT, 0); } + public TerminalNode UINT() { return getToken(CSharpParser.UINT, 0); } + public TerminalNode LONG() { return getToken(CSharpParser.LONG, 0); } + public TerminalNode ULONG() { return getToken(CSharpParser.ULONG, 0); } + public TerminalNode CHAR() { return getToken(CSharpParser.CHAR, 0); } + public Integral_typeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_integral_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterIntegral_type(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitIntegral_type(this); + } + } + + public final Integral_typeContext integral_type() throws RecognitionException { + Integral_typeContext _localctx = new Integral_typeContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_integral_type); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(512); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << BYTE) | (1L << CHAR) | (1L << INT) | (1L << LONG))) != 0) || ((((_la - 83)) & ~0x3f) == 0 && ((1L << (_la - 83)) & ((1L << (SBYTE - 83)) | (1L << (SHORT - 83)) | (1L << (UINT - 83)) | (1L << (ULONG - 83)) | (1L << (USHORT - 83)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Floating_point_typeContext extends ParserRuleContext { + public TerminalNode FLOAT() { return getToken(CSharpParser.FLOAT, 0); } + public TerminalNode DOUBLE() { return getToken(CSharpParser.DOUBLE, 0); } + public Floating_point_typeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_floating_point_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterFloating_point_type(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitFloating_point_type(this); + } + } + + public final Floating_point_typeContext floating_point_type() throws RecognitionException { + Floating_point_typeContext _localctx = new Floating_point_typeContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_floating_point_type); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(514); + _la = _input.LA(1); + if ( !(_la==DOUBLE || _la==FLOAT) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Class_typeContext extends ParserRuleContext { + public Namespace_or_type_nameContext namespace_or_type_name() { + return getRuleContext(Namespace_or_type_nameContext.class,0); + } + public TerminalNode OBJECT() { return getToken(CSharpParser.OBJECT, 0); } + public TerminalNode DYNAMIC() { return getToken(CSharpParser.DYNAMIC, 0); } + public TerminalNode STRING() { return getToken(CSharpParser.STRING, 0); } + public Class_typeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_class_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterClass_type(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitClass_type(this); + } + } + + public final Class_typeContext class_type() throws RecognitionException { + Class_typeContext _localctx = new Class_typeContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_class_type); + try { + setState(520); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(516); + namespace_or_type_name(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(517); + match(OBJECT); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(518); + match(DYNAMIC); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(519); + match(STRING); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Type_argument_listContext extends ParserRuleContext { + public TerminalNode LT() { return getToken(CSharpParser.LT, 0); } + public List type_() { + return getRuleContexts(Type_Context.class); + } + public Type_Context type_(int i) { + return getRuleContext(Type_Context.class,i); + } + public TerminalNode GT() { return getToken(CSharpParser.GT, 0); } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Type_argument_listContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_type_argument_list; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterType_argument_list(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitType_argument_list(this); + } + } + + public final Type_argument_listContext type_argument_list() throws RecognitionException { + Type_argument_listContext _localctx = new Type_argument_listContext(_ctx, getState()); + enterRule(_localctx, 22, RULE_type_argument_list); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(522); + match(LT); + setState(523); + type_(); + setState(528); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(524); + match(COMMA); + setState(525); + type_(); + } + } + setState(530); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(531); + match(GT); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Argument_listContext extends ParserRuleContext { + public List argument() { + return getRuleContexts(ArgumentContext.class); + } + public ArgumentContext argument(int i) { + return getRuleContext(ArgumentContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Argument_listContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_argument_list; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterArgument_list(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitArgument_list(this); + } + } + + public final Argument_listContext argument_list() throws RecognitionException { + Argument_listContext _localctx = new Argument_listContext(_ctx, getState()); + enterRule(_localctx, 24, RULE_argument_list); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(533); + argument(); + setState(538); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(534); + match(COMMA); + setState(535); + argument(); + } + } + setState(540); + _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 ArgumentContext extends ParserRuleContext { + public Token refout; + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public TerminalNode VAR() { return getToken(CSharpParser.VAR, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public TerminalNode REF() { return getToken(CSharpParser.REF, 0); } + public TerminalNode OUT() { return getToken(CSharpParser.OUT, 0); } + public TerminalNode IN() { return getToken(CSharpParser.IN, 0); } + public ArgumentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_argument; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterArgument(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitArgument(this); + } + } + + public final ArgumentContext argument() throws RecognitionException { + ArgumentContext _localctx = new ArgumentContext(_ctx, getState()); + enterRule(_localctx, 26, RULE_argument); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(544); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { + case 1: + { + setState(541); + identifier(); + setState(542); + match(COLON); + } + break; + } + setState(547); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { + case 1: + { + setState(546); + ((ArgumentContext)_localctx).refout = _input.LT(1); + _la = _input.LA(1); + if ( !(((((_la - 54)) & ~0x3f) == 0 && ((1L << (_la - 54)) & ((1L << (IN - 54)) | (1L << (OUT - 54)) | (1L << (REF - 54)))) != 0)) ) { + ((ArgumentContext)_localctx).refout = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + } + setState(551); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,21,_ctx) ) { + case 1: + { + setState(549); + match(VAR); + } + break; + case 2: + { + setState(550); + type_(); + } + break; + } + setState(553); + expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ExpressionContext extends ParserRuleContext { + public AssignmentContext assignment() { + return getRuleContext(AssignmentContext.class,0); + } + public Non_assignment_expressionContext non_assignment_expression() { + return getRuleContext(Non_assignment_expressionContext.class,0); + } + public TerminalNode REF() { return getToken(CSharpParser.REF, 0); } + public ExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitExpression(this); + } + } + + public final ExpressionContext expression() throws RecognitionException { + ExpressionContext _localctx = new ExpressionContext(_ctx, getState()); + enterRule(_localctx, 28, RULE_expression); + try { + setState(559); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(555); + assignment(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(556); + non_assignment_expression(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(557); + match(REF); + setState(558); + non_assignment_expression(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Non_assignment_expressionContext extends ParserRuleContext { + public Lambda_expressionContext lambda_expression() { + return getRuleContext(Lambda_expressionContext.class,0); + } + public Query_expressionContext query_expression() { + return getRuleContext(Query_expressionContext.class,0); + } + public Conditional_expressionContext conditional_expression() { + return getRuleContext(Conditional_expressionContext.class,0); + } + public Non_assignment_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_non_assignment_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterNon_assignment_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitNon_assignment_expression(this); + } + } + + public final Non_assignment_expressionContext non_assignment_expression() throws RecognitionException { + Non_assignment_expressionContext _localctx = new Non_assignment_expressionContext(_ctx, getState()); + enterRule(_localctx, 30, RULE_non_assignment_expression); + try { + setState(564); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(561); + lambda_expression(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(562); + query_expression(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(563); + conditional_expression(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AssignmentContext extends ParserRuleContext { + public Unary_expressionContext unary_expression() { + return getRuleContext(Unary_expressionContext.class,0); + } + public Assignment_operatorContext assignment_operator() { + return getRuleContext(Assignment_operatorContext.class,0); + } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode OP_COALESCING_ASSIGNMENT() { return getToken(CSharpParser.OP_COALESCING_ASSIGNMENT, 0); } + public Throwable_expressionContext throwable_expression() { + return getRuleContext(Throwable_expressionContext.class,0); + } + public AssignmentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_assignment; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAssignment(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAssignment(this); + } + } + + public final AssignmentContext assignment() throws RecognitionException { + AssignmentContext _localctx = new AssignmentContext(_ctx, getState()); + enterRule(_localctx, 32, RULE_assignment); + try { + setState(574); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(566); + unary_expression(); + setState(567); + assignment_operator(); + setState(568); + expression(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(570); + unary_expression(); + setState(571); + match(OP_COALESCING_ASSIGNMENT); + setState(572); + throwable_expression(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Assignment_operatorContext extends ParserRuleContext { + public TerminalNode ASSIGNMENT() { return getToken(CSharpParser.ASSIGNMENT, 0); } + public TerminalNode OP_ADD_ASSIGNMENT() { return getToken(CSharpParser.OP_ADD_ASSIGNMENT, 0); } + public TerminalNode OP_SUB_ASSIGNMENT() { return getToken(CSharpParser.OP_SUB_ASSIGNMENT, 0); } + public TerminalNode OP_MULT_ASSIGNMENT() { return getToken(CSharpParser.OP_MULT_ASSIGNMENT, 0); } + public TerminalNode OP_DIV_ASSIGNMENT() { return getToken(CSharpParser.OP_DIV_ASSIGNMENT, 0); } + public TerminalNode OP_MOD_ASSIGNMENT() { return getToken(CSharpParser.OP_MOD_ASSIGNMENT, 0); } + public TerminalNode OP_AND_ASSIGNMENT() { return getToken(CSharpParser.OP_AND_ASSIGNMENT, 0); } + public TerminalNode OP_OR_ASSIGNMENT() { return getToken(CSharpParser.OP_OR_ASSIGNMENT, 0); } + public TerminalNode OP_XOR_ASSIGNMENT() { return getToken(CSharpParser.OP_XOR_ASSIGNMENT, 0); } + public TerminalNode OP_LEFT_SHIFT_ASSIGNMENT() { return getToken(CSharpParser.OP_LEFT_SHIFT_ASSIGNMENT, 0); } + public Right_shift_assignmentContext right_shift_assignment() { + return getRuleContext(Right_shift_assignmentContext.class,0); + } + public Assignment_operatorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_assignment_operator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAssignment_operator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAssignment_operator(this); + } + } + + public final Assignment_operatorContext assignment_operator() throws RecognitionException { + Assignment_operatorContext _localctx = new Assignment_operatorContext(_ctx, getState()); + enterRule(_localctx, 34, RULE_assignment_operator); + try { + setState(587); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ASSIGNMENT: + enterOuterAlt(_localctx, 1); + { + setState(576); + match(ASSIGNMENT); + } + break; + case OP_ADD_ASSIGNMENT: + enterOuterAlt(_localctx, 2); + { + setState(577); + match(OP_ADD_ASSIGNMENT); + } + break; + case OP_SUB_ASSIGNMENT: + enterOuterAlt(_localctx, 3); + { + setState(578); + match(OP_SUB_ASSIGNMENT); + } + break; + case OP_MULT_ASSIGNMENT: + enterOuterAlt(_localctx, 4); + { + setState(579); + match(OP_MULT_ASSIGNMENT); + } + break; + case OP_DIV_ASSIGNMENT: + enterOuterAlt(_localctx, 5); + { + setState(580); + match(OP_DIV_ASSIGNMENT); + } + break; + case OP_MOD_ASSIGNMENT: + enterOuterAlt(_localctx, 6); + { + setState(581); + match(OP_MOD_ASSIGNMENT); + } + break; + case OP_AND_ASSIGNMENT: + enterOuterAlt(_localctx, 7); + { + setState(582); + match(OP_AND_ASSIGNMENT); + } + break; + case OP_OR_ASSIGNMENT: + enterOuterAlt(_localctx, 8); + { + setState(583); + match(OP_OR_ASSIGNMENT); + } + break; + case OP_XOR_ASSIGNMENT: + enterOuterAlt(_localctx, 9); + { + setState(584); + match(OP_XOR_ASSIGNMENT); + } + break; + case OP_LEFT_SHIFT_ASSIGNMENT: + enterOuterAlt(_localctx, 10); + { + setState(585); + match(OP_LEFT_SHIFT_ASSIGNMENT); + } + break; + case GT: + enterOuterAlt(_localctx, 11); + { + setState(586); + right_shift_assignment(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Conditional_expressionContext extends ParserRuleContext { + public Null_coalescing_expressionContext null_coalescing_expression() { + return getRuleContext(Null_coalescing_expressionContext.class,0); + } + public TerminalNode INTERR() { return getToken(CSharpParser.INTERR, 0); } + public List throwable_expression() { + return getRuleContexts(Throwable_expressionContext.class); + } + public Throwable_expressionContext throwable_expression(int i) { + return getRuleContext(Throwable_expressionContext.class,i); + } + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public Conditional_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_conditional_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterConditional_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitConditional_expression(this); + } + } + + public final Conditional_expressionContext conditional_expression() throws RecognitionException { + Conditional_expressionContext _localctx = new Conditional_expressionContext(_ctx, getState()); + enterRule(_localctx, 36, RULE_conditional_expression); + try { + enterOuterAlt(_localctx, 1); + { + setState(589); + null_coalescing_expression(); + setState(595); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { + case 1: + { + setState(590); + match(INTERR); + setState(591); + throwable_expression(); + setState(592); + match(COLON); + setState(593); + throwable_expression(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Null_coalescing_expressionContext extends ParserRuleContext { + public Conditional_or_expressionContext conditional_or_expression() { + return getRuleContext(Conditional_or_expressionContext.class,0); + } + public TerminalNode OP_COALESCING() { return getToken(CSharpParser.OP_COALESCING, 0); } + public Null_coalescing_expressionContext null_coalescing_expression() { + return getRuleContext(Null_coalescing_expressionContext.class,0); + } + public Throw_expressionContext throw_expression() { + return getRuleContext(Throw_expressionContext.class,0); + } + public Null_coalescing_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_null_coalescing_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterNull_coalescing_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitNull_coalescing_expression(this); + } + } + + public final Null_coalescing_expressionContext null_coalescing_expression() throws RecognitionException { + Null_coalescing_expressionContext _localctx = new Null_coalescing_expressionContext(_ctx, getState()); + enterRule(_localctx, 38, RULE_null_coalescing_expression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(597); + conditional_or_expression(); + setState(603); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OP_COALESCING) { + { + setState(598); + match(OP_COALESCING); + setState(601); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BASE: + case BOOL: + case BY: + case BYTE: + case CHAR: + case CHECKED: + case DECIMAL: + case DEFAULT: + case DELEGATE: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FALSE: + case FLOAT: + case FROM: + case GET: + case GROUP: + case INT: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case NEW: + case NULL_: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case SIZEOF: + case STRING: + case THIS: + case TRUE: + case TYPEOF: + case UINT: + case ULONG: + case UNCHECKED: + case UNMANAGED: + case USHORT: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case LITERAL_ACCESS: + case INTEGER_LITERAL: + case HEX_INTEGER_LITERAL: + case BIN_INTEGER_LITERAL: + case REAL_LITERAL: + case CHARACTER_LITERAL: + case REGULAR_STRING: + case VERBATIUM_STRING: + case INTERPOLATED_REGULAR_STRING_START: + case INTERPOLATED_VERBATIUM_STRING_START: + case OPEN_PARENS: + case PLUS: + case MINUS: + case STAR: + case AMP: + case CARET: + case BANG: + case TILDE: + case OP_INC: + case OP_DEC: + case OP_RANGE: + { + setState(599); + null_coalescing_expression(); + } + break; + case THROW: + { + setState(600); + throw_expression(); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Conditional_or_expressionContext extends ParserRuleContext { + public List conditional_and_expression() { + return getRuleContexts(Conditional_and_expressionContext.class); + } + public Conditional_and_expressionContext conditional_and_expression(int i) { + return getRuleContext(Conditional_and_expressionContext.class,i); + } + public List OP_OR() { return getTokens(CSharpParser.OP_OR); } + public TerminalNode OP_OR(int i) { + return getToken(CSharpParser.OP_OR, i); + } + public Conditional_or_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_conditional_or_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterConditional_or_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitConditional_or_expression(this); + } + } + + public final Conditional_or_expressionContext conditional_or_expression() throws RecognitionException { + Conditional_or_expressionContext _localctx = new Conditional_or_expressionContext(_ctx, getState()); + enterRule(_localctx, 40, RULE_conditional_or_expression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(605); + conditional_and_expression(); + setState(610); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==OP_OR) { + { + { + setState(606); + match(OP_OR); + setState(607); + conditional_and_expression(); + } + } + setState(612); + _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 Conditional_and_expressionContext extends ParserRuleContext { + public List inclusive_or_expression() { + return getRuleContexts(Inclusive_or_expressionContext.class); + } + public Inclusive_or_expressionContext inclusive_or_expression(int i) { + return getRuleContext(Inclusive_or_expressionContext.class,i); + } + public List OP_AND() { return getTokens(CSharpParser.OP_AND); } + public TerminalNode OP_AND(int i) { + return getToken(CSharpParser.OP_AND, i); + } + public Conditional_and_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_conditional_and_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterConditional_and_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitConditional_and_expression(this); + } + } + + public final Conditional_and_expressionContext conditional_and_expression() throws RecognitionException { + Conditional_and_expressionContext _localctx = new Conditional_and_expressionContext(_ctx, getState()); + enterRule(_localctx, 42, RULE_conditional_and_expression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(613); + inclusive_or_expression(); + setState(618); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==OP_AND) { + { + { + setState(614); + match(OP_AND); + setState(615); + inclusive_or_expression(); + } + } + setState(620); + _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 Inclusive_or_expressionContext extends ParserRuleContext { + public List exclusive_or_expression() { + return getRuleContexts(Exclusive_or_expressionContext.class); + } + public Exclusive_or_expressionContext exclusive_or_expression(int i) { + return getRuleContext(Exclusive_or_expressionContext.class,i); + } + public List BITWISE_OR() { return getTokens(CSharpParser.BITWISE_OR); } + public TerminalNode BITWISE_OR(int i) { + return getToken(CSharpParser.BITWISE_OR, i); + } + public Inclusive_or_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_inclusive_or_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterInclusive_or_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitInclusive_or_expression(this); + } + } + + public final Inclusive_or_expressionContext inclusive_or_expression() throws RecognitionException { + Inclusive_or_expressionContext _localctx = new Inclusive_or_expressionContext(_ctx, getState()); + enterRule(_localctx, 44, RULE_inclusive_or_expression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(621); + exclusive_or_expression(); + setState(626); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==BITWISE_OR) { + { + { + setState(622); + match(BITWISE_OR); + setState(623); + exclusive_or_expression(); + } + } + setState(628); + _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 Exclusive_or_expressionContext extends ParserRuleContext { + public List and_expression() { + return getRuleContexts(And_expressionContext.class); + } + public And_expressionContext and_expression(int i) { + return getRuleContext(And_expressionContext.class,i); + } + public List CARET() { return getTokens(CSharpParser.CARET); } + public TerminalNode CARET(int i) { + return getToken(CSharpParser.CARET, i); + } + public Exclusive_or_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_exclusive_or_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterExclusive_or_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitExclusive_or_expression(this); + } + } + + public final Exclusive_or_expressionContext exclusive_or_expression() throws RecognitionException { + Exclusive_or_expressionContext _localctx = new Exclusive_or_expressionContext(_ctx, getState()); + enterRule(_localctx, 46, RULE_exclusive_or_expression); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(629); + and_expression(); + setState(634); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,32,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(630); + match(CARET); + setState(631); + and_expression(); + } + } + } + setState(636); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,32,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class And_expressionContext extends ParserRuleContext { + public List equality_expression() { + return getRuleContexts(Equality_expressionContext.class); + } + public Equality_expressionContext equality_expression(int i) { + return getRuleContext(Equality_expressionContext.class,i); + } + public List AMP() { return getTokens(CSharpParser.AMP); } + public TerminalNode AMP(int i) { + return getToken(CSharpParser.AMP, i); + } + public And_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_and_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAnd_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAnd_expression(this); + } + } + + public final And_expressionContext and_expression() throws RecognitionException { + And_expressionContext _localctx = new And_expressionContext(_ctx, getState()); + enterRule(_localctx, 48, RULE_and_expression); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(637); + equality_expression(); + setState(642); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,33,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(638); + match(AMP); + setState(639); + equality_expression(); + } + } + } + setState(644); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,33,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Equality_expressionContext extends ParserRuleContext { + public List relational_expression() { + return getRuleContexts(Relational_expressionContext.class); + } + public Relational_expressionContext relational_expression(int i) { + return getRuleContext(Relational_expressionContext.class,i); + } + public List OP_EQ() { return getTokens(CSharpParser.OP_EQ); } + public TerminalNode OP_EQ(int i) { + return getToken(CSharpParser.OP_EQ, i); + } + public List OP_NE() { return getTokens(CSharpParser.OP_NE); } + public TerminalNode OP_NE(int i) { + return getToken(CSharpParser.OP_NE, i); + } + public Equality_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_equality_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterEquality_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitEquality_expression(this); + } + } + + public final Equality_expressionContext equality_expression() throws RecognitionException { + Equality_expressionContext _localctx = new Equality_expressionContext(_ctx, getState()); + enterRule(_localctx, 50, RULE_equality_expression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(645); + relational_expression(); + setState(650); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==OP_EQ || _la==OP_NE) { + { + { + setState(646); + _la = _input.LA(1); + if ( !(_la==OP_EQ || _la==OP_NE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(647); + relational_expression(); + } + } + setState(652); + _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 Relational_expressionContext extends ParserRuleContext { + public List shift_expression() { + return getRuleContexts(Shift_expressionContext.class); + } + public Shift_expressionContext shift_expression(int i) { + return getRuleContext(Shift_expressionContext.class,i); + } + public List IS() { return getTokens(CSharpParser.IS); } + public TerminalNode IS(int i) { + return getToken(CSharpParser.IS, i); + } + public List isType() { + return getRuleContexts(IsTypeContext.class); + } + public IsTypeContext isType(int i) { + return getRuleContext(IsTypeContext.class,i); + } + public List AS() { return getTokens(CSharpParser.AS); } + public TerminalNode AS(int i) { + return getToken(CSharpParser.AS, i); + } + public List type_() { + return getRuleContexts(Type_Context.class); + } + public Type_Context type_(int i) { + return getRuleContext(Type_Context.class,i); + } + public List LT() { return getTokens(CSharpParser.LT); } + public TerminalNode LT(int i) { + return getToken(CSharpParser.LT, i); + } + public List GT() { return getTokens(CSharpParser.GT); } + public TerminalNode GT(int i) { + return getToken(CSharpParser.GT, i); + } + public List OP_LE() { return getTokens(CSharpParser.OP_LE); } + public TerminalNode OP_LE(int i) { + return getToken(CSharpParser.OP_LE, i); + } + public List OP_GE() { return getTokens(CSharpParser.OP_GE); } + public TerminalNode OP_GE(int i) { + return getToken(CSharpParser.OP_GE, i); + } + public Relational_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_relational_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterRelational_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitRelational_expression(this); + } + } + + public final Relational_expressionContext relational_expression() throws RecognitionException { + Relational_expressionContext _localctx = new Relational_expressionContext(_ctx, getState()); + enterRule(_localctx, 52, RULE_relational_expression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(653); + shift_expression(); + setState(662); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==AS || _la==IS || ((((_la - 146)) & ~0x3f) == 0 && ((1L << (_la - 146)) & ((1L << (LT - 146)) | (1L << (GT - 146)) | (1L << (OP_LE - 146)) | (1L << (OP_GE - 146)))) != 0)) { + { + setState(660); + _errHandler.sync(this); + switch (_input.LA(1)) { + case LT: + case GT: + case OP_LE: + case OP_GE: + { + setState(654); + _la = _input.LA(1); + if ( !(((((_la - 146)) & ~0x3f) == 0 && ((1L << (_la - 146)) & ((1L << (LT - 146)) | (1L << (GT - 146)) | (1L << (OP_LE - 146)) | (1L << (OP_GE - 146)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(655); + shift_expression(); + } + break; + case IS: + { + setState(656); + match(IS); + setState(657); + isType(); + } + break; + case AS: + { + setState(658); + match(AS); + setState(659); + type_(); + } + break; + default: + throw new NoViableAltException(this); + } + } + setState(664); + _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 Shift_expressionContext extends ParserRuleContext { + public List additive_expression() { + return getRuleContexts(Additive_expressionContext.class); + } + public Additive_expressionContext additive_expression(int i) { + return getRuleContext(Additive_expressionContext.class,i); + } + public List OP_LEFT_SHIFT() { return getTokens(CSharpParser.OP_LEFT_SHIFT); } + public TerminalNode OP_LEFT_SHIFT(int i) { + return getToken(CSharpParser.OP_LEFT_SHIFT, i); + } + public List right_shift() { + return getRuleContexts(Right_shiftContext.class); + } + public Right_shiftContext right_shift(int i) { + return getRuleContext(Right_shiftContext.class,i); + } + public Shift_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_shift_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterShift_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitShift_expression(this); + } + } + + public final Shift_expressionContext shift_expression() throws RecognitionException { + Shift_expressionContext _localctx = new Shift_expressionContext(_ctx, getState()); + enterRule(_localctx, 54, RULE_shift_expression); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(665); + additive_expression(); + setState(673); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(668); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OP_LEFT_SHIFT: + { + setState(666); + match(OP_LEFT_SHIFT); + } + break; + case GT: + { + setState(667); + right_shift(); + } + break; + default: + throw new NoViableAltException(this); + } + setState(670); + additive_expression(); + } + } + } + setState(675); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Additive_expressionContext extends ParserRuleContext { + public List multiplicative_expression() { + return getRuleContexts(Multiplicative_expressionContext.class); + } + public Multiplicative_expressionContext multiplicative_expression(int i) { + return getRuleContext(Multiplicative_expressionContext.class,i); + } + public List PLUS() { return getTokens(CSharpParser.PLUS); } + public TerminalNode PLUS(int i) { + return getToken(CSharpParser.PLUS, i); + } + public List MINUS() { return getTokens(CSharpParser.MINUS); } + public TerminalNode MINUS(int i) { + return getToken(CSharpParser.MINUS, i); + } + public Additive_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_additive_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAdditive_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAdditive_expression(this); + } + } + + public final Additive_expressionContext additive_expression() throws RecognitionException { + Additive_expressionContext _localctx = new Additive_expressionContext(_ctx, getState()); + enterRule(_localctx, 56, RULE_additive_expression); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(676); + multiplicative_expression(); + setState(681); + _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(677); + _la = _input.LA(1); + if ( !(_la==PLUS || _la==MINUS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(678); + multiplicative_expression(); + } + } + } + setState(683); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,39,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Multiplicative_expressionContext extends ParserRuleContext { + public List switch_expression() { + return getRuleContexts(Switch_expressionContext.class); + } + public Switch_expressionContext switch_expression(int i) { + return getRuleContext(Switch_expressionContext.class,i); + } + public List STAR() { return getTokens(CSharpParser.STAR); } + public TerminalNode STAR(int i) { + return getToken(CSharpParser.STAR, i); + } + public List DIV() { return getTokens(CSharpParser.DIV); } + public TerminalNode DIV(int i) { + return getToken(CSharpParser.DIV, i); + } + public List PERCENT() { return getTokens(CSharpParser.PERCENT); } + public TerminalNode PERCENT(int i) { + return getToken(CSharpParser.PERCENT, i); + } + public Multiplicative_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_multiplicative_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterMultiplicative_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitMultiplicative_expression(this); + } + } + + public final Multiplicative_expressionContext multiplicative_expression() throws RecognitionException { + Multiplicative_expressionContext _localctx = new Multiplicative_expressionContext(_ctx, getState()); + enterRule(_localctx, 58, RULE_multiplicative_expression); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(684); + switch_expression(); + setState(689); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,40,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(685); + _la = _input.LA(1); + if ( !(((((_la - 137)) & ~0x3f) == 0 && ((1L << (_la - 137)) & ((1L << (STAR - 137)) | (1L << (DIV - 137)) | (1L << (PERCENT - 137)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(686); + switch_expression(); + } + } + } + setState(691); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,40,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Switch_expressionContext extends ParserRuleContext { + public Range_expressionContext range_expression() { + return getRuleContext(Range_expressionContext.class,0); + } + public TerminalNode SWITCH() { return getToken(CSharpParser.SWITCH, 0); } + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public Switch_expression_armsContext switch_expression_arms() { + return getRuleContext(Switch_expression_armsContext.class,0); + } + public TerminalNode COMMA() { return getToken(CSharpParser.COMMA, 0); } + public Switch_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_switch_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterSwitch_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitSwitch_expression(this); + } + } + + public final Switch_expressionContext switch_expression() throws RecognitionException { + Switch_expressionContext _localctx = new Switch_expressionContext(_ctx, getState()); + enterRule(_localctx, 60, RULE_switch_expression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(692); + range_expression(); + setState(702); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==SWITCH) { + { + setState(693); + match(SWITCH); + setState(694); + match(OPEN_BRACE); + setState(699); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)))) != 0)) { + { + setState(695); + switch_expression_arms(); + setState(697); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(696); + match(COMMA); + } + } + + } + } + + setState(701); + match(CLOSE_BRACE); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Switch_expression_armsContext extends ParserRuleContext { + public List switch_expression_arm() { + return getRuleContexts(Switch_expression_armContext.class); + } + public Switch_expression_armContext switch_expression_arm(int i) { + return getRuleContext(Switch_expression_armContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Switch_expression_armsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_switch_expression_arms; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterSwitch_expression_arms(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitSwitch_expression_arms(this); + } + } + + public final Switch_expression_armsContext switch_expression_arms() throws RecognitionException { + Switch_expression_armsContext _localctx = new Switch_expression_armsContext(_ctx, getState()); + enterRule(_localctx, 62, RULE_switch_expression_arms); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(704); + switch_expression_arm(); + setState(709); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,44,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(705); + match(COMMA); + setState(706); + switch_expression_arm(); + } + } + } + setState(711); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,44,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Switch_expression_armContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Right_arrowContext right_arrow() { + return getRuleContext(Right_arrowContext.class,0); + } + public Throwable_expressionContext throwable_expression() { + return getRuleContext(Throwable_expressionContext.class,0); + } + public Case_guardContext case_guard() { + return getRuleContext(Case_guardContext.class,0); + } + public Switch_expression_armContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_switch_expression_arm; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterSwitch_expression_arm(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitSwitch_expression_arm(this); + } + } + + public final Switch_expression_armContext switch_expression_arm() throws RecognitionException { + Switch_expression_armContext _localctx = new Switch_expression_armContext(_ctx, getState()); + enterRule(_localctx, 64, RULE_switch_expression_arm); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(712); + expression(); + setState(714); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHEN) { + { + setState(713); + case_guard(); + } + } + + setState(716); + right_arrow(); + setState(717); + throwable_expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Range_expressionContext extends ParserRuleContext { + public List unary_expression() { + return getRuleContexts(Unary_expressionContext.class); + } + public Unary_expressionContext unary_expression(int i) { + return getRuleContext(Unary_expressionContext.class,i); + } + public TerminalNode OP_RANGE() { return getToken(CSharpParser.OP_RANGE, 0); } + public Range_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_range_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterRange_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitRange_expression(this); + } + } + + public final Range_expressionContext range_expression() throws RecognitionException { + Range_expressionContext _localctx = new Range_expressionContext(_ctx, getState()); + enterRule(_localctx, 66, RULE_range_expression); + int _la; + try { + setState(727); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(719); + unary_expression(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(721); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)))) != 0)) { + { + setState(720); + unary_expression(); + } + } + + setState(723); + match(OP_RANGE); + setState(725); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { + case 1: + { + setState(724); + unary_expression(); + } + break; + } + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Unary_expressionContext extends ParserRuleContext { + public Primary_expressionContext primary_expression() { + return getRuleContext(Primary_expressionContext.class,0); + } + public TerminalNode PLUS() { return getToken(CSharpParser.PLUS, 0); } + public Unary_expressionContext unary_expression() { + return getRuleContext(Unary_expressionContext.class,0); + } + public TerminalNode MINUS() { return getToken(CSharpParser.MINUS, 0); } + public TerminalNode BANG() { return getToken(CSharpParser.BANG, 0); } + public TerminalNode TILDE() { return getToken(CSharpParser.TILDE, 0); } + public TerminalNode OP_INC() { return getToken(CSharpParser.OP_INC, 0); } + public TerminalNode OP_DEC() { return getToken(CSharpParser.OP_DEC, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public TerminalNode AWAIT() { return getToken(CSharpParser.AWAIT, 0); } + public TerminalNode AMP() { return getToken(CSharpParser.AMP, 0); } + public TerminalNode STAR() { return getToken(CSharpParser.STAR, 0); } + public TerminalNode CARET() { return getToken(CSharpParser.CARET, 0); } + public Unary_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_unary_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterUnary_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitUnary_expression(this); + } + } + + public final Unary_expressionContext unary_expression() throws RecognitionException { + Unary_expressionContext _localctx = new Unary_expressionContext(_ctx, getState()); + enterRule(_localctx, 68, RULE_unary_expression); + try { + setState(755); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(729); + primary_expression(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(730); + match(PLUS); + setState(731); + unary_expression(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(732); + match(MINUS); + setState(733); + unary_expression(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(734); + match(BANG); + setState(735); + unary_expression(); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(736); + match(TILDE); + setState(737); + unary_expression(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(738); + match(OP_INC); + setState(739); + unary_expression(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(740); + match(OP_DEC); + setState(741); + unary_expression(); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(742); + match(OPEN_PARENS); + setState(743); + type_(); + setState(744); + match(CLOSE_PARENS); + setState(745); + unary_expression(); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(747); + match(AWAIT); + setState(748); + unary_expression(); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(749); + match(AMP); + setState(750); + unary_expression(); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(751); + match(STAR); + setState(752); + unary_expression(); + } + break; + case 12: + enterOuterAlt(_localctx, 12); + { + setState(753); + match(CARET); + setState(754); + unary_expression(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Primary_expressionContext extends ParserRuleContext { + public Primary_expression_startContext pe; + public Primary_expression_startContext primary_expression_start() { + return getRuleContext(Primary_expression_startContext.class,0); + } + public List BANG() { return getTokens(CSharpParser.BANG); } + public TerminalNode BANG(int i) { + return getToken(CSharpParser.BANG, i); + } + public List bracket_expression() { + return getRuleContexts(Bracket_expressionContext.class); + } + public Bracket_expressionContext bracket_expression(int i) { + return getRuleContext(Bracket_expressionContext.class,i); + } + public List member_access() { + return getRuleContexts(Member_accessContext.class); + } + public Member_accessContext member_access(int i) { + return getRuleContext(Member_accessContext.class,i); + } + public List method_invocation() { + return getRuleContexts(Method_invocationContext.class); + } + public Method_invocationContext method_invocation(int i) { + return getRuleContext(Method_invocationContext.class,i); + } + public List OP_INC() { return getTokens(CSharpParser.OP_INC); } + public TerminalNode OP_INC(int i) { + return getToken(CSharpParser.OP_INC, i); + } + public List OP_DEC() { return getTokens(CSharpParser.OP_DEC); } + public TerminalNode OP_DEC(int i) { + return getToken(CSharpParser.OP_DEC, i); + } + public List OP_PTR() { return getTokens(CSharpParser.OP_PTR); } + public TerminalNode OP_PTR(int i) { + return getToken(CSharpParser.OP_PTR, i); + } + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public Primary_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_primary_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterPrimary_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitPrimary_expression(this); + } + } + + public final Primary_expressionContext primary_expression() throws RecognitionException { + Primary_expressionContext _localctx = new Primary_expressionContext(_ctx, getState()); + enterRule(_localctx, 70, RULE_primary_expression); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(757); + ((Primary_expressionContext)_localctx).pe = primary_expression_start(); + setState(759); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) { + case 1: + { + setState(758); + match(BANG); + } + break; + } + setState(764); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,51,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(761); + bracket_expression(); + } + } + } + setState(766); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,51,_ctx); + } + setState(768); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) { + case 1: + { + setState(767); + match(BANG); + } + break; + } + setState(792); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,57,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + { + setState(776); + _errHandler.sync(this); + switch (_input.LA(1)) { + case DOT: + case INTERR: + { + setState(770); + member_access(); + } + break; + case OPEN_PARENS: + { + setState(771); + method_invocation(); + } + break; + case OP_INC: + { + setState(772); + match(OP_INC); + } + break; + case OP_DEC: + { + setState(773); + match(OP_DEC); + } + break; + case OP_PTR: + { + setState(774); + match(OP_PTR); + setState(775); + identifier(); + } + break; + default: + throw new NoViableAltException(this); + } + setState(779); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { + case 1: + { + setState(778); + match(BANG); + } + break; + } + } + setState(784); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,55,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(781); + bracket_expression(); + } + } + } + setState(786); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,55,_ctx); + } + setState(788); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { + case 1: + { + setState(787); + match(BANG); + } + break; + } + } + } + } + setState(794); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,57,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Primary_expression_startContext extends ParserRuleContext { + public Primary_expression_startContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_primary_expression_start; } + + public Primary_expression_startContext() { } + public void copyFrom(Primary_expression_startContext ctx) { + super.copyFrom(ctx); + } + } + public static class LiteralAccessExpressionContext extends Primary_expression_startContext { + public TerminalNode LITERAL_ACCESS() { return getToken(CSharpParser.LITERAL_ACCESS, 0); } + public LiteralAccessExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLiteralAccessExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLiteralAccessExpression(this); + } + } + public static class DefaultValueExpressionContext extends Primary_expression_startContext { + public TerminalNode DEFAULT() { return getToken(CSharpParser.DEFAULT, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public DefaultValueExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterDefaultValueExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitDefaultValueExpression(this); + } + } + public static class BaseAccessExpressionContext extends Primary_expression_startContext { + public TerminalNode BASE() { return getToken(CSharpParser.BASE, 0); } + public TerminalNode DOT() { return getToken(CSharpParser.DOT, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode OPEN_BRACKET() { return getToken(CSharpParser.OPEN_BRACKET, 0); } + public Expression_listContext expression_list() { + return getRuleContext(Expression_listContext.class,0); + } + public TerminalNode CLOSE_BRACKET() { return getToken(CSharpParser.CLOSE_BRACKET, 0); } + public Type_argument_listContext type_argument_list() { + return getRuleContext(Type_argument_listContext.class,0); + } + public BaseAccessExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterBaseAccessExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitBaseAccessExpression(this); + } + } + public static class SizeofExpressionContext extends Primary_expression_startContext { + public TerminalNode SIZEOF() { return getToken(CSharpParser.SIZEOF, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public SizeofExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterSizeofExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitSizeofExpression(this); + } + } + public static class ParenthesisExpressionsContext extends Primary_expression_startContext { + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public ParenthesisExpressionsContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterParenthesisExpressions(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitParenthesisExpressions(this); + } + } + public static class ThisReferenceExpressionContext extends Primary_expression_startContext { + public TerminalNode THIS() { return getToken(CSharpParser.THIS, 0); } + public ThisReferenceExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterThisReferenceExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitThisReferenceExpression(this); + } + } + public static class ObjectCreationExpressionContext extends Primary_expression_startContext { + public TerminalNode NEW() { return getToken(CSharpParser.NEW, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public Anonymous_object_initializerContext anonymous_object_initializer() { + return getRuleContext(Anonymous_object_initializerContext.class,0); + } + public List rank_specifier() { + return getRuleContexts(Rank_specifierContext.class); + } + public Rank_specifierContext rank_specifier(int i) { + return getRuleContext(Rank_specifierContext.class,i); + } + public Array_initializerContext array_initializer() { + return getRuleContext(Array_initializerContext.class,0); + } + public Object_creation_expressionContext object_creation_expression() { + return getRuleContext(Object_creation_expressionContext.class,0); + } + public Object_or_collection_initializerContext object_or_collection_initializer() { + return getRuleContext(Object_or_collection_initializerContext.class,0); + } + public TerminalNode OPEN_BRACKET() { return getToken(CSharpParser.OPEN_BRACKET, 0); } + public Expression_listContext expression_list() { + return getRuleContext(Expression_listContext.class,0); + } + public TerminalNode CLOSE_BRACKET() { return getToken(CSharpParser.CLOSE_BRACKET, 0); } + public ObjectCreationExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterObjectCreationExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitObjectCreationExpression(this); + } + } + public static class AnonymousMethodExpressionContext extends Primary_expression_startContext { + public TerminalNode DELEGATE() { return getToken(CSharpParser.DELEGATE, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public TerminalNode ASYNC() { return getToken(CSharpParser.ASYNC, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Explicit_anonymous_function_parameter_listContext explicit_anonymous_function_parameter_list() { + return getRuleContext(Explicit_anonymous_function_parameter_listContext.class,0); + } + public AnonymousMethodExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAnonymousMethodExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAnonymousMethodExpression(this); + } + } + public static class TypeofExpressionContext extends Primary_expression_startContext { + public TerminalNode TYPEOF() { return getToken(CSharpParser.TYPEOF, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Unbound_type_nameContext unbound_type_name() { + return getRuleContext(Unbound_type_nameContext.class,0); + } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public TerminalNode VOID() { return getToken(CSharpParser.VOID, 0); } + public TypeofExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterTypeofExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitTypeofExpression(this); + } + } + public static class TupleExpressionContext extends Primary_expression_startContext { + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public List argument() { + return getRuleContexts(ArgumentContext.class); + } + public ArgumentContext argument(int i) { + return getRuleContext(ArgumentContext.class,i); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public TupleExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterTupleExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitTupleExpression(this); + } + } + public static class UncheckedExpressionContext extends Primary_expression_startContext { + public TerminalNode UNCHECKED() { return getToken(CSharpParser.UNCHECKED, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public UncheckedExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterUncheckedExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitUncheckedExpression(this); + } + } + public static class SimpleNameExpressionContext extends Primary_expression_startContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public Type_argument_listContext type_argument_list() { + return getRuleContext(Type_argument_listContext.class,0); + } + public SimpleNameExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterSimpleNameExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitSimpleNameExpression(this); + } + } + public static class MemberAccessExpressionContext extends Primary_expression_startContext { + public Predefined_typeContext predefined_type() { + return getRuleContext(Predefined_typeContext.class,0); + } + public Qualified_alias_memberContext qualified_alias_member() { + return getRuleContext(Qualified_alias_memberContext.class,0); + } + public MemberAccessExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterMemberAccessExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitMemberAccessExpression(this); + } + } + public static class CheckedExpressionContext extends Primary_expression_startContext { + public TerminalNode CHECKED() { return getToken(CSharpParser.CHECKED, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public CheckedExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterCheckedExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitCheckedExpression(this); + } + } + public static class LiteralExpressionContext extends Primary_expression_startContext { + public LiteralContext literal() { + return getRuleContext(LiteralContext.class,0); + } + public LiteralExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLiteralExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLiteralExpression(this); + } + } + public static class NameofExpressionContext extends Primary_expression_startContext { + public TerminalNode NAMEOF() { return getToken(CSharpParser.NAMEOF, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public List DOT() { return getTokens(CSharpParser.DOT); } + public TerminalNode DOT(int i) { + return getToken(CSharpParser.DOT, i); + } + public NameofExpressionContext(Primary_expression_startContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterNameofExpression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitNameofExpression(this); + } + } + + public final Primary_expression_startContext primary_expression_start() throws RecognitionException { + Primary_expression_startContext _localctx = new Primary_expression_startContext(_ctx, getState()); + enterRule(_localctx, 72, RULE_primary_expression_start); + int _la; + try { + int _alt; + setState(916); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { + case 1: + _localctx = new LiteralExpressionContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(795); + literal(); + } + break; + case 2: + _localctx = new SimpleNameExpressionContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(796); + identifier(); + setState(798); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { + case 1: + { + setState(797); + type_argument_list(); + } + break; + } + } + break; + case 3: + _localctx = new ParenthesisExpressionsContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(800); + match(OPEN_PARENS); + setState(801); + expression(); + setState(802); + match(CLOSE_PARENS); + } + break; + case 4: + _localctx = new MemberAccessExpressionContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(804); + predefined_type(); + } + break; + case 5: + _localctx = new MemberAccessExpressionContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(805); + qualified_alias_member(); + } + break; + case 6: + _localctx = new LiteralAccessExpressionContext(_localctx); + enterOuterAlt(_localctx, 6); + { + setState(806); + match(LITERAL_ACCESS); + } + break; + case 7: + _localctx = new ThisReferenceExpressionContext(_localctx); + enterOuterAlt(_localctx, 7); + { + setState(807); + match(THIS); + } + break; + case 8: + _localctx = new BaseAccessExpressionContext(_localctx); + enterOuterAlt(_localctx, 8); + { + setState(808); + match(BASE); + setState(818); + _errHandler.sync(this); + switch (_input.LA(1)) { + case DOT: + { + setState(809); + match(DOT); + setState(810); + identifier(); + setState(812); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,59,_ctx) ) { + case 1: + { + setState(811); + type_argument_list(); + } + break; + } + } + break; + case OPEN_BRACKET: + { + setState(814); + match(OPEN_BRACKET); + setState(815); + expression_list(); + setState(816); + match(CLOSE_BRACKET); + } + break; + default: + throw new NoViableAltException(this); + } + } + break; + case 9: + _localctx = new ObjectCreationExpressionContext(_localctx); + enterOuterAlt(_localctx, 9); + { + setState(820); + match(NEW); + setState(849); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BOOL: + case BY: + case BYTE: + case CHAR: + case DECIMAL: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FLOAT: + case FROM: + case GET: + case GROUP: + case INT: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case STRING: + case UINT: + case ULONG: + case UNMANAGED: + case USHORT: + case VAR: + case VOID: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case OPEN_PARENS: + { + setState(821); + type_(); + setState(843); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,64,_ctx) ) { + case 1: + { + setState(822); + object_creation_expression(); + } + break; + case 2: + { + setState(823); + object_or_collection_initializer(); + } + break; + case 3: + { + setState(824); + match(OPEN_BRACKET); + setState(825); + expression_list(); + setState(826); + match(CLOSE_BRACKET); + setState(830); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,61,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(827); + rank_specifier(); + } + } + } + setState(832); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,61,_ctx); + } + setState(834); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACE) { + { + setState(833); + array_initializer(); + } + } + + } + break; + case 4: + { + setState(837); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(836); + rank_specifier(); + } + } + setState(839); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==OPEN_BRACKET ); + setState(841); + array_initializer(); + } + break; + } + } + break; + case OPEN_BRACE: + { + setState(845); + anonymous_object_initializer(); + } + break; + case OPEN_BRACKET: + { + setState(846); + rank_specifier(); + setState(847); + array_initializer(); + } + break; + default: + throw new NoViableAltException(this); + } + } + break; + case 10: + _localctx = new TupleExpressionContext(_localctx); + enterOuterAlt(_localctx, 10); + { + setState(851); + match(OPEN_PARENS); + setState(852); + argument(); + setState(855); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(853); + match(COMMA); + setState(854); + argument(); + } + } + setState(857); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==COMMA ); + setState(859); + match(CLOSE_PARENS); + } + break; + case 11: + _localctx = new TypeofExpressionContext(_localctx); + enterOuterAlt(_localctx, 11); + { + setState(861); + match(TYPEOF); + setState(862); + match(OPEN_PARENS); + setState(866); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { + case 1: + { + setState(863); + unbound_type_name(); + } + break; + case 2: + { + setState(864); + type_(); + } + break; + case 3: + { + setState(865); + match(VOID); + } + break; + } + setState(868); + match(CLOSE_PARENS); + } + break; + case 12: + _localctx = new CheckedExpressionContext(_localctx); + enterOuterAlt(_localctx, 12); + { + setState(869); + match(CHECKED); + setState(870); + match(OPEN_PARENS); + setState(871); + expression(); + setState(872); + match(CLOSE_PARENS); + } + break; + case 13: + _localctx = new UncheckedExpressionContext(_localctx); + enterOuterAlt(_localctx, 13); + { + setState(874); + match(UNCHECKED); + setState(875); + match(OPEN_PARENS); + setState(876); + expression(); + setState(877); + match(CLOSE_PARENS); + } + break; + case 14: + _localctx = new DefaultValueExpressionContext(_localctx); + enterOuterAlt(_localctx, 14); + { + setState(879); + match(DEFAULT); + setState(884); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { + case 1: + { + setState(880); + match(OPEN_PARENS); + setState(881); + type_(); + setState(882); + match(CLOSE_PARENS); + } + break; + } + } + break; + case 15: + _localctx = new AnonymousMethodExpressionContext(_localctx); + enterOuterAlt(_localctx, 15); + { + setState(887); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ASYNC) { + { + setState(886); + match(ASYNC); + } + } + + setState(889); + match(DELEGATE); + setState(895); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_PARENS) { + { + setState(890); + match(OPEN_PARENS); + setState(892); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 10)) & ~0x3f) == 0 && ((1L << (_la - 10)) & ((1L << (ADD - 10)) | (1L << (ALIAS - 10)) | (1L << (ARGLIST - 10)) | (1L << (ASCENDING - 10)) | (1L << (ASYNC - 10)) | (1L << (AWAIT - 10)) | (1L << (BOOL - 10)) | (1L << (BY - 10)) | (1L << (BYTE - 10)) | (1L << (CHAR - 10)) | (1L << (DECIMAL - 10)) | (1L << (DESCENDING - 10)) | (1L << (DOUBLE - 10)) | (1L << (DYNAMIC - 10)) | (1L << (EQUALS - 10)) | (1L << (FLOAT - 10)) | (1L << (FROM - 10)) | (1L << (GET - 10)) | (1L << (GROUP - 10)) | (1L << (IN - 10)) | (1L << (INT - 10)) | (1L << (INTO - 10)) | (1L << (JOIN - 10)) | (1L << (LET - 10)) | (1L << (LONG - 10)) | (1L << (NAMEOF - 10)) | (1L << (OBJECT - 10)) | (1L << (ON - 10)) | (1L << (ORDERBY - 10)) | (1L << (OUT - 10)))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (PARTIAL - 75)) | (1L << (REF - 75)) | (1L << (REMOVE - 75)) | (1L << (SBYTE - 75)) | (1L << (SELECT - 75)) | (1L << (SET - 75)) | (1L << (SHORT - 75)) | (1L << (STRING - 75)) | (1L << (UINT - 75)) | (1L << (ULONG - 75)) | (1L << (UNMANAGED - 75)) | (1L << (USHORT - 75)) | (1L << (VAR - 75)) | (1L << (VOID - 75)) | (1L << (WHEN - 75)) | (1L << (WHERE - 75)) | (1L << (YIELD - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (OPEN_PARENS - 75)))) != 0)) { + { + setState(891); + explicit_anonymous_function_parameter_list(); + } + } + + setState(894); + match(CLOSE_PARENS); + } + } + + setState(897); + block(); + } + break; + case 16: + _localctx = new SizeofExpressionContext(_localctx); + enterOuterAlt(_localctx, 16); + { + setState(898); + match(SIZEOF); + setState(899); + match(OPEN_PARENS); + setState(900); + type_(); + setState(901); + match(CLOSE_PARENS); + } + break; + case 17: + _localctx = new NameofExpressionContext(_localctx); + enterOuterAlt(_localctx, 17); + { + setState(903); + match(NAMEOF); + setState(904); + match(OPEN_PARENS); + setState(910); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,72,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(905); + identifier(); + setState(906); + match(DOT); + } + } + } + setState(912); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,72,_ctx); + } + setState(913); + identifier(); + setState(914); + match(CLOSE_PARENS); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Throwable_expressionContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Throw_expressionContext throw_expression() { + return getRuleContext(Throw_expressionContext.class,0); + } + public Throwable_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_throwable_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterThrowable_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitThrowable_expression(this); + } + } + + public final Throwable_expressionContext throwable_expression() throws RecognitionException { + Throwable_expressionContext _localctx = new Throwable_expressionContext(_ctx, getState()); + enterRule(_localctx, 74, RULE_throwable_expression); + try { + setState(920); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BASE: + case BOOL: + case BY: + case BYTE: + case CHAR: + case CHECKED: + case DECIMAL: + case DEFAULT: + case DELEGATE: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FALSE: + case FLOAT: + case FROM: + case GET: + case GROUP: + case INT: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case NEW: + case NULL_: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REF: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case SIZEOF: + case STRING: + case THIS: + case TRUE: + case TYPEOF: + case UINT: + case ULONG: + case UNCHECKED: + case UNMANAGED: + case USHORT: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case LITERAL_ACCESS: + case INTEGER_LITERAL: + case HEX_INTEGER_LITERAL: + case BIN_INTEGER_LITERAL: + case REAL_LITERAL: + case CHARACTER_LITERAL: + case REGULAR_STRING: + case VERBATIUM_STRING: + case INTERPOLATED_REGULAR_STRING_START: + case INTERPOLATED_VERBATIUM_STRING_START: + case OPEN_PARENS: + case PLUS: + case MINUS: + case STAR: + case AMP: + case CARET: + case BANG: + case TILDE: + case OP_INC: + case OP_DEC: + case OP_RANGE: + enterOuterAlt(_localctx, 1); + { + setState(918); + expression(); + } + break; + case THROW: + enterOuterAlt(_localctx, 2); + { + setState(919); + throw_expression(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Throw_expressionContext extends ParserRuleContext { + public TerminalNode THROW() { return getToken(CSharpParser.THROW, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Throw_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_throw_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterThrow_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitThrow_expression(this); + } + } + + public final Throw_expressionContext throw_expression() throws RecognitionException { + Throw_expressionContext _localctx = new Throw_expressionContext(_ctx, getState()); + enterRule(_localctx, 76, RULE_throw_expression); + try { + enterOuterAlt(_localctx, 1); + { + setState(922); + match(THROW); + setState(923); + expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Member_accessContext extends ParserRuleContext { + public TerminalNode DOT() { return getToken(CSharpParser.DOT, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode INTERR() { return getToken(CSharpParser.INTERR, 0); } + public Type_argument_listContext type_argument_list() { + return getRuleContext(Type_argument_listContext.class,0); + } + public Member_accessContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_member_access; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterMember_access(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitMember_access(this); + } + } + + public final Member_accessContext member_access() throws RecognitionException { + Member_accessContext _localctx = new Member_accessContext(_ctx, getState()); + enterRule(_localctx, 78, RULE_member_access); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(926); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==INTERR) { + { + setState(925); + match(INTERR); + } + } + + setState(928); + match(DOT); + setState(929); + identifier(); + setState(931); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,76,_ctx) ) { + case 1: + { + setState(930); + type_argument_list(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Bracket_expressionContext extends ParserRuleContext { + public TerminalNode OPEN_BRACKET() { return getToken(CSharpParser.OPEN_BRACKET, 0); } + public List indexer_argument() { + return getRuleContexts(Indexer_argumentContext.class); + } + public Indexer_argumentContext indexer_argument(int i) { + return getRuleContext(Indexer_argumentContext.class,i); + } + public TerminalNode CLOSE_BRACKET() { return getToken(CSharpParser.CLOSE_BRACKET, 0); } + public TerminalNode INTERR() { return getToken(CSharpParser.INTERR, 0); } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Bracket_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_bracket_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterBracket_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitBracket_expression(this); + } + } + + public final Bracket_expressionContext bracket_expression() throws RecognitionException { + Bracket_expressionContext _localctx = new Bracket_expressionContext(_ctx, getState()); + enterRule(_localctx, 80, RULE_bracket_expression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(934); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==INTERR) { + { + setState(933); + match(INTERR); + } + } + + setState(936); + match(OPEN_BRACKET); + setState(937); + indexer_argument(); + setState(942); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(938); + match(COMMA); + setState(939); + indexer_argument(); + } + } + setState(944); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(945); + match(CLOSE_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Indexer_argumentContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public Indexer_argumentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_indexer_argument; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterIndexer_argument(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitIndexer_argument(this); + } + } + + public final Indexer_argumentContext indexer_argument() throws RecognitionException { + Indexer_argumentContext _localctx = new Indexer_argumentContext(_ctx, getState()); + enterRule(_localctx, 82, RULE_indexer_argument); + try { + enterOuterAlt(_localctx, 1); + { + setState(950); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { + case 1: + { + setState(947); + identifier(); + setState(948); + match(COLON); + } + break; + } + setState(952); + expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Predefined_typeContext extends ParserRuleContext { + public TerminalNode BOOL() { return getToken(CSharpParser.BOOL, 0); } + public TerminalNode BYTE() { return getToken(CSharpParser.BYTE, 0); } + public TerminalNode CHAR() { return getToken(CSharpParser.CHAR, 0); } + public TerminalNode DECIMAL() { return getToken(CSharpParser.DECIMAL, 0); } + public TerminalNode DOUBLE() { return getToken(CSharpParser.DOUBLE, 0); } + public TerminalNode FLOAT() { return getToken(CSharpParser.FLOAT, 0); } + public TerminalNode INT() { return getToken(CSharpParser.INT, 0); } + public TerminalNode LONG() { return getToken(CSharpParser.LONG, 0); } + public TerminalNode OBJECT() { return getToken(CSharpParser.OBJECT, 0); } + public TerminalNode SBYTE() { return getToken(CSharpParser.SBYTE, 0); } + public TerminalNode SHORT() { return getToken(CSharpParser.SHORT, 0); } + public TerminalNode STRING() { return getToken(CSharpParser.STRING, 0); } + public TerminalNode UINT() { return getToken(CSharpParser.UINT, 0); } + public TerminalNode ULONG() { return getToken(CSharpParser.ULONG, 0); } + public TerminalNode USHORT() { return getToken(CSharpParser.USHORT, 0); } + public Predefined_typeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_predefined_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterPredefined_type(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitPredefined_type(this); + } + } + + public final Predefined_typeContext predefined_type() throws RecognitionException { + Predefined_typeContext _localctx = new Predefined_typeContext(_ctx, getState()); + enterRule(_localctx, 84, RULE_predefined_type); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(954); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << BOOL) | (1L << BYTE) | (1L << CHAR) | (1L << DECIMAL) | (1L << DOUBLE) | (1L << FLOAT) | (1L << INT) | (1L << LONG))) != 0) || ((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & ((1L << (OBJECT - 68)) | (1L << (SBYTE - 68)) | (1L << (SHORT - 68)) | (1L << (STRING - 68)) | (1L << (UINT - 68)) | (1L << (ULONG - 68)) | (1L << (USHORT - 68)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Expression_listContext extends ParserRuleContext { + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Expression_listContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression_list; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterExpression_list(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitExpression_list(this); + } + } + + public final Expression_listContext expression_list() throws RecognitionException { + Expression_listContext _localctx = new Expression_listContext(_ctx, getState()); + enterRule(_localctx, 86, RULE_expression_list); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(956); + expression(); + setState(961); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(957); + match(COMMA); + setState(958); + expression(); + } + } + setState(963); + _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 Object_or_collection_initializerContext extends ParserRuleContext { + public Object_initializerContext object_initializer() { + return getRuleContext(Object_initializerContext.class,0); + } + public Collection_initializerContext collection_initializer() { + return getRuleContext(Collection_initializerContext.class,0); + } + public Object_or_collection_initializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_object_or_collection_initializer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterObject_or_collection_initializer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitObject_or_collection_initializer(this); + } + } + + public final Object_or_collection_initializerContext object_or_collection_initializer() throws RecognitionException { + Object_or_collection_initializerContext _localctx = new Object_or_collection_initializerContext(_ctx, getState()); + enterRule(_localctx, 88, RULE_object_or_collection_initializer); + try { + setState(966); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(964); + object_initializer(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(965); + collection_initializer(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Object_initializerContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public Member_initializer_listContext member_initializer_list() { + return getRuleContext(Member_initializer_listContext.class,0); + } + public TerminalNode COMMA() { return getToken(CSharpParser.COMMA, 0); } + public Object_initializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_object_initializer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterObject_initializer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitObject_initializer(this); + } + } + + public final Object_initializerContext object_initializer() throws RecognitionException { + Object_initializerContext _localctx = new Object_initializerContext(_ctx, getState()); + enterRule(_localctx, 90, RULE_object_initializer); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(968); + match(OPEN_BRACE); + setState(973); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BY) | (1L << DESCENDING) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INTO) | (1L << JOIN) | (1L << LET))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REMOVE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (UNMANAGED - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (OPEN_BRACKET - 64)))) != 0)) { + { + setState(969); + member_initializer_list(); + setState(971); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(970); + match(COMMA); + } + } + + } + } + + setState(975); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Member_initializer_listContext extends ParserRuleContext { + public List member_initializer() { + return getRuleContexts(Member_initializerContext.class); + } + public Member_initializerContext member_initializer(int i) { + return getRuleContext(Member_initializerContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Member_initializer_listContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_member_initializer_list; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterMember_initializer_list(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitMember_initializer_list(this); + } + } + + public final Member_initializer_listContext member_initializer_list() throws RecognitionException { + Member_initializer_listContext _localctx = new Member_initializer_listContext(_ctx, getState()); + enterRule(_localctx, 92, RULE_member_initializer_list); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(977); + member_initializer(); + setState(982); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,84,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(978); + match(COMMA); + setState(979); + member_initializer(); + } + } + } + setState(984); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,84,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Member_initializerContext extends ParserRuleContext { + public TerminalNode ASSIGNMENT() { return getToken(CSharpParser.ASSIGNMENT, 0); } + public Initializer_valueContext initializer_value() { + return getRuleContext(Initializer_valueContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode OPEN_BRACKET() { return getToken(CSharpParser.OPEN_BRACKET, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_BRACKET() { return getToken(CSharpParser.CLOSE_BRACKET, 0); } + public Member_initializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_member_initializer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterMember_initializer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitMember_initializer(this); + } + } + + public final Member_initializerContext member_initializer() throws RecognitionException { + Member_initializerContext _localctx = new Member_initializerContext(_ctx, getState()); + enterRule(_localctx, 94, RULE_member_initializer); + try { + enterOuterAlt(_localctx, 1); + { + setState(990); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BY: + case DESCENDING: + case DYNAMIC: + case EQUALS: + case FROM: + case GET: + case GROUP: + case INTO: + case JOIN: + case LET: + case NAMEOF: + case ON: + case ORDERBY: + case PARTIAL: + case REMOVE: + case SELECT: + case SET: + case UNMANAGED: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + { + setState(985); + identifier(); + } + break; + case OPEN_BRACKET: + { + setState(986); + match(OPEN_BRACKET); + setState(987); + expression(); + setState(988); + match(CLOSE_BRACKET); + } + break; + default: + throw new NoViableAltException(this); + } + setState(992); + match(ASSIGNMENT); + setState(993); + initializer_value(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Initializer_valueContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Object_or_collection_initializerContext object_or_collection_initializer() { + return getRuleContext(Object_or_collection_initializerContext.class,0); + } + public Initializer_valueContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_initializer_value; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterInitializer_value(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitInitializer_value(this); + } + } + + public final Initializer_valueContext initializer_value() throws RecognitionException { + Initializer_valueContext _localctx = new Initializer_valueContext(_ctx, getState()); + enterRule(_localctx, 96, RULE_initializer_value); + try { + setState(997); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BASE: + case BOOL: + case BY: + case BYTE: + case CHAR: + case CHECKED: + case DECIMAL: + case DEFAULT: + case DELEGATE: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FALSE: + case FLOAT: + case FROM: + case GET: + case GROUP: + case INT: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case NEW: + case NULL_: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REF: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case SIZEOF: + case STRING: + case THIS: + case TRUE: + case TYPEOF: + case UINT: + case ULONG: + case UNCHECKED: + case UNMANAGED: + case USHORT: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case LITERAL_ACCESS: + case INTEGER_LITERAL: + case HEX_INTEGER_LITERAL: + case BIN_INTEGER_LITERAL: + case REAL_LITERAL: + case CHARACTER_LITERAL: + case REGULAR_STRING: + case VERBATIUM_STRING: + case INTERPOLATED_REGULAR_STRING_START: + case INTERPOLATED_VERBATIUM_STRING_START: + case OPEN_PARENS: + case PLUS: + case MINUS: + case STAR: + case AMP: + case CARET: + case BANG: + case TILDE: + case OP_INC: + case OP_DEC: + case OP_RANGE: + enterOuterAlt(_localctx, 1); + { + setState(995); + expression(); + } + break; + case OPEN_BRACE: + enterOuterAlt(_localctx, 2); + { + setState(996); + object_or_collection_initializer(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Collection_initializerContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public List element_initializer() { + return getRuleContexts(Element_initializerContext.class); + } + public Element_initializerContext element_initializer(int i) { + return getRuleContext(Element_initializerContext.class,i); + } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Collection_initializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_collection_initializer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterCollection_initializer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitCollection_initializer(this); + } + } + + public final Collection_initializerContext collection_initializer() throws RecognitionException { + Collection_initializerContext _localctx = new Collection_initializerContext(_ctx, getState()); + enterRule(_localctx, 98, RULE_collection_initializer); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(999); + match(OPEN_BRACE); + setState(1000); + element_initializer(); + setState(1005); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,87,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1001); + match(COMMA); + setState(1002); + element_initializer(); + } + } + } + setState(1007); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,87,_ctx); + } + setState(1009); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(1008); + match(COMMA); + } + } + + setState(1011); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Element_initializerContext extends ParserRuleContext { + public Non_assignment_expressionContext non_assignment_expression() { + return getRuleContext(Non_assignment_expressionContext.class,0); + } + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public Expression_listContext expression_list() { + return getRuleContext(Expression_listContext.class,0); + } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public Element_initializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_element_initializer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterElement_initializer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitElement_initializer(this); + } + } + + public final Element_initializerContext element_initializer() throws RecognitionException { + Element_initializerContext _localctx = new Element_initializerContext(_ctx, getState()); + enterRule(_localctx, 100, RULE_element_initializer); + try { + setState(1018); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BASE: + case BOOL: + case BY: + case BYTE: + case CHAR: + case CHECKED: + case DECIMAL: + case DEFAULT: + case DELEGATE: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FALSE: + case FLOAT: + case FROM: + case GET: + case GROUP: + case INT: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case NEW: + case NULL_: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case SIZEOF: + case STRING: + case THIS: + case TRUE: + case TYPEOF: + case UINT: + case ULONG: + case UNCHECKED: + case UNMANAGED: + case USHORT: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case LITERAL_ACCESS: + case INTEGER_LITERAL: + case HEX_INTEGER_LITERAL: + case BIN_INTEGER_LITERAL: + case REAL_LITERAL: + case CHARACTER_LITERAL: + case REGULAR_STRING: + case VERBATIUM_STRING: + case INTERPOLATED_REGULAR_STRING_START: + case INTERPOLATED_VERBATIUM_STRING_START: + case OPEN_PARENS: + case PLUS: + case MINUS: + case STAR: + case AMP: + case CARET: + case BANG: + case TILDE: + case OP_INC: + case OP_DEC: + case OP_RANGE: + enterOuterAlt(_localctx, 1); + { + setState(1013); + non_assignment_expression(); + } + break; + case OPEN_BRACE: + enterOuterAlt(_localctx, 2); + { + setState(1014); + match(OPEN_BRACE); + setState(1015); + expression_list(); + setState(1016); + match(CLOSE_BRACE); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Anonymous_object_initializerContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public Member_declarator_listContext member_declarator_list() { + return getRuleContext(Member_declarator_listContext.class,0); + } + public TerminalNode COMMA() { return getToken(CSharpParser.COMMA, 0); } + public Anonymous_object_initializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_anonymous_object_initializer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAnonymous_object_initializer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAnonymous_object_initializer(this); + } + } + + public final Anonymous_object_initializerContext anonymous_object_initializer() throws RecognitionException { + Anonymous_object_initializerContext _localctx = new Anonymous_object_initializerContext(_ctx, getState()); + enterRule(_localctx, 102, RULE_anonymous_object_initializer); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1020); + match(OPEN_BRACE); + setState(1025); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 10)) & ~0x3f) == 0 && ((1L << (_la - 10)) & ((1L << (ADD - 10)) | (1L << (ALIAS - 10)) | (1L << (ARGLIST - 10)) | (1L << (ASCENDING - 10)) | (1L << (ASYNC - 10)) | (1L << (AWAIT - 10)) | (1L << (BASE - 10)) | (1L << (BOOL - 10)) | (1L << (BY - 10)) | (1L << (BYTE - 10)) | (1L << (CHAR - 10)) | (1L << (CHECKED - 10)) | (1L << (DECIMAL - 10)) | (1L << (DEFAULT - 10)) | (1L << (DELEGATE - 10)) | (1L << (DESCENDING - 10)) | (1L << (DOUBLE - 10)) | (1L << (DYNAMIC - 10)) | (1L << (EQUALS - 10)) | (1L << (FALSE - 10)) | (1L << (FLOAT - 10)) | (1L << (FROM - 10)) | (1L << (GET - 10)) | (1L << (GROUP - 10)) | (1L << (INT - 10)) | (1L << (INTO - 10)) | (1L << (JOIN - 10)) | (1L << (LET - 10)) | (1L << (LONG - 10)) | (1L << (NAMEOF - 10)) | (1L << (NEW - 10)) | (1L << (NULL_ - 10)) | (1L << (OBJECT - 10)) | (1L << (ON - 10)) | (1L << (ORDERBY - 10)))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (PARTIAL - 75)) | (1L << (REMOVE - 75)) | (1L << (SBYTE - 75)) | (1L << (SELECT - 75)) | (1L << (SET - 75)) | (1L << (SHORT - 75)) | (1L << (SIZEOF - 75)) | (1L << (STRING - 75)) | (1L << (THIS - 75)) | (1L << (TRUE - 75)) | (1L << (TYPEOF - 75)) | (1L << (UINT - 75)) | (1L << (ULONG - 75)) | (1L << (UNCHECKED - 75)) | (1L << (UNMANAGED - 75)) | (1L << (USHORT - 75)) | (1L << (VAR - 75)) | (1L << (WHEN - 75)) | (1L << (WHERE - 75)) | (1L << (YIELD - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (LITERAL_ACCESS - 75)) | (1L << (INTEGER_LITERAL - 75)) | (1L << (HEX_INTEGER_LITERAL - 75)) | (1L << (BIN_INTEGER_LITERAL - 75)) | (1L << (REAL_LITERAL - 75)) | (1L << (CHARACTER_LITERAL - 75)) | (1L << (REGULAR_STRING - 75)) | (1L << (VERBATIUM_STRING - 75)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 75)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 75)) | (1L << (OPEN_PARENS - 75)))) != 0)) { + { + setState(1021); + member_declarator_list(); + setState(1023); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(1022); + match(COMMA); + } + } + + } + } + + setState(1027); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Member_declarator_listContext extends ParserRuleContext { + public List member_declarator() { + return getRuleContexts(Member_declaratorContext.class); + } + public Member_declaratorContext member_declarator(int i) { + return getRuleContext(Member_declaratorContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Member_declarator_listContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_member_declarator_list; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterMember_declarator_list(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitMember_declarator_list(this); + } + } + + public final Member_declarator_listContext member_declarator_list() throws RecognitionException { + Member_declarator_listContext _localctx = new Member_declarator_listContext(_ctx, getState()); + enterRule(_localctx, 104, RULE_member_declarator_list); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1029); + member_declarator(); + setState(1034); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1030); + match(COMMA); + setState(1031); + member_declarator(); + } + } + } + setState(1036); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,92,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Member_declaratorContext extends ParserRuleContext { + public Primary_expressionContext primary_expression() { + return getRuleContext(Primary_expressionContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode ASSIGNMENT() { return getToken(CSharpParser.ASSIGNMENT, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Member_declaratorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_member_declarator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterMember_declarator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitMember_declarator(this); + } + } + + public final Member_declaratorContext member_declarator() throws RecognitionException { + Member_declaratorContext _localctx = new Member_declaratorContext(_ctx, getState()); + enterRule(_localctx, 106, RULE_member_declarator); + try { + setState(1042); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1037); + primary_expression(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1038); + identifier(); + setState(1039); + match(ASSIGNMENT); + setState(1040); + expression(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Unbound_type_nameContext extends ParserRuleContext { + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public TerminalNode DOUBLE_COLON() { return getToken(CSharpParser.DOUBLE_COLON, 0); } + public List DOT() { return getTokens(CSharpParser.DOT); } + public TerminalNode DOT(int i) { + return getToken(CSharpParser.DOT, i); + } + public List generic_dimension_specifier() { + return getRuleContexts(Generic_dimension_specifierContext.class); + } + public Generic_dimension_specifierContext generic_dimension_specifier(int i) { + return getRuleContext(Generic_dimension_specifierContext.class,i); + } + public Unbound_type_nameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_unbound_type_name; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterUnbound_type_name(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitUnbound_type_name(this); + } + } + + public final Unbound_type_nameContext unbound_type_name() throws RecognitionException { + Unbound_type_nameContext _localctx = new Unbound_type_nameContext(_ctx, getState()); + enterRule(_localctx, 108, RULE_unbound_type_name); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1044); + identifier(); + setState(1053); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CLOSE_PARENS: + case DOT: + case LT: + { + setState(1046); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LT) { + { + setState(1045); + generic_dimension_specifier(); + } + } + + } + break; + case DOUBLE_COLON: + { + setState(1048); + match(DOUBLE_COLON); + setState(1049); + identifier(); + setState(1051); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LT) { + { + setState(1050); + generic_dimension_specifier(); + } + } + + } + break; + default: + throw new NoViableAltException(this); + } + setState(1062); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==DOT) { + { + { + setState(1055); + match(DOT); + setState(1056); + identifier(); + setState(1058); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LT) { + { + setState(1057); + generic_dimension_specifier(); + } + } + + } + } + setState(1064); + _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 Generic_dimension_specifierContext extends ParserRuleContext { + public TerminalNode LT() { return getToken(CSharpParser.LT, 0); } + public TerminalNode GT() { return getToken(CSharpParser.GT, 0); } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Generic_dimension_specifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_generic_dimension_specifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterGeneric_dimension_specifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitGeneric_dimension_specifier(this); + } + } + + public final Generic_dimension_specifierContext generic_dimension_specifier() throws RecognitionException { + Generic_dimension_specifierContext _localctx = new Generic_dimension_specifierContext(_ctx, getState()); + enterRule(_localctx, 110, RULE_generic_dimension_specifier); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1065); + match(LT); + setState(1069); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1066); + match(COMMA); + } + } + setState(1071); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1072); + match(GT); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IsTypeContext extends ParserRuleContext { + public Base_typeContext base_type() { + return getRuleContext(Base_typeContext.class,0); + } + public List rank_specifier() { + return getRuleContexts(Rank_specifierContext.class); + } + public Rank_specifierContext rank_specifier(int i) { + return getRuleContext(Rank_specifierContext.class,i); + } + public List STAR() { return getTokens(CSharpParser.STAR); } + public TerminalNode STAR(int i) { + return getToken(CSharpParser.STAR, i); + } + public TerminalNode INTERR() { return getToken(CSharpParser.INTERR, 0); } + public IsTypePatternArmsContext isTypePatternArms() { + return getRuleContext(IsTypePatternArmsContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public IsTypeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_isType; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterIsType(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitIsType(this); + } + } + + public final IsTypeContext isType() throws RecognitionException { + IsTypeContext _localctx = new IsTypeContext(_ctx, getState()); + enterRule(_localctx, 112, RULE_isType); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1074); + base_type(); + setState(1079); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,101,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + setState(1077); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACKET: + { + setState(1075); + rank_specifier(); + } + break; + case STAR: + { + setState(1076); + match(STAR); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + setState(1081); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,101,_ctx); + } + setState(1083); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { + case 1: + { + setState(1082); + match(INTERR); + } + break; + } + setState(1086); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACE) { + { + setState(1085); + isTypePatternArms(); + } + } + + setState(1089); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,104,_ctx) ) { + case 1: + { + setState(1088); + identifier(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IsTypePatternArmsContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public List isTypePatternArm() { + return getRuleContexts(IsTypePatternArmContext.class); + } + public IsTypePatternArmContext isTypePatternArm(int i) { + return getRuleContext(IsTypePatternArmContext.class,i); + } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public IsTypePatternArmsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_isTypePatternArms; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterIsTypePatternArms(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitIsTypePatternArms(this); + } + } + + public final IsTypePatternArmsContext isTypePatternArms() throws RecognitionException { + IsTypePatternArmsContext _localctx = new IsTypePatternArmsContext(_ctx, getState()); + enterRule(_localctx, 114, RULE_isTypePatternArms); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1091); + match(OPEN_BRACE); + setState(1092); + isTypePatternArm(); + setState(1097); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1093); + match(COMMA); + setState(1094); + isTypePatternArm(); + } + } + setState(1099); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1100); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IsTypePatternArmContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public IsTypePatternArmContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_isTypePatternArm; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterIsTypePatternArm(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitIsTypePatternArm(this); + } + } + + public final IsTypePatternArmContext isTypePatternArm() throws RecognitionException { + IsTypePatternArmContext _localctx = new IsTypePatternArmContext(_ctx, getState()); + enterRule(_localctx, 116, RULE_isTypePatternArm); + try { + enterOuterAlt(_localctx, 1); + { + setState(1102); + identifier(); + setState(1103); + match(COLON); + setState(1104); + expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Lambda_expressionContext extends ParserRuleContext { + public Anonymous_function_signatureContext anonymous_function_signature() { + return getRuleContext(Anonymous_function_signatureContext.class,0); + } + public Right_arrowContext right_arrow() { + return getRuleContext(Right_arrowContext.class,0); + } + public Anonymous_function_bodyContext anonymous_function_body() { + return getRuleContext(Anonymous_function_bodyContext.class,0); + } + public TerminalNode ASYNC() { return getToken(CSharpParser.ASYNC, 0); } + public Lambda_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_lambda_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLambda_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLambda_expression(this); + } + } + + public final Lambda_expressionContext lambda_expression() throws RecognitionException { + Lambda_expressionContext _localctx = new Lambda_expressionContext(_ctx, getState()); + enterRule(_localctx, 118, RULE_lambda_expression); + try { + enterOuterAlt(_localctx, 1); + { + setState(1107); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,106,_ctx) ) { + case 1: + { + setState(1106); + match(ASYNC); + } + break; + } + setState(1109); + anonymous_function_signature(); + setState(1110); + right_arrow(); + setState(1111); + anonymous_function_body(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Anonymous_function_signatureContext extends ParserRuleContext { + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Explicit_anonymous_function_parameter_listContext explicit_anonymous_function_parameter_list() { + return getRuleContext(Explicit_anonymous_function_parameter_listContext.class,0); + } + public Implicit_anonymous_function_parameter_listContext implicit_anonymous_function_parameter_list() { + return getRuleContext(Implicit_anonymous_function_parameter_listContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public Anonymous_function_signatureContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_anonymous_function_signature; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAnonymous_function_signature(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAnonymous_function_signature(this); + } + } + + public final Anonymous_function_signatureContext anonymous_function_signature() throws RecognitionException { + Anonymous_function_signatureContext _localctx = new Anonymous_function_signatureContext(_ctx, getState()); + enterRule(_localctx, 120, RULE_anonymous_function_signature); + try { + setState(1124); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,107,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1113); + match(OPEN_PARENS); + setState(1114); + match(CLOSE_PARENS); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1115); + match(OPEN_PARENS); + setState(1116); + explicit_anonymous_function_parameter_list(); + setState(1117); + match(CLOSE_PARENS); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1119); + match(OPEN_PARENS); + setState(1120); + implicit_anonymous_function_parameter_list(); + setState(1121); + match(CLOSE_PARENS); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(1123); + identifier(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Explicit_anonymous_function_parameter_listContext extends ParserRuleContext { + public List explicit_anonymous_function_parameter() { + return getRuleContexts(Explicit_anonymous_function_parameterContext.class); + } + public Explicit_anonymous_function_parameterContext explicit_anonymous_function_parameter(int i) { + return getRuleContext(Explicit_anonymous_function_parameterContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Explicit_anonymous_function_parameter_listContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_explicit_anonymous_function_parameter_list; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterExplicit_anonymous_function_parameter_list(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitExplicit_anonymous_function_parameter_list(this); + } + } + + public final Explicit_anonymous_function_parameter_listContext explicit_anonymous_function_parameter_list() throws RecognitionException { + Explicit_anonymous_function_parameter_listContext _localctx = new Explicit_anonymous_function_parameter_listContext(_ctx, getState()); + enterRule(_localctx, 122, RULE_explicit_anonymous_function_parameter_list); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1126); + explicit_anonymous_function_parameter(); + setState(1131); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1127); + match(COMMA); + setState(1128); + explicit_anonymous_function_parameter(); + } + } + setState(1133); + _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 Explicit_anonymous_function_parameterContext extends ParserRuleContext { + public Token refout; + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode REF() { return getToken(CSharpParser.REF, 0); } + public TerminalNode OUT() { return getToken(CSharpParser.OUT, 0); } + public TerminalNode IN() { return getToken(CSharpParser.IN, 0); } + public Explicit_anonymous_function_parameterContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_explicit_anonymous_function_parameter; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterExplicit_anonymous_function_parameter(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitExplicit_anonymous_function_parameter(this); + } + } + + public final Explicit_anonymous_function_parameterContext explicit_anonymous_function_parameter() throws RecognitionException { + Explicit_anonymous_function_parameterContext _localctx = new Explicit_anonymous_function_parameterContext(_ctx, getState()); + enterRule(_localctx, 124, RULE_explicit_anonymous_function_parameter); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1135); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 54)) & ~0x3f) == 0 && ((1L << (_la - 54)) & ((1L << (IN - 54)) | (1L << (OUT - 54)) | (1L << (REF - 54)))) != 0)) { + { + setState(1134); + ((Explicit_anonymous_function_parameterContext)_localctx).refout = _input.LT(1); + _la = _input.LA(1); + if ( !(((((_la - 54)) & ~0x3f) == 0 && ((1L << (_la - 54)) & ((1L << (IN - 54)) | (1L << (OUT - 54)) | (1L << (REF - 54)))) != 0)) ) { + ((Explicit_anonymous_function_parameterContext)_localctx).refout = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + + setState(1137); + type_(); + setState(1138); + identifier(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Implicit_anonymous_function_parameter_listContext extends ParserRuleContext { + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Implicit_anonymous_function_parameter_listContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_implicit_anonymous_function_parameter_list; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterImplicit_anonymous_function_parameter_list(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitImplicit_anonymous_function_parameter_list(this); + } + } + + public final Implicit_anonymous_function_parameter_listContext implicit_anonymous_function_parameter_list() throws RecognitionException { + Implicit_anonymous_function_parameter_listContext _localctx = new Implicit_anonymous_function_parameter_listContext(_ctx, getState()); + enterRule(_localctx, 126, RULE_implicit_anonymous_function_parameter_list); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1140); + identifier(); + setState(1145); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1141); + match(COMMA); + setState(1142); + identifier(); + } + } + setState(1147); + _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 Anonymous_function_bodyContext extends ParserRuleContext { + public Throwable_expressionContext throwable_expression() { + return getRuleContext(Throwable_expressionContext.class,0); + } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public Anonymous_function_bodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_anonymous_function_body; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAnonymous_function_body(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAnonymous_function_body(this); + } + } + + public final Anonymous_function_bodyContext anonymous_function_body() throws RecognitionException { + Anonymous_function_bodyContext _localctx = new Anonymous_function_bodyContext(_ctx, getState()); + enterRule(_localctx, 128, RULE_anonymous_function_body); + try { + setState(1150); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BASE: + case BOOL: + case BY: + case BYTE: + case CHAR: + case CHECKED: + case DECIMAL: + case DEFAULT: + case DELEGATE: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FALSE: + case FLOAT: + case FROM: + case GET: + case GROUP: + case INT: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case NEW: + case NULL_: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REF: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case SIZEOF: + case STRING: + case THIS: + case THROW: + case TRUE: + case TYPEOF: + case UINT: + case ULONG: + case UNCHECKED: + case UNMANAGED: + case USHORT: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case LITERAL_ACCESS: + case INTEGER_LITERAL: + case HEX_INTEGER_LITERAL: + case BIN_INTEGER_LITERAL: + case REAL_LITERAL: + case CHARACTER_LITERAL: + case REGULAR_STRING: + case VERBATIUM_STRING: + case INTERPOLATED_REGULAR_STRING_START: + case INTERPOLATED_VERBATIUM_STRING_START: + case OPEN_PARENS: + case PLUS: + case MINUS: + case STAR: + case AMP: + case CARET: + case BANG: + case TILDE: + case OP_INC: + case OP_DEC: + case OP_RANGE: + enterOuterAlt(_localctx, 1); + { + setState(1148); + throwable_expression(); + } + break; + case OPEN_BRACE: + enterOuterAlt(_localctx, 2); + { + setState(1149); + block(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Query_expressionContext extends ParserRuleContext { + public From_clauseContext from_clause() { + return getRuleContext(From_clauseContext.class,0); + } + public Query_bodyContext query_body() { + return getRuleContext(Query_bodyContext.class,0); + } + public Query_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_query_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterQuery_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitQuery_expression(this); + } + } + + public final Query_expressionContext query_expression() throws RecognitionException { + Query_expressionContext _localctx = new Query_expressionContext(_ctx, getState()); + enterRule(_localctx, 130, RULE_query_expression); + try { + enterOuterAlt(_localctx, 1); + { + setState(1152); + from_clause(); + setState(1153); + query_body(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class From_clauseContext extends ParserRuleContext { + public TerminalNode FROM() { return getToken(CSharpParser.FROM, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode IN() { return getToken(CSharpParser.IN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public From_clauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_from_clause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterFrom_clause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitFrom_clause(this); + } + } + + public final From_clauseContext from_clause() throws RecognitionException { + From_clauseContext _localctx = new From_clauseContext(_ctx, getState()); + enterRule(_localctx, 132, RULE_from_clause); + try { + enterOuterAlt(_localctx, 1); + { + setState(1155); + match(FROM); + setState(1157); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,112,_ctx) ) { + case 1: + { + setState(1156); + type_(); + } + break; + } + setState(1159); + identifier(); + setState(1160); + match(IN); + setState(1161); + expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Query_bodyContext extends ParserRuleContext { + public Select_or_group_clauseContext select_or_group_clause() { + return getRuleContext(Select_or_group_clauseContext.class,0); + } + public List query_body_clause() { + return getRuleContexts(Query_body_clauseContext.class); + } + public Query_body_clauseContext query_body_clause(int i) { + return getRuleContext(Query_body_clauseContext.class,i); + } + public Query_continuationContext query_continuation() { + return getRuleContext(Query_continuationContext.class,0); + } + public Query_bodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_query_body; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterQuery_body(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitQuery_body(this); + } + } + + public final Query_bodyContext query_body() throws RecognitionException { + Query_bodyContext _localctx = new Query_bodyContext(_ctx, getState()); + enterRule(_localctx, 134, RULE_query_body); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1166); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 48)) & ~0x3f) == 0 && ((1L << (_la - 48)) & ((1L << (FROM - 48)) | (1L << (JOIN - 48)) | (1L << (LET - 48)) | (1L << (ORDERBY - 48)) | (1L << (WHERE - 48)))) != 0)) { + { + { + setState(1163); + query_body_clause(); + } + } + setState(1168); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1169); + select_or_group_clause(); + setState(1171); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,114,_ctx) ) { + case 1: + { + setState(1170); + query_continuation(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Query_body_clauseContext extends ParserRuleContext { + public From_clauseContext from_clause() { + return getRuleContext(From_clauseContext.class,0); + } + public Let_clauseContext let_clause() { + return getRuleContext(Let_clauseContext.class,0); + } + public Where_clauseContext where_clause() { + return getRuleContext(Where_clauseContext.class,0); + } + public Combined_join_clauseContext combined_join_clause() { + return getRuleContext(Combined_join_clauseContext.class,0); + } + public Orderby_clauseContext orderby_clause() { + return getRuleContext(Orderby_clauseContext.class,0); + } + public Query_body_clauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_query_body_clause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterQuery_body_clause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitQuery_body_clause(this); + } + } + + public final Query_body_clauseContext query_body_clause() throws RecognitionException { + Query_body_clauseContext _localctx = new Query_body_clauseContext(_ctx, getState()); + enterRule(_localctx, 136, RULE_query_body_clause); + try { + setState(1178); + _errHandler.sync(this); + switch (_input.LA(1)) { + case FROM: + enterOuterAlt(_localctx, 1); + { + setState(1173); + from_clause(); + } + break; + case LET: + enterOuterAlt(_localctx, 2); + { + setState(1174); + let_clause(); + } + break; + case WHERE: + enterOuterAlt(_localctx, 3); + { + setState(1175); + where_clause(); + } + break; + case JOIN: + enterOuterAlt(_localctx, 4); + { + setState(1176); + combined_join_clause(); + } + break; + case ORDERBY: + enterOuterAlt(_localctx, 5); + { + setState(1177); + orderby_clause(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Let_clauseContext extends ParserRuleContext { + public TerminalNode LET() { return getToken(CSharpParser.LET, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode ASSIGNMENT() { return getToken(CSharpParser.ASSIGNMENT, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Let_clauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_let_clause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLet_clause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLet_clause(this); + } + } + + public final Let_clauseContext let_clause() throws RecognitionException { + Let_clauseContext _localctx = new Let_clauseContext(_ctx, getState()); + enterRule(_localctx, 138, RULE_let_clause); + try { + enterOuterAlt(_localctx, 1); + { + setState(1180); + match(LET); + setState(1181); + identifier(); + setState(1182); + match(ASSIGNMENT); + setState(1183); + expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Where_clauseContext extends ParserRuleContext { + public TerminalNode WHERE() { return getToken(CSharpParser.WHERE, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Where_clauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_where_clause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterWhere_clause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitWhere_clause(this); + } + } + + public final Where_clauseContext where_clause() throws RecognitionException { + Where_clauseContext _localctx = new Where_clauseContext(_ctx, getState()); + enterRule(_localctx, 140, RULE_where_clause); + try { + enterOuterAlt(_localctx, 1); + { + setState(1185); + match(WHERE); + setState(1186); + expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Combined_join_clauseContext extends ParserRuleContext { + public TerminalNode JOIN() { return getToken(CSharpParser.JOIN, 0); } + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public TerminalNode IN() { return getToken(CSharpParser.IN, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode ON() { return getToken(CSharpParser.ON, 0); } + public TerminalNode EQUALS() { return getToken(CSharpParser.EQUALS, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public TerminalNode INTO() { return getToken(CSharpParser.INTO, 0); } + public Combined_join_clauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_combined_join_clause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterCombined_join_clause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitCombined_join_clause(this); + } + } + + public final Combined_join_clauseContext combined_join_clause() throws RecognitionException { + Combined_join_clauseContext _localctx = new Combined_join_clauseContext(_ctx, getState()); + enterRule(_localctx, 142, RULE_combined_join_clause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1188); + match(JOIN); + setState(1190); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,116,_ctx) ) { + case 1: + { + setState(1189); + type_(); + } + break; + } + setState(1192); + identifier(); + setState(1193); + match(IN); + setState(1194); + expression(); + setState(1195); + match(ON); + setState(1196); + expression(); + setState(1197); + match(EQUALS); + setState(1198); + expression(); + setState(1201); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==INTO) { + { + setState(1199); + match(INTO); + setState(1200); + identifier(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Orderby_clauseContext extends ParserRuleContext { + public TerminalNode ORDERBY() { return getToken(CSharpParser.ORDERBY, 0); } + public List ordering() { + return getRuleContexts(OrderingContext.class); + } + public OrderingContext ordering(int i) { + return getRuleContext(OrderingContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Orderby_clauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_orderby_clause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterOrderby_clause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitOrderby_clause(this); + } + } + + public final Orderby_clauseContext orderby_clause() throws RecognitionException { + Orderby_clauseContext _localctx = new Orderby_clauseContext(_ctx, getState()); + enterRule(_localctx, 144, RULE_orderby_clause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1203); + match(ORDERBY); + setState(1204); + ordering(); + setState(1209); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1205); + match(COMMA); + setState(1206); + ordering(); + } + } + setState(1211); + _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 OrderingContext extends ParserRuleContext { + public Token dir; + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode ASCENDING() { return getToken(CSharpParser.ASCENDING, 0); } + public TerminalNode DESCENDING() { return getToken(CSharpParser.DESCENDING, 0); } + public OrderingContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ordering; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterOrdering(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitOrdering(this); + } + } + + public final OrderingContext ordering() throws RecognitionException { + OrderingContext _localctx = new OrderingContext(_ctx, getState()); + enterRule(_localctx, 146, RULE_ordering); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1212); + expression(); + setState(1214); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ASCENDING || _la==DESCENDING) { + { + setState(1213); + ((OrderingContext)_localctx).dir = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==ASCENDING || _la==DESCENDING) ) { + ((OrderingContext)_localctx).dir = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Select_or_group_clauseContext extends ParserRuleContext { + public TerminalNode SELECT() { return getToken(CSharpParser.SELECT, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode GROUP() { return getToken(CSharpParser.GROUP, 0); } + public TerminalNode BY() { return getToken(CSharpParser.BY, 0); } + public Select_or_group_clauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_select_or_group_clause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterSelect_or_group_clause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitSelect_or_group_clause(this); + } + } + + public final Select_or_group_clauseContext select_or_group_clause() throws RecognitionException { + Select_or_group_clauseContext _localctx = new Select_or_group_clauseContext(_ctx, getState()); + enterRule(_localctx, 148, RULE_select_or_group_clause); + try { + setState(1223); + _errHandler.sync(this); + switch (_input.LA(1)) { + case SELECT: + enterOuterAlt(_localctx, 1); + { + setState(1216); + match(SELECT); + setState(1217); + expression(); + } + break; + case GROUP: + enterOuterAlt(_localctx, 2); + { + setState(1218); + match(GROUP); + setState(1219); + expression(); + setState(1220); + match(BY); + setState(1221); + expression(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Query_continuationContext extends ParserRuleContext { + public TerminalNode INTO() { return getToken(CSharpParser.INTO, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public Query_bodyContext query_body() { + return getRuleContext(Query_bodyContext.class,0); + } + public Query_continuationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_query_continuation; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterQuery_continuation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitQuery_continuation(this); + } + } + + public final Query_continuationContext query_continuation() throws RecognitionException { + Query_continuationContext _localctx = new Query_continuationContext(_ctx, getState()); + enterRule(_localctx, 150, RULE_query_continuation); + try { + enterOuterAlt(_localctx, 1); + { + setState(1225); + match(INTO); + setState(1226); + identifier(); + setState(1227); + query_body(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class StatementContext extends ParserRuleContext { + public Labeled_StatementContext labeled_Statement() { + return getRuleContext(Labeled_StatementContext.class,0); + } + public DeclarationStatementContext declarationStatement() { + return getRuleContext(DeclarationStatementContext.class,0); + } + public Embedded_statementContext embedded_statement() { + return getRuleContext(Embedded_statementContext.class,0); + } + public StatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitStatement(this); + } + } + + public final StatementContext statement() throws RecognitionException { + StatementContext _localctx = new StatementContext(_ctx, getState()); + enterRule(_localctx, 152, RULE_statement); + try { + setState(1232); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,121,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1229); + labeled_Statement(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1230); + declarationStatement(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1231); + embedded_statement(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class DeclarationStatementContext extends ParserRuleContext { + public Local_variable_declarationContext local_variable_declaration() { + return getRuleContext(Local_variable_declarationContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Local_constant_declarationContext local_constant_declaration() { + return getRuleContext(Local_constant_declarationContext.class,0); + } + public Local_function_declarationContext local_function_declaration() { + return getRuleContext(Local_function_declarationContext.class,0); + } + public DeclarationStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_declarationStatement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterDeclarationStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitDeclarationStatement(this); + } + } + + public final DeclarationStatementContext declarationStatement() throws RecognitionException { + DeclarationStatementContext _localctx = new DeclarationStatementContext(_ctx, getState()); + enterRule(_localctx, 154, RULE_declarationStatement); + try { + setState(1241); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,122,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1234); + local_variable_declaration(); + setState(1235); + match(SEMICOLON); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1237); + local_constant_declaration(); + setState(1238); + match(SEMICOLON); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1240); + local_function_declaration(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Local_function_declarationContext extends ParserRuleContext { + public Local_function_headerContext local_function_header() { + return getRuleContext(Local_function_headerContext.class,0); + } + public Local_function_bodyContext local_function_body() { + return getRuleContext(Local_function_bodyContext.class,0); + } + public Local_function_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_local_function_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLocal_function_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLocal_function_declaration(this); + } + } + + public final Local_function_declarationContext local_function_declaration() throws RecognitionException { + Local_function_declarationContext _localctx = new Local_function_declarationContext(_ctx, getState()); + enterRule(_localctx, 156, RULE_local_function_declaration); + try { + enterOuterAlt(_localctx, 1); + { + setState(1243); + local_function_header(); + setState(1244); + local_function_body(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Local_function_headerContext extends ParserRuleContext { + public Return_typeContext return_type() { + return getRuleContext(Return_typeContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Local_function_modifiersContext local_function_modifiers() { + return getRuleContext(Local_function_modifiersContext.class,0); + } + public Type_parameter_listContext type_parameter_list() { + return getRuleContext(Type_parameter_listContext.class,0); + } + public Formal_parameter_listContext formal_parameter_list() { + return getRuleContext(Formal_parameter_listContext.class,0); + } + public Type_parameter_constraints_clausesContext type_parameter_constraints_clauses() { + return getRuleContext(Type_parameter_constraints_clausesContext.class,0); + } + public Local_function_headerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_local_function_header; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLocal_function_header(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLocal_function_header(this); + } + } + + public final Local_function_headerContext local_function_header() throws RecognitionException { + Local_function_headerContext _localctx = new Local_function_headerContext(_ctx, getState()); + enterRule(_localctx, 158, RULE_local_function_header); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1247); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,123,_ctx) ) { + case 1: + { + setState(1246); + local_function_modifiers(); + } + break; + } + setState(1249); + return_type(); + setState(1250); + identifier(); + setState(1252); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LT) { + { + setState(1251); + type_parameter_list(); + } + } + + setState(1254); + match(OPEN_PARENS); + setState(1256); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 10)) & ~0x3f) == 0 && ((1L << (_la - 10)) & ((1L << (ADD - 10)) | (1L << (ALIAS - 10)) | (1L << (ARGLIST - 10)) | (1L << (ASCENDING - 10)) | (1L << (ASYNC - 10)) | (1L << (AWAIT - 10)) | (1L << (BOOL - 10)) | (1L << (BY - 10)) | (1L << (BYTE - 10)) | (1L << (CHAR - 10)) | (1L << (DECIMAL - 10)) | (1L << (DESCENDING - 10)) | (1L << (DOUBLE - 10)) | (1L << (DYNAMIC - 10)) | (1L << (EQUALS - 10)) | (1L << (FLOAT - 10)) | (1L << (FROM - 10)) | (1L << (GET - 10)) | (1L << (GROUP - 10)) | (1L << (IN - 10)) | (1L << (INT - 10)) | (1L << (INTO - 10)) | (1L << (JOIN - 10)) | (1L << (LET - 10)) | (1L << (LONG - 10)) | (1L << (NAMEOF - 10)) | (1L << (OBJECT - 10)) | (1L << (ON - 10)) | (1L << (ORDERBY - 10)) | (1L << (OUT - 10)))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (PARAMS - 74)) | (1L << (PARTIAL - 74)) | (1L << (REF - 74)) | (1L << (REMOVE - 74)) | (1L << (SBYTE - 74)) | (1L << (SELECT - 74)) | (1L << (SET - 74)) | (1L << (SHORT - 74)) | (1L << (STRING - 74)) | (1L << (THIS - 74)) | (1L << (UINT - 74)) | (1L << (ULONG - 74)) | (1L << (UNMANAGED - 74)) | (1L << (USHORT - 74)) | (1L << (VAR - 74)) | (1L << (VOID - 74)) | (1L << (WHEN - 74)) | (1L << (WHERE - 74)) | (1L << (YIELD - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (OPEN_BRACKET - 74)) | (1L << (OPEN_PARENS - 74)))) != 0)) { + { + setState(1255); + formal_parameter_list(); + } + } + + setState(1258); + match(CLOSE_PARENS); + setState(1260); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHERE) { + { + setState(1259); + type_parameter_constraints_clauses(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Local_function_modifiersContext extends ParserRuleContext { + public TerminalNode ASYNC() { return getToken(CSharpParser.ASYNC, 0); } + public TerminalNode UNSAFE() { return getToken(CSharpParser.UNSAFE, 0); } + public TerminalNode STATIC() { return getToken(CSharpParser.STATIC, 0); } + public Local_function_modifiersContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_local_function_modifiers; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLocal_function_modifiers(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLocal_function_modifiers(this); + } + } + + public final Local_function_modifiersContext local_function_modifiers() throws RecognitionException { + Local_function_modifiersContext _localctx = new Local_function_modifiersContext(_ctx, getState()); + enterRule(_localctx, 160, RULE_local_function_modifiers); + int _la; + try { + setState(1268); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ASYNC: + case UNSAFE: + enterOuterAlt(_localctx, 1); + { + setState(1262); + _la = _input.LA(1); + if ( !(_la==ASYNC || _la==UNSAFE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(1264); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==STATIC) { + { + setState(1263); + match(STATIC); + } + } + + } + break; + case STATIC: + enterOuterAlt(_localctx, 2); + { + setState(1266); + match(STATIC); + setState(1267); + _la = _input.LA(1); + if ( !(_la==ASYNC || _la==UNSAFE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Local_function_bodyContext extends ParserRuleContext { + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public Right_arrowContext right_arrow() { + return getRuleContext(Right_arrowContext.class,0); + } + public Throwable_expressionContext throwable_expression() { + return getRuleContext(Throwable_expressionContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Local_function_bodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_local_function_body; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLocal_function_body(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLocal_function_body(this); + } + } + + public final Local_function_bodyContext local_function_body() throws RecognitionException { + Local_function_bodyContext _localctx = new Local_function_bodyContext(_ctx, getState()); + enterRule(_localctx, 162, RULE_local_function_body); + try { + setState(1275); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACE: + enterOuterAlt(_localctx, 1); + { + setState(1270); + block(); + } + break; + case ASSIGNMENT: + enterOuterAlt(_localctx, 2); + { + setState(1271); + right_arrow(); + setState(1272); + throwable_expression(); + setState(1273); + match(SEMICOLON); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Labeled_StatementContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public Labeled_StatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_labeled_Statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLabeled_Statement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLabeled_Statement(this); + } + } + + public final Labeled_StatementContext labeled_Statement() throws RecognitionException { + Labeled_StatementContext _localctx = new Labeled_StatementContext(_ctx, getState()); + enterRule(_localctx, 164, RULE_labeled_Statement); + try { + enterOuterAlt(_localctx, 1); + { + setState(1277); + identifier(); + setState(1278); + match(COLON); + setState(1279); + statement(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Embedded_statementContext extends ParserRuleContext { + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public Simple_embedded_statementContext simple_embedded_statement() { + return getRuleContext(Simple_embedded_statementContext.class,0); + } + public Embedded_statementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_embedded_statement; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterEmbedded_statement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitEmbedded_statement(this); + } + } + + public final Embedded_statementContext embedded_statement() throws RecognitionException { + Embedded_statementContext _localctx = new Embedded_statementContext(_ctx, getState()); + enterRule(_localctx, 166, RULE_embedded_statement); + try { + setState(1283); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACE: + enterOuterAlt(_localctx, 1); + { + setState(1281); + block(); + } + break; + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BASE: + case BOOL: + case BREAK: + case BY: + case BYTE: + case CHAR: + case CHECKED: + case CONTINUE: + case DECIMAL: + case DEFAULT: + case DELEGATE: + case DESCENDING: + case DO: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FALSE: + case FIXED: + case FLOAT: + case FOR: + case FOREACH: + case FROM: + case GET: + case GOTO: + case GROUP: + case IF: + case INT: + case INTO: + case JOIN: + case LET: + case LOCK: + case LONG: + case NAMEOF: + case NEW: + case NULL_: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REF: + case REMOVE: + case RETURN: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case SIZEOF: + case STRING: + case SWITCH: + case THIS: + case THROW: + case TRUE: + case TRY: + case TYPEOF: + case UINT: + case ULONG: + case UNCHECKED: + case UNMANAGED: + case UNSAFE: + case USHORT: + case USING: + case VAR: + case WHEN: + case WHERE: + case WHILE: + case YIELD: + case IDENTIFIER: + case LITERAL_ACCESS: + case INTEGER_LITERAL: + case HEX_INTEGER_LITERAL: + case BIN_INTEGER_LITERAL: + case REAL_LITERAL: + case CHARACTER_LITERAL: + case REGULAR_STRING: + case VERBATIUM_STRING: + case INTERPOLATED_REGULAR_STRING_START: + case INTERPOLATED_VERBATIUM_STRING_START: + case OPEN_PARENS: + case SEMICOLON: + case PLUS: + case MINUS: + case STAR: + case AMP: + case CARET: + case BANG: + case TILDE: + case OP_INC: + case OP_DEC: + case OP_RANGE: + enterOuterAlt(_localctx, 2); + { + setState(1282); + simple_embedded_statement(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Simple_embedded_statementContext extends ParserRuleContext { + public Simple_embedded_statementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_simple_embedded_statement; } + + public Simple_embedded_statementContext() { } + public void copyFrom(Simple_embedded_statementContext ctx) { + super.copyFrom(ctx); + } + } + public static class TryStatementContext extends Simple_embedded_statementContext { + public TerminalNode TRY() { return getToken(CSharpParser.TRY, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public Catch_clausesContext catch_clauses() { + return getRuleContext(Catch_clausesContext.class,0); + } + public Finally_clauseContext finally_clause() { + return getRuleContext(Finally_clauseContext.class,0); + } + public TryStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterTryStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitTryStatement(this); + } + } + public static class CheckedStatementContext extends Simple_embedded_statementContext { + public TerminalNode CHECKED() { return getToken(CSharpParser.CHECKED, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public CheckedStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterCheckedStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitCheckedStatement(this); + } + } + public static class ThrowStatementContext extends Simple_embedded_statementContext { + public TerminalNode THROW() { return getToken(CSharpParser.THROW, 0); } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public ThrowStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterThrowStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitThrowStatement(this); + } + } + public static class TheEmptyStatementContext extends Simple_embedded_statementContext { + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public TheEmptyStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterTheEmptyStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitTheEmptyStatement(this); + } + } + public static class UnsafeStatementContext extends Simple_embedded_statementContext { + public TerminalNode UNSAFE() { return getToken(CSharpParser.UNSAFE, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public UnsafeStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterUnsafeStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitUnsafeStatement(this); + } + } + public static class ForStatementContext extends Simple_embedded_statementContext { + public TerminalNode FOR() { return getToken(CSharpParser.FOR, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public List SEMICOLON() { return getTokens(CSharpParser.SEMICOLON); } + public TerminalNode SEMICOLON(int i) { + return getToken(CSharpParser.SEMICOLON, i); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Embedded_statementContext embedded_statement() { + return getRuleContext(Embedded_statementContext.class,0); + } + public For_initializerContext for_initializer() { + return getRuleContext(For_initializerContext.class,0); + } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public For_iteratorContext for_iterator() { + return getRuleContext(For_iteratorContext.class,0); + } + public ForStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterForStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitForStatement(this); + } + } + public static class BreakStatementContext extends Simple_embedded_statementContext { + public TerminalNode BREAK() { return getToken(CSharpParser.BREAK, 0); } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public BreakStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterBreakStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitBreakStatement(this); + } + } + public static class IfStatementContext extends Simple_embedded_statementContext { + public TerminalNode IF() { return getToken(CSharpParser.IF, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public List if_body() { + return getRuleContexts(If_bodyContext.class); + } + public If_bodyContext if_body(int i) { + return getRuleContext(If_bodyContext.class,i); + } + public TerminalNode ELSE() { return getToken(CSharpParser.ELSE, 0); } + public IfStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterIfStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitIfStatement(this); + } + } + public static class ReturnStatementContext extends Simple_embedded_statementContext { + public TerminalNode RETURN() { return getToken(CSharpParser.RETURN, 0); } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public ReturnStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterReturnStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitReturnStatement(this); + } + } + public static class GotoStatementContext extends Simple_embedded_statementContext { + public TerminalNode GOTO() { return getToken(CSharpParser.GOTO, 0); } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode CASE() { return getToken(CSharpParser.CASE, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode DEFAULT() { return getToken(CSharpParser.DEFAULT, 0); } + public GotoStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterGotoStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitGotoStatement(this); + } + } + public static class SwitchStatementContext extends Simple_embedded_statementContext { + public TerminalNode SWITCH() { return getToken(CSharpParser.SWITCH, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public List switch_section() { + return getRuleContexts(Switch_sectionContext.class); + } + public Switch_sectionContext switch_section(int i) { + return getRuleContext(Switch_sectionContext.class,i); + } + public SwitchStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterSwitchStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitSwitchStatement(this); + } + } + public static class FixedStatementContext extends Simple_embedded_statementContext { + public TerminalNode FIXED() { return getToken(CSharpParser.FIXED, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public Pointer_typeContext pointer_type() { + return getRuleContext(Pointer_typeContext.class,0); + } + public Fixed_pointer_declaratorsContext fixed_pointer_declarators() { + return getRuleContext(Fixed_pointer_declaratorsContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Embedded_statementContext embedded_statement() { + return getRuleContext(Embedded_statementContext.class,0); + } + public FixedStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterFixedStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitFixedStatement(this); + } + } + public static class WhileStatementContext extends Simple_embedded_statementContext { + public TerminalNode WHILE() { return getToken(CSharpParser.WHILE, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Embedded_statementContext embedded_statement() { + return getRuleContext(Embedded_statementContext.class,0); + } + public WhileStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterWhileStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitWhileStatement(this); + } + } + public static class DoStatementContext extends Simple_embedded_statementContext { + public TerminalNode DO() { return getToken(CSharpParser.DO, 0); } + public Embedded_statementContext embedded_statement() { + return getRuleContext(Embedded_statementContext.class,0); + } + public TerminalNode WHILE() { return getToken(CSharpParser.WHILE, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public DoStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterDoStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitDoStatement(this); + } + } + public static class ForeachStatementContext extends Simple_embedded_statementContext { + public TerminalNode FOREACH() { return getToken(CSharpParser.FOREACH, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public Local_variable_typeContext local_variable_type() { + return getRuleContext(Local_variable_typeContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode IN() { return getToken(CSharpParser.IN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Embedded_statementContext embedded_statement() { + return getRuleContext(Embedded_statementContext.class,0); + } + public TerminalNode AWAIT() { return getToken(CSharpParser.AWAIT, 0); } + public ForeachStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterForeachStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitForeachStatement(this); + } + } + public static class UncheckedStatementContext extends Simple_embedded_statementContext { + public TerminalNode UNCHECKED() { return getToken(CSharpParser.UNCHECKED, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public UncheckedStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterUncheckedStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitUncheckedStatement(this); + } + } + public static class ExpressionStatementContext extends Simple_embedded_statementContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public ExpressionStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterExpressionStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitExpressionStatement(this); + } + } + public static class ContinueStatementContext extends Simple_embedded_statementContext { + public TerminalNode CONTINUE() { return getToken(CSharpParser.CONTINUE, 0); } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public ContinueStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterContinueStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitContinueStatement(this); + } + } + public static class UsingStatementContext extends Simple_embedded_statementContext { + public TerminalNode USING() { return getToken(CSharpParser.USING, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public Resource_acquisitionContext resource_acquisition() { + return getRuleContext(Resource_acquisitionContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Embedded_statementContext embedded_statement() { + return getRuleContext(Embedded_statementContext.class,0); + } + public UsingStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterUsingStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitUsingStatement(this); + } + } + public static class LockStatementContext extends Simple_embedded_statementContext { + public TerminalNode LOCK() { return getToken(CSharpParser.LOCK, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Embedded_statementContext embedded_statement() { + return getRuleContext(Embedded_statementContext.class,0); + } + public LockStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLockStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLockStatement(this); + } + } + public static class YieldStatementContext extends Simple_embedded_statementContext { + public TerminalNode YIELD() { return getToken(CSharpParser.YIELD, 0); } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public TerminalNode RETURN() { return getToken(CSharpParser.RETURN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode BREAK() { return getToken(CSharpParser.BREAK, 0); } + public YieldStatementContext(Simple_embedded_statementContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterYieldStatement(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitYieldStatement(this); + } + } + + public final Simple_embedded_statementContext simple_embedded_statement() throws RecognitionException { + Simple_embedded_statementContext _localctx = new Simple_embedded_statementContext(_ctx, getState()); + enterRule(_localctx, 168, RULE_simple_embedded_statement); + int _la; + try { + setState(1415); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,143,_ctx) ) { + case 1: + _localctx = new TheEmptyStatementContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(1285); + match(SEMICOLON); + } + break; + case 2: + _localctx = new ExpressionStatementContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(1286); + expression(); + setState(1287); + match(SEMICOLON); + } + break; + case 3: + _localctx = new IfStatementContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(1289); + match(IF); + setState(1290); + match(OPEN_PARENS); + setState(1291); + expression(); + setState(1292); + match(CLOSE_PARENS); + setState(1293); + if_body(); + setState(1296); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,131,_ctx) ) { + case 1: + { + setState(1294); + match(ELSE); + setState(1295); + if_body(); + } + break; + } + } + break; + case 4: + _localctx = new SwitchStatementContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(1298); + match(SWITCH); + setState(1299); + match(OPEN_PARENS); + setState(1300); + expression(); + setState(1301); + match(CLOSE_PARENS); + setState(1302); + match(OPEN_BRACE); + setState(1306); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==CASE || _la==DEFAULT) { + { + { + setState(1303); + switch_section(); + } + } + setState(1308); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1309); + match(CLOSE_BRACE); + } + break; + case 5: + _localctx = new WhileStatementContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(1311); + match(WHILE); + setState(1312); + match(OPEN_PARENS); + setState(1313); + expression(); + setState(1314); + match(CLOSE_PARENS); + setState(1315); + embedded_statement(); + } + break; + case 6: + _localctx = new DoStatementContext(_localctx); + enterOuterAlt(_localctx, 6); + { + setState(1317); + match(DO); + setState(1318); + embedded_statement(); + setState(1319); + match(WHILE); + setState(1320); + match(OPEN_PARENS); + setState(1321); + expression(); + setState(1322); + match(CLOSE_PARENS); + setState(1323); + match(SEMICOLON); + } + break; + case 7: + _localctx = new ForStatementContext(_localctx); + enterOuterAlt(_localctx, 7); + { + setState(1325); + match(FOR); + setState(1326); + match(OPEN_PARENS); + setState(1328); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FIXED) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (USING - 64)) | (1L << (VAR - 64)) | (1L << (VOID - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)))) != 0)) { + { + setState(1327); + for_initializer(); + } + } + + setState(1330); + match(SEMICOLON); + setState(1332); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)))) != 0)) { + { + setState(1331); + expression(); + } + } + + setState(1334); + match(SEMICOLON); + setState(1336); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)))) != 0)) { + { + setState(1335); + for_iterator(); + } + } + + setState(1338); + match(CLOSE_PARENS); + setState(1339); + embedded_statement(); + } + break; + case 8: + _localctx = new ForeachStatementContext(_localctx); + enterOuterAlt(_localctx, 8); + { + setState(1341); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==AWAIT) { + { + setState(1340); + match(AWAIT); + } + } + + setState(1343); + match(FOREACH); + setState(1344); + match(OPEN_PARENS); + setState(1345); + local_variable_type(); + setState(1346); + identifier(); + setState(1347); + match(IN); + setState(1348); + expression(); + setState(1349); + match(CLOSE_PARENS); + setState(1350); + embedded_statement(); + } + break; + case 9: + _localctx = new BreakStatementContext(_localctx); + enterOuterAlt(_localctx, 9); + { + setState(1352); + match(BREAK); + setState(1353); + match(SEMICOLON); + } + break; + case 10: + _localctx = new ContinueStatementContext(_localctx); + enterOuterAlt(_localctx, 10); + { + setState(1354); + match(CONTINUE); + setState(1355); + match(SEMICOLON); + } + break; + case 11: + _localctx = new GotoStatementContext(_localctx); + enterOuterAlt(_localctx, 11); + { + setState(1356); + match(GOTO); + setState(1361); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BY: + case DESCENDING: + case DYNAMIC: + case EQUALS: + case FROM: + case GET: + case GROUP: + case INTO: + case JOIN: + case LET: + case NAMEOF: + case ON: + case ORDERBY: + case PARTIAL: + case REMOVE: + case SELECT: + case SET: + case UNMANAGED: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + { + setState(1357); + identifier(); + } + break; + case CASE: + { + setState(1358); + match(CASE); + setState(1359); + expression(); + } + break; + case DEFAULT: + { + setState(1360); + match(DEFAULT); + } + break; + default: + throw new NoViableAltException(this); + } + setState(1363); + match(SEMICOLON); + } + break; + case 12: + _localctx = new ReturnStatementContext(_localctx); + enterOuterAlt(_localctx, 12); + { + setState(1364); + match(RETURN); + setState(1366); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)))) != 0)) { + { + setState(1365); + expression(); + } + } + + setState(1368); + match(SEMICOLON); + } + break; + case 13: + _localctx = new ThrowStatementContext(_localctx); + enterOuterAlt(_localctx, 13); + { + setState(1369); + match(THROW); + setState(1371); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)))) != 0)) { + { + setState(1370); + expression(); + } + } + + setState(1373); + match(SEMICOLON); + } + break; + case 14: + _localctx = new TryStatementContext(_localctx); + enterOuterAlt(_localctx, 14); + { + setState(1374); + match(TRY); + setState(1375); + block(); + setState(1381); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CATCH: + { + setState(1376); + catch_clauses(); + setState(1378); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==FINALLY) { + { + setState(1377); + finally_clause(); + } + } + + } + break; + case FINALLY: + { + setState(1380); + finally_clause(); + } + break; + default: + throw new NoViableAltException(this); + } + } + break; + case 15: + _localctx = new CheckedStatementContext(_localctx); + enterOuterAlt(_localctx, 15); + { + setState(1383); + match(CHECKED); + setState(1384); + block(); + } + break; + case 16: + _localctx = new UncheckedStatementContext(_localctx); + enterOuterAlt(_localctx, 16); + { + setState(1385); + match(UNCHECKED); + setState(1386); + block(); + } + break; + case 17: + _localctx = new LockStatementContext(_localctx); + enterOuterAlt(_localctx, 17); + { + setState(1387); + match(LOCK); + setState(1388); + match(OPEN_PARENS); + setState(1389); + expression(); + setState(1390); + match(CLOSE_PARENS); + setState(1391); + embedded_statement(); + } + break; + case 18: + _localctx = new UsingStatementContext(_localctx); + enterOuterAlt(_localctx, 18); + { + setState(1393); + match(USING); + setState(1394); + match(OPEN_PARENS); + setState(1395); + resource_acquisition(); + setState(1396); + match(CLOSE_PARENS); + setState(1397); + embedded_statement(); + } + break; + case 19: + _localctx = new YieldStatementContext(_localctx); + enterOuterAlt(_localctx, 19); + { + setState(1399); + match(YIELD); + setState(1403); + _errHandler.sync(this); + switch (_input.LA(1)) { + case RETURN: + { + setState(1400); + match(RETURN); + setState(1401); + expression(); + } + break; + case BREAK: + { + setState(1402); + match(BREAK); + } + break; + default: + throw new NoViableAltException(this); + } + setState(1405); + match(SEMICOLON); + } + break; + case 20: + _localctx = new UnsafeStatementContext(_localctx); + enterOuterAlt(_localctx, 20); + { + setState(1406); + match(UNSAFE); + setState(1407); + block(); + } + break; + case 21: + _localctx = new FixedStatementContext(_localctx); + enterOuterAlt(_localctx, 21); + { + setState(1408); + match(FIXED); + setState(1409); + match(OPEN_PARENS); + setState(1410); + pointer_type(); + setState(1411); + fixed_pointer_declarators(); + setState(1412); + match(CLOSE_PARENS); + setState(1413); + embedded_statement(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BlockContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public Statement_listContext statement_list() { + return getRuleContext(Statement_listContext.class,0); + } + public BlockContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_block; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterBlock(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitBlock(this); + } + } + + public final BlockContext block() throws RecognitionException { + BlockContext _localctx = new BlockContext(_ctx, getState()); + enterRule(_localctx, 170, RULE_block); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1417); + match(OPEN_BRACE); + setState(1419); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BREAK) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << CONST) | (1L << CONTINUE) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DO) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FIXED) | (1L << FLOAT) | (1L << FOR) | (1L << FOREACH) | (1L << FROM) | (1L << GET) | (1L << GOTO) | (1L << GROUP) | (1L << IF) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LOCK) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (RETURN - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STATIC - 64)) | (1L << (STRING - 64)) | (1L << (SWITCH - 64)) | (1L << (THIS - 64)) | (1L << (THROW - 64)) | (1L << (TRUE - 64)) | (1L << (TRY - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (UNSAFE - 64)) | (1L << (USHORT - 64)) | (1L << (USING - 64)) | (1L << (VAR - 64)) | (1L << (VOID - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (WHILE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)) | (1L << (OPEN_BRACE - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (SEMICOLON - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)))) != 0)) { + { + setState(1418); + statement_list(); + } + } + + setState(1421); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Local_variable_declarationContext extends ParserRuleContext { + public Local_variable_typeContext local_variable_type() { + return getRuleContext(Local_variable_typeContext.class,0); + } + public List local_variable_declarator() { + return getRuleContexts(Local_variable_declaratorContext.class); + } + public Local_variable_declaratorContext local_variable_declarator(int i) { + return getRuleContext(Local_variable_declaratorContext.class,i); + } + public TerminalNode USING() { return getToken(CSharpParser.USING, 0); } + public TerminalNode REF() { return getToken(CSharpParser.REF, 0); } + public TerminalNode READONLY() { return getToken(CSharpParser.READONLY, 0); } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public TerminalNode FIXED() { return getToken(CSharpParser.FIXED, 0); } + public Pointer_typeContext pointer_type() { + return getRuleContext(Pointer_typeContext.class,0); + } + public Fixed_pointer_declaratorsContext fixed_pointer_declarators() { + return getRuleContext(Fixed_pointer_declaratorsContext.class,0); + } + public Local_variable_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_local_variable_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLocal_variable_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLocal_variable_declaration(this); + } + } + + public final Local_variable_declarationContext local_variable_declaration() throws RecognitionException { + Local_variable_declarationContext _localctx = new Local_variable_declarationContext(_ctx, getState()); + enterRule(_localctx, 172, RULE_local_variable_declaration); + int _la; + try { + setState(1442); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BOOL: + case BY: + case BYTE: + case CHAR: + case DECIMAL: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FLOAT: + case FROM: + case GET: + case GROUP: + case INT: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REF: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case STRING: + case UINT: + case ULONG: + case UNMANAGED: + case USHORT: + case USING: + case VAR: + case VOID: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case OPEN_PARENS: + enterOuterAlt(_localctx, 1); + { + setState(1427); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,145,_ctx) ) { + case 1: + { + setState(1423); + match(USING); + } + break; + case 2: + { + setState(1424); + match(REF); + } + break; + case 3: + { + setState(1425); + match(REF); + setState(1426); + match(READONLY); + } + break; + } + setState(1429); + local_variable_type(); + setState(1430); + local_variable_declarator(); + setState(1435); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1431); + match(COMMA); + setState(1432); + local_variable_declarator(); + } + } + setState(1437); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + case FIXED: + enterOuterAlt(_localctx, 2); + { + setState(1438); + match(FIXED); + setState(1439); + pointer_type(); + setState(1440); + fixed_pointer_declarators(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Local_variable_typeContext extends ParserRuleContext { + public TerminalNode VAR() { return getToken(CSharpParser.VAR, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public Local_variable_typeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_local_variable_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLocal_variable_type(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLocal_variable_type(this); + } + } + + public final Local_variable_typeContext local_variable_type() throws RecognitionException { + Local_variable_typeContext _localctx = new Local_variable_typeContext(_ctx, getState()); + enterRule(_localctx, 174, RULE_local_variable_type); + try { + setState(1446); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,148,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1444); + match(VAR); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1445); + type_(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Local_variable_declaratorContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode ASSIGNMENT() { return getToken(CSharpParser.ASSIGNMENT, 0); } + public Local_variable_initializerContext local_variable_initializer() { + return getRuleContext(Local_variable_initializerContext.class,0); + } + public TerminalNode REF() { return getToken(CSharpParser.REF, 0); } + public Local_variable_declaratorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_local_variable_declarator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLocal_variable_declarator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLocal_variable_declarator(this); + } + } + + public final Local_variable_declaratorContext local_variable_declarator() throws RecognitionException { + Local_variable_declaratorContext _localctx = new Local_variable_declaratorContext(_ctx, getState()); + enterRule(_localctx, 176, RULE_local_variable_declarator); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1448); + identifier(); + setState(1454); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ASSIGNMENT) { + { + setState(1449); + match(ASSIGNMENT); + setState(1451); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,149,_ctx) ) { + case 1: + { + setState(1450); + match(REF); + } + break; + } + setState(1453); + local_variable_initializer(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Local_variable_initializerContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Array_initializerContext array_initializer() { + return getRuleContext(Array_initializerContext.class,0); + } + public Stackalloc_initializerContext stackalloc_initializer() { + return getRuleContext(Stackalloc_initializerContext.class,0); + } + public Local_variable_initializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_local_variable_initializer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLocal_variable_initializer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLocal_variable_initializer(this); + } + } + + public final Local_variable_initializerContext local_variable_initializer() throws RecognitionException { + Local_variable_initializerContext _localctx = new Local_variable_initializerContext(_ctx, getState()); + enterRule(_localctx, 178, RULE_local_variable_initializer); + try { + setState(1459); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BASE: + case BOOL: + case BY: + case BYTE: + case CHAR: + case CHECKED: + case DECIMAL: + case DEFAULT: + case DELEGATE: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FALSE: + case FLOAT: + case FROM: + case GET: + case GROUP: + case INT: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case NEW: + case NULL_: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REF: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case SIZEOF: + case STRING: + case THIS: + case TRUE: + case TYPEOF: + case UINT: + case ULONG: + case UNCHECKED: + case UNMANAGED: + case USHORT: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case LITERAL_ACCESS: + case INTEGER_LITERAL: + case HEX_INTEGER_LITERAL: + case BIN_INTEGER_LITERAL: + case REAL_LITERAL: + case CHARACTER_LITERAL: + case REGULAR_STRING: + case VERBATIUM_STRING: + case INTERPOLATED_REGULAR_STRING_START: + case INTERPOLATED_VERBATIUM_STRING_START: + case OPEN_PARENS: + case PLUS: + case MINUS: + case STAR: + case AMP: + case CARET: + case BANG: + case TILDE: + case OP_INC: + case OP_DEC: + case OP_RANGE: + enterOuterAlt(_localctx, 1); + { + setState(1456); + expression(); + } + break; + case OPEN_BRACE: + enterOuterAlt(_localctx, 2); + { + setState(1457); + array_initializer(); + } + break; + case STACKALLOC: + enterOuterAlt(_localctx, 3); + { + setState(1458); + stackalloc_initializer(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Local_constant_declarationContext extends ParserRuleContext { + public TerminalNode CONST() { return getToken(CSharpParser.CONST, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public Constant_declaratorsContext constant_declarators() { + return getRuleContext(Constant_declaratorsContext.class,0); + } + public Local_constant_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_local_constant_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLocal_constant_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLocal_constant_declaration(this); + } + } + + public final Local_constant_declarationContext local_constant_declaration() throws RecognitionException { + Local_constant_declarationContext _localctx = new Local_constant_declarationContext(_ctx, getState()); + enterRule(_localctx, 180, RULE_local_constant_declaration); + try { + enterOuterAlt(_localctx, 1); + { + setState(1461); + match(CONST); + setState(1462); + type_(); + setState(1463); + constant_declarators(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class If_bodyContext extends ParserRuleContext { + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public Simple_embedded_statementContext simple_embedded_statement() { + return getRuleContext(Simple_embedded_statementContext.class,0); + } + public If_bodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_if_body; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterIf_body(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitIf_body(this); + } + } + + public final If_bodyContext if_body() throws RecognitionException { + If_bodyContext _localctx = new If_bodyContext(_ctx, getState()); + enterRule(_localctx, 182, RULE_if_body); + try { + setState(1467); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACE: + enterOuterAlt(_localctx, 1); + { + setState(1465); + block(); + } + break; + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BASE: + case BOOL: + case BREAK: + case BY: + case BYTE: + case CHAR: + case CHECKED: + case CONTINUE: + case DECIMAL: + case DEFAULT: + case DELEGATE: + case DESCENDING: + case DO: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FALSE: + case FIXED: + case FLOAT: + case FOR: + case FOREACH: + case FROM: + case GET: + case GOTO: + case GROUP: + case IF: + case INT: + case INTO: + case JOIN: + case LET: + case LOCK: + case LONG: + case NAMEOF: + case NEW: + case NULL_: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REF: + case REMOVE: + case RETURN: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case SIZEOF: + case STRING: + case SWITCH: + case THIS: + case THROW: + case TRUE: + case TRY: + case TYPEOF: + case UINT: + case ULONG: + case UNCHECKED: + case UNMANAGED: + case UNSAFE: + case USHORT: + case USING: + case VAR: + case WHEN: + case WHERE: + case WHILE: + case YIELD: + case IDENTIFIER: + case LITERAL_ACCESS: + case INTEGER_LITERAL: + case HEX_INTEGER_LITERAL: + case BIN_INTEGER_LITERAL: + case REAL_LITERAL: + case CHARACTER_LITERAL: + case REGULAR_STRING: + case VERBATIUM_STRING: + case INTERPOLATED_REGULAR_STRING_START: + case INTERPOLATED_VERBATIUM_STRING_START: + case OPEN_PARENS: + case SEMICOLON: + case PLUS: + case MINUS: + case STAR: + case AMP: + case CARET: + case BANG: + case TILDE: + case OP_INC: + case OP_DEC: + case OP_RANGE: + enterOuterAlt(_localctx, 2); + { + setState(1466); + simple_embedded_statement(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Switch_sectionContext extends ParserRuleContext { + public Statement_listContext statement_list() { + return getRuleContext(Statement_listContext.class,0); + } + public List switch_label() { + return getRuleContexts(Switch_labelContext.class); + } + public Switch_labelContext switch_label(int i) { + return getRuleContext(Switch_labelContext.class,i); + } + public Switch_sectionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_switch_section; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterSwitch_section(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitSwitch_section(this); + } + } + + public final Switch_sectionContext switch_section() throws RecognitionException { + Switch_sectionContext _localctx = new Switch_sectionContext(_ctx, getState()); + enterRule(_localctx, 184, RULE_switch_section); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1470); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(1469); + switch_label(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(1472); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,153,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + setState(1474); + statement_list(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Switch_labelContext extends ParserRuleContext { + public TerminalNode CASE() { return getToken(CSharpParser.CASE, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public Case_guardContext case_guard() { + return getRuleContext(Case_guardContext.class,0); + } + public TerminalNode DEFAULT() { return getToken(CSharpParser.DEFAULT, 0); } + public Switch_labelContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_switch_label; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterSwitch_label(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitSwitch_label(this); + } + } + + public final Switch_labelContext switch_label() throws RecognitionException { + Switch_labelContext _localctx = new Switch_labelContext(_ctx, getState()); + enterRule(_localctx, 186, RULE_switch_label); + int _la; + try { + setState(1485); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CASE: + enterOuterAlt(_localctx, 1); + { + setState(1476); + match(CASE); + setState(1477); + expression(); + setState(1479); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHEN) { + { + setState(1478); + case_guard(); + } + } + + setState(1481); + match(COLON); + } + break; + case DEFAULT: + enterOuterAlt(_localctx, 2); + { + setState(1483); + match(DEFAULT); + setState(1484); + match(COLON); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Case_guardContext extends ParserRuleContext { + public TerminalNode WHEN() { return getToken(CSharpParser.WHEN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Case_guardContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_case_guard; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterCase_guard(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitCase_guard(this); + } + } + + public final Case_guardContext case_guard() throws RecognitionException { + Case_guardContext _localctx = new Case_guardContext(_ctx, getState()); + enterRule(_localctx, 188, RULE_case_guard); + try { + enterOuterAlt(_localctx, 1); + { + setState(1487); + match(WHEN); + setState(1488); + expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Statement_listContext extends ParserRuleContext { + public List statement() { + return getRuleContexts(StatementContext.class); + } + public StatementContext statement(int i) { + return getRuleContext(StatementContext.class,i); + } + public Statement_listContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_statement_list; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterStatement_list(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitStatement_list(this); + } + } + + public final Statement_listContext statement_list() throws RecognitionException { + Statement_listContext _localctx = new Statement_listContext(_ctx, getState()); + enterRule(_localctx, 190, RULE_statement_list); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1491); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(1490); + statement(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(1493); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,156,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class For_initializerContext extends ParserRuleContext { + public Local_variable_declarationContext local_variable_declaration() { + return getRuleContext(Local_variable_declarationContext.class,0); + } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public For_initializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_for_initializer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterFor_initializer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitFor_initializer(this); + } + } + + public final For_initializerContext for_initializer() throws RecognitionException { + For_initializerContext _localctx = new For_initializerContext(_ctx, getState()); + enterRule(_localctx, 192, RULE_for_initializer); + int _la; + try { + setState(1504); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,158,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1495); + local_variable_declaration(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1496); + expression(); + setState(1501); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1497); + match(COMMA); + setState(1498); + expression(); + } + } + setState(1503); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class For_iteratorContext extends ParserRuleContext { + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public For_iteratorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_for_iterator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterFor_iterator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitFor_iterator(this); + } + } + + public final For_iteratorContext for_iterator() throws RecognitionException { + For_iteratorContext _localctx = new For_iteratorContext(_ctx, getState()); + enterRule(_localctx, 194, RULE_for_iterator); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1506); + expression(); + setState(1511); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1507); + match(COMMA); + setState(1508); + expression(); + } + } + setState(1513); + _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 Catch_clausesContext extends ParserRuleContext { + public List specific_catch_clause() { + return getRuleContexts(Specific_catch_clauseContext.class); + } + public Specific_catch_clauseContext specific_catch_clause(int i) { + return getRuleContext(Specific_catch_clauseContext.class,i); + } + public General_catch_clauseContext general_catch_clause() { + return getRuleContext(General_catch_clauseContext.class,0); + } + public Catch_clausesContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_catch_clauses; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterCatch_clauses(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitCatch_clauses(this); + } + } + + public final Catch_clausesContext catch_clauses() throws RecognitionException { + Catch_clausesContext _localctx = new Catch_clausesContext(_ctx, getState()); + enterRule(_localctx, 196, RULE_catch_clauses); + int _la; + try { + int _alt; + setState(1525); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,162,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1514); + specific_catch_clause(); + setState(1518); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,160,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1515); + specific_catch_clause(); + } + } + } + setState(1520); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,160,_ctx); + } + setState(1522); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==CATCH) { + { + setState(1521); + general_catch_clause(); + } + } + + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1524); + general_catch_clause(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Specific_catch_clauseContext extends ParserRuleContext { + public TerminalNode CATCH() { return getToken(CSharpParser.CATCH, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public Class_typeContext class_type() { + return getRuleContext(Class_typeContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public Exception_filterContext exception_filter() { + return getRuleContext(Exception_filterContext.class,0); + } + public Specific_catch_clauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_specific_catch_clause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterSpecific_catch_clause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitSpecific_catch_clause(this); + } + } + + public final Specific_catch_clauseContext specific_catch_clause() throws RecognitionException { + Specific_catch_clauseContext _localctx = new Specific_catch_clauseContext(_ctx, getState()); + enterRule(_localctx, 198, RULE_specific_catch_clause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1527); + match(CATCH); + setState(1528); + match(OPEN_PARENS); + setState(1529); + class_type(); + setState(1531); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BY) | (1L << DESCENDING) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INTO) | (1L << JOIN) | (1L << LET))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REMOVE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (UNMANAGED - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)))) != 0)) { + { + setState(1530); + identifier(); + } + } + + setState(1533); + match(CLOSE_PARENS); + setState(1535); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHEN) { + { + setState(1534); + exception_filter(); + } + } + + setState(1537); + block(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class General_catch_clauseContext extends ParserRuleContext { + public TerminalNode CATCH() { return getToken(CSharpParser.CATCH, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public Exception_filterContext exception_filter() { + return getRuleContext(Exception_filterContext.class,0); + } + public General_catch_clauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_general_catch_clause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterGeneral_catch_clause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitGeneral_catch_clause(this); + } + } + + public final General_catch_clauseContext general_catch_clause() throws RecognitionException { + General_catch_clauseContext _localctx = new General_catch_clauseContext(_ctx, getState()); + enterRule(_localctx, 200, RULE_general_catch_clause); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1539); + match(CATCH); + setState(1541); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHEN) { + { + setState(1540); + exception_filter(); + } + } + + setState(1543); + block(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Exception_filterContext extends ParserRuleContext { + public TerminalNode WHEN() { return getToken(CSharpParser.WHEN, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Exception_filterContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_exception_filter; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterException_filter(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitException_filter(this); + } + } + + public final Exception_filterContext exception_filter() throws RecognitionException { + Exception_filterContext _localctx = new Exception_filterContext(_ctx, getState()); + enterRule(_localctx, 202, RULE_exception_filter); + try { + enterOuterAlt(_localctx, 1); + { + setState(1545); + match(WHEN); + setState(1546); + match(OPEN_PARENS); + setState(1547); + expression(); + setState(1548); + match(CLOSE_PARENS); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Finally_clauseContext extends ParserRuleContext { + public TerminalNode FINALLY() { return getToken(CSharpParser.FINALLY, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public Finally_clauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_finally_clause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterFinally_clause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitFinally_clause(this); + } + } + + public final Finally_clauseContext finally_clause() throws RecognitionException { + Finally_clauseContext _localctx = new Finally_clauseContext(_ctx, getState()); + enterRule(_localctx, 204, RULE_finally_clause); + try { + enterOuterAlt(_localctx, 1); + { + setState(1550); + match(FINALLY); + setState(1551); + block(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Resource_acquisitionContext extends ParserRuleContext { + public Local_variable_declarationContext local_variable_declaration() { + return getRuleContext(Local_variable_declarationContext.class,0); + } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Resource_acquisitionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_resource_acquisition; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterResource_acquisition(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitResource_acquisition(this); + } + } + + public final Resource_acquisitionContext resource_acquisition() throws RecognitionException { + Resource_acquisitionContext _localctx = new Resource_acquisitionContext(_ctx, getState()); + enterRule(_localctx, 206, RULE_resource_acquisition); + try { + setState(1555); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,166,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1553); + local_variable_declaration(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1554); + expression(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Namespace_declarationContext extends ParserRuleContext { + public Qualified_identifierContext qi; + public TerminalNode NAMESPACE() { return getToken(CSharpParser.NAMESPACE, 0); } + public Namespace_bodyContext namespace_body() { + return getRuleContext(Namespace_bodyContext.class,0); + } + public Qualified_identifierContext qualified_identifier() { + return getRuleContext(Qualified_identifierContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Namespace_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namespace_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterNamespace_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitNamespace_declaration(this); + } + } + + public final Namespace_declarationContext namespace_declaration() throws RecognitionException { + Namespace_declarationContext _localctx = new Namespace_declarationContext(_ctx, getState()); + enterRule(_localctx, 208, RULE_namespace_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1557); + match(NAMESPACE); + setState(1558); + ((Namespace_declarationContext)_localctx).qi = qualified_identifier(); + setState(1559); + namespace_body(); + setState(1561); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==SEMICOLON) { + { + setState(1560); + match(SEMICOLON); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Qualified_identifierContext extends ParserRuleContext { + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public List DOT() { return getTokens(CSharpParser.DOT); } + public TerminalNode DOT(int i) { + return getToken(CSharpParser.DOT, i); + } + public Qualified_identifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_qualified_identifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterQualified_identifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitQualified_identifier(this); + } + } + + public final Qualified_identifierContext qualified_identifier() throws RecognitionException { + Qualified_identifierContext _localctx = new Qualified_identifierContext(_ctx, getState()); + enterRule(_localctx, 210, RULE_qualified_identifier); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1563); + identifier(); + setState(1568); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==DOT) { + { + { + setState(1564); + match(DOT); + setState(1565); + identifier(); + } + } + setState(1570); + _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 Namespace_bodyContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public Extern_alias_directivesContext extern_alias_directives() { + return getRuleContext(Extern_alias_directivesContext.class,0); + } + public Using_directivesContext using_directives() { + return getRuleContext(Using_directivesContext.class,0); + } + public Namespace_member_declarationsContext namespace_member_declarations() { + return getRuleContext(Namespace_member_declarationsContext.class,0); + } + public Namespace_bodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namespace_body; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterNamespace_body(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitNamespace_body(this); + } + } + + public final Namespace_bodyContext namespace_body() throws RecognitionException { + Namespace_bodyContext _localctx = new Namespace_bodyContext(_ctx, getState()); + enterRule(_localctx, 212, RULE_namespace_body); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1571); + match(OPEN_BRACE); + setState(1573); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,169,_ctx) ) { + case 1: + { + setState(1572); + extern_alias_directives(); + } + break; + } + setState(1576); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==USING) { + { + setState(1575); + using_directives(); + } + } + + setState(1579); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ABSTRACT) | (1L << ASYNC) | (1L << CLASS) | (1L << DELEGATE) | (1L << ENUM) | (1L << EXTERN) | (1L << INTERFACE) | (1L << INTERNAL))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (NAMESPACE - 65)) | (1L << (NEW - 65)) | (1L << (OVERRIDE - 65)) | (1L << (PARTIAL - 65)) | (1L << (PRIVATE - 65)) | (1L << (PROTECTED - 65)) | (1L << (PUBLIC - 65)) | (1L << (READONLY - 65)) | (1L << (REF - 65)) | (1L << (SEALED - 65)) | (1L << (STATIC - 65)) | (1L << (STRUCT - 65)) | (1L << (UNSAFE - 65)) | (1L << (VIRTUAL - 65)) | (1L << (VOLATILE - 65)) | (1L << (OPEN_BRACKET - 65)))) != 0)) { + { + setState(1578); + namespace_member_declarations(); + } + } + + setState(1581); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Extern_alias_directivesContext extends ParserRuleContext { + public List extern_alias_directive() { + return getRuleContexts(Extern_alias_directiveContext.class); + } + public Extern_alias_directiveContext extern_alias_directive(int i) { + return getRuleContext(Extern_alias_directiveContext.class,i); + } + public Extern_alias_directivesContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_extern_alias_directives; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterExtern_alias_directives(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitExtern_alias_directives(this); + } + } + + public final Extern_alias_directivesContext extern_alias_directives() throws RecognitionException { + Extern_alias_directivesContext _localctx = new Extern_alias_directivesContext(_ctx, getState()); + enterRule(_localctx, 214, RULE_extern_alias_directives); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1584); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(1583); + extern_alias_directive(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(1586); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,172,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Extern_alias_directiveContext extends ParserRuleContext { + public TerminalNode EXTERN() { return getToken(CSharpParser.EXTERN, 0); } + public TerminalNode ALIAS() { return getToken(CSharpParser.ALIAS, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Extern_alias_directiveContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_extern_alias_directive; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterExtern_alias_directive(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitExtern_alias_directive(this); + } + } + + public final Extern_alias_directiveContext extern_alias_directive() throws RecognitionException { + Extern_alias_directiveContext _localctx = new Extern_alias_directiveContext(_ctx, getState()); + enterRule(_localctx, 216, RULE_extern_alias_directive); + try { + enterOuterAlt(_localctx, 1); + { + setState(1588); + match(EXTERN); + setState(1589); + match(ALIAS); + setState(1590); + identifier(); + setState(1591); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Using_directivesContext extends ParserRuleContext { + public List using_directive() { + return getRuleContexts(Using_directiveContext.class); + } + public Using_directiveContext using_directive(int i) { + return getRuleContext(Using_directiveContext.class,i); + } + public Using_directivesContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_using_directives; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterUsing_directives(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitUsing_directives(this); + } + } + + public final Using_directivesContext using_directives() throws RecognitionException { + Using_directivesContext _localctx = new Using_directivesContext(_ctx, getState()); + enterRule(_localctx, 218, RULE_using_directives); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1594); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(1593); + using_directive(); + } + } + setState(1596); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==USING ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Using_directiveContext extends ParserRuleContext { + public Using_directiveContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_using_directive; } + + public Using_directiveContext() { } + public void copyFrom(Using_directiveContext ctx) { + super.copyFrom(ctx); + } + } + public static class UsingAliasDirectiveContext extends Using_directiveContext { + public TerminalNode USING() { return getToken(CSharpParser.USING, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode ASSIGNMENT() { return getToken(CSharpParser.ASSIGNMENT, 0); } + public Namespace_or_type_nameContext namespace_or_type_name() { + return getRuleContext(Namespace_or_type_nameContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public UsingAliasDirectiveContext(Using_directiveContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterUsingAliasDirective(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitUsingAliasDirective(this); + } + } + public static class UsingNamespaceDirectiveContext extends Using_directiveContext { + public TerminalNode USING() { return getToken(CSharpParser.USING, 0); } + public Namespace_or_type_nameContext namespace_or_type_name() { + return getRuleContext(Namespace_or_type_nameContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public UsingNamespaceDirectiveContext(Using_directiveContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterUsingNamespaceDirective(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitUsingNamespaceDirective(this); + } + } + public static class UsingStaticDirectiveContext extends Using_directiveContext { + public TerminalNode USING() { return getToken(CSharpParser.USING, 0); } + public TerminalNode STATIC() { return getToken(CSharpParser.STATIC, 0); } + public Namespace_or_type_nameContext namespace_or_type_name() { + return getRuleContext(Namespace_or_type_nameContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public UsingStaticDirectiveContext(Using_directiveContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterUsingStaticDirective(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitUsingStaticDirective(this); + } + } + + public final Using_directiveContext using_directive() throws RecognitionException { + Using_directiveContext _localctx = new Using_directiveContext(_ctx, getState()); + enterRule(_localctx, 220, RULE_using_directive); + try { + setState(1613); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,174,_ctx) ) { + case 1: + _localctx = new UsingAliasDirectiveContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(1598); + match(USING); + setState(1599); + identifier(); + setState(1600); + match(ASSIGNMENT); + setState(1601); + namespace_or_type_name(); + setState(1602); + match(SEMICOLON); + } + break; + case 2: + _localctx = new UsingNamespaceDirectiveContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(1604); + match(USING); + setState(1605); + namespace_or_type_name(); + setState(1606); + match(SEMICOLON); + } + break; + case 3: + _localctx = new UsingStaticDirectiveContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(1608); + match(USING); + setState(1609); + match(STATIC); + setState(1610); + namespace_or_type_name(); + setState(1611); + match(SEMICOLON); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Namespace_member_declarationsContext extends ParserRuleContext { + public List namespace_member_declaration() { + return getRuleContexts(Namespace_member_declarationContext.class); + } + public Namespace_member_declarationContext namespace_member_declaration(int i) { + return getRuleContext(Namespace_member_declarationContext.class,i); + } + public Namespace_member_declarationsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namespace_member_declarations; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterNamespace_member_declarations(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitNamespace_member_declarations(this); + } + } + + public final Namespace_member_declarationsContext namespace_member_declarations() throws RecognitionException { + Namespace_member_declarationsContext _localctx = new Namespace_member_declarationsContext(_ctx, getState()); + enterRule(_localctx, 222, RULE_namespace_member_declarations); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1616); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(1615); + namespace_member_declaration(); + } + } + setState(1618); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ABSTRACT) | (1L << ASYNC) | (1L << CLASS) | (1L << DELEGATE) | (1L << ENUM) | (1L << EXTERN) | (1L << INTERFACE) | (1L << INTERNAL))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (NAMESPACE - 65)) | (1L << (NEW - 65)) | (1L << (OVERRIDE - 65)) | (1L << (PARTIAL - 65)) | (1L << (PRIVATE - 65)) | (1L << (PROTECTED - 65)) | (1L << (PUBLIC - 65)) | (1L << (READONLY - 65)) | (1L << (REF - 65)) | (1L << (SEALED - 65)) | (1L << (STATIC - 65)) | (1L << (STRUCT - 65)) | (1L << (UNSAFE - 65)) | (1L << (VIRTUAL - 65)) | (1L << (VOLATILE - 65)) | (1L << (OPEN_BRACKET - 65)))) != 0) ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Namespace_member_declarationContext extends ParserRuleContext { + public Namespace_declarationContext namespace_declaration() { + return getRuleContext(Namespace_declarationContext.class,0); + } + public Type_declarationContext type_declaration() { + return getRuleContext(Type_declarationContext.class,0); + } + public Namespace_member_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_namespace_member_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterNamespace_member_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitNamespace_member_declaration(this); + } + } + + public final Namespace_member_declarationContext namespace_member_declaration() throws RecognitionException { + Namespace_member_declarationContext _localctx = new Namespace_member_declarationContext(_ctx, getState()); + enterRule(_localctx, 224, RULE_namespace_member_declaration); + try { + setState(1622); + _errHandler.sync(this); + switch (_input.LA(1)) { + case NAMESPACE: + enterOuterAlt(_localctx, 1); + { + setState(1620); + namespace_declaration(); + } + break; + case ABSTRACT: + case ASYNC: + case CLASS: + case DELEGATE: + case ENUM: + case EXTERN: + case INTERFACE: + case INTERNAL: + case NEW: + case OVERRIDE: + case PARTIAL: + case PRIVATE: + case PROTECTED: + case PUBLIC: + case READONLY: + case REF: + case SEALED: + case STATIC: + case STRUCT: + case UNSAFE: + case VIRTUAL: + case VOLATILE: + case OPEN_BRACKET: + enterOuterAlt(_localctx, 2); + { + setState(1621); + type_declaration(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Type_declarationContext extends ParserRuleContext { + public Class_definitionContext class_definition() { + return getRuleContext(Class_definitionContext.class,0); + } + public Struct_definitionContext struct_definition() { + return getRuleContext(Struct_definitionContext.class,0); + } + public Interface_definitionContext interface_definition() { + return getRuleContext(Interface_definitionContext.class,0); + } + public Enum_definitionContext enum_definition() { + return getRuleContext(Enum_definitionContext.class,0); + } + public Delegate_definitionContext delegate_definition() { + return getRuleContext(Delegate_definitionContext.class,0); + } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public All_member_modifiersContext all_member_modifiers() { + return getRuleContext(All_member_modifiersContext.class,0); + } + public Type_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_type_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterType_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitType_declaration(this); + } + } + + public final Type_declarationContext type_declaration() throws RecognitionException { + Type_declarationContext _localctx = new Type_declarationContext(_ctx, getState()); + enterRule(_localctx, 226, RULE_type_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1625); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(1624); + attributes(); + } + } + + setState(1628); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,178,_ctx) ) { + case 1: + { + setState(1627); + all_member_modifiers(); + } + break; + } + setState(1635); + _errHandler.sync(this); + switch (_input.LA(1)) { + case CLASS: + { + setState(1630); + class_definition(); + } + break; + case READONLY: + case REF: + case STRUCT: + { + setState(1631); + struct_definition(); + } + break; + case INTERFACE: + { + setState(1632); + interface_definition(); + } + break; + case ENUM: + { + setState(1633); + enum_definition(); + } + break; + case DELEGATE: + { + setState(1634); + delegate_definition(); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Qualified_alias_memberContext extends ParserRuleContext { + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public TerminalNode DOUBLE_COLON() { return getToken(CSharpParser.DOUBLE_COLON, 0); } + public Type_argument_listContext type_argument_list() { + return getRuleContext(Type_argument_listContext.class,0); + } + public Qualified_alias_memberContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_qualified_alias_member; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterQualified_alias_member(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitQualified_alias_member(this); + } + } + + public final Qualified_alias_memberContext qualified_alias_member() throws RecognitionException { + Qualified_alias_memberContext _localctx = new Qualified_alias_memberContext(_ctx, getState()); + enterRule(_localctx, 228, RULE_qualified_alias_member); + try { + enterOuterAlt(_localctx, 1); + { + setState(1637); + identifier(); + setState(1638); + match(DOUBLE_COLON); + setState(1639); + identifier(); + setState(1641); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,180,_ctx) ) { + case 1: + { + setState(1640); + type_argument_list(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Type_parameter_listContext extends ParserRuleContext { + public TerminalNode LT() { return getToken(CSharpParser.LT, 0); } + public List type_parameter() { + return getRuleContexts(Type_parameterContext.class); + } + public Type_parameterContext type_parameter(int i) { + return getRuleContext(Type_parameterContext.class,i); + } + public TerminalNode GT() { return getToken(CSharpParser.GT, 0); } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Type_parameter_listContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_type_parameter_list; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterType_parameter_list(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitType_parameter_list(this); + } + } + + public final Type_parameter_listContext type_parameter_list() throws RecognitionException { + Type_parameter_listContext _localctx = new Type_parameter_listContext(_ctx, getState()); + enterRule(_localctx, 230, RULE_type_parameter_list); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1643); + match(LT); + setState(1644); + type_parameter(); + setState(1649); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1645); + match(COMMA); + setState(1646); + type_parameter(); + } + } + setState(1651); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1652); + match(GT); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Type_parameterContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public Type_parameterContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_type_parameter; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterType_parameter(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitType_parameter(this); + } + } + + public final Type_parameterContext type_parameter() throws RecognitionException { + Type_parameterContext _localctx = new Type_parameterContext(_ctx, getState()); + enterRule(_localctx, 232, RULE_type_parameter); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1655); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(1654); + attributes(); + } + } + + setState(1657); + identifier(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Class_baseContext extends ParserRuleContext { + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public Class_typeContext class_type() { + return getRuleContext(Class_typeContext.class,0); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public List namespace_or_type_name() { + return getRuleContexts(Namespace_or_type_nameContext.class); + } + public Namespace_or_type_nameContext namespace_or_type_name(int i) { + return getRuleContext(Namespace_or_type_nameContext.class,i); + } + public Class_baseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_class_base; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterClass_base(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitClass_base(this); + } + } + + public final Class_baseContext class_base() throws RecognitionException { + Class_baseContext _localctx = new Class_baseContext(_ctx, getState()); + enterRule(_localctx, 234, RULE_class_base); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1659); + match(COLON); + setState(1660); + class_type(); + setState(1665); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1661); + match(COMMA); + setState(1662); + namespace_or_type_name(); + } + } + setState(1667); + _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 Interface_type_listContext extends ParserRuleContext { + public List namespace_or_type_name() { + return getRuleContexts(Namespace_or_type_nameContext.class); + } + public Namespace_or_type_nameContext namespace_or_type_name(int i) { + return getRuleContext(Namespace_or_type_nameContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Interface_type_listContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interface_type_list; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterInterface_type_list(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitInterface_type_list(this); + } + } + + public final Interface_type_listContext interface_type_list() throws RecognitionException { + Interface_type_listContext _localctx = new Interface_type_listContext(_ctx, getState()); + enterRule(_localctx, 236, RULE_interface_type_list); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1668); + namespace_or_type_name(); + setState(1673); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1669); + match(COMMA); + setState(1670); + namespace_or_type_name(); + } + } + setState(1675); + _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 Type_parameter_constraints_clausesContext extends ParserRuleContext { + public List type_parameter_constraints_clause() { + return getRuleContexts(Type_parameter_constraints_clauseContext.class); + } + public Type_parameter_constraints_clauseContext type_parameter_constraints_clause(int i) { + return getRuleContext(Type_parameter_constraints_clauseContext.class,i); + } + public Type_parameter_constraints_clausesContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_type_parameter_constraints_clauses; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterType_parameter_constraints_clauses(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitType_parameter_constraints_clauses(this); + } + } + + public final Type_parameter_constraints_clausesContext type_parameter_constraints_clauses() throws RecognitionException { + Type_parameter_constraints_clausesContext _localctx = new Type_parameter_constraints_clausesContext(_ctx, getState()); + enterRule(_localctx, 238, RULE_type_parameter_constraints_clauses); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1677); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(1676); + type_parameter_constraints_clause(); + } + } + setState(1679); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==WHERE ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Type_parameter_constraints_clauseContext extends ParserRuleContext { + public TerminalNode WHERE() { return getToken(CSharpParser.WHERE, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public Type_parameter_constraintsContext type_parameter_constraints() { + return getRuleContext(Type_parameter_constraintsContext.class,0); + } + public Type_parameter_constraints_clauseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_type_parameter_constraints_clause; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterType_parameter_constraints_clause(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitType_parameter_constraints_clause(this); + } + } + + public final Type_parameter_constraints_clauseContext type_parameter_constraints_clause() throws RecognitionException { + Type_parameter_constraints_clauseContext _localctx = new Type_parameter_constraints_clauseContext(_ctx, getState()); + enterRule(_localctx, 240, RULE_type_parameter_constraints_clause); + try { + enterOuterAlt(_localctx, 1); + { + setState(1681); + match(WHERE); + setState(1682); + identifier(); + setState(1683); + match(COLON); + setState(1684); + type_parameter_constraints(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Type_parameter_constraintsContext extends ParserRuleContext { + public Constructor_constraintContext constructor_constraint() { + return getRuleContext(Constructor_constraintContext.class,0); + } + public Primary_constraintContext primary_constraint() { + return getRuleContext(Primary_constraintContext.class,0); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Secondary_constraintsContext secondary_constraints() { + return getRuleContext(Secondary_constraintsContext.class,0); + } + public Type_parameter_constraintsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_type_parameter_constraints; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterType_parameter_constraints(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitType_parameter_constraints(this); + } + } + + public final Type_parameter_constraintsContext type_parameter_constraints() throws RecognitionException { + Type_parameter_constraintsContext _localctx = new Type_parameter_constraintsContext(_ctx, getState()); + enterRule(_localctx, 242, RULE_type_parameter_constraints); + int _la; + try { + setState(1696); + _errHandler.sync(this); + switch (_input.LA(1)) { + case NEW: + enterOuterAlt(_localctx, 1); + { + setState(1686); + constructor_constraint(); + } + break; + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BY: + case CLASS: + case DESCENDING: + case DYNAMIC: + case EQUALS: + case FROM: + case GET: + case GROUP: + case INTO: + case JOIN: + case LET: + case NAMEOF: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REMOVE: + case SELECT: + case SET: + case STRING: + case STRUCT: + case UNMANAGED: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + enterOuterAlt(_localctx, 2); + { + setState(1687); + primary_constraint(); + setState(1690); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,186,_ctx) ) { + case 1: + { + setState(1688); + match(COMMA); + setState(1689); + secondary_constraints(); + } + break; + } + setState(1694); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(1692); + match(COMMA); + setState(1693); + constructor_constraint(); + } + } + + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Primary_constraintContext extends ParserRuleContext { + public Class_typeContext class_type() { + return getRuleContext(Class_typeContext.class,0); + } + public TerminalNode CLASS() { return getToken(CSharpParser.CLASS, 0); } + public TerminalNode INTERR() { return getToken(CSharpParser.INTERR, 0); } + public TerminalNode STRUCT() { return getToken(CSharpParser.STRUCT, 0); } + public TerminalNode UNMANAGED() { return getToken(CSharpParser.UNMANAGED, 0); } + public Primary_constraintContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_primary_constraint; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterPrimary_constraint(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitPrimary_constraint(this); + } + } + + public final Primary_constraintContext primary_constraint() throws RecognitionException { + Primary_constraintContext _localctx = new Primary_constraintContext(_ctx, getState()); + enterRule(_localctx, 244, RULE_primary_constraint); + int _la; + try { + setState(1705); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,190,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1698); + class_type(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1699); + match(CLASS); + setState(1701); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==INTERR) { + { + setState(1700); + match(INTERR); + } + } + + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1703); + match(STRUCT); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(1704); + match(UNMANAGED); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Secondary_constraintsContext extends ParserRuleContext { + public List namespace_or_type_name() { + return getRuleContexts(Namespace_or_type_nameContext.class); + } + public Namespace_or_type_nameContext namespace_or_type_name(int i) { + return getRuleContext(Namespace_or_type_nameContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Secondary_constraintsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_secondary_constraints; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterSecondary_constraints(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitSecondary_constraints(this); + } + } + + public final Secondary_constraintsContext secondary_constraints() throws RecognitionException { + Secondary_constraintsContext _localctx = new Secondary_constraintsContext(_ctx, getState()); + enterRule(_localctx, 246, RULE_secondary_constraints); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1707); + namespace_or_type_name(); + setState(1712); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,191,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1708); + match(COMMA); + setState(1709); + namespace_or_type_name(); + } + } + } + setState(1714); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,191,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Constructor_constraintContext extends ParserRuleContext { + public TerminalNode NEW() { return getToken(CSharpParser.NEW, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Constructor_constraintContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constructor_constraint; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterConstructor_constraint(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitConstructor_constraint(this); + } + } + + public final Constructor_constraintContext constructor_constraint() throws RecognitionException { + Constructor_constraintContext _localctx = new Constructor_constraintContext(_ctx, getState()); + enterRule(_localctx, 248, RULE_constructor_constraint); + try { + enterOuterAlt(_localctx, 1); + { + setState(1715); + match(NEW); + setState(1716); + match(OPEN_PARENS); + setState(1717); + match(CLOSE_PARENS); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Class_bodyContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public Class_member_declarationsContext class_member_declarations() { + return getRuleContext(Class_member_declarationsContext.class,0); + } + public Class_bodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_class_body; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterClass_body(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitClass_body(this); + } + } + + public final Class_bodyContext class_body() throws RecognitionException { + Class_bodyContext _localctx = new Class_bodyContext(_ctx, getState()); + enterRule(_localctx, 250, RULE_class_body); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1719); + match(OPEN_BRACE); + setState(1721); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ABSTRACT) | (1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CLASS) | (1L << CONST) | (1L << DECIMAL) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << ENUM) | (1L << EQUALS) | (1L << EVENT) | (1L << EXPLICIT) | (1L << EXTERN) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << IMPLICIT) | (1L << INT) | (1L << INTERFACE) | (1L << INTERNAL) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (OVERRIDE - 64)) | (1L << (PARTIAL - 64)) | (1L << (PRIVATE - 64)) | (1L << (PROTECTED - 64)) | (1L << (PUBLIC - 64)) | (1L << (READONLY - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SEALED - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (STATIC - 64)) | (1L << (STRING - 64)) | (1L << (STRUCT - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNMANAGED - 64)) | (1L << (UNSAFE - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (VIRTUAL - 64)) | (1L << (VOID - 64)) | (1L << (VOLATILE - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (OPEN_BRACKET - 64)))) != 0) || _la==OPEN_PARENS || _la==TILDE) { + { + setState(1720); + class_member_declarations(); + } + } + + setState(1723); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Class_member_declarationsContext extends ParserRuleContext { + public List class_member_declaration() { + return getRuleContexts(Class_member_declarationContext.class); + } + public Class_member_declarationContext class_member_declaration(int i) { + return getRuleContext(Class_member_declarationContext.class,i); + } + public Class_member_declarationsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_class_member_declarations; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterClass_member_declarations(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitClass_member_declarations(this); + } + } + + public final Class_member_declarationsContext class_member_declarations() throws RecognitionException { + Class_member_declarationsContext _localctx = new Class_member_declarationsContext(_ctx, getState()); + enterRule(_localctx, 252, RULE_class_member_declarations); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1726); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(1725); + class_member_declaration(); + } + } + setState(1728); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ABSTRACT) | (1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CLASS) | (1L << CONST) | (1L << DECIMAL) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << ENUM) | (1L << EQUALS) | (1L << EVENT) | (1L << EXPLICIT) | (1L << EXTERN) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << IMPLICIT) | (1L << INT) | (1L << INTERFACE) | (1L << INTERNAL) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (OVERRIDE - 64)) | (1L << (PARTIAL - 64)) | (1L << (PRIVATE - 64)) | (1L << (PROTECTED - 64)) | (1L << (PUBLIC - 64)) | (1L << (READONLY - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SEALED - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (STATIC - 64)) | (1L << (STRING - 64)) | (1L << (STRUCT - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNMANAGED - 64)) | (1L << (UNSAFE - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (VIRTUAL - 64)) | (1L << (VOID - 64)) | (1L << (VOLATILE - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (OPEN_BRACKET - 64)))) != 0) || _la==OPEN_PARENS || _la==TILDE ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Class_member_declarationContext extends ParserRuleContext { + public Common_member_declarationContext common_member_declaration() { + return getRuleContext(Common_member_declarationContext.class,0); + } + public Destructor_definitionContext destructor_definition() { + return getRuleContext(Destructor_definitionContext.class,0); + } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public All_member_modifiersContext all_member_modifiers() { + return getRuleContext(All_member_modifiersContext.class,0); + } + public Class_member_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_class_member_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterClass_member_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitClass_member_declaration(this); + } + } + + public final Class_member_declarationContext class_member_declaration() throws RecognitionException { + Class_member_declarationContext _localctx = new Class_member_declarationContext(_ctx, getState()); + enterRule(_localctx, 254, RULE_class_member_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1731); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(1730); + attributes(); + } + } + + setState(1734); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,195,_ctx) ) { + case 1: + { + setState(1733); + all_member_modifiers(); + } + break; + } + setState(1738); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BOOL: + case BY: + case BYTE: + case CHAR: + case CLASS: + case CONST: + case DECIMAL: + case DELEGATE: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case ENUM: + case EQUALS: + case EVENT: + case EXPLICIT: + case FLOAT: + case FROM: + case GET: + case GROUP: + case IMPLICIT: + case INT: + case INTERFACE: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case READONLY: + case REF: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case STRING: + case STRUCT: + case UINT: + case ULONG: + case UNMANAGED: + case USHORT: + case VAR: + case VOID: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case OPEN_PARENS: + { + setState(1736); + common_member_declaration(); + } + break; + case TILDE: + { + setState(1737); + destructor_definition(); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class All_member_modifiersContext extends ParserRuleContext { + public List all_member_modifier() { + return getRuleContexts(All_member_modifierContext.class); + } + public All_member_modifierContext all_member_modifier(int i) { + return getRuleContext(All_member_modifierContext.class,i); + } + public All_member_modifiersContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_all_member_modifiers; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAll_member_modifiers(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAll_member_modifiers(this); + } + } + + public final All_member_modifiersContext all_member_modifiers() throws RecognitionException { + All_member_modifiersContext _localctx = new All_member_modifiersContext(_ctx, getState()); + enterRule(_localctx, 256, RULE_all_member_modifiers); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1741); + _errHandler.sync(this); + _alt = 1; + do { + switch (_alt) { + case 1: + { + { + setState(1740); + all_member_modifier(); + } + } + break; + default: + throw new NoViableAltException(this); + } + setState(1743); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,197,_ctx); + } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class All_member_modifierContext extends ParserRuleContext { + public TerminalNode NEW() { return getToken(CSharpParser.NEW, 0); } + public TerminalNode PUBLIC() { return getToken(CSharpParser.PUBLIC, 0); } + public TerminalNode PROTECTED() { return getToken(CSharpParser.PROTECTED, 0); } + public TerminalNode INTERNAL() { return getToken(CSharpParser.INTERNAL, 0); } + public TerminalNode PRIVATE() { return getToken(CSharpParser.PRIVATE, 0); } + public TerminalNode READONLY() { return getToken(CSharpParser.READONLY, 0); } + public TerminalNode VOLATILE() { return getToken(CSharpParser.VOLATILE, 0); } + public TerminalNode VIRTUAL() { return getToken(CSharpParser.VIRTUAL, 0); } + public TerminalNode SEALED() { return getToken(CSharpParser.SEALED, 0); } + public TerminalNode OVERRIDE() { return getToken(CSharpParser.OVERRIDE, 0); } + public TerminalNode ABSTRACT() { return getToken(CSharpParser.ABSTRACT, 0); } + public TerminalNode STATIC() { return getToken(CSharpParser.STATIC, 0); } + public TerminalNode UNSAFE() { return getToken(CSharpParser.UNSAFE, 0); } + public TerminalNode EXTERN() { return getToken(CSharpParser.EXTERN, 0); } + public TerminalNode PARTIAL() { return getToken(CSharpParser.PARTIAL, 0); } + public TerminalNode ASYNC() { return getToken(CSharpParser.ASYNC, 0); } + public All_member_modifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_all_member_modifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAll_member_modifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAll_member_modifier(this); + } + } + + public final All_member_modifierContext all_member_modifier() throws RecognitionException { + All_member_modifierContext _localctx = new All_member_modifierContext(_ctx, getState()); + enterRule(_localctx, 258, RULE_all_member_modifier); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1745); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ABSTRACT) | (1L << ASYNC) | (1L << EXTERN) | (1L << INTERNAL))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (NEW - 66)) | (1L << (OVERRIDE - 66)) | (1L << (PARTIAL - 66)) | (1L << (PRIVATE - 66)) | (1L << (PROTECTED - 66)) | (1L << (PUBLIC - 66)) | (1L << (READONLY - 66)) | (1L << (SEALED - 66)) | (1L << (STATIC - 66)) | (1L << (UNSAFE - 66)) | (1L << (VIRTUAL - 66)) | (1L << (VOLATILE - 66)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Common_member_declarationContext extends ParserRuleContext { + public Constant_declarationContext constant_declaration() { + return getRuleContext(Constant_declarationContext.class,0); + } + public Typed_member_declarationContext typed_member_declaration() { + return getRuleContext(Typed_member_declarationContext.class,0); + } + public Event_declarationContext event_declaration() { + return getRuleContext(Event_declarationContext.class,0); + } + public Conversion_operator_declaratorContext conversion_operator_declarator() { + return getRuleContext(Conversion_operator_declaratorContext.class,0); + } + public BodyContext body() { + return getRuleContext(BodyContext.class,0); + } + public Right_arrowContext right_arrow() { + return getRuleContext(Right_arrowContext.class,0); + } + public Throwable_expressionContext throwable_expression() { + return getRuleContext(Throwable_expressionContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Constructor_declarationContext constructor_declaration() { + return getRuleContext(Constructor_declarationContext.class,0); + } + public TerminalNode VOID() { return getToken(CSharpParser.VOID, 0); } + public Method_declarationContext method_declaration() { + return getRuleContext(Method_declarationContext.class,0); + } + public Class_definitionContext class_definition() { + return getRuleContext(Class_definitionContext.class,0); + } + public Struct_definitionContext struct_definition() { + return getRuleContext(Struct_definitionContext.class,0); + } + public Interface_definitionContext interface_definition() { + return getRuleContext(Interface_definitionContext.class,0); + } + public Enum_definitionContext enum_definition() { + return getRuleContext(Enum_definitionContext.class,0); + } + public Delegate_definitionContext delegate_definition() { + return getRuleContext(Delegate_definitionContext.class,0); + } + public Common_member_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_common_member_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterCommon_member_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitCommon_member_declaration(this); + } + } + + public final Common_member_declarationContext common_member_declaration() throws RecognitionException { + Common_member_declarationContext _localctx = new Common_member_declarationContext(_ctx, getState()); + enterRule(_localctx, 260, RULE_common_member_declaration); + try { + setState(1766); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,199,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1747); + constant_declaration(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1748); + typed_member_declaration(); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1749); + event_declaration(); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(1750); + conversion_operator_declarator(); + setState(1756); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACE: + case SEMICOLON: + { + setState(1751); + body(); + } + break; + case ASSIGNMENT: + { + setState(1752); + right_arrow(); + setState(1753); + throwable_expression(); + setState(1754); + match(SEMICOLON); + } + break; + default: + throw new NoViableAltException(this); + } + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(1758); + constructor_declaration(); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(1759); + match(VOID); + setState(1760); + method_declaration(); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(1761); + class_definition(); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(1762); + struct_definition(); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(1763); + interface_definition(); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(1764); + enum_definition(); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(1765); + delegate_definition(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Typed_member_declarationContext extends ParserRuleContext { + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public Namespace_or_type_nameContext namespace_or_type_name() { + return getRuleContext(Namespace_or_type_nameContext.class,0); + } + public TerminalNode DOT() { return getToken(CSharpParser.DOT, 0); } + public Indexer_declarationContext indexer_declaration() { + return getRuleContext(Indexer_declarationContext.class,0); + } + public Method_declarationContext method_declaration() { + return getRuleContext(Method_declarationContext.class,0); + } + public Property_declarationContext property_declaration() { + return getRuleContext(Property_declarationContext.class,0); + } + public Operator_declarationContext operator_declaration() { + return getRuleContext(Operator_declarationContext.class,0); + } + public Field_declarationContext field_declaration() { + return getRuleContext(Field_declarationContext.class,0); + } + public TerminalNode REF() { return getToken(CSharpParser.REF, 0); } + public TerminalNode READONLY() { return getToken(CSharpParser.READONLY, 0); } + public Typed_member_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_typed_member_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterTyped_member_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitTyped_member_declaration(this); + } + } + + public final Typed_member_declarationContext typed_member_declaration() throws RecognitionException { + Typed_member_declarationContext _localctx = new Typed_member_declarationContext(_ctx, getState()); + enterRule(_localctx, 262, RULE_typed_member_declaration); + try { + enterOuterAlt(_localctx, 1); + { + setState(1773); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,200,_ctx) ) { + case 1: + { + setState(1768); + match(REF); + } + break; + case 2: + { + setState(1769); + match(READONLY); + setState(1770); + match(REF); + } + break; + case 3: + { + setState(1771); + match(REF); + setState(1772); + match(READONLY); + } + break; + } + setState(1775); + type_(); + setState(1785); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,201,_ctx) ) { + case 1: + { + setState(1776); + namespace_or_type_name(); + setState(1777); + match(DOT); + setState(1778); + indexer_declaration(); + } + break; + case 2: + { + setState(1780); + method_declaration(); + } + break; + case 3: + { + setState(1781); + property_declaration(); + } + break; + case 4: + { + setState(1782); + indexer_declaration(); + } + break; + case 5: + { + setState(1783); + operator_declaration(); + } + break; + case 6: + { + setState(1784); + field_declaration(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Constant_declaratorsContext extends ParserRuleContext { + public List constant_declarator() { + return getRuleContexts(Constant_declaratorContext.class); + } + public Constant_declaratorContext constant_declarator(int i) { + return getRuleContext(Constant_declaratorContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Constant_declaratorsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constant_declarators; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterConstant_declarators(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitConstant_declarators(this); + } + } + + public final Constant_declaratorsContext constant_declarators() throws RecognitionException { + Constant_declaratorsContext _localctx = new Constant_declaratorsContext(_ctx, getState()); + enterRule(_localctx, 264, RULE_constant_declarators); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1787); + constant_declarator(); + setState(1792); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1788); + match(COMMA); + setState(1789); + constant_declarator(); + } + } + setState(1794); + _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 Constant_declaratorContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode ASSIGNMENT() { return getToken(CSharpParser.ASSIGNMENT, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Constant_declaratorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constant_declarator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterConstant_declarator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitConstant_declarator(this); + } + } + + public final Constant_declaratorContext constant_declarator() throws RecognitionException { + Constant_declaratorContext _localctx = new Constant_declaratorContext(_ctx, getState()); + enterRule(_localctx, 266, RULE_constant_declarator); + try { + enterOuterAlt(_localctx, 1); + { + setState(1795); + identifier(); + setState(1796); + match(ASSIGNMENT); + setState(1797); + expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Variable_declaratorsContext extends ParserRuleContext { + public List variable_declarator() { + return getRuleContexts(Variable_declaratorContext.class); + } + public Variable_declaratorContext variable_declarator(int i) { + return getRuleContext(Variable_declaratorContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Variable_declaratorsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variable_declarators; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterVariable_declarators(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitVariable_declarators(this); + } + } + + public final Variable_declaratorsContext variable_declarators() throws RecognitionException { + Variable_declaratorsContext _localctx = new Variable_declaratorsContext(_ctx, getState()); + enterRule(_localctx, 268, RULE_variable_declarators); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1799); + variable_declarator(); + setState(1804); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(1800); + match(COMMA); + setState(1801); + variable_declarator(); + } + } + setState(1806); + _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 Variable_declaratorContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode ASSIGNMENT() { return getToken(CSharpParser.ASSIGNMENT, 0); } + public Variable_initializerContext variable_initializer() { + return getRuleContext(Variable_initializerContext.class,0); + } + public Variable_declaratorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variable_declarator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterVariable_declarator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitVariable_declarator(this); + } + } + + public final Variable_declaratorContext variable_declarator() throws RecognitionException { + Variable_declaratorContext _localctx = new Variable_declaratorContext(_ctx, getState()); + enterRule(_localctx, 270, RULE_variable_declarator); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1807); + identifier(); + setState(1810); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ASSIGNMENT) { + { + setState(1808); + match(ASSIGNMENT); + setState(1809); + variable_initializer(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Variable_initializerContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Array_initializerContext array_initializer() { + return getRuleContext(Array_initializerContext.class,0); + } + public Variable_initializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variable_initializer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterVariable_initializer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitVariable_initializer(this); + } + } + + public final Variable_initializerContext variable_initializer() throws RecognitionException { + Variable_initializerContext _localctx = new Variable_initializerContext(_ctx, getState()); + enterRule(_localctx, 272, RULE_variable_initializer); + try { + setState(1814); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BASE: + case BOOL: + case BY: + case BYTE: + case CHAR: + case CHECKED: + case DECIMAL: + case DEFAULT: + case DELEGATE: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FALSE: + case FLOAT: + case FROM: + case GET: + case GROUP: + case INT: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case NEW: + case NULL_: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REF: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case SIZEOF: + case STRING: + case THIS: + case TRUE: + case TYPEOF: + case UINT: + case ULONG: + case UNCHECKED: + case UNMANAGED: + case USHORT: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case LITERAL_ACCESS: + case INTEGER_LITERAL: + case HEX_INTEGER_LITERAL: + case BIN_INTEGER_LITERAL: + case REAL_LITERAL: + case CHARACTER_LITERAL: + case REGULAR_STRING: + case VERBATIUM_STRING: + case INTERPOLATED_REGULAR_STRING_START: + case INTERPOLATED_VERBATIUM_STRING_START: + case OPEN_PARENS: + case PLUS: + case MINUS: + case STAR: + case AMP: + case CARET: + case BANG: + case TILDE: + case OP_INC: + case OP_DEC: + case OP_RANGE: + enterOuterAlt(_localctx, 1); + { + setState(1812); + expression(); + } + break; + case OPEN_BRACE: + enterOuterAlt(_localctx, 2); + { + setState(1813); + array_initializer(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Return_typeContext extends ParserRuleContext { + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public TerminalNode VOID() { return getToken(CSharpParser.VOID, 0); } + public Return_typeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_return_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterReturn_type(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitReturn_type(this); + } + } + + public final Return_typeContext return_type() throws RecognitionException { + Return_typeContext _localctx = new Return_typeContext(_ctx, getState()); + enterRule(_localctx, 274, RULE_return_type); + try { + setState(1818); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,206,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1816); + type_(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1817); + match(VOID); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Member_nameContext extends ParserRuleContext { + public Namespace_or_type_nameContext namespace_or_type_name() { + return getRuleContext(Namespace_or_type_nameContext.class,0); + } + public Member_nameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_member_name; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterMember_name(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitMember_name(this); + } + } + + public final Member_nameContext member_name() throws RecognitionException { + Member_nameContext _localctx = new Member_nameContext(_ctx, getState()); + enterRule(_localctx, 276, RULE_member_name); + try { + enterOuterAlt(_localctx, 1); + { + setState(1820); + namespace_or_type_name(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Method_bodyContext extends ParserRuleContext { + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Method_bodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_method_body; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterMethod_body(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitMethod_body(this); + } + } + + public final Method_bodyContext method_body() throws RecognitionException { + Method_bodyContext _localctx = new Method_bodyContext(_ctx, getState()); + enterRule(_localctx, 278, RULE_method_body); + try { + setState(1824); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACE: + enterOuterAlt(_localctx, 1); + { + setState(1822); + block(); + } + break; + case SEMICOLON: + enterOuterAlt(_localctx, 2); + { + setState(1823); + match(SEMICOLON); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Formal_parameter_listContext extends ParserRuleContext { + public Parameter_arrayContext parameter_array() { + return getRuleContext(Parameter_arrayContext.class,0); + } + public Fixed_parametersContext fixed_parameters() { + return getRuleContext(Fixed_parametersContext.class,0); + } + public TerminalNode COMMA() { return getToken(CSharpParser.COMMA, 0); } + public Formal_parameter_listContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_formal_parameter_list; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterFormal_parameter_list(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitFormal_parameter_list(this); + } + } + + public final Formal_parameter_listContext formal_parameter_list() throws RecognitionException { + Formal_parameter_listContext _localctx = new Formal_parameter_listContext(_ctx, getState()); + enterRule(_localctx, 280, RULE_formal_parameter_list); + int _la; + try { + setState(1832); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,209,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1826); + parameter_array(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1827); + fixed_parameters(); + setState(1830); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(1828); + match(COMMA); + setState(1829); + parameter_array(); + } + } + + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Fixed_parametersContext extends ParserRuleContext { + public List fixed_parameter() { + return getRuleContexts(Fixed_parameterContext.class); + } + public Fixed_parameterContext fixed_parameter(int i) { + return getRuleContext(Fixed_parameterContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Fixed_parametersContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fixed_parameters; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterFixed_parameters(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitFixed_parameters(this); + } + } + + public final Fixed_parametersContext fixed_parameters() throws RecognitionException { + Fixed_parametersContext _localctx = new Fixed_parametersContext(_ctx, getState()); + enterRule(_localctx, 282, RULE_fixed_parameters); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(1834); + fixed_parameter(); + setState(1839); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,210,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(1835); + match(COMMA); + setState(1836); + fixed_parameter(); + } + } + } + setState(1841); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,210,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Fixed_parameterContext extends ParserRuleContext { + public Arg_declarationContext arg_declaration() { + return getRuleContext(Arg_declarationContext.class,0); + } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public Parameter_modifierContext parameter_modifier() { + return getRuleContext(Parameter_modifierContext.class,0); + } + public TerminalNode ARGLIST() { return getToken(CSharpParser.ARGLIST, 0); } + public Fixed_parameterContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fixed_parameter; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterFixed_parameter(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitFixed_parameter(this); + } + } + + public final Fixed_parameterContext fixed_parameter() throws RecognitionException { + Fixed_parameterContext _localctx = new Fixed_parameterContext(_ctx, getState()); + enterRule(_localctx, 284, RULE_fixed_parameter); + int _la; + try { + setState(1850); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,213,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1843); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(1842); + attributes(); + } + } + + setState(1846); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 54)) & ~0x3f) == 0 && ((1L << (_la - 54)) & ((1L << (IN - 54)) | (1L << (OUT - 54)) | (1L << (REF - 54)) | (1L << (THIS - 54)))) != 0)) { + { + setState(1845); + parameter_modifier(); + } + } + + setState(1848); + arg_declaration(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1849); + match(ARGLIST); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Parameter_modifierContext extends ParserRuleContext { + public TerminalNode REF() { return getToken(CSharpParser.REF, 0); } + public TerminalNode OUT() { return getToken(CSharpParser.OUT, 0); } + public TerminalNode IN() { return getToken(CSharpParser.IN, 0); } + public TerminalNode THIS() { return getToken(CSharpParser.THIS, 0); } + public Parameter_modifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_parameter_modifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterParameter_modifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitParameter_modifier(this); + } + } + + public final Parameter_modifierContext parameter_modifier() throws RecognitionException { + Parameter_modifierContext _localctx = new Parameter_modifierContext(_ctx, getState()); + enterRule(_localctx, 286, RULE_parameter_modifier); + try { + setState(1860); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,214,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1852); + match(REF); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1853); + match(OUT); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1854); + match(IN); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(1855); + match(REF); + setState(1856); + match(THIS); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(1857); + match(IN); + setState(1858); + match(THIS); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(1859); + match(THIS); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Parameter_arrayContext extends ParserRuleContext { + public TerminalNode PARAMS() { return getToken(CSharpParser.PARAMS, 0); } + public Array_typeContext array_type() { + return getRuleContext(Array_typeContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public Parameter_arrayContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_parameter_array; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterParameter_array(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitParameter_array(this); + } + } + + public final Parameter_arrayContext parameter_array() throws RecognitionException { + Parameter_arrayContext _localctx = new Parameter_arrayContext(_ctx, getState()); + enterRule(_localctx, 288, RULE_parameter_array); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1863); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(1862); + attributes(); + } + } + + setState(1865); + match(PARAMS); + setState(1866); + array_type(); + setState(1867); + identifier(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Accessor_declarationsContext extends ParserRuleContext { + public AttributesContext attrs; + public Accessor_modifierContext mods; + public TerminalNode GET() { return getToken(CSharpParser.GET, 0); } + public Accessor_bodyContext accessor_body() { + return getRuleContext(Accessor_bodyContext.class,0); + } + public TerminalNode SET() { return getToken(CSharpParser.SET, 0); } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public Accessor_modifierContext accessor_modifier() { + return getRuleContext(Accessor_modifierContext.class,0); + } + public Set_accessor_declarationContext set_accessor_declaration() { + return getRuleContext(Set_accessor_declarationContext.class,0); + } + public Get_accessor_declarationContext get_accessor_declaration() { + return getRuleContext(Get_accessor_declarationContext.class,0); + } + public Accessor_declarationsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_accessor_declarations; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAccessor_declarations(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAccessor_declarations(this); + } + } + + public final Accessor_declarationsContext accessor_declarations() throws RecognitionException { + Accessor_declarationsContext _localctx = new Accessor_declarationsContext(_ctx, getState()); + enterRule(_localctx, 290, RULE_accessor_declarations); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1870); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(1869); + ((Accessor_declarationsContext)_localctx).attrs = attributes(); + } + } + + setState(1873); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 57)) & ~0x3f) == 0 && ((1L << (_la - 57)) & ((1L << (INTERNAL - 57)) | (1L << (PRIVATE - 57)) | (1L << (PROTECTED - 57)))) != 0)) { + { + setState(1872); + ((Accessor_declarationsContext)_localctx).mods = accessor_modifier(); + } + } + + setState(1885); + _errHandler.sync(this); + switch (_input.LA(1)) { + case GET: + { + setState(1875); + match(GET); + setState(1876); + accessor_body(); + setState(1878); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==INTERNAL || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (PRIVATE - 76)) | (1L << (PROTECTED - 76)) | (1L << (SET - 76)) | (1L << (OPEN_BRACKET - 76)))) != 0)) { + { + setState(1877); + set_accessor_declaration(); + } + } + + } + break; + case SET: + { + setState(1880); + match(SET); + setState(1881); + accessor_body(); + setState(1883); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==GET || _la==INTERNAL || ((((_la - 76)) & ~0x3f) == 0 && ((1L << (_la - 76)) & ((1L << (PRIVATE - 76)) | (1L << (PROTECTED - 76)) | (1L << (OPEN_BRACKET - 76)))) != 0)) { + { + setState(1882); + get_accessor_declaration(); + } + } + + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Get_accessor_declarationContext extends ParserRuleContext { + public TerminalNode GET() { return getToken(CSharpParser.GET, 0); } + public Accessor_bodyContext accessor_body() { + return getRuleContext(Accessor_bodyContext.class,0); + } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public Accessor_modifierContext accessor_modifier() { + return getRuleContext(Accessor_modifierContext.class,0); + } + public Get_accessor_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_get_accessor_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterGet_accessor_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitGet_accessor_declaration(this); + } + } + + public final Get_accessor_declarationContext get_accessor_declaration() throws RecognitionException { + Get_accessor_declarationContext _localctx = new Get_accessor_declarationContext(_ctx, getState()); + enterRule(_localctx, 292, RULE_get_accessor_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1888); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(1887); + attributes(); + } + } + + setState(1891); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 57)) & ~0x3f) == 0 && ((1L << (_la - 57)) & ((1L << (INTERNAL - 57)) | (1L << (PRIVATE - 57)) | (1L << (PROTECTED - 57)))) != 0)) { + { + setState(1890); + accessor_modifier(); + } + } + + setState(1893); + match(GET); + setState(1894); + accessor_body(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Set_accessor_declarationContext extends ParserRuleContext { + public TerminalNode SET() { return getToken(CSharpParser.SET, 0); } + public Accessor_bodyContext accessor_body() { + return getRuleContext(Accessor_bodyContext.class,0); + } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public Accessor_modifierContext accessor_modifier() { + return getRuleContext(Accessor_modifierContext.class,0); + } + public Set_accessor_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_set_accessor_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterSet_accessor_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitSet_accessor_declaration(this); + } + } + + public final Set_accessor_declarationContext set_accessor_declaration() throws RecognitionException { + Set_accessor_declarationContext _localctx = new Set_accessor_declarationContext(_ctx, getState()); + enterRule(_localctx, 294, RULE_set_accessor_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1897); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(1896); + attributes(); + } + } + + setState(1900); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 57)) & ~0x3f) == 0 && ((1L << (_la - 57)) & ((1L << (INTERNAL - 57)) | (1L << (PRIVATE - 57)) | (1L << (PROTECTED - 57)))) != 0)) { + { + setState(1899); + accessor_modifier(); + } + } + + setState(1902); + match(SET); + setState(1903); + accessor_body(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Accessor_modifierContext extends ParserRuleContext { + public TerminalNode PROTECTED() { return getToken(CSharpParser.PROTECTED, 0); } + public TerminalNode INTERNAL() { return getToken(CSharpParser.INTERNAL, 0); } + public TerminalNode PRIVATE() { return getToken(CSharpParser.PRIVATE, 0); } + public Accessor_modifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_accessor_modifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAccessor_modifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAccessor_modifier(this); + } + } + + public final Accessor_modifierContext accessor_modifier() throws RecognitionException { + Accessor_modifierContext _localctx = new Accessor_modifierContext(_ctx, getState()); + enterRule(_localctx, 296, RULE_accessor_modifier); + try { + setState(1912); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,225,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1905); + match(PROTECTED); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1906); + match(INTERNAL); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1907); + match(PRIVATE); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(1908); + match(PROTECTED); + setState(1909); + match(INTERNAL); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(1910); + match(INTERNAL); + setState(1911); + match(PROTECTED); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Accessor_bodyContext extends ParserRuleContext { + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Accessor_bodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_accessor_body; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAccessor_body(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAccessor_body(this); + } + } + + public final Accessor_bodyContext accessor_body() throws RecognitionException { + Accessor_bodyContext _localctx = new Accessor_bodyContext(_ctx, getState()); + enterRule(_localctx, 298, RULE_accessor_body); + try { + setState(1916); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACE: + enterOuterAlt(_localctx, 1); + { + setState(1914); + block(); + } + break; + case SEMICOLON: + enterOuterAlt(_localctx, 2); + { + setState(1915); + match(SEMICOLON); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Event_accessor_declarationsContext extends ParserRuleContext { + public TerminalNode ADD() { return getToken(CSharpParser.ADD, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public Remove_accessor_declarationContext remove_accessor_declaration() { + return getRuleContext(Remove_accessor_declarationContext.class,0); + } + public TerminalNode REMOVE() { return getToken(CSharpParser.REMOVE, 0); } + public Add_accessor_declarationContext add_accessor_declaration() { + return getRuleContext(Add_accessor_declarationContext.class,0); + } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public Event_accessor_declarationsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_event_accessor_declarations; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterEvent_accessor_declarations(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitEvent_accessor_declarations(this); + } + } + + public final Event_accessor_declarationsContext event_accessor_declarations() throws RecognitionException { + Event_accessor_declarationsContext _localctx = new Event_accessor_declarationsContext(_ctx, getState()); + enterRule(_localctx, 300, RULE_event_accessor_declarations); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1919); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(1918); + attributes(); + } + } + + setState(1929); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + { + setState(1921); + match(ADD); + setState(1922); + block(); + setState(1923); + remove_accessor_declaration(); + } + break; + case REMOVE: + { + setState(1925); + match(REMOVE); + setState(1926); + block(); + setState(1927); + add_accessor_declaration(); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Add_accessor_declarationContext extends ParserRuleContext { + public TerminalNode ADD() { return getToken(CSharpParser.ADD, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public Add_accessor_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_add_accessor_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAdd_accessor_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAdd_accessor_declaration(this); + } + } + + public final Add_accessor_declarationContext add_accessor_declaration() throws RecognitionException { + Add_accessor_declarationContext _localctx = new Add_accessor_declarationContext(_ctx, getState()); + enterRule(_localctx, 302, RULE_add_accessor_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1932); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(1931); + attributes(); + } + } + + setState(1934); + match(ADD); + setState(1935); + block(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Remove_accessor_declarationContext extends ParserRuleContext { + public TerminalNode REMOVE() { return getToken(CSharpParser.REMOVE, 0); } + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public Remove_accessor_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_remove_accessor_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterRemove_accessor_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitRemove_accessor_declaration(this); + } + } + + public final Remove_accessor_declarationContext remove_accessor_declaration() throws RecognitionException { + Remove_accessor_declarationContext _localctx = new Remove_accessor_declarationContext(_ctx, getState()); + enterRule(_localctx, 304, RULE_remove_accessor_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1938); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(1937); + attributes(); + } + } + + setState(1940); + match(REMOVE); + setState(1941); + block(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Overloadable_operatorContext extends ParserRuleContext { + public TerminalNode PLUS() { return getToken(CSharpParser.PLUS, 0); } + public TerminalNode MINUS() { return getToken(CSharpParser.MINUS, 0); } + public TerminalNode BANG() { return getToken(CSharpParser.BANG, 0); } + public TerminalNode TILDE() { return getToken(CSharpParser.TILDE, 0); } + public TerminalNode OP_INC() { return getToken(CSharpParser.OP_INC, 0); } + public TerminalNode OP_DEC() { return getToken(CSharpParser.OP_DEC, 0); } + public TerminalNode TRUE() { return getToken(CSharpParser.TRUE, 0); } + public TerminalNode FALSE() { return getToken(CSharpParser.FALSE, 0); } + public TerminalNode STAR() { return getToken(CSharpParser.STAR, 0); } + public TerminalNode DIV() { return getToken(CSharpParser.DIV, 0); } + public TerminalNode PERCENT() { return getToken(CSharpParser.PERCENT, 0); } + public TerminalNode AMP() { return getToken(CSharpParser.AMP, 0); } + public TerminalNode BITWISE_OR() { return getToken(CSharpParser.BITWISE_OR, 0); } + public TerminalNode CARET() { return getToken(CSharpParser.CARET, 0); } + public TerminalNode OP_LEFT_SHIFT() { return getToken(CSharpParser.OP_LEFT_SHIFT, 0); } + public Right_shiftContext right_shift() { + return getRuleContext(Right_shiftContext.class,0); + } + public TerminalNode OP_EQ() { return getToken(CSharpParser.OP_EQ, 0); } + public TerminalNode OP_NE() { return getToken(CSharpParser.OP_NE, 0); } + public TerminalNode GT() { return getToken(CSharpParser.GT, 0); } + public TerminalNode LT() { return getToken(CSharpParser.LT, 0); } + public TerminalNode OP_GE() { return getToken(CSharpParser.OP_GE, 0); } + public TerminalNode OP_LE() { return getToken(CSharpParser.OP_LE, 0); } + public Overloadable_operatorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_overloadable_operator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterOverloadable_operator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitOverloadable_operator(this); + } + } + + public final Overloadable_operatorContext overloadable_operator() throws RecognitionException { + Overloadable_operatorContext _localctx = new Overloadable_operatorContext(_ctx, getState()); + enterRule(_localctx, 306, RULE_overloadable_operator); + try { + setState(1965); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,231,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(1943); + match(PLUS); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(1944); + match(MINUS); + } + break; + case 3: + enterOuterAlt(_localctx, 3); + { + setState(1945); + match(BANG); + } + break; + case 4: + enterOuterAlt(_localctx, 4); + { + setState(1946); + match(TILDE); + } + break; + case 5: + enterOuterAlt(_localctx, 5); + { + setState(1947); + match(OP_INC); + } + break; + case 6: + enterOuterAlt(_localctx, 6); + { + setState(1948); + match(OP_DEC); + } + break; + case 7: + enterOuterAlt(_localctx, 7); + { + setState(1949); + match(TRUE); + } + break; + case 8: + enterOuterAlt(_localctx, 8); + { + setState(1950); + match(FALSE); + } + break; + case 9: + enterOuterAlt(_localctx, 9); + { + setState(1951); + match(STAR); + } + break; + case 10: + enterOuterAlt(_localctx, 10); + { + setState(1952); + match(DIV); + } + break; + case 11: + enterOuterAlt(_localctx, 11); + { + setState(1953); + match(PERCENT); + } + break; + case 12: + enterOuterAlt(_localctx, 12); + { + setState(1954); + match(AMP); + } + break; + case 13: + enterOuterAlt(_localctx, 13); + { + setState(1955); + match(BITWISE_OR); + } + break; + case 14: + enterOuterAlt(_localctx, 14); + { + setState(1956); + match(CARET); + } + break; + case 15: + enterOuterAlt(_localctx, 15); + { + setState(1957); + match(OP_LEFT_SHIFT); + } + break; + case 16: + enterOuterAlt(_localctx, 16); + { + setState(1958); + right_shift(); + } + break; + case 17: + enterOuterAlt(_localctx, 17); + { + setState(1959); + match(OP_EQ); + } + break; + case 18: + enterOuterAlt(_localctx, 18); + { + setState(1960); + match(OP_NE); + } + break; + case 19: + enterOuterAlt(_localctx, 19); + { + setState(1961); + match(GT); + } + break; + case 20: + enterOuterAlt(_localctx, 20); + { + setState(1962); + match(LT); + } + break; + case 21: + enterOuterAlt(_localctx, 21); + { + setState(1963); + match(OP_GE); + } + break; + case 22: + enterOuterAlt(_localctx, 22); + { + setState(1964); + match(OP_LE); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Conversion_operator_declaratorContext extends ParserRuleContext { + public TerminalNode OPERATOR() { return getToken(CSharpParser.OPERATOR, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public Arg_declarationContext arg_declaration() { + return getRuleContext(Arg_declarationContext.class,0); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public TerminalNode IMPLICIT() { return getToken(CSharpParser.IMPLICIT, 0); } + public TerminalNode EXPLICIT() { return getToken(CSharpParser.EXPLICIT, 0); } + public Conversion_operator_declaratorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_conversion_operator_declarator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterConversion_operator_declarator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitConversion_operator_declarator(this); + } + } + + public final Conversion_operator_declaratorContext conversion_operator_declarator() throws RecognitionException { + Conversion_operator_declaratorContext _localctx = new Conversion_operator_declaratorContext(_ctx, getState()); + enterRule(_localctx, 308, RULE_conversion_operator_declarator); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1967); + _la = _input.LA(1); + if ( !(_la==EXPLICIT || _la==IMPLICIT) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(1968); + match(OPERATOR); + setState(1969); + type_(); + setState(1970); + match(OPEN_PARENS); + setState(1971); + arg_declaration(); + setState(1972); + match(CLOSE_PARENS); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Constructor_initializerContext extends ParserRuleContext { + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public TerminalNode BASE() { return getToken(CSharpParser.BASE, 0); } + public TerminalNode THIS() { return getToken(CSharpParser.THIS, 0); } + public Argument_listContext argument_list() { + return getRuleContext(Argument_listContext.class,0); + } + public Constructor_initializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constructor_initializer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterConstructor_initializer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitConstructor_initializer(this); + } + } + + public final Constructor_initializerContext constructor_initializer() throws RecognitionException { + Constructor_initializerContext _localctx = new Constructor_initializerContext(_ctx, getState()); + enterRule(_localctx, 310, RULE_constructor_initializer); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1974); + match(COLON); + setState(1975); + _la = _input.LA(1); + if ( !(_la==BASE || _la==THIS) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(1976); + match(OPEN_PARENS); + setState(1978); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << IN) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (OUT - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (VOID - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)))) != 0)) { + { + setState(1977); + argument_list(); + } + } + + setState(1980); + match(CLOSE_PARENS); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BodyContext extends ParserRuleContext { + public BlockContext block() { + return getRuleContext(BlockContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public BodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_body; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterBody(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitBody(this); + } + } + + public final BodyContext body() throws RecognitionException { + BodyContext _localctx = new BodyContext(_ctx, getState()); + enterRule(_localctx, 312, RULE_body); + try { + setState(1984); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACE: + enterOuterAlt(_localctx, 1); + { + setState(1982); + block(); + } + break; + case SEMICOLON: + enterOuterAlt(_localctx, 2); + { + setState(1983); + match(SEMICOLON); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Struct_interfacesContext extends ParserRuleContext { + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public Interface_type_listContext interface_type_list() { + return getRuleContext(Interface_type_listContext.class,0); + } + public Struct_interfacesContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_struct_interfaces; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterStruct_interfaces(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitStruct_interfaces(this); + } + } + + public final Struct_interfacesContext struct_interfaces() throws RecognitionException { + Struct_interfacesContext _localctx = new Struct_interfacesContext(_ctx, getState()); + enterRule(_localctx, 314, RULE_struct_interfaces); + try { + enterOuterAlt(_localctx, 1); + { + setState(1986); + match(COLON); + setState(1987); + interface_type_list(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Struct_bodyContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public List struct_member_declaration() { + return getRuleContexts(Struct_member_declarationContext.class); + } + public Struct_member_declarationContext struct_member_declaration(int i) { + return getRuleContext(Struct_member_declarationContext.class,i); + } + public Struct_bodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_struct_body; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterStruct_body(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitStruct_body(this); + } + } + + public final Struct_bodyContext struct_body() throws RecognitionException { + Struct_bodyContext _localctx = new Struct_bodyContext(_ctx, getState()); + enterRule(_localctx, 316, RULE_struct_body); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1989); + match(OPEN_BRACE); + setState(1993); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 9)) & ~0x3f) == 0 && ((1L << (_la - 9)) & ((1L << (ABSTRACT - 9)) | (1L << (ADD - 9)) | (1L << (ALIAS - 9)) | (1L << (ARGLIST - 9)) | (1L << (ASCENDING - 9)) | (1L << (ASYNC - 9)) | (1L << (AWAIT - 9)) | (1L << (BOOL - 9)) | (1L << (BY - 9)) | (1L << (BYTE - 9)) | (1L << (CHAR - 9)) | (1L << (CLASS - 9)) | (1L << (CONST - 9)) | (1L << (DECIMAL - 9)) | (1L << (DELEGATE - 9)) | (1L << (DESCENDING - 9)) | (1L << (DOUBLE - 9)) | (1L << (DYNAMIC - 9)) | (1L << (ENUM - 9)) | (1L << (EQUALS - 9)) | (1L << (EVENT - 9)) | (1L << (EXPLICIT - 9)) | (1L << (EXTERN - 9)) | (1L << (FIXED - 9)) | (1L << (FLOAT - 9)) | (1L << (FROM - 9)) | (1L << (GET - 9)) | (1L << (GROUP - 9)) | (1L << (IMPLICIT - 9)) | (1L << (INT - 9)) | (1L << (INTERFACE - 9)) | (1L << (INTERNAL - 9)) | (1L << (INTO - 9)) | (1L << (JOIN - 9)) | (1L << (LET - 9)) | (1L << (LONG - 9)) | (1L << (NAMEOF - 9)) | (1L << (NEW - 9)) | (1L << (OBJECT - 9)) | (1L << (ON - 9)) | (1L << (ORDERBY - 9)))) != 0) || ((((_la - 73)) & ~0x3f) == 0 && ((1L << (_la - 73)) & ((1L << (OVERRIDE - 73)) | (1L << (PARTIAL - 73)) | (1L << (PRIVATE - 73)) | (1L << (PROTECTED - 73)) | (1L << (PUBLIC - 73)) | (1L << (READONLY - 73)) | (1L << (REF - 73)) | (1L << (REMOVE - 73)) | (1L << (SBYTE - 73)) | (1L << (SEALED - 73)) | (1L << (SELECT - 73)) | (1L << (SET - 73)) | (1L << (SHORT - 73)) | (1L << (STATIC - 73)) | (1L << (STRING - 73)) | (1L << (STRUCT - 73)) | (1L << (UINT - 73)) | (1L << (ULONG - 73)) | (1L << (UNMANAGED - 73)) | (1L << (UNSAFE - 73)) | (1L << (USHORT - 73)) | (1L << (VAR - 73)) | (1L << (VIRTUAL - 73)) | (1L << (VOID - 73)) | (1L << (VOLATILE - 73)) | (1L << (WHEN - 73)) | (1L << (WHERE - 73)) | (1L << (YIELD - 73)) | (1L << (IDENTIFIER - 73)) | (1L << (OPEN_BRACKET - 73)) | (1L << (OPEN_PARENS - 73)))) != 0)) { + { + { + setState(1990); + struct_member_declaration(); + } + } + setState(1995); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(1996); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Struct_member_declarationContext extends ParserRuleContext { + public Common_member_declarationContext common_member_declaration() { + return getRuleContext(Common_member_declarationContext.class,0); + } + public TerminalNode FIXED() { return getToken(CSharpParser.FIXED, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public All_member_modifiersContext all_member_modifiers() { + return getRuleContext(All_member_modifiersContext.class,0); + } + public List fixed_size_buffer_declarator() { + return getRuleContexts(Fixed_size_buffer_declaratorContext.class); + } + public Fixed_size_buffer_declaratorContext fixed_size_buffer_declarator(int i) { + return getRuleContext(Fixed_size_buffer_declaratorContext.class,i); + } + public Struct_member_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_struct_member_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterStruct_member_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitStruct_member_declaration(this); + } + } + + public final Struct_member_declarationContext struct_member_declaration() throws RecognitionException { + Struct_member_declarationContext _localctx = new Struct_member_declarationContext(_ctx, getState()); + enterRule(_localctx, 318, RULE_struct_member_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(1999); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(1998); + attributes(); + } + } + + setState(2002); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,236,_ctx) ) { + case 1: + { + setState(2001); + all_member_modifiers(); + } + break; + } + setState(2014); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BOOL: + case BY: + case BYTE: + case CHAR: + case CLASS: + case CONST: + case DECIMAL: + case DELEGATE: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case ENUM: + case EQUALS: + case EVENT: + case EXPLICIT: + case FLOAT: + case FROM: + case GET: + case GROUP: + case IMPLICIT: + case INT: + case INTERFACE: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case READONLY: + case REF: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case STRING: + case STRUCT: + case UINT: + case ULONG: + case UNMANAGED: + case USHORT: + case VAR: + case VOID: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case OPEN_PARENS: + { + setState(2004); + common_member_declaration(); + } + break; + case FIXED: + { + setState(2005); + match(FIXED); + setState(2006); + type_(); + setState(2008); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(2007); + fixed_size_buffer_declarator(); + } + } + setState(2010); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BY) | (1L << DESCENDING) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INTO) | (1L << JOIN) | (1L << LET))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REMOVE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (UNMANAGED - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)))) != 0) ); + setState(2012); + match(SEMICOLON); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Array_typeContext extends ParserRuleContext { + public Base_typeContext base_type() { + return getRuleContext(Base_typeContext.class,0); + } + public List rank_specifier() { + return getRuleContexts(Rank_specifierContext.class); + } + public Rank_specifierContext rank_specifier(int i) { + return getRuleContext(Rank_specifierContext.class,i); + } + public List STAR() { return getTokens(CSharpParser.STAR); } + public TerminalNode STAR(int i) { + return getToken(CSharpParser.STAR, i); + } + public List INTERR() { return getTokens(CSharpParser.INTERR); } + public TerminalNode INTERR(int i) { + return getToken(CSharpParser.INTERR, i); + } + public Array_typeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_array_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterArray_type(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitArray_type(this); + } + } + + public final Array_typeContext array_type() throws RecognitionException { + Array_typeContext _localctx = new Array_typeContext(_ctx, getState()); + enterRule(_localctx, 320, RULE_array_type); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2016); + base_type(); + setState(2024); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(2020); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==STAR || _la==INTERR) { + { + { + setState(2017); + _la = _input.LA(1); + if ( !(_la==STAR || _la==INTERR) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + setState(2022); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2023); + rank_specifier(); + } + } + setState(2026); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( ((((_la - 127)) & ~0x3f) == 0 && ((1L << (_la - 127)) & ((1L << (OPEN_BRACKET - 127)) | (1L << (STAR - 127)) | (1L << (INTERR - 127)))) != 0) ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Rank_specifierContext extends ParserRuleContext { + public TerminalNode OPEN_BRACKET() { return getToken(CSharpParser.OPEN_BRACKET, 0); } + public TerminalNode CLOSE_BRACKET() { return getToken(CSharpParser.CLOSE_BRACKET, 0); } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Rank_specifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_rank_specifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterRank_specifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitRank_specifier(this); + } + } + + public final Rank_specifierContext rank_specifier() throws RecognitionException { + Rank_specifierContext _localctx = new Rank_specifierContext(_ctx, getState()); + enterRule(_localctx, 322, RULE_rank_specifier); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2028); + match(OPEN_BRACKET); + setState(2032); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2029); + match(COMMA); + } + } + setState(2034); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2035); + match(CLOSE_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Array_initializerContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public List variable_initializer() { + return getRuleContexts(Variable_initializerContext.class); + } + public Variable_initializerContext variable_initializer(int i) { + return getRuleContext(Variable_initializerContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Array_initializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_array_initializer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterArray_initializer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitArray_initializer(this); + } + } + + public final Array_initializerContext array_initializer() throws RecognitionException { + Array_initializerContext _localctx = new Array_initializerContext(_ctx, getState()); + enterRule(_localctx, 324, RULE_array_initializer); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2037); + match(OPEN_BRACE); + setState(2049); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)) | (1L << (OPEN_BRACE - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)))) != 0)) { + { + setState(2038); + variable_initializer(); + setState(2043); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,242,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(2039); + match(COMMA); + setState(2040); + variable_initializer(); + } + } + } + setState(2045); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,242,_ctx); + } + setState(2047); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(2046); + match(COMMA); + } + } + + } + } + + setState(2051); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Variant_type_parameter_listContext extends ParserRuleContext { + public TerminalNode LT() { return getToken(CSharpParser.LT, 0); } + public List variant_type_parameter() { + return getRuleContexts(Variant_type_parameterContext.class); + } + public Variant_type_parameterContext variant_type_parameter(int i) { + return getRuleContext(Variant_type_parameterContext.class,i); + } + public TerminalNode GT() { return getToken(CSharpParser.GT, 0); } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Variant_type_parameter_listContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variant_type_parameter_list; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterVariant_type_parameter_list(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitVariant_type_parameter_list(this); + } + } + + public final Variant_type_parameter_listContext variant_type_parameter_list() throws RecognitionException { + Variant_type_parameter_listContext _localctx = new Variant_type_parameter_listContext(_ctx, getState()); + enterRule(_localctx, 326, RULE_variant_type_parameter_list); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2053); + match(LT); + setState(2054); + variant_type_parameter(); + setState(2059); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2055); + match(COMMA); + setState(2056); + variant_type_parameter(); + } + } + setState(2061); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2062); + match(GT); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Variant_type_parameterContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public Variance_annotationContext variance_annotation() { + return getRuleContext(Variance_annotationContext.class,0); + } + public Variant_type_parameterContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variant_type_parameter; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterVariant_type_parameter(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitVariant_type_parameter(this); + } + } + + public final Variant_type_parameterContext variant_type_parameter() throws RecognitionException { + Variant_type_parameterContext _localctx = new Variant_type_parameterContext(_ctx, getState()); + enterRule(_localctx, 328, RULE_variant_type_parameter); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2065); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(2064); + attributes(); + } + } + + setState(2068); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==IN || _la==OUT) { + { + setState(2067); + variance_annotation(); + } + } + + setState(2070); + identifier(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Variance_annotationContext extends ParserRuleContext { + public TerminalNode IN() { return getToken(CSharpParser.IN, 0); } + public TerminalNode OUT() { return getToken(CSharpParser.OUT, 0); } + public Variance_annotationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_variance_annotation; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterVariance_annotation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitVariance_annotation(this); + } + } + + public final Variance_annotationContext variance_annotation() throws RecognitionException { + Variance_annotationContext _localctx = new Variance_annotationContext(_ctx, getState()); + enterRule(_localctx, 330, RULE_variance_annotation); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2072); + _la = _input.LA(1); + if ( !(_la==IN || _la==OUT) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Interface_baseContext extends ParserRuleContext { + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public Interface_type_listContext interface_type_list() { + return getRuleContext(Interface_type_listContext.class,0); + } + public Interface_baseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interface_base; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterInterface_base(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitInterface_base(this); + } + } + + public final Interface_baseContext interface_base() throws RecognitionException { + Interface_baseContext _localctx = new Interface_baseContext(_ctx, getState()); + enterRule(_localctx, 332, RULE_interface_base); + try { + enterOuterAlt(_localctx, 1); + { + setState(2074); + match(COLON); + setState(2075); + interface_type_list(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Interface_bodyContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public List interface_member_declaration() { + return getRuleContexts(Interface_member_declarationContext.class); + } + public Interface_member_declarationContext interface_member_declaration(int i) { + return getRuleContext(Interface_member_declarationContext.class,i); + } + public Interface_bodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interface_body; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterInterface_body(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitInterface_body(this); + } + } + + public final Interface_bodyContext interface_body() throws RecognitionException { + Interface_bodyContext _localctx = new Interface_bodyContext(_ctx, getState()); + enterRule(_localctx, 334, RULE_interface_body); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2077); + match(OPEN_BRACE); + setState(2081); + _errHandler.sync(this); + _la = _input.LA(1); + while (((((_la - 10)) & ~0x3f) == 0 && ((1L << (_la - 10)) & ((1L << (ADD - 10)) | (1L << (ALIAS - 10)) | (1L << (ARGLIST - 10)) | (1L << (ASCENDING - 10)) | (1L << (ASYNC - 10)) | (1L << (AWAIT - 10)) | (1L << (BOOL - 10)) | (1L << (BY - 10)) | (1L << (BYTE - 10)) | (1L << (CHAR - 10)) | (1L << (DECIMAL - 10)) | (1L << (DESCENDING - 10)) | (1L << (DOUBLE - 10)) | (1L << (DYNAMIC - 10)) | (1L << (EQUALS - 10)) | (1L << (EVENT - 10)) | (1L << (FLOAT - 10)) | (1L << (FROM - 10)) | (1L << (GET - 10)) | (1L << (GROUP - 10)) | (1L << (INT - 10)) | (1L << (INTO - 10)) | (1L << (JOIN - 10)) | (1L << (LET - 10)) | (1L << (LONG - 10)) | (1L << (NAMEOF - 10)) | (1L << (NEW - 10)) | (1L << (OBJECT - 10)) | (1L << (ON - 10)) | (1L << (ORDERBY - 10)))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (PARTIAL - 75)) | (1L << (READONLY - 75)) | (1L << (REF - 75)) | (1L << (REMOVE - 75)) | (1L << (SBYTE - 75)) | (1L << (SELECT - 75)) | (1L << (SET - 75)) | (1L << (SHORT - 75)) | (1L << (STRING - 75)) | (1L << (UINT - 75)) | (1L << (ULONG - 75)) | (1L << (UNMANAGED - 75)) | (1L << (UNSAFE - 75)) | (1L << (USHORT - 75)) | (1L << (VAR - 75)) | (1L << (VOID - 75)) | (1L << (WHEN - 75)) | (1L << (WHERE - 75)) | (1L << (YIELD - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (OPEN_BRACKET - 75)) | (1L << (OPEN_PARENS - 75)))) != 0)) { + { + { + setState(2078); + interface_member_declaration(); + } + } + setState(2083); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2084); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Interface_member_declarationContext extends ParserRuleContext { + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public TerminalNode VOID() { return getToken(CSharpParser.VOID, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public TerminalNode EVENT() { return getToken(CSharpParser.EVENT, 0); } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public TerminalNode NEW() { return getToken(CSharpParser.NEW, 0); } + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public Interface_accessorsContext interface_accessors() { + return getRuleContext(Interface_accessorsContext.class,0); + } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public TerminalNode THIS() { return getToken(CSharpParser.THIS, 0); } + public TerminalNode OPEN_BRACKET() { return getToken(CSharpParser.OPEN_BRACKET, 0); } + public Formal_parameter_listContext formal_parameter_list() { + return getRuleContext(Formal_parameter_listContext.class,0); + } + public TerminalNode CLOSE_BRACKET() { return getToken(CSharpParser.CLOSE_BRACKET, 0); } + public TerminalNode UNSAFE() { return getToken(CSharpParser.UNSAFE, 0); } + public TerminalNode REF() { return getToken(CSharpParser.REF, 0); } + public TerminalNode READONLY() { return getToken(CSharpParser.READONLY, 0); } + public Type_parameter_listContext type_parameter_list() { + return getRuleContext(Type_parameter_listContext.class,0); + } + public Type_parameter_constraints_clausesContext type_parameter_constraints_clauses() { + return getRuleContext(Type_parameter_constraints_clausesContext.class,0); + } + public Interface_member_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interface_member_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterInterface_member_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitInterface_member_declaration(this); + } + } + + public final Interface_member_declarationContext interface_member_declaration() throws RecognitionException { + Interface_member_declarationContext _localctx = new Interface_member_declarationContext(_ctx, getState()); + enterRule(_localctx, 336, RULE_interface_member_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2087); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(2086); + attributes(); + } + } + + setState(2090); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==NEW) { + { + setState(2089); + match(NEW); + } + } + + setState(2155); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,261,_ctx) ) { + case 1: + { + setState(2093); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==UNSAFE) { + { + setState(2092); + match(UNSAFE); + } + } + + setState(2100); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,252,_ctx) ) { + case 1: + { + setState(2095); + match(REF); + } + break; + case 2: + { + setState(2096); + match(REF); + setState(2097); + match(READONLY); + } + break; + case 3: + { + setState(2098); + match(READONLY); + setState(2099); + match(REF); + } + break; + } + setState(2102); + type_(); + setState(2130); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,256,_ctx) ) { + case 1: + { + setState(2103); + identifier(); + setState(2105); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LT) { + { + setState(2104); + type_parameter_list(); + } + } + + setState(2107); + match(OPEN_PARENS); + setState(2109); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 10)) & ~0x3f) == 0 && ((1L << (_la - 10)) & ((1L << (ADD - 10)) | (1L << (ALIAS - 10)) | (1L << (ARGLIST - 10)) | (1L << (ASCENDING - 10)) | (1L << (ASYNC - 10)) | (1L << (AWAIT - 10)) | (1L << (BOOL - 10)) | (1L << (BY - 10)) | (1L << (BYTE - 10)) | (1L << (CHAR - 10)) | (1L << (DECIMAL - 10)) | (1L << (DESCENDING - 10)) | (1L << (DOUBLE - 10)) | (1L << (DYNAMIC - 10)) | (1L << (EQUALS - 10)) | (1L << (FLOAT - 10)) | (1L << (FROM - 10)) | (1L << (GET - 10)) | (1L << (GROUP - 10)) | (1L << (IN - 10)) | (1L << (INT - 10)) | (1L << (INTO - 10)) | (1L << (JOIN - 10)) | (1L << (LET - 10)) | (1L << (LONG - 10)) | (1L << (NAMEOF - 10)) | (1L << (OBJECT - 10)) | (1L << (ON - 10)) | (1L << (ORDERBY - 10)) | (1L << (OUT - 10)))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (PARAMS - 74)) | (1L << (PARTIAL - 74)) | (1L << (REF - 74)) | (1L << (REMOVE - 74)) | (1L << (SBYTE - 74)) | (1L << (SELECT - 74)) | (1L << (SET - 74)) | (1L << (SHORT - 74)) | (1L << (STRING - 74)) | (1L << (THIS - 74)) | (1L << (UINT - 74)) | (1L << (ULONG - 74)) | (1L << (UNMANAGED - 74)) | (1L << (USHORT - 74)) | (1L << (VAR - 74)) | (1L << (VOID - 74)) | (1L << (WHEN - 74)) | (1L << (WHERE - 74)) | (1L << (YIELD - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (OPEN_BRACKET - 74)) | (1L << (OPEN_PARENS - 74)))) != 0)) { + { + setState(2108); + formal_parameter_list(); + } + } + + setState(2111); + match(CLOSE_PARENS); + setState(2113); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHERE) { + { + setState(2112); + type_parameter_constraints_clauses(); + } + } + + setState(2115); + match(SEMICOLON); + } + break; + case 2: + { + setState(2117); + identifier(); + setState(2118); + match(OPEN_BRACE); + setState(2119); + interface_accessors(); + setState(2120); + match(CLOSE_BRACE); + } + break; + case 3: + { + setState(2122); + match(THIS); + setState(2123); + match(OPEN_BRACKET); + setState(2124); + formal_parameter_list(); + setState(2125); + match(CLOSE_BRACKET); + setState(2126); + match(OPEN_BRACE); + setState(2127); + interface_accessors(); + setState(2128); + match(CLOSE_BRACE); + } + break; + } + } + break; + case 2: + { + setState(2133); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==UNSAFE) { + { + setState(2132); + match(UNSAFE); + } + } + + setState(2135); + match(VOID); + setState(2136); + identifier(); + setState(2138); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LT) { + { + setState(2137); + type_parameter_list(); + } + } + + setState(2140); + match(OPEN_PARENS); + setState(2142); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 10)) & ~0x3f) == 0 && ((1L << (_la - 10)) & ((1L << (ADD - 10)) | (1L << (ALIAS - 10)) | (1L << (ARGLIST - 10)) | (1L << (ASCENDING - 10)) | (1L << (ASYNC - 10)) | (1L << (AWAIT - 10)) | (1L << (BOOL - 10)) | (1L << (BY - 10)) | (1L << (BYTE - 10)) | (1L << (CHAR - 10)) | (1L << (DECIMAL - 10)) | (1L << (DESCENDING - 10)) | (1L << (DOUBLE - 10)) | (1L << (DYNAMIC - 10)) | (1L << (EQUALS - 10)) | (1L << (FLOAT - 10)) | (1L << (FROM - 10)) | (1L << (GET - 10)) | (1L << (GROUP - 10)) | (1L << (IN - 10)) | (1L << (INT - 10)) | (1L << (INTO - 10)) | (1L << (JOIN - 10)) | (1L << (LET - 10)) | (1L << (LONG - 10)) | (1L << (NAMEOF - 10)) | (1L << (OBJECT - 10)) | (1L << (ON - 10)) | (1L << (ORDERBY - 10)) | (1L << (OUT - 10)))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (PARAMS - 74)) | (1L << (PARTIAL - 74)) | (1L << (REF - 74)) | (1L << (REMOVE - 74)) | (1L << (SBYTE - 74)) | (1L << (SELECT - 74)) | (1L << (SET - 74)) | (1L << (SHORT - 74)) | (1L << (STRING - 74)) | (1L << (THIS - 74)) | (1L << (UINT - 74)) | (1L << (ULONG - 74)) | (1L << (UNMANAGED - 74)) | (1L << (USHORT - 74)) | (1L << (VAR - 74)) | (1L << (VOID - 74)) | (1L << (WHEN - 74)) | (1L << (WHERE - 74)) | (1L << (YIELD - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (OPEN_BRACKET - 74)) | (1L << (OPEN_PARENS - 74)))) != 0)) { + { + setState(2141); + formal_parameter_list(); + } + } + + setState(2144); + match(CLOSE_PARENS); + setState(2146); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHERE) { + { + setState(2145); + type_parameter_constraints_clauses(); + } + } + + setState(2148); + match(SEMICOLON); + } + break; + case 3: + { + setState(2150); + match(EVENT); + setState(2151); + type_(); + setState(2152); + identifier(); + setState(2153); + match(SEMICOLON); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Interface_accessorsContext extends ParserRuleContext { + public TerminalNode GET() { return getToken(CSharpParser.GET, 0); } + public List SEMICOLON() { return getTokens(CSharpParser.SEMICOLON); } + public TerminalNode SEMICOLON(int i) { + return getToken(CSharpParser.SEMICOLON, i); + } + public TerminalNode SET() { return getToken(CSharpParser.SET, 0); } + public List attributes() { + return getRuleContexts(AttributesContext.class); + } + public AttributesContext attributes(int i) { + return getRuleContext(AttributesContext.class,i); + } + public Interface_accessorsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interface_accessors; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterInterface_accessors(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitInterface_accessors(this); + } + } + + public final Interface_accessorsContext interface_accessors() throws RecognitionException { + Interface_accessorsContext _localctx = new Interface_accessorsContext(_ctx, getState()); + enterRule(_localctx, 338, RULE_interface_accessors); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2158); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(2157); + attributes(); + } + } + + setState(2178); + _errHandler.sync(this); + switch (_input.LA(1)) { + case GET: + { + setState(2160); + match(GET); + setState(2161); + match(SEMICOLON); + setState(2167); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==SET || _la==OPEN_BRACKET) { + { + setState(2163); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(2162); + attributes(); + } + } + + setState(2165); + match(SET); + setState(2166); + match(SEMICOLON); + } + } + + } + break; + case SET: + { + setState(2169); + match(SET); + setState(2170); + match(SEMICOLON); + setState(2176); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==GET || _la==OPEN_BRACKET) { + { + setState(2172); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(2171); + attributes(); + } + } + + setState(2174); + match(GET); + setState(2175); + match(SEMICOLON); + } + } + + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Enum_baseContext extends ParserRuleContext { + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public Enum_baseContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_enum_base; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterEnum_base(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitEnum_base(this); + } + } + + public final Enum_baseContext enum_base() throws RecognitionException { + Enum_baseContext _localctx = new Enum_baseContext(_ctx, getState()); + enterRule(_localctx, 340, RULE_enum_base); + try { + enterOuterAlt(_localctx, 1); + { + setState(2180); + match(COLON); + setState(2181); + type_(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Enum_bodyContext extends ParserRuleContext { + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public List enum_member_declaration() { + return getRuleContexts(Enum_member_declarationContext.class); + } + public Enum_member_declarationContext enum_member_declaration(int i) { + return getRuleContext(Enum_member_declarationContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Enum_bodyContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_enum_body; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterEnum_body(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitEnum_body(this); + } + } + + public final Enum_bodyContext enum_body() throws RecognitionException { + Enum_bodyContext _localctx = new Enum_bodyContext(_ctx, getState()); + enterRule(_localctx, 342, RULE_enum_body); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2183); + match(OPEN_BRACE); + setState(2195); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BY) | (1L << DESCENDING) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INTO) | (1L << JOIN) | (1L << LET))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REMOVE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (UNMANAGED - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (OPEN_BRACKET - 64)))) != 0)) { + { + setState(2184); + enum_member_declaration(); + setState(2189); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,268,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(2185); + match(COMMA); + setState(2186); + enum_member_declaration(); + } + } + } + setState(2191); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,268,_ctx); + } + setState(2193); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(2192); + match(COMMA); + } + } + + } + } + + setState(2197); + match(CLOSE_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Enum_member_declarationContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public AttributesContext attributes() { + return getRuleContext(AttributesContext.class,0); + } + public TerminalNode ASSIGNMENT() { return getToken(CSharpParser.ASSIGNMENT, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Enum_member_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_enum_member_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterEnum_member_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitEnum_member_declaration(this); + } + } + + public final Enum_member_declarationContext enum_member_declaration() throws RecognitionException { + Enum_member_declarationContext _localctx = new Enum_member_declarationContext(_ctx, getState()); + enterRule(_localctx, 344, RULE_enum_member_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2200); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACKET) { + { + setState(2199); + attributes(); + } + } + + setState(2202); + identifier(); + setState(2205); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ASSIGNMENT) { + { + setState(2203); + match(ASSIGNMENT); + setState(2204); + expression(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Global_attribute_sectionContext extends ParserRuleContext { + public TerminalNode OPEN_BRACKET() { return getToken(CSharpParser.OPEN_BRACKET, 0); } + public Global_attribute_targetContext global_attribute_target() { + return getRuleContext(Global_attribute_targetContext.class,0); + } + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public Attribute_listContext attribute_list() { + return getRuleContext(Attribute_listContext.class,0); + } + public TerminalNode CLOSE_BRACKET() { return getToken(CSharpParser.CLOSE_BRACKET, 0); } + public TerminalNode COMMA() { return getToken(CSharpParser.COMMA, 0); } + public Global_attribute_sectionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_global_attribute_section; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterGlobal_attribute_section(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitGlobal_attribute_section(this); + } + } + + public final Global_attribute_sectionContext global_attribute_section() throws RecognitionException { + Global_attribute_sectionContext _localctx = new Global_attribute_sectionContext(_ctx, getState()); + enterRule(_localctx, 346, RULE_global_attribute_section); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2207); + match(OPEN_BRACKET); + setState(2208); + global_attribute_target(); + setState(2209); + match(COLON); + setState(2210); + attribute_list(); + setState(2212); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(2211); + match(COMMA); + } + } + + setState(2214); + match(CLOSE_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Global_attribute_targetContext extends ParserRuleContext { + public KeywordContext keyword() { + return getRuleContext(KeywordContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public Global_attribute_targetContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_global_attribute_target; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterGlobal_attribute_target(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitGlobal_attribute_target(this); + } + } + + public final Global_attribute_targetContext global_attribute_target() throws RecognitionException { + Global_attribute_targetContext _localctx = new Global_attribute_targetContext(_ctx, getState()); + enterRule(_localctx, 348, RULE_global_attribute_target); + try { + setState(2218); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,274,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(2216); + keyword(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(2217); + identifier(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AttributesContext extends ParserRuleContext { + public List attribute_section() { + return getRuleContexts(Attribute_sectionContext.class); + } + public Attribute_sectionContext attribute_section(int i) { + return getRuleContext(Attribute_sectionContext.class,i); + } + public AttributesContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_attributes; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAttributes(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAttributes(this); + } + } + + public final AttributesContext attributes() throws RecognitionException { + AttributesContext _localctx = new AttributesContext(_ctx, getState()); + enterRule(_localctx, 350, RULE_attributes); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2221); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(2220); + attribute_section(); + } + } + setState(2223); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==OPEN_BRACKET ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Attribute_sectionContext extends ParserRuleContext { + public TerminalNode OPEN_BRACKET() { return getToken(CSharpParser.OPEN_BRACKET, 0); } + public Attribute_listContext attribute_list() { + return getRuleContext(Attribute_listContext.class,0); + } + public TerminalNode CLOSE_BRACKET() { return getToken(CSharpParser.CLOSE_BRACKET, 0); } + public Attribute_targetContext attribute_target() { + return getRuleContext(Attribute_targetContext.class,0); + } + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public TerminalNode COMMA() { return getToken(CSharpParser.COMMA, 0); } + public Attribute_sectionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_attribute_section; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAttribute_section(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAttribute_section(this); + } + } + + public final Attribute_sectionContext attribute_section() throws RecognitionException { + Attribute_sectionContext _localctx = new Attribute_sectionContext(_ctx, getState()); + enterRule(_localctx, 352, RULE_attribute_section); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2225); + match(OPEN_BRACKET); + setState(2229); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,276,_ctx) ) { + case 1: + { + setState(2226); + attribute_target(); + setState(2227); + match(COLON); + } + break; + } + setState(2231); + attribute_list(); + setState(2233); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(2232); + match(COMMA); + } + } + + setState(2235); + match(CLOSE_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Attribute_targetContext extends ParserRuleContext { + public KeywordContext keyword() { + return getRuleContext(KeywordContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public Attribute_targetContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_attribute_target; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAttribute_target(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAttribute_target(this); + } + } + + public final Attribute_targetContext attribute_target() throws RecognitionException { + Attribute_targetContext _localctx = new Attribute_targetContext(_ctx, getState()); + enterRule(_localctx, 354, RULE_attribute_target); + try { + setState(2239); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,278,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(2237); + keyword(); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(2238); + identifier(); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Attribute_listContext extends ParserRuleContext { + public List attribute() { + return getRuleContexts(AttributeContext.class); + } + public AttributeContext attribute(int i) { + return getRuleContext(AttributeContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Attribute_listContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_attribute_list; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAttribute_list(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAttribute_list(this); + } + } + + public final Attribute_listContext attribute_list() throws RecognitionException { + Attribute_listContext _localctx = new Attribute_listContext(_ctx, getState()); + enterRule(_localctx, 356, RULE_attribute_list); + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2241); + attribute(); + setState(2246); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,279,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(2242); + match(COMMA); + setState(2243); + attribute(); + } + } + } + setState(2248); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,279,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AttributeContext extends ParserRuleContext { + public Namespace_or_type_nameContext namespace_or_type_name() { + return getRuleContext(Namespace_or_type_nameContext.class,0); + } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public List attribute_argument() { + return getRuleContexts(Attribute_argumentContext.class); + } + public Attribute_argumentContext attribute_argument(int i) { + return getRuleContext(Attribute_argumentContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public AttributeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_attribute; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAttribute(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAttribute(this); + } + } + + public final AttributeContext attribute() throws RecognitionException { + AttributeContext _localctx = new AttributeContext(_ctx, getState()); + enterRule(_localctx, 358, RULE_attribute); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2249); + namespace_or_type_name(); + setState(2262); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_PARENS) { + { + setState(2250); + match(OPEN_PARENS); + setState(2259); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)))) != 0)) { + { + setState(2251); + attribute_argument(); + setState(2256); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2252); + match(COMMA); + setState(2253); + attribute_argument(); + } + } + setState(2258); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + + setState(2261); + match(CLOSE_PARENS); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Attribute_argumentContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public Attribute_argumentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_attribute_argument; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterAttribute_argument(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitAttribute_argument(this); + } + } + + public final Attribute_argumentContext attribute_argument() throws RecognitionException { + Attribute_argumentContext _localctx = new Attribute_argumentContext(_ctx, getState()); + enterRule(_localctx, 360, RULE_attribute_argument); + try { + enterOuterAlt(_localctx, 1); + { + setState(2267); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,283,_ctx) ) { + case 1: + { + setState(2264); + identifier(); + setState(2265); + match(COLON); + } + break; + } + setState(2269); + expression(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Pointer_typeContext extends ParserRuleContext { + public TerminalNode STAR() { return getToken(CSharpParser.STAR, 0); } + public Simple_typeContext simple_type() { + return getRuleContext(Simple_typeContext.class,0); + } + public Class_typeContext class_type() { + return getRuleContext(Class_typeContext.class,0); + } + public List rank_specifier() { + return getRuleContexts(Rank_specifierContext.class); + } + public Rank_specifierContext rank_specifier(int i) { + return getRuleContext(Rank_specifierContext.class,i); + } + public List INTERR() { return getTokens(CSharpParser.INTERR); } + public TerminalNode INTERR(int i) { + return getToken(CSharpParser.INTERR, i); + } + public TerminalNode VOID() { return getToken(CSharpParser.VOID, 0); } + public Pointer_typeContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_pointer_type; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterPointer_type(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitPointer_type(this); + } + } + + public final Pointer_typeContext pointer_type() throws RecognitionException { + Pointer_typeContext _localctx = new Pointer_typeContext(_ctx, getState()); + enterRule(_localctx, 362, RULE_pointer_type); + int _la; + try { + setState(2286); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BOOL: + case BY: + case BYTE: + case CHAR: + case DECIMAL: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FLOAT: + case FROM: + case GET: + case GROUP: + case INT: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case STRING: + case UINT: + case ULONG: + case UNMANAGED: + case USHORT: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + enterOuterAlt(_localctx, 1); + { + setState(2273); + _errHandler.sync(this); + switch (_input.LA(1)) { + case BOOL: + case BYTE: + case CHAR: + case DECIMAL: + case DOUBLE: + case FLOAT: + case INT: + case LONG: + case SBYTE: + case SHORT: + case UINT: + case ULONG: + case USHORT: + { + setState(2271); + simple_type(); + } + break; + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BY: + case DESCENDING: + case DYNAMIC: + case EQUALS: + case FROM: + case GET: + case GROUP: + case INTO: + case JOIN: + case LET: + case NAMEOF: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REMOVE: + case SELECT: + case SET: + case STRING: + case UNMANAGED: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + { + setState(2272); + class_type(); + } + break; + default: + throw new NoViableAltException(this); + } + setState(2279); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==OPEN_BRACKET || _la==INTERR) { + { + setState(2277); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACKET: + { + setState(2275); + rank_specifier(); + } + break; + case INTERR: + { + setState(2276); + match(INTERR); + } + break; + default: + throw new NoViableAltException(this); + } + } + setState(2281); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2282); + match(STAR); + } + break; + case VOID: + enterOuterAlt(_localctx, 2); + { + setState(2284); + match(VOID); + setState(2285); + match(STAR); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Fixed_pointer_declaratorsContext extends ParserRuleContext { + public List fixed_pointer_declarator() { + return getRuleContexts(Fixed_pointer_declaratorContext.class); + } + public Fixed_pointer_declaratorContext fixed_pointer_declarator(int i) { + return getRuleContext(Fixed_pointer_declaratorContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Fixed_pointer_declaratorsContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fixed_pointer_declarators; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterFixed_pointer_declarators(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitFixed_pointer_declarators(this); + } + } + + public final Fixed_pointer_declaratorsContext fixed_pointer_declarators() throws RecognitionException { + Fixed_pointer_declaratorsContext _localctx = new Fixed_pointer_declaratorsContext(_ctx, getState()); + enterRule(_localctx, 364, RULE_fixed_pointer_declarators); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2288); + fixed_pointer_declarator(); + setState(2293); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2289); + match(COMMA); + setState(2290); + fixed_pointer_declarator(); + } + } + setState(2295); + _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 Fixed_pointer_declaratorContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode ASSIGNMENT() { return getToken(CSharpParser.ASSIGNMENT, 0); } + public Fixed_pointer_initializerContext fixed_pointer_initializer() { + return getRuleContext(Fixed_pointer_initializerContext.class,0); + } + public Fixed_pointer_declaratorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fixed_pointer_declarator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterFixed_pointer_declarator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitFixed_pointer_declarator(this); + } + } + + public final Fixed_pointer_declaratorContext fixed_pointer_declarator() throws RecognitionException { + Fixed_pointer_declaratorContext _localctx = new Fixed_pointer_declaratorContext(_ctx, getState()); + enterRule(_localctx, 366, RULE_fixed_pointer_declarator); + try { + enterOuterAlt(_localctx, 1); + { + setState(2296); + identifier(); + setState(2297); + match(ASSIGNMENT); + setState(2298); + fixed_pointer_initializer(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Fixed_pointer_initializerContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode AMP() { return getToken(CSharpParser.AMP, 0); } + public Stackalloc_initializerContext stackalloc_initializer() { + return getRuleContext(Stackalloc_initializerContext.class,0); + } + public Fixed_pointer_initializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fixed_pointer_initializer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterFixed_pointer_initializer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitFixed_pointer_initializer(this); + } + } + + public final Fixed_pointer_initializerContext fixed_pointer_initializer() throws RecognitionException { + Fixed_pointer_initializerContext _localctx = new Fixed_pointer_initializerContext(_ctx, getState()); + enterRule(_localctx, 368, RULE_fixed_pointer_initializer); + try { + setState(2305); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BASE: + case BOOL: + case BY: + case BYTE: + case CHAR: + case CHECKED: + case DECIMAL: + case DEFAULT: + case DELEGATE: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FALSE: + case FLOAT: + case FROM: + case GET: + case GROUP: + case INT: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case NEW: + case NULL_: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REF: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case SIZEOF: + case STRING: + case THIS: + case TRUE: + case TYPEOF: + case UINT: + case ULONG: + case UNCHECKED: + case UNMANAGED: + case USHORT: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case LITERAL_ACCESS: + case INTEGER_LITERAL: + case HEX_INTEGER_LITERAL: + case BIN_INTEGER_LITERAL: + case REAL_LITERAL: + case CHARACTER_LITERAL: + case REGULAR_STRING: + case VERBATIUM_STRING: + case INTERPOLATED_REGULAR_STRING_START: + case INTERPOLATED_VERBATIUM_STRING_START: + case OPEN_PARENS: + case PLUS: + case MINUS: + case STAR: + case AMP: + case CARET: + case BANG: + case TILDE: + case OP_INC: + case OP_DEC: + case OP_RANGE: + enterOuterAlt(_localctx, 1); + { + setState(2301); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,289,_ctx) ) { + case 1: + { + setState(2300); + match(AMP); + } + break; + } + setState(2303); + expression(); + } + break; + case STACKALLOC: + enterOuterAlt(_localctx, 2); + { + setState(2304); + stackalloc_initializer(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Fixed_size_buffer_declaratorContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode OPEN_BRACKET() { return getToken(CSharpParser.OPEN_BRACKET, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TerminalNode CLOSE_BRACKET() { return getToken(CSharpParser.CLOSE_BRACKET, 0); } + public Fixed_size_buffer_declaratorContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_fixed_size_buffer_declarator; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterFixed_size_buffer_declarator(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitFixed_size_buffer_declarator(this); + } + } + + public final Fixed_size_buffer_declaratorContext fixed_size_buffer_declarator() throws RecognitionException { + Fixed_size_buffer_declaratorContext _localctx = new Fixed_size_buffer_declaratorContext(_ctx, getState()); + enterRule(_localctx, 370, RULE_fixed_size_buffer_declarator); + try { + enterOuterAlt(_localctx, 1); + { + setState(2307); + identifier(); + setState(2308); + match(OPEN_BRACKET); + setState(2309); + expression(); + setState(2310); + match(CLOSE_BRACKET); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Stackalloc_initializerContext extends ParserRuleContext { + public TerminalNode STACKALLOC() { return getToken(CSharpParser.STACKALLOC, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public TerminalNode OPEN_BRACKET() { return getToken(CSharpParser.OPEN_BRACKET, 0); } + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode CLOSE_BRACKET() { return getToken(CSharpParser.CLOSE_BRACKET, 0); } + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public Stackalloc_initializerContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_stackalloc_initializer; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterStackalloc_initializer(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitStackalloc_initializer(this); + } + } + + public final Stackalloc_initializerContext stackalloc_initializer() throws RecognitionException { + Stackalloc_initializerContext _localctx = new Stackalloc_initializerContext(_ctx, getState()); + enterRule(_localctx, 372, RULE_stackalloc_initializer); + int _la; + try { + int _alt; + setState(2341); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,295,_ctx) ) { + case 1: + enterOuterAlt(_localctx, 1); + { + setState(2312); + match(STACKALLOC); + setState(2313); + type_(); + setState(2314); + match(OPEN_BRACKET); + setState(2315); + expression(); + setState(2316); + match(CLOSE_BRACKET); + } + break; + case 2: + enterOuterAlt(_localctx, 2); + { + setState(2318); + match(STACKALLOC); + setState(2320); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 10)) & ~0x3f) == 0 && ((1L << (_la - 10)) & ((1L << (ADD - 10)) | (1L << (ALIAS - 10)) | (1L << (ARGLIST - 10)) | (1L << (ASCENDING - 10)) | (1L << (ASYNC - 10)) | (1L << (AWAIT - 10)) | (1L << (BOOL - 10)) | (1L << (BY - 10)) | (1L << (BYTE - 10)) | (1L << (CHAR - 10)) | (1L << (DECIMAL - 10)) | (1L << (DESCENDING - 10)) | (1L << (DOUBLE - 10)) | (1L << (DYNAMIC - 10)) | (1L << (EQUALS - 10)) | (1L << (FLOAT - 10)) | (1L << (FROM - 10)) | (1L << (GET - 10)) | (1L << (GROUP - 10)) | (1L << (INT - 10)) | (1L << (INTO - 10)) | (1L << (JOIN - 10)) | (1L << (LET - 10)) | (1L << (LONG - 10)) | (1L << (NAMEOF - 10)) | (1L << (OBJECT - 10)) | (1L << (ON - 10)) | (1L << (ORDERBY - 10)))) != 0) || ((((_la - 75)) & ~0x3f) == 0 && ((1L << (_la - 75)) & ((1L << (PARTIAL - 75)) | (1L << (REMOVE - 75)) | (1L << (SBYTE - 75)) | (1L << (SELECT - 75)) | (1L << (SET - 75)) | (1L << (SHORT - 75)) | (1L << (STRING - 75)) | (1L << (UINT - 75)) | (1L << (ULONG - 75)) | (1L << (UNMANAGED - 75)) | (1L << (USHORT - 75)) | (1L << (VAR - 75)) | (1L << (VOID - 75)) | (1L << (WHEN - 75)) | (1L << (WHERE - 75)) | (1L << (YIELD - 75)) | (1L << (IDENTIFIER - 75)) | (1L << (OPEN_PARENS - 75)))) != 0)) { + { + setState(2319); + type_(); + } + } + + setState(2322); + match(OPEN_BRACKET); + setState(2324); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)))) != 0)) { + { + setState(2323); + expression(); + } + } + + setState(2326); + match(CLOSE_BRACKET); + setState(2327); + match(OPEN_BRACE); + setState(2328); + expression(); + setState(2333); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,293,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(2329); + match(COMMA); + setState(2330); + expression(); + } + } + } + setState(2335); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,293,_ctx); + } + setState(2337); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(2336); + match(COMMA); + } + } + + setState(2339); + match(CLOSE_BRACE); + } + break; + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Right_arrowContext extends ParserRuleContext { + public Token first; + public Token second; + public TerminalNode ASSIGNMENT() { return getToken(CSharpParser.ASSIGNMENT, 0); } + public TerminalNode GT() { return getToken(CSharpParser.GT, 0); } + public Right_arrowContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_right_arrow; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterRight_arrow(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitRight_arrow(this); + } + } + + public final Right_arrowContext right_arrow() throws RecognitionException { + Right_arrowContext _localctx = new Right_arrowContext(_ctx, getState()); + enterRule(_localctx, 374, RULE_right_arrow); + try { + enterOuterAlt(_localctx, 1); + { + setState(2343); + ((Right_arrowContext)_localctx).first = match(ASSIGNMENT); + setState(2344); + ((Right_arrowContext)_localctx).second = match(GT); + setState(2345); + if (!((((Right_arrowContext)_localctx).first!=null?((Right_arrowContext)_localctx).first.getTokenIndex():0) + 1 == (((Right_arrowContext)_localctx).second!=null?((Right_arrowContext)_localctx).second.getTokenIndex():0))) throw new FailedPredicateException(this, "$first.index + 1 == $second.index"); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Right_shiftContext extends ParserRuleContext { + public Token first; + public Token second; + public List GT() { return getTokens(CSharpParser.GT); } + public TerminalNode GT(int i) { + return getToken(CSharpParser.GT, i); + } + public Right_shiftContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_right_shift; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterRight_shift(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitRight_shift(this); + } + } + + public final Right_shiftContext right_shift() throws RecognitionException { + Right_shiftContext _localctx = new Right_shiftContext(_ctx, getState()); + enterRule(_localctx, 376, RULE_right_shift); + try { + enterOuterAlt(_localctx, 1); + { + setState(2347); + ((Right_shiftContext)_localctx).first = match(GT); + setState(2348); + ((Right_shiftContext)_localctx).second = match(GT); + setState(2349); + if (!((((Right_shiftContext)_localctx).first!=null?((Right_shiftContext)_localctx).first.getTokenIndex():0) + 1 == (((Right_shiftContext)_localctx).second!=null?((Right_shiftContext)_localctx).second.getTokenIndex():0))) throw new FailedPredicateException(this, "$first.index + 1 == $second.index"); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Right_shift_assignmentContext extends ParserRuleContext { + public Token first; + public Token second; + public TerminalNode GT() { return getToken(CSharpParser.GT, 0); } + public TerminalNode OP_GE() { return getToken(CSharpParser.OP_GE, 0); } + public Right_shift_assignmentContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_right_shift_assignment; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterRight_shift_assignment(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitRight_shift_assignment(this); + } + } + + public final Right_shift_assignmentContext right_shift_assignment() throws RecognitionException { + Right_shift_assignmentContext _localctx = new Right_shift_assignmentContext(_ctx, getState()); + enterRule(_localctx, 378, RULE_right_shift_assignment); + try { + enterOuterAlt(_localctx, 1); + { + setState(2351); + ((Right_shift_assignmentContext)_localctx).first = match(GT); + setState(2352); + ((Right_shift_assignmentContext)_localctx).second = match(OP_GE); + setState(2353); + if (!((((Right_shift_assignmentContext)_localctx).first!=null?((Right_shift_assignmentContext)_localctx).first.getTokenIndex():0) + 1 == (((Right_shift_assignmentContext)_localctx).second!=null?((Right_shift_assignmentContext)_localctx).second.getTokenIndex():0))) throw new FailedPredicateException(this, "$first.index + 1 == $second.index"); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class LiteralContext extends ParserRuleContext { + public Boolean_literalContext boolean_literal() { + return getRuleContext(Boolean_literalContext.class,0); + } + public String_literalContext string_literal() { + return getRuleContext(String_literalContext.class,0); + } + public TerminalNode INTEGER_LITERAL() { return getToken(CSharpParser.INTEGER_LITERAL, 0); } + public TerminalNode HEX_INTEGER_LITERAL() { return getToken(CSharpParser.HEX_INTEGER_LITERAL, 0); } + public TerminalNode BIN_INTEGER_LITERAL() { return getToken(CSharpParser.BIN_INTEGER_LITERAL, 0); } + public TerminalNode REAL_LITERAL() { return getToken(CSharpParser.REAL_LITERAL, 0); } + public TerminalNode CHARACTER_LITERAL() { return getToken(CSharpParser.CHARACTER_LITERAL, 0); } + public TerminalNode NULL_() { return getToken(CSharpParser.NULL_, 0); } + public LiteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_literal; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterLiteral(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitLiteral(this); + } + } + + public final LiteralContext literal() throws RecognitionException { + LiteralContext _localctx = new LiteralContext(_ctx, getState()); + enterRule(_localctx, 380, RULE_literal); + try { + setState(2363); + _errHandler.sync(this); + switch (_input.LA(1)) { + case FALSE: + case TRUE: + enterOuterAlt(_localctx, 1); + { + setState(2355); + boolean_literal(); + } + break; + case REGULAR_STRING: + case VERBATIUM_STRING: + case INTERPOLATED_REGULAR_STRING_START: + case INTERPOLATED_VERBATIUM_STRING_START: + enterOuterAlt(_localctx, 2); + { + setState(2356); + string_literal(); + } + break; + case INTEGER_LITERAL: + enterOuterAlt(_localctx, 3); + { + setState(2357); + match(INTEGER_LITERAL); + } + break; + case HEX_INTEGER_LITERAL: + enterOuterAlt(_localctx, 4); + { + setState(2358); + match(HEX_INTEGER_LITERAL); + } + break; + case BIN_INTEGER_LITERAL: + enterOuterAlt(_localctx, 5); + { + setState(2359); + match(BIN_INTEGER_LITERAL); + } + break; + case REAL_LITERAL: + enterOuterAlt(_localctx, 6); + { + setState(2360); + match(REAL_LITERAL); + } + break; + case CHARACTER_LITERAL: + enterOuterAlt(_localctx, 7); + { + setState(2361); + match(CHARACTER_LITERAL); + } + break; + case NULL_: + enterOuterAlt(_localctx, 8); + { + setState(2362); + match(NULL_); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Boolean_literalContext extends ParserRuleContext { + public TerminalNode TRUE() { return getToken(CSharpParser.TRUE, 0); } + public TerminalNode FALSE() { return getToken(CSharpParser.FALSE, 0); } + public Boolean_literalContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_boolean_literal; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterBoolean_literal(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitBoolean_literal(this); + } + } + + public final Boolean_literalContext boolean_literal() throws RecognitionException { + Boolean_literalContext _localctx = new Boolean_literalContext(_ctx, getState()); + enterRule(_localctx, 382, RULE_boolean_literal); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2365); + _la = _input.LA(1); + if ( !(_la==FALSE || _la==TRUE) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class String_literalContext extends ParserRuleContext { + public Interpolated_regular_stringContext interpolated_regular_string() { + return getRuleContext(Interpolated_regular_stringContext.class,0); + } + public Interpolated_verbatium_stringContext interpolated_verbatium_string() { + return getRuleContext(Interpolated_verbatium_stringContext.class,0); + } + public TerminalNode REGULAR_STRING() { return getToken(CSharpParser.REGULAR_STRING, 0); } + public TerminalNode VERBATIUM_STRING() { return getToken(CSharpParser.VERBATIUM_STRING, 0); } + public String_literalContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_string_literal; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterString_literal(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitString_literal(this); + } + } + + public final String_literalContext string_literal() throws RecognitionException { + String_literalContext _localctx = new String_literalContext(_ctx, getState()); + enterRule(_localctx, 384, RULE_string_literal); + try { + setState(2371); + _errHandler.sync(this); + switch (_input.LA(1)) { + case INTERPOLATED_REGULAR_STRING_START: + enterOuterAlt(_localctx, 1); + { + setState(2367); + interpolated_regular_string(); + } + break; + case INTERPOLATED_VERBATIUM_STRING_START: + enterOuterAlt(_localctx, 2); + { + setState(2368); + interpolated_verbatium_string(); + } + break; + case REGULAR_STRING: + enterOuterAlt(_localctx, 3); + { + setState(2369); + match(REGULAR_STRING); + } + break; + case VERBATIUM_STRING: + enterOuterAlt(_localctx, 4); + { + setState(2370); + match(VERBATIUM_STRING); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Interpolated_regular_stringContext extends ParserRuleContext { + public TerminalNode INTERPOLATED_REGULAR_STRING_START() { return getToken(CSharpParser.INTERPOLATED_REGULAR_STRING_START, 0); } + public TerminalNode DOUBLE_QUOTE_INSIDE() { return getToken(CSharpParser.DOUBLE_QUOTE_INSIDE, 0); } + public List interpolated_regular_string_part() { + return getRuleContexts(Interpolated_regular_string_partContext.class); + } + public Interpolated_regular_string_partContext interpolated_regular_string_part(int i) { + return getRuleContext(Interpolated_regular_string_partContext.class,i); + } + public Interpolated_regular_stringContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interpolated_regular_string; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterInterpolated_regular_string(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitInterpolated_regular_string(this); + } + } + + public final Interpolated_regular_stringContext interpolated_regular_string() throws RecognitionException { + Interpolated_regular_stringContext _localctx = new Interpolated_regular_stringContext(_ctx, getState()); + enterRule(_localctx, 386, RULE_interpolated_regular_string); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2373); + match(INTERPOLATED_REGULAR_STRING_START); + setState(2377); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)) | (1L << (DOUBLE_CURLY_INSIDE - 129)) | (1L << (REGULAR_CHAR_INSIDE - 129)) | (1L << (REGULAR_STRING_INSIDE - 129)))) != 0)) { + { + { + setState(2374); + interpolated_regular_string_part(); + } + } + setState(2379); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2380); + match(DOUBLE_QUOTE_INSIDE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Interpolated_verbatium_stringContext extends ParserRuleContext { + public TerminalNode INTERPOLATED_VERBATIUM_STRING_START() { return getToken(CSharpParser.INTERPOLATED_VERBATIUM_STRING_START, 0); } + public TerminalNode DOUBLE_QUOTE_INSIDE() { return getToken(CSharpParser.DOUBLE_QUOTE_INSIDE, 0); } + public List interpolated_verbatium_string_part() { + return getRuleContexts(Interpolated_verbatium_string_partContext.class); + } + public Interpolated_verbatium_string_partContext interpolated_verbatium_string_part(int i) { + return getRuleContext(Interpolated_verbatium_string_partContext.class,i); + } + public Interpolated_verbatium_stringContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interpolated_verbatium_string; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterInterpolated_verbatium_string(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitInterpolated_verbatium_string(this); + } + } + + public final Interpolated_verbatium_stringContext interpolated_verbatium_string() throws RecognitionException { + Interpolated_verbatium_stringContext _localctx = new Interpolated_verbatium_stringContext(_ctx, getState()); + enterRule(_localctx, 388, RULE_interpolated_verbatium_string); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2382); + match(INTERPOLATED_VERBATIUM_STRING_START); + setState(2386); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)) | (1L << (DOUBLE_CURLY_INSIDE - 129)) | (1L << (VERBATIUM_DOUBLE_QUOTE_INSIDE - 129)) | (1L << (VERBATIUM_INSIDE_STRING - 129)))) != 0)) { + { + { + setState(2383); + interpolated_verbatium_string_part(); + } + } + setState(2388); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2389); + match(DOUBLE_QUOTE_INSIDE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Interpolated_regular_string_partContext extends ParserRuleContext { + public Interpolated_string_expressionContext interpolated_string_expression() { + return getRuleContext(Interpolated_string_expressionContext.class,0); + } + public TerminalNode DOUBLE_CURLY_INSIDE() { return getToken(CSharpParser.DOUBLE_CURLY_INSIDE, 0); } + public TerminalNode REGULAR_CHAR_INSIDE() { return getToken(CSharpParser.REGULAR_CHAR_INSIDE, 0); } + public TerminalNode REGULAR_STRING_INSIDE() { return getToken(CSharpParser.REGULAR_STRING_INSIDE, 0); } + public Interpolated_regular_string_partContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interpolated_regular_string_part; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterInterpolated_regular_string_part(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitInterpolated_regular_string_part(this); + } + } + + public final Interpolated_regular_string_partContext interpolated_regular_string_part() throws RecognitionException { + Interpolated_regular_string_partContext _localctx = new Interpolated_regular_string_partContext(_ctx, getState()); + enterRule(_localctx, 390, RULE_interpolated_regular_string_part); + try { + setState(2395); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BASE: + case BOOL: + case BY: + case BYTE: + case CHAR: + case CHECKED: + case DECIMAL: + case DEFAULT: + case DELEGATE: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FALSE: + case FLOAT: + case FROM: + case GET: + case GROUP: + case INT: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case NEW: + case NULL_: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REF: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case SIZEOF: + case STRING: + case THIS: + case TRUE: + case TYPEOF: + case UINT: + case ULONG: + case UNCHECKED: + case UNMANAGED: + case USHORT: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case LITERAL_ACCESS: + case INTEGER_LITERAL: + case HEX_INTEGER_LITERAL: + case BIN_INTEGER_LITERAL: + case REAL_LITERAL: + case CHARACTER_LITERAL: + case REGULAR_STRING: + case VERBATIUM_STRING: + case INTERPOLATED_REGULAR_STRING_START: + case INTERPOLATED_VERBATIUM_STRING_START: + case OPEN_PARENS: + case PLUS: + case MINUS: + case STAR: + case AMP: + case CARET: + case BANG: + case TILDE: + case OP_INC: + case OP_DEC: + case OP_RANGE: + enterOuterAlt(_localctx, 1); + { + setState(2391); + interpolated_string_expression(); + } + break; + case DOUBLE_CURLY_INSIDE: + enterOuterAlt(_localctx, 2); + { + setState(2392); + match(DOUBLE_CURLY_INSIDE); + } + break; + case REGULAR_CHAR_INSIDE: + enterOuterAlt(_localctx, 3); + { + setState(2393); + match(REGULAR_CHAR_INSIDE); + } + break; + case REGULAR_STRING_INSIDE: + enterOuterAlt(_localctx, 4); + { + setState(2394); + match(REGULAR_STRING_INSIDE); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Interpolated_verbatium_string_partContext extends ParserRuleContext { + public Interpolated_string_expressionContext interpolated_string_expression() { + return getRuleContext(Interpolated_string_expressionContext.class,0); + } + public TerminalNode DOUBLE_CURLY_INSIDE() { return getToken(CSharpParser.DOUBLE_CURLY_INSIDE, 0); } + public TerminalNode VERBATIUM_DOUBLE_QUOTE_INSIDE() { return getToken(CSharpParser.VERBATIUM_DOUBLE_QUOTE_INSIDE, 0); } + public TerminalNode VERBATIUM_INSIDE_STRING() { return getToken(CSharpParser.VERBATIUM_INSIDE_STRING, 0); } + public Interpolated_verbatium_string_partContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interpolated_verbatium_string_part; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterInterpolated_verbatium_string_part(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitInterpolated_verbatium_string_part(this); + } + } + + public final Interpolated_verbatium_string_partContext interpolated_verbatium_string_part() throws RecognitionException { + Interpolated_verbatium_string_partContext _localctx = new Interpolated_verbatium_string_partContext(_ctx, getState()); + enterRule(_localctx, 392, RULE_interpolated_verbatium_string_part); + try { + setState(2401); + _errHandler.sync(this); + switch (_input.LA(1)) { + case ADD: + case ALIAS: + case ARGLIST: + case ASCENDING: + case ASYNC: + case AWAIT: + case BASE: + case BOOL: + case BY: + case BYTE: + case CHAR: + case CHECKED: + case DECIMAL: + case DEFAULT: + case DELEGATE: + case DESCENDING: + case DOUBLE: + case DYNAMIC: + case EQUALS: + case FALSE: + case FLOAT: + case FROM: + case GET: + case GROUP: + case INT: + case INTO: + case JOIN: + case LET: + case LONG: + case NAMEOF: + case NEW: + case NULL_: + case OBJECT: + case ON: + case ORDERBY: + case PARTIAL: + case REF: + case REMOVE: + case SBYTE: + case SELECT: + case SET: + case SHORT: + case SIZEOF: + case STRING: + case THIS: + case TRUE: + case TYPEOF: + case UINT: + case ULONG: + case UNCHECKED: + case UNMANAGED: + case USHORT: + case VAR: + case WHEN: + case WHERE: + case YIELD: + case IDENTIFIER: + case LITERAL_ACCESS: + case INTEGER_LITERAL: + case HEX_INTEGER_LITERAL: + case BIN_INTEGER_LITERAL: + case REAL_LITERAL: + case CHARACTER_LITERAL: + case REGULAR_STRING: + case VERBATIUM_STRING: + case INTERPOLATED_REGULAR_STRING_START: + case INTERPOLATED_VERBATIUM_STRING_START: + case OPEN_PARENS: + case PLUS: + case MINUS: + case STAR: + case AMP: + case CARET: + case BANG: + case TILDE: + case OP_INC: + case OP_DEC: + case OP_RANGE: + enterOuterAlt(_localctx, 1); + { + setState(2397); + interpolated_string_expression(); + } + break; + case DOUBLE_CURLY_INSIDE: + enterOuterAlt(_localctx, 2); + { + setState(2398); + match(DOUBLE_CURLY_INSIDE); + } + break; + case VERBATIUM_DOUBLE_QUOTE_INSIDE: + enterOuterAlt(_localctx, 3); + { + setState(2399); + match(VERBATIUM_DOUBLE_QUOTE_INSIDE); + } + break; + case VERBATIUM_INSIDE_STRING: + enterOuterAlt(_localctx, 4); + { + setState(2400); + match(VERBATIUM_INSIDE_STRING); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Interpolated_string_expressionContext extends ParserRuleContext { + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public List COMMA() { return getTokens(CSharpParser.COMMA); } + public TerminalNode COMMA(int i) { + return getToken(CSharpParser.COMMA, i); + } + public TerminalNode COLON() { return getToken(CSharpParser.COLON, 0); } + public List FORMAT_STRING() { return getTokens(CSharpParser.FORMAT_STRING); } + public TerminalNode FORMAT_STRING(int i) { + return getToken(CSharpParser.FORMAT_STRING, i); + } + public Interpolated_string_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interpolated_string_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterInterpolated_string_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitInterpolated_string_expression(this); + } + } + + public final Interpolated_string_expressionContext interpolated_string_expression() throws RecognitionException { + Interpolated_string_expressionContext _localctx = new Interpolated_string_expressionContext(_ctx, getState()); + enterRule(_localctx, 394, RULE_interpolated_string_expression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2403); + expression(); + setState(2408); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==COMMA) { + { + { + setState(2404); + match(COMMA); + setState(2405); + expression(); + } + } + setState(2410); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(2417); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COLON) { + { + setState(2411); + match(COLON); + setState(2413); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(2412); + match(FORMAT_STRING); + } + } + setState(2415); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==FORMAT_STRING ); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class KeywordContext extends ParserRuleContext { + public TerminalNode ABSTRACT() { return getToken(CSharpParser.ABSTRACT, 0); } + public TerminalNode AS() { return getToken(CSharpParser.AS, 0); } + public TerminalNode BASE() { return getToken(CSharpParser.BASE, 0); } + public TerminalNode BOOL() { return getToken(CSharpParser.BOOL, 0); } + public TerminalNode BREAK() { return getToken(CSharpParser.BREAK, 0); } + public TerminalNode BYTE() { return getToken(CSharpParser.BYTE, 0); } + public TerminalNode CASE() { return getToken(CSharpParser.CASE, 0); } + public TerminalNode CATCH() { return getToken(CSharpParser.CATCH, 0); } + public TerminalNode CHAR() { return getToken(CSharpParser.CHAR, 0); } + public TerminalNode CHECKED() { return getToken(CSharpParser.CHECKED, 0); } + public TerminalNode CLASS() { return getToken(CSharpParser.CLASS, 0); } + public TerminalNode CONST() { return getToken(CSharpParser.CONST, 0); } + public TerminalNode CONTINUE() { return getToken(CSharpParser.CONTINUE, 0); } + public TerminalNode DECIMAL() { return getToken(CSharpParser.DECIMAL, 0); } + public TerminalNode DEFAULT() { return getToken(CSharpParser.DEFAULT, 0); } + public TerminalNode DELEGATE() { return getToken(CSharpParser.DELEGATE, 0); } + public TerminalNode DO() { return getToken(CSharpParser.DO, 0); } + public TerminalNode DOUBLE() { return getToken(CSharpParser.DOUBLE, 0); } + public TerminalNode ELSE() { return getToken(CSharpParser.ELSE, 0); } + public TerminalNode ENUM() { return getToken(CSharpParser.ENUM, 0); } + public TerminalNode EVENT() { return getToken(CSharpParser.EVENT, 0); } + public TerminalNode EXPLICIT() { return getToken(CSharpParser.EXPLICIT, 0); } + public TerminalNode EXTERN() { return getToken(CSharpParser.EXTERN, 0); } + public TerminalNode FALSE() { return getToken(CSharpParser.FALSE, 0); } + public TerminalNode FINALLY() { return getToken(CSharpParser.FINALLY, 0); } + public TerminalNode FIXED() { return getToken(CSharpParser.FIXED, 0); } + public TerminalNode FLOAT() { return getToken(CSharpParser.FLOAT, 0); } + public TerminalNode FOR() { return getToken(CSharpParser.FOR, 0); } + public TerminalNode FOREACH() { return getToken(CSharpParser.FOREACH, 0); } + public TerminalNode GOTO() { return getToken(CSharpParser.GOTO, 0); } + public TerminalNode IF() { return getToken(CSharpParser.IF, 0); } + public TerminalNode IMPLICIT() { return getToken(CSharpParser.IMPLICIT, 0); } + public TerminalNode IN() { return getToken(CSharpParser.IN, 0); } + public TerminalNode INT() { return getToken(CSharpParser.INT, 0); } + public TerminalNode INTERFACE() { return getToken(CSharpParser.INTERFACE, 0); } + public TerminalNode INTERNAL() { return getToken(CSharpParser.INTERNAL, 0); } + public TerminalNode IS() { return getToken(CSharpParser.IS, 0); } + public TerminalNode LOCK() { return getToken(CSharpParser.LOCK, 0); } + public TerminalNode LONG() { return getToken(CSharpParser.LONG, 0); } + public TerminalNode NAMESPACE() { return getToken(CSharpParser.NAMESPACE, 0); } + public TerminalNode NEW() { return getToken(CSharpParser.NEW, 0); } + public TerminalNode NULL_() { return getToken(CSharpParser.NULL_, 0); } + public TerminalNode OBJECT() { return getToken(CSharpParser.OBJECT, 0); } + public TerminalNode OPERATOR() { return getToken(CSharpParser.OPERATOR, 0); } + public TerminalNode OUT() { return getToken(CSharpParser.OUT, 0); } + public TerminalNode OVERRIDE() { return getToken(CSharpParser.OVERRIDE, 0); } + public TerminalNode PARAMS() { return getToken(CSharpParser.PARAMS, 0); } + public TerminalNode PRIVATE() { return getToken(CSharpParser.PRIVATE, 0); } + public TerminalNode PROTECTED() { return getToken(CSharpParser.PROTECTED, 0); } + public TerminalNode PUBLIC() { return getToken(CSharpParser.PUBLIC, 0); } + public TerminalNode READONLY() { return getToken(CSharpParser.READONLY, 0); } + public TerminalNode REF() { return getToken(CSharpParser.REF, 0); } + public TerminalNode RETURN() { return getToken(CSharpParser.RETURN, 0); } + public TerminalNode SBYTE() { return getToken(CSharpParser.SBYTE, 0); } + public TerminalNode SEALED() { return getToken(CSharpParser.SEALED, 0); } + public TerminalNode SHORT() { return getToken(CSharpParser.SHORT, 0); } + public TerminalNode SIZEOF() { return getToken(CSharpParser.SIZEOF, 0); } + public TerminalNode STACKALLOC() { return getToken(CSharpParser.STACKALLOC, 0); } + public TerminalNode STATIC() { return getToken(CSharpParser.STATIC, 0); } + public TerminalNode STRING() { return getToken(CSharpParser.STRING, 0); } + public TerminalNode STRUCT() { return getToken(CSharpParser.STRUCT, 0); } + public TerminalNode SWITCH() { return getToken(CSharpParser.SWITCH, 0); } + public TerminalNode THIS() { return getToken(CSharpParser.THIS, 0); } + public TerminalNode THROW() { return getToken(CSharpParser.THROW, 0); } + public TerminalNode TRUE() { return getToken(CSharpParser.TRUE, 0); } + public TerminalNode TRY() { return getToken(CSharpParser.TRY, 0); } + public TerminalNode TYPEOF() { return getToken(CSharpParser.TYPEOF, 0); } + public TerminalNode UINT() { return getToken(CSharpParser.UINT, 0); } + public TerminalNode ULONG() { return getToken(CSharpParser.ULONG, 0); } + public TerminalNode UNCHECKED() { return getToken(CSharpParser.UNCHECKED, 0); } + public TerminalNode UNMANAGED() { return getToken(CSharpParser.UNMANAGED, 0); } + public TerminalNode UNSAFE() { return getToken(CSharpParser.UNSAFE, 0); } + public TerminalNode USHORT() { return getToken(CSharpParser.USHORT, 0); } + public TerminalNode USING() { return getToken(CSharpParser.USING, 0); } + public TerminalNode VIRTUAL() { return getToken(CSharpParser.VIRTUAL, 0); } + public TerminalNode VOID() { return getToken(CSharpParser.VOID, 0); } + public TerminalNode VOLATILE() { return getToken(CSharpParser.VOLATILE, 0); } + public TerminalNode WHILE() { return getToken(CSharpParser.WHILE, 0); } + public KeywordContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_keyword; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterKeyword(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitKeyword(this); + } + } + + public final KeywordContext keyword() throws RecognitionException { + KeywordContext _localctx = new KeywordContext(_ctx, getState()); + enterRule(_localctx, 396, RULE_keyword); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2419); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ABSTRACT) | (1L << AS) | (1L << BASE) | (1L << BOOL) | (1L << BREAK) | (1L << BYTE) | (1L << CASE) | (1L << CATCH) | (1L << CHAR) | (1L << CHECKED) | (1L << CLASS) | (1L << CONST) | (1L << CONTINUE) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DO) | (1L << DOUBLE) | (1L << ELSE) | (1L << ENUM) | (1L << EVENT) | (1L << EXPLICIT) | (1L << EXTERN) | (1L << FALSE) | (1L << FINALLY) | (1L << FIXED) | (1L << FLOAT) | (1L << FOR) | (1L << FOREACH) | (1L << GOTO) | (1L << IF) | (1L << IMPLICIT) | (1L << IN) | (1L << INT) | (1L << INTERFACE) | (1L << INTERNAL) | (1L << IS) | (1L << LOCK) | (1L << LONG))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (NAMESPACE - 65)) | (1L << (NEW - 65)) | (1L << (NULL_ - 65)) | (1L << (OBJECT - 65)) | (1L << (OPERATOR - 65)) | (1L << (OUT - 65)) | (1L << (OVERRIDE - 65)) | (1L << (PARAMS - 65)) | (1L << (PRIVATE - 65)) | (1L << (PROTECTED - 65)) | (1L << (PUBLIC - 65)) | (1L << (READONLY - 65)) | (1L << (REF - 65)) | (1L << (RETURN - 65)) | (1L << (SBYTE - 65)) | (1L << (SEALED - 65)) | (1L << (SHORT - 65)) | (1L << (SIZEOF - 65)) | (1L << (STACKALLOC - 65)) | (1L << (STATIC - 65)) | (1L << (STRING - 65)) | (1L << (STRUCT - 65)) | (1L << (SWITCH - 65)) | (1L << (THIS - 65)) | (1L << (THROW - 65)) | (1L << (TRUE - 65)) | (1L << (TRY - 65)) | (1L << (TYPEOF - 65)) | (1L << (UINT - 65)) | (1L << (ULONG - 65)) | (1L << (UNCHECKED - 65)) | (1L << (UNMANAGED - 65)) | (1L << (UNSAFE - 65)) | (1L << (USHORT - 65)) | (1L << (USING - 65)) | (1L << (VIRTUAL - 65)) | (1L << (VOID - 65)) | (1L << (VOLATILE - 65)) | (1L << (WHILE - 65)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Class_definitionContext extends ParserRuleContext { + public TerminalNode CLASS() { return getToken(CSharpParser.CLASS, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public Class_bodyContext class_body() { + return getRuleContext(Class_bodyContext.class,0); + } + public Type_parameter_listContext type_parameter_list() { + return getRuleContext(Type_parameter_listContext.class,0); + } + public Class_baseContext class_base() { + return getRuleContext(Class_baseContext.class,0); + } + public Type_parameter_constraints_clausesContext type_parameter_constraints_clauses() { + return getRuleContext(Type_parameter_constraints_clausesContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Class_definitionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_class_definition; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterClass_definition(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitClass_definition(this); + } + } + + public final Class_definitionContext class_definition() throws RecognitionException { + Class_definitionContext _localctx = new Class_definitionContext(_ctx, getState()); + enterRule(_localctx, 398, RULE_class_definition); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2421); + match(CLASS); + setState(2422); + identifier(); + setState(2424); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LT) { + { + setState(2423); + type_parameter_list(); + } + } + + setState(2427); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COLON) { + { + setState(2426); + class_base(); + } + } + + setState(2430); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHERE) { + { + setState(2429); + type_parameter_constraints_clauses(); + } + } + + setState(2432); + class_body(); + setState(2434); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==SEMICOLON) { + { + setState(2433); + match(SEMICOLON); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Struct_definitionContext extends ParserRuleContext { + public TerminalNode STRUCT() { return getToken(CSharpParser.STRUCT, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public Struct_bodyContext struct_body() { + return getRuleContext(Struct_bodyContext.class,0); + } + public Type_parameter_listContext type_parameter_list() { + return getRuleContext(Type_parameter_listContext.class,0); + } + public Struct_interfacesContext struct_interfaces() { + return getRuleContext(Struct_interfacesContext.class,0); + } + public Type_parameter_constraints_clausesContext type_parameter_constraints_clauses() { + return getRuleContext(Type_parameter_constraints_clausesContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public TerminalNode READONLY() { return getToken(CSharpParser.READONLY, 0); } + public TerminalNode REF() { return getToken(CSharpParser.REF, 0); } + public Struct_definitionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_struct_definition; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterStruct_definition(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitStruct_definition(this); + } + } + + public final Struct_definitionContext struct_definition() throws RecognitionException { + Struct_definitionContext _localctx = new Struct_definitionContext(_ctx, getState()); + enterRule(_localctx, 400, RULE_struct_definition); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2437); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==READONLY || _la==REF) { + { + setState(2436); + _la = _input.LA(1); + if ( !(_la==READONLY || _la==REF) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + + setState(2439); + match(STRUCT); + setState(2440); + identifier(); + setState(2442); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LT) { + { + setState(2441); + type_parameter_list(); + } + } + + setState(2445); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COLON) { + { + setState(2444); + struct_interfaces(); + } + } + + setState(2448); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHERE) { + { + setState(2447); + type_parameter_constraints_clauses(); + } + } + + setState(2450); + struct_body(); + setState(2452); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==SEMICOLON) { + { + setState(2451); + match(SEMICOLON); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Interface_definitionContext extends ParserRuleContext { + public TerminalNode INTERFACE() { return getToken(CSharpParser.INTERFACE, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public Class_bodyContext class_body() { + return getRuleContext(Class_bodyContext.class,0); + } + public Variant_type_parameter_listContext variant_type_parameter_list() { + return getRuleContext(Variant_type_parameter_listContext.class,0); + } + public Interface_baseContext interface_base() { + return getRuleContext(Interface_baseContext.class,0); + } + public Type_parameter_constraints_clausesContext type_parameter_constraints_clauses() { + return getRuleContext(Type_parameter_constraints_clausesContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Interface_definitionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_interface_definition; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterInterface_definition(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitInterface_definition(this); + } + } + + public final Interface_definitionContext interface_definition() throws RecognitionException { + Interface_definitionContext _localctx = new Interface_definitionContext(_ctx, getState()); + enterRule(_localctx, 402, RULE_interface_definition); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2454); + match(INTERFACE); + setState(2455); + identifier(); + setState(2457); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LT) { + { + setState(2456); + variant_type_parameter_list(); + } + } + + setState(2460); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COLON) { + { + setState(2459); + interface_base(); + } + } + + setState(2463); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHERE) { + { + setState(2462); + type_parameter_constraints_clauses(); + } + } + + setState(2465); + class_body(); + setState(2467); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==SEMICOLON) { + { + setState(2466); + match(SEMICOLON); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Enum_definitionContext extends ParserRuleContext { + public TerminalNode ENUM() { return getToken(CSharpParser.ENUM, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public Enum_bodyContext enum_body() { + return getRuleContext(Enum_bodyContext.class,0); + } + public Enum_baseContext enum_base() { + return getRuleContext(Enum_baseContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Enum_definitionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_enum_definition; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterEnum_definition(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitEnum_definition(this); + } + } + + public final Enum_definitionContext enum_definition() throws RecognitionException { + Enum_definitionContext _localctx = new Enum_definitionContext(_ctx, getState()); + enterRule(_localctx, 404, RULE_enum_definition); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2469); + match(ENUM); + setState(2470); + identifier(); + setState(2472); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COLON) { + { + setState(2471); + enum_base(); + } + } + + setState(2474); + enum_body(); + setState(2476); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==SEMICOLON) { + { + setState(2475); + match(SEMICOLON); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Delegate_definitionContext extends ParserRuleContext { + public TerminalNode DELEGATE() { return getToken(CSharpParser.DELEGATE, 0); } + public Return_typeContext return_type() { + return getRuleContext(Return_typeContext.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Variant_type_parameter_listContext variant_type_parameter_list() { + return getRuleContext(Variant_type_parameter_listContext.class,0); + } + public Formal_parameter_listContext formal_parameter_list() { + return getRuleContext(Formal_parameter_listContext.class,0); + } + public Type_parameter_constraints_clausesContext type_parameter_constraints_clauses() { + return getRuleContext(Type_parameter_constraints_clausesContext.class,0); + } + public Delegate_definitionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_delegate_definition; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterDelegate_definition(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitDelegate_definition(this); + } + } + + public final Delegate_definitionContext delegate_definition() throws RecognitionException { + Delegate_definitionContext _localctx = new Delegate_definitionContext(_ctx, getState()); + enterRule(_localctx, 406, RULE_delegate_definition); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2478); + match(DELEGATE); + setState(2479); + return_type(); + setState(2480); + identifier(); + setState(2482); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LT) { + { + setState(2481); + variant_type_parameter_list(); + } + } + + setState(2484); + match(OPEN_PARENS); + setState(2486); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 10)) & ~0x3f) == 0 && ((1L << (_la - 10)) & ((1L << (ADD - 10)) | (1L << (ALIAS - 10)) | (1L << (ARGLIST - 10)) | (1L << (ASCENDING - 10)) | (1L << (ASYNC - 10)) | (1L << (AWAIT - 10)) | (1L << (BOOL - 10)) | (1L << (BY - 10)) | (1L << (BYTE - 10)) | (1L << (CHAR - 10)) | (1L << (DECIMAL - 10)) | (1L << (DESCENDING - 10)) | (1L << (DOUBLE - 10)) | (1L << (DYNAMIC - 10)) | (1L << (EQUALS - 10)) | (1L << (FLOAT - 10)) | (1L << (FROM - 10)) | (1L << (GET - 10)) | (1L << (GROUP - 10)) | (1L << (IN - 10)) | (1L << (INT - 10)) | (1L << (INTO - 10)) | (1L << (JOIN - 10)) | (1L << (LET - 10)) | (1L << (LONG - 10)) | (1L << (NAMEOF - 10)) | (1L << (OBJECT - 10)) | (1L << (ON - 10)) | (1L << (ORDERBY - 10)) | (1L << (OUT - 10)))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (PARAMS - 74)) | (1L << (PARTIAL - 74)) | (1L << (REF - 74)) | (1L << (REMOVE - 74)) | (1L << (SBYTE - 74)) | (1L << (SELECT - 74)) | (1L << (SET - 74)) | (1L << (SHORT - 74)) | (1L << (STRING - 74)) | (1L << (THIS - 74)) | (1L << (UINT - 74)) | (1L << (ULONG - 74)) | (1L << (UNMANAGED - 74)) | (1L << (USHORT - 74)) | (1L << (VAR - 74)) | (1L << (VOID - 74)) | (1L << (WHEN - 74)) | (1L << (WHERE - 74)) | (1L << (YIELD - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (OPEN_BRACKET - 74)) | (1L << (OPEN_PARENS - 74)))) != 0)) { + { + setState(2485); + formal_parameter_list(); + } + } + + setState(2488); + match(CLOSE_PARENS); + setState(2490); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHERE) { + { + setState(2489); + type_parameter_constraints_clauses(); + } + } + + setState(2492); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Event_declarationContext extends ParserRuleContext { + public TerminalNode EVENT() { return getToken(CSharpParser.EVENT, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public Variable_declaratorsContext variable_declarators() { + return getRuleContext(Variable_declaratorsContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Member_nameContext member_name() { + return getRuleContext(Member_nameContext.class,0); + } + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public Event_accessor_declarationsContext event_accessor_declarations() { + return getRuleContext(Event_accessor_declarationsContext.class,0); + } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public Event_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_event_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterEvent_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitEvent_declaration(this); + } + } + + public final Event_declarationContext event_declaration() throws RecognitionException { + Event_declarationContext _localctx = new Event_declarationContext(_ctx, getState()); + enterRule(_localctx, 408, RULE_event_declaration); + try { + enterOuterAlt(_localctx, 1); + { + setState(2494); + match(EVENT); + setState(2495); + type_(); + setState(2504); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,323,_ctx) ) { + case 1: + { + setState(2496); + variable_declarators(); + setState(2497); + match(SEMICOLON); + } + break; + case 2: + { + setState(2499); + member_name(); + setState(2500); + match(OPEN_BRACE); + setState(2501); + event_accessor_declarations(); + setState(2502); + match(CLOSE_BRACE); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Field_declarationContext extends ParserRuleContext { + public Variable_declaratorsContext variable_declarators() { + return getRuleContext(Variable_declaratorsContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Field_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_field_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterField_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitField_declaration(this); + } + } + + public final Field_declarationContext field_declaration() throws RecognitionException { + Field_declarationContext _localctx = new Field_declarationContext(_ctx, getState()); + enterRule(_localctx, 410, RULE_field_declaration); + try { + enterOuterAlt(_localctx, 1); + { + setState(2506); + variable_declarators(); + setState(2507); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Property_declarationContext extends ParserRuleContext { + public Member_nameContext member_name() { + return getRuleContext(Member_nameContext.class,0); + } + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public Accessor_declarationsContext accessor_declarations() { + return getRuleContext(Accessor_declarationsContext.class,0); + } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public Right_arrowContext right_arrow() { + return getRuleContext(Right_arrowContext.class,0); + } + public Throwable_expressionContext throwable_expression() { + return getRuleContext(Throwable_expressionContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public TerminalNode ASSIGNMENT() { return getToken(CSharpParser.ASSIGNMENT, 0); } + public Variable_initializerContext variable_initializer() { + return getRuleContext(Variable_initializerContext.class,0); + } + public Property_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_property_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterProperty_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitProperty_declaration(this); + } + } + + public final Property_declarationContext property_declaration() throws RecognitionException { + Property_declarationContext _localctx = new Property_declarationContext(_ctx, getState()); + enterRule(_localctx, 412, RULE_property_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2509); + member_name(); + setState(2523); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACE: + { + setState(2510); + match(OPEN_BRACE); + setState(2511); + accessor_declarations(); + setState(2512); + match(CLOSE_BRACE); + setState(2517); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ASSIGNMENT) { + { + setState(2513); + match(ASSIGNMENT); + setState(2514); + variable_initializer(); + setState(2515); + match(SEMICOLON); + } + } + + } + break; + case ASSIGNMENT: + { + setState(2519); + right_arrow(); + setState(2520); + throwable_expression(); + setState(2521); + match(SEMICOLON); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Constant_declarationContext extends ParserRuleContext { + public TerminalNode CONST() { return getToken(CSharpParser.CONST, 0); } + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public Constant_declaratorsContext constant_declarators() { + return getRuleContext(Constant_declaratorsContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Constant_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constant_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterConstant_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitConstant_declaration(this); + } + } + + public final Constant_declarationContext constant_declaration() throws RecognitionException { + Constant_declarationContext _localctx = new Constant_declarationContext(_ctx, getState()); + enterRule(_localctx, 414, RULE_constant_declaration); + try { + enterOuterAlt(_localctx, 1); + { + setState(2525); + match(CONST); + setState(2526); + type_(); + setState(2527); + constant_declarators(); + setState(2528); + match(SEMICOLON); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Indexer_declarationContext extends ParserRuleContext { + public TerminalNode THIS() { return getToken(CSharpParser.THIS, 0); } + public TerminalNode OPEN_BRACKET() { return getToken(CSharpParser.OPEN_BRACKET, 0); } + public Formal_parameter_listContext formal_parameter_list() { + return getRuleContext(Formal_parameter_listContext.class,0); + } + public TerminalNode CLOSE_BRACKET() { return getToken(CSharpParser.CLOSE_BRACKET, 0); } + public TerminalNode OPEN_BRACE() { return getToken(CSharpParser.OPEN_BRACE, 0); } + public Accessor_declarationsContext accessor_declarations() { + return getRuleContext(Accessor_declarationsContext.class,0); + } + public TerminalNode CLOSE_BRACE() { return getToken(CSharpParser.CLOSE_BRACE, 0); } + public Right_arrowContext right_arrow() { + return getRuleContext(Right_arrowContext.class,0); + } + public Throwable_expressionContext throwable_expression() { + return getRuleContext(Throwable_expressionContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Indexer_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_indexer_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterIndexer_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitIndexer_declaration(this); + } + } + + public final Indexer_declarationContext indexer_declaration() throws RecognitionException { + Indexer_declarationContext _localctx = new Indexer_declarationContext(_ctx, getState()); + enterRule(_localctx, 416, RULE_indexer_declaration); + try { + enterOuterAlt(_localctx, 1); + { + setState(2530); + match(THIS); + setState(2531); + match(OPEN_BRACKET); + setState(2532); + formal_parameter_list(); + setState(2533); + match(CLOSE_BRACKET); + setState(2542); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACE: + { + setState(2534); + match(OPEN_BRACE); + setState(2535); + accessor_declarations(); + setState(2536); + match(CLOSE_BRACE); + } + break; + case ASSIGNMENT: + { + setState(2538); + right_arrow(); + setState(2539); + throwable_expression(); + setState(2540); + match(SEMICOLON); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Destructor_definitionContext extends ParserRuleContext { + public TerminalNode TILDE() { return getToken(CSharpParser.TILDE, 0); } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public BodyContext body() { + return getRuleContext(BodyContext.class,0); + } + public Destructor_definitionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_destructor_definition; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterDestructor_definition(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitDestructor_definition(this); + } + } + + public final Destructor_definitionContext destructor_definition() throws RecognitionException { + Destructor_definitionContext _localctx = new Destructor_definitionContext(_ctx, getState()); + enterRule(_localctx, 418, RULE_destructor_definition); + try { + enterOuterAlt(_localctx, 1); + { + setState(2544); + match(TILDE); + setState(2545); + identifier(); + setState(2546); + match(OPEN_PARENS); + setState(2547); + match(CLOSE_PARENS); + setState(2548); + body(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Constructor_declarationContext extends ParserRuleContext { + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public BodyContext body() { + return getRuleContext(BodyContext.class,0); + } + public Formal_parameter_listContext formal_parameter_list() { + return getRuleContext(Formal_parameter_listContext.class,0); + } + public Constructor_initializerContext constructor_initializer() { + return getRuleContext(Constructor_initializerContext.class,0); + } + public Constructor_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_constructor_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterConstructor_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitConstructor_declaration(this); + } + } + + public final Constructor_declarationContext constructor_declaration() throws RecognitionException { + Constructor_declarationContext _localctx = new Constructor_declarationContext(_ctx, getState()); + enterRule(_localctx, 420, RULE_constructor_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2550); + identifier(); + setState(2551); + match(OPEN_PARENS); + setState(2553); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 10)) & ~0x3f) == 0 && ((1L << (_la - 10)) & ((1L << (ADD - 10)) | (1L << (ALIAS - 10)) | (1L << (ARGLIST - 10)) | (1L << (ASCENDING - 10)) | (1L << (ASYNC - 10)) | (1L << (AWAIT - 10)) | (1L << (BOOL - 10)) | (1L << (BY - 10)) | (1L << (BYTE - 10)) | (1L << (CHAR - 10)) | (1L << (DECIMAL - 10)) | (1L << (DESCENDING - 10)) | (1L << (DOUBLE - 10)) | (1L << (DYNAMIC - 10)) | (1L << (EQUALS - 10)) | (1L << (FLOAT - 10)) | (1L << (FROM - 10)) | (1L << (GET - 10)) | (1L << (GROUP - 10)) | (1L << (IN - 10)) | (1L << (INT - 10)) | (1L << (INTO - 10)) | (1L << (JOIN - 10)) | (1L << (LET - 10)) | (1L << (LONG - 10)) | (1L << (NAMEOF - 10)) | (1L << (OBJECT - 10)) | (1L << (ON - 10)) | (1L << (ORDERBY - 10)) | (1L << (OUT - 10)))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (PARAMS - 74)) | (1L << (PARTIAL - 74)) | (1L << (REF - 74)) | (1L << (REMOVE - 74)) | (1L << (SBYTE - 74)) | (1L << (SELECT - 74)) | (1L << (SET - 74)) | (1L << (SHORT - 74)) | (1L << (STRING - 74)) | (1L << (THIS - 74)) | (1L << (UINT - 74)) | (1L << (ULONG - 74)) | (1L << (UNMANAGED - 74)) | (1L << (USHORT - 74)) | (1L << (VAR - 74)) | (1L << (VOID - 74)) | (1L << (WHEN - 74)) | (1L << (WHERE - 74)) | (1L << (YIELD - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (OPEN_BRACKET - 74)) | (1L << (OPEN_PARENS - 74)))) != 0)) { + { + setState(2552); + formal_parameter_list(); + } + } + + setState(2555); + match(CLOSE_PARENS); + setState(2557); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COLON) { + { + setState(2556); + constructor_initializer(); + } + } + + setState(2559); + body(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Method_declarationContext extends ParserRuleContext { + public Method_member_nameContext method_member_name() { + return getRuleContext(Method_member_nameContext.class,0); + } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Method_bodyContext method_body() { + return getRuleContext(Method_bodyContext.class,0); + } + public Right_arrowContext right_arrow() { + return getRuleContext(Right_arrowContext.class,0); + } + public Throwable_expressionContext throwable_expression() { + return getRuleContext(Throwable_expressionContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public Type_parameter_listContext type_parameter_list() { + return getRuleContext(Type_parameter_listContext.class,0); + } + public Formal_parameter_listContext formal_parameter_list() { + return getRuleContext(Formal_parameter_listContext.class,0); + } + public Type_parameter_constraints_clausesContext type_parameter_constraints_clauses() { + return getRuleContext(Type_parameter_constraints_clausesContext.class,0); + } + public Method_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_method_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterMethod_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitMethod_declaration(this); + } + } + + public final Method_declarationContext method_declaration() throws RecognitionException { + Method_declarationContext _localctx = new Method_declarationContext(_ctx, getState()); + enterRule(_localctx, 422, RULE_method_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2561); + method_member_name(); + setState(2563); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LT) { + { + setState(2562); + type_parameter_list(); + } + } + + setState(2565); + match(OPEN_PARENS); + setState(2567); + _errHandler.sync(this); + _la = _input.LA(1); + if (((((_la - 10)) & ~0x3f) == 0 && ((1L << (_la - 10)) & ((1L << (ADD - 10)) | (1L << (ALIAS - 10)) | (1L << (ARGLIST - 10)) | (1L << (ASCENDING - 10)) | (1L << (ASYNC - 10)) | (1L << (AWAIT - 10)) | (1L << (BOOL - 10)) | (1L << (BY - 10)) | (1L << (BYTE - 10)) | (1L << (CHAR - 10)) | (1L << (DECIMAL - 10)) | (1L << (DESCENDING - 10)) | (1L << (DOUBLE - 10)) | (1L << (DYNAMIC - 10)) | (1L << (EQUALS - 10)) | (1L << (FLOAT - 10)) | (1L << (FROM - 10)) | (1L << (GET - 10)) | (1L << (GROUP - 10)) | (1L << (IN - 10)) | (1L << (INT - 10)) | (1L << (INTO - 10)) | (1L << (JOIN - 10)) | (1L << (LET - 10)) | (1L << (LONG - 10)) | (1L << (NAMEOF - 10)) | (1L << (OBJECT - 10)) | (1L << (ON - 10)) | (1L << (ORDERBY - 10)) | (1L << (OUT - 10)))) != 0) || ((((_la - 74)) & ~0x3f) == 0 && ((1L << (_la - 74)) & ((1L << (PARAMS - 74)) | (1L << (PARTIAL - 74)) | (1L << (REF - 74)) | (1L << (REMOVE - 74)) | (1L << (SBYTE - 74)) | (1L << (SELECT - 74)) | (1L << (SET - 74)) | (1L << (SHORT - 74)) | (1L << (STRING - 74)) | (1L << (THIS - 74)) | (1L << (UINT - 74)) | (1L << (ULONG - 74)) | (1L << (UNMANAGED - 74)) | (1L << (USHORT - 74)) | (1L << (VAR - 74)) | (1L << (VOID - 74)) | (1L << (WHEN - 74)) | (1L << (WHERE - 74)) | (1L << (YIELD - 74)) | (1L << (IDENTIFIER - 74)) | (1L << (OPEN_BRACKET - 74)) | (1L << (OPEN_PARENS - 74)))) != 0)) { + { + setState(2566); + formal_parameter_list(); + } + } + + setState(2569); + match(CLOSE_PARENS); + setState(2571); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==WHERE) { + { + setState(2570); + type_parameter_constraints_clauses(); + } + } + + setState(2578); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACE: + case SEMICOLON: + { + setState(2573); + method_body(); + } + break; + case ASSIGNMENT: + { + setState(2574); + right_arrow(); + setState(2575); + throwable_expression(); + setState(2576); + match(SEMICOLON); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Method_member_nameContext extends ParserRuleContext { + public List identifier() { + return getRuleContexts(IdentifierContext.class); + } + public IdentifierContext identifier(int i) { + return getRuleContext(IdentifierContext.class,i); + } + public TerminalNode DOUBLE_COLON() { return getToken(CSharpParser.DOUBLE_COLON, 0); } + public List DOT() { return getTokens(CSharpParser.DOT); } + public TerminalNode DOT(int i) { + return getToken(CSharpParser.DOT, i); + } + public List type_argument_list() { + return getRuleContexts(Type_argument_listContext.class); + } + public Type_argument_listContext type_argument_list(int i) { + return getRuleContext(Type_argument_listContext.class,i); + } + public Method_member_nameContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_method_member_name; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterMethod_member_name(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitMethod_member_name(this); + } + } + + public final Method_member_nameContext method_member_name() throws RecognitionException { + Method_member_nameContext _localctx = new Method_member_nameContext(_ctx, getState()); + enterRule(_localctx, 424, RULE_method_member_name); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(2585); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,333,_ctx) ) { + case 1: + { + setState(2580); + identifier(); + } + break; + case 2: + { + setState(2581); + identifier(); + setState(2582); + match(DOUBLE_COLON); + setState(2583); + identifier(); + } + break; + } + setState(2594); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,335,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + { + { + setState(2588); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==LT) { + { + setState(2587); + type_argument_list(); + } + } + + setState(2590); + match(DOT); + setState(2591); + identifier(); + } + } + } + setState(2596); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,335,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Operator_declarationContext extends ParserRuleContext { + public TerminalNode OPERATOR() { return getToken(CSharpParser.OPERATOR, 0); } + public Overloadable_operatorContext overloadable_operator() { + return getRuleContext(Overloadable_operatorContext.class,0); + } + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public List arg_declaration() { + return getRuleContexts(Arg_declarationContext.class); + } + public Arg_declarationContext arg_declaration(int i) { + return getRuleContext(Arg_declarationContext.class,i); + } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public BodyContext body() { + return getRuleContext(BodyContext.class,0); + } + public Right_arrowContext right_arrow() { + return getRuleContext(Right_arrowContext.class,0); + } + public Throwable_expressionContext throwable_expression() { + return getRuleContext(Throwable_expressionContext.class,0); + } + public TerminalNode SEMICOLON() { return getToken(CSharpParser.SEMICOLON, 0); } + public List IN() { return getTokens(CSharpParser.IN); } + public TerminalNode IN(int i) { + return getToken(CSharpParser.IN, i); + } + public TerminalNode COMMA() { return getToken(CSharpParser.COMMA, 0); } + public Operator_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_operator_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterOperator_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitOperator_declaration(this); + } + } + + public final Operator_declarationContext operator_declaration() throws RecognitionException { + Operator_declarationContext _localctx = new Operator_declarationContext(_ctx, getState()); + enterRule(_localctx, 426, RULE_operator_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2597); + match(OPERATOR); + setState(2598); + overloadable_operator(); + setState(2599); + match(OPEN_PARENS); + setState(2601); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==IN) { + { + setState(2600); + match(IN); + } + } + + setState(2603); + arg_declaration(); + setState(2609); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COMMA) { + { + setState(2604); + match(COMMA); + setState(2606); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==IN) { + { + setState(2605); + match(IN); + } + } + + setState(2608); + arg_declaration(); + } + } + + setState(2611); + match(CLOSE_PARENS); + setState(2617); + _errHandler.sync(this); + switch (_input.LA(1)) { + case OPEN_BRACE: + case SEMICOLON: + { + setState(2612); + body(); + } + break; + case ASSIGNMENT: + { + setState(2613); + right_arrow(); + setState(2614); + throwable_expression(); + setState(2615); + match(SEMICOLON); + } + break; + default: + throw new NoViableAltException(this); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Arg_declarationContext extends ParserRuleContext { + public Type_Context type_() { + return getRuleContext(Type_Context.class,0); + } + public IdentifierContext identifier() { + return getRuleContext(IdentifierContext.class,0); + } + public TerminalNode ASSIGNMENT() { return getToken(CSharpParser.ASSIGNMENT, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public Arg_declarationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_arg_declaration; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterArg_declaration(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitArg_declaration(this); + } + } + + public final Arg_declarationContext arg_declaration() throws RecognitionException { + Arg_declarationContext _localctx = new Arg_declarationContext(_ctx, getState()); + enterRule(_localctx, 428, RULE_arg_declaration); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2619); + type_(); + setState(2620); + identifier(); + setState(2623); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==ASSIGNMENT) { + { + setState(2621); + match(ASSIGNMENT); + setState(2622); + expression(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Method_invocationContext extends ParserRuleContext { + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Argument_listContext argument_list() { + return getRuleContext(Argument_listContext.class,0); + } + public Method_invocationContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_method_invocation; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterMethod_invocation(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitMethod_invocation(this); + } + } + + public final Method_invocationContext method_invocation() throws RecognitionException { + Method_invocationContext _localctx = new Method_invocationContext(_ctx, getState()); + enterRule(_localctx, 430, RULE_method_invocation); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2625); + match(OPEN_PARENS); + setState(2627); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << IN) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (OUT - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (VOID - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)))) != 0)) { + { + setState(2626); + argument_list(); + } + } + + setState(2629); + match(CLOSE_PARENS); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class Object_creation_expressionContext extends ParserRuleContext { + public TerminalNode OPEN_PARENS() { return getToken(CSharpParser.OPEN_PARENS, 0); } + public TerminalNode CLOSE_PARENS() { return getToken(CSharpParser.CLOSE_PARENS, 0); } + public Argument_listContext argument_list() { + return getRuleContext(Argument_listContext.class,0); + } + public Object_or_collection_initializerContext object_or_collection_initializer() { + return getRuleContext(Object_or_collection_initializerContext.class,0); + } + public Object_creation_expressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_object_creation_expression; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterObject_creation_expression(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitObject_creation_expression(this); + } + } + + public final Object_creation_expressionContext object_creation_expression() throws RecognitionException { + Object_creation_expressionContext _localctx = new Object_creation_expressionContext(_ctx, getState()); + enterRule(_localctx, 432, RULE_object_creation_expression); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2631); + match(OPEN_PARENS); + setState(2633); + _errHandler.sync(this); + _la = _input.LA(1); + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BASE) | (1L << BOOL) | (1L << BY) | (1L << BYTE) | (1L << CHAR) | (1L << CHECKED) | (1L << DECIMAL) | (1L << DEFAULT) | (1L << DELEGATE) | (1L << DESCENDING) | (1L << DOUBLE) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FALSE) | (1L << FLOAT) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << IN) | (1L << INT) | (1L << INTO) | (1L << JOIN) | (1L << LET) | (1L << LONG))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (NEW - 64)) | (1L << (NULL_ - 64)) | (1L << (OBJECT - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (OUT - 64)) | (1L << (PARTIAL - 64)) | (1L << (REF - 64)) | (1L << (REMOVE - 64)) | (1L << (SBYTE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (SHORT - 64)) | (1L << (SIZEOF - 64)) | (1L << (STRING - 64)) | (1L << (THIS - 64)) | (1L << (TRUE - 64)) | (1L << (TYPEOF - 64)) | (1L << (UINT - 64)) | (1L << (ULONG - 64)) | (1L << (UNCHECKED - 64)) | (1L << (UNMANAGED - 64)) | (1L << (USHORT - 64)) | (1L << (VAR - 64)) | (1L << (VOID - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)) | (1L << (LITERAL_ACCESS - 64)) | (1L << (INTEGER_LITERAL - 64)) | (1L << (HEX_INTEGER_LITERAL - 64)) | (1L << (BIN_INTEGER_LITERAL - 64)) | (1L << (REAL_LITERAL - 64)) | (1L << (CHARACTER_LITERAL - 64)) | (1L << (REGULAR_STRING - 64)) | (1L << (VERBATIUM_STRING - 64)) | (1L << (INTERPOLATED_REGULAR_STRING_START - 64)) | (1L << (INTERPOLATED_VERBATIUM_STRING_START - 64)))) != 0) || ((((_la - 129)) & ~0x3f) == 0 && ((1L << (_la - 129)) & ((1L << (OPEN_PARENS - 129)) | (1L << (PLUS - 129)) | (1L << (MINUS - 129)) | (1L << (STAR - 129)) | (1L << (AMP - 129)) | (1L << (CARET - 129)) | (1L << (BANG - 129)) | (1L << (TILDE - 129)) | (1L << (OP_INC - 129)) | (1L << (OP_DEC - 129)) | (1L << (OP_RANGE - 129)))) != 0)) { + { + setState(2632); + argument_list(); + } + } + + setState(2635); + match(CLOSE_PARENS); + setState(2637); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==OPEN_BRACE) { + { + setState(2636); + object_or_collection_initializer(); + } + } + + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IdentifierContext extends ParserRuleContext { + public TerminalNode IDENTIFIER() { return getToken(CSharpParser.IDENTIFIER, 0); } + public TerminalNode ADD() { return getToken(CSharpParser.ADD, 0); } + public TerminalNode ALIAS() { return getToken(CSharpParser.ALIAS, 0); } + public TerminalNode ARGLIST() { return getToken(CSharpParser.ARGLIST, 0); } + public TerminalNode ASCENDING() { return getToken(CSharpParser.ASCENDING, 0); } + public TerminalNode ASYNC() { return getToken(CSharpParser.ASYNC, 0); } + public TerminalNode AWAIT() { return getToken(CSharpParser.AWAIT, 0); } + public TerminalNode BY() { return getToken(CSharpParser.BY, 0); } + public TerminalNode DESCENDING() { return getToken(CSharpParser.DESCENDING, 0); } + public TerminalNode DYNAMIC() { return getToken(CSharpParser.DYNAMIC, 0); } + public TerminalNode EQUALS() { return getToken(CSharpParser.EQUALS, 0); } + public TerminalNode FROM() { return getToken(CSharpParser.FROM, 0); } + public TerminalNode GET() { return getToken(CSharpParser.GET, 0); } + public TerminalNode GROUP() { return getToken(CSharpParser.GROUP, 0); } + public TerminalNode INTO() { return getToken(CSharpParser.INTO, 0); } + public TerminalNode JOIN() { return getToken(CSharpParser.JOIN, 0); } + public TerminalNode LET() { return getToken(CSharpParser.LET, 0); } + public TerminalNode NAMEOF() { return getToken(CSharpParser.NAMEOF, 0); } + public TerminalNode ON() { return getToken(CSharpParser.ON, 0); } + public TerminalNode ORDERBY() { return getToken(CSharpParser.ORDERBY, 0); } + public TerminalNode PARTIAL() { return getToken(CSharpParser.PARTIAL, 0); } + public TerminalNode REMOVE() { return getToken(CSharpParser.REMOVE, 0); } + public TerminalNode SELECT() { return getToken(CSharpParser.SELECT, 0); } + public TerminalNode SET() { return getToken(CSharpParser.SET, 0); } + public TerminalNode UNMANAGED() { return getToken(CSharpParser.UNMANAGED, 0); } + public TerminalNode VAR() { return getToken(CSharpParser.VAR, 0); } + public TerminalNode WHEN() { return getToken(CSharpParser.WHEN, 0); } + public TerminalNode WHERE() { return getToken(CSharpParser.WHERE, 0); } + public TerminalNode YIELD() { return getToken(CSharpParser.YIELD, 0); } + public IdentifierContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_identifier; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).enterIdentifier(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof CSharpParserListener ) ((CSharpParserListener)listener).exitIdentifier(this); + } + } + + public final IdentifierContext identifier() throws RecognitionException { + IdentifierContext _localctx = new IdentifierContext(_ctx, getState()); + enterRule(_localctx, 434, RULE_identifier); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(2639); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ADD) | (1L << ALIAS) | (1L << ARGLIST) | (1L << ASCENDING) | (1L << ASYNC) | (1L << AWAIT) | (1L << BY) | (1L << DESCENDING) | (1L << DYNAMIC) | (1L << EQUALS) | (1L << FROM) | (1L << GET) | (1L << GROUP) | (1L << INTO) | (1L << JOIN) | (1L << LET))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (NAMEOF - 64)) | (1L << (ON - 64)) | (1L << (ORDERBY - 64)) | (1L << (PARTIAL - 64)) | (1L << (REMOVE - 64)) | (1L << (SELECT - 64)) | (1L << (SET - 64)) | (1L << (UNMANAGED - 64)) | (1L << (VAR - 64)) | (1L << (WHEN - 64)) | (1L << (WHERE - 64)) | (1L << (YIELD - 64)) | (1L << (IDENTIFIER - 64)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 187: + return right_arrow_sempred((Right_arrowContext)_localctx, predIndex); + case 188: + return right_shift_sempred((Right_shiftContext)_localctx, predIndex); + case 189: + return right_shift_assignment_sempred((Right_shift_assignmentContext)_localctx, predIndex); + } + return true; + } + private boolean right_arrow_sempred(Right_arrowContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return (((Right_arrowContext)_localctx).first!=null?((Right_arrowContext)_localctx).first.getTokenIndex():0) + 1 == (((Right_arrowContext)_localctx).second!=null?((Right_arrowContext)_localctx).second.getTokenIndex():0); + } + return true; + } + private boolean right_shift_sempred(Right_shiftContext _localctx, int predIndex) { + switch (predIndex) { + case 1: + return (((Right_shiftContext)_localctx).first!=null?((Right_shiftContext)_localctx).first.getTokenIndex():0) + 1 == (((Right_shiftContext)_localctx).second!=null?((Right_shiftContext)_localctx).second.getTokenIndex():0); + } + return true; + } + private boolean right_shift_assignment_sempred(Right_shift_assignmentContext _localctx, int predIndex) { + switch (predIndex) { + case 2: + return (((Right_shift_assignmentContext)_localctx).first!=null?((Right_shift_assignmentContext)_localctx).first.getTokenIndex():0) + 1 == (((Right_shift_assignmentContext)_localctx).second!=null?((Right_shift_assignmentContext)_localctx).second.getTokenIndex():0); + } + return true; + } + + private static final int _serializedATNSegments = 2; + private static final String _serializedATNSegment0 = + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00c8\u0a54\4\2\t"+ + "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ + "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ + "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ + "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ + "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ + ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+ + "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+ + "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+ + "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+ + "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+ + "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\4i\ti\4j\tj\4k\t"+ + "k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4"+ + "w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t\u0080"+ + "\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084\4\u0085"+ + "\t\u0085\4\u0086\t\u0086\4\u0087\t\u0087\4\u0088\t\u0088\4\u0089\t\u0089"+ + "\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d\4\u008e"+ + "\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092\t\u0092"+ + "\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096\4\u0097"+ + "\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\4\u009b\t\u009b"+ + "\4\u009c\t\u009c\4\u009d\t\u009d\4\u009e\t\u009e\4\u009f\t\u009f\4\u00a0"+ + "\t\u00a0\4\u00a1\t\u00a1\4\u00a2\t\u00a2\4\u00a3\t\u00a3\4\u00a4\t\u00a4"+ + "\4\u00a5\t\u00a5\4\u00a6\t\u00a6\4\u00a7\t\u00a7\4\u00a8\t\u00a8\4\u00a9"+ + "\t\u00a9\4\u00aa\t\u00aa\4\u00ab\t\u00ab\4\u00ac\t\u00ac\4\u00ad\t\u00ad"+ + "\4\u00ae\t\u00ae\4\u00af\t\u00af\4\u00b0\t\u00b0\4\u00b1\t\u00b1\4\u00b2"+ + "\t\u00b2\4\u00b3\t\u00b3\4\u00b4\t\u00b4\4\u00b5\t\u00b5\4\u00b6\t\u00b6"+ + "\4\u00b7\t\u00b7\4\u00b8\t\u00b8\4\u00b9\t\u00b9\4\u00ba\t\u00ba\4\u00bb"+ + "\t\u00bb\4\u00bc\t\u00bc\4\u00bd\t\u00bd\4\u00be\t\u00be\4\u00bf\t\u00bf"+ + "\4\u00c0\t\u00c0\4\u00c1\t\u00c1\4\u00c2\t\u00c2\4\u00c3\t\u00c3\4\u00c4"+ + "\t\u00c4\4\u00c5\t\u00c5\4\u00c6\t\u00c6\4\u00c7\t\u00c7\4\u00c8\t\u00c8"+ + "\4\u00c9\t\u00c9\4\u00ca\t\u00ca\4\u00cb\t\u00cb\4\u00cc\t\u00cc\4\u00cd"+ + "\t\u00cd\4\u00ce\t\u00ce\4\u00cf\t\u00cf\4\u00d0\t\u00d0\4\u00d1\t\u00d1"+ + "\4\u00d2\t\u00d2\4\u00d3\t\u00d3\4\u00d4\t\u00d4\4\u00d5\t\u00d5\4\u00d6"+ + "\t\u00d6\4\u00d7\t\u00d7\4\u00d8\t\u00d8\4\u00d9\t\u00d9\4\u00da\t\u00da"+ + "\4\u00db\t\u00db\3\2\5\2\u01b8\n\2\3\2\5\2\u01bb\n\2\3\2\5\2\u01be\n\2"+ + "\3\2\7\2\u01c1\n\2\f\2\16\2\u01c4\13\2\3\2\5\2\u01c7\n\2\3\2\3\2\3\3\3"+ + "\3\5\3\u01cd\n\3\3\3\5\3\u01d0\n\3\3\3\3\3\3\3\5\3\u01d5\n\3\7\3\u01d7"+ + "\n\3\f\3\16\3\u01da\13\3\3\4\3\4\3\4\3\4\7\4\u01e0\n\4\f\4\16\4\u01e3"+ + "\13\4\3\5\3\5\3\5\3\5\3\5\5\5\u01ea\n\5\3\6\3\6\3\6\3\6\6\6\u01f0\n\6"+ + "\r\6\16\6\u01f1\3\6\3\6\3\7\3\7\5\7\u01f8\n\7\3\b\3\b\5\b\u01fc\n\b\3"+ + "\t\3\t\3\t\5\t\u0201\n\t\3\n\3\n\3\13\3\13\3\f\3\f\3\f\3\f\5\f\u020b\n"+ + "\f\3\r\3\r\3\r\3\r\7\r\u0211\n\r\f\r\16\r\u0214\13\r\3\r\3\r\3\16\3\16"+ + "\3\16\7\16\u021b\n\16\f\16\16\16\u021e\13\16\3\17\3\17\3\17\5\17\u0223"+ + "\n\17\3\17\5\17\u0226\n\17\3\17\3\17\5\17\u022a\n\17\3\17\3\17\3\20\3"+ + "\20\3\20\3\20\5\20\u0232\n\20\3\21\3\21\3\21\5\21\u0237\n\21\3\22\3\22"+ + "\3\22\3\22\3\22\3\22\3\22\3\22\5\22\u0241\n\22\3\23\3\23\3\23\3\23\3\23"+ + "\3\23\3\23\3\23\3\23\3\23\3\23\5\23\u024e\n\23\3\24\3\24\3\24\3\24\3\24"+ + "\3\24\5\24\u0256\n\24\3\25\3\25\3\25\3\25\5\25\u025c\n\25\5\25\u025e\n"+ + "\25\3\26\3\26\3\26\7\26\u0263\n\26\f\26\16\26\u0266\13\26\3\27\3\27\3"+ + "\27\7\27\u026b\n\27\f\27\16\27\u026e\13\27\3\30\3\30\3\30\7\30\u0273\n"+ + "\30\f\30\16\30\u0276\13\30\3\31\3\31\3\31\7\31\u027b\n\31\f\31\16\31\u027e"+ + "\13\31\3\32\3\32\3\32\7\32\u0283\n\32\f\32\16\32\u0286\13\32\3\33\3\33"+ + "\3\33\7\33\u028b\n\33\f\33\16\33\u028e\13\33\3\34\3\34\3\34\3\34\3\34"+ + "\3\34\3\34\7\34\u0297\n\34\f\34\16\34\u029a\13\34\3\35\3\35\3\35\5\35"+ + "\u029f\n\35\3\35\7\35\u02a2\n\35\f\35\16\35\u02a5\13\35\3\36\3\36\3\36"+ + "\7\36\u02aa\n\36\f\36\16\36\u02ad\13\36\3\37\3\37\3\37\7\37\u02b2\n\37"+ + "\f\37\16\37\u02b5\13\37\3 \3 \3 \3 \3 \5 \u02bc\n \5 \u02be\n \3 \5 \u02c1"+ + "\n \3!\3!\3!\7!\u02c6\n!\f!\16!\u02c9\13!\3\"\3\"\5\"\u02cd\n\"\3\"\3"+ + "\"\3\"\3#\3#\5#\u02d4\n#\3#\3#\5#\u02d8\n#\5#\u02da\n#\3$\3$\3$\3$\3$"+ + "\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\3$\5$\u02f6"+ + "\n$\3%\3%\5%\u02fa\n%\3%\7%\u02fd\n%\f%\16%\u0300\13%\3%\5%\u0303\n%\3"+ + "%\3%\3%\3%\3%\3%\5%\u030b\n%\3%\5%\u030e\n%\3%\7%\u0311\n%\f%\16%\u0314"+ + "\13%\3%\5%\u0317\n%\7%\u0319\n%\f%\16%\u031c\13%\3&\3&\3&\5&\u0321\n&"+ + "\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\5&\u032f\n&\3&\3&\3&\3&\5&\u0335"+ + "\n&\3&\3&\3&\3&\3&\3&\3&\3&\7&\u033f\n&\f&\16&\u0342\13&\3&\5&\u0345\n"+ + "&\3&\6&\u0348\n&\r&\16&\u0349\3&\3&\5&\u034e\n&\3&\3&\3&\3&\5&\u0354\n"+ + "&\3&\3&\3&\3&\6&\u035a\n&\r&\16&\u035b\3&\3&\3&\3&\3&\3&\3&\5&\u0365\n"+ + "&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\5&\u0377\n&\3&\5&\u037a"+ + "\n&\3&\3&\3&\5&\u037f\n&\3&\5&\u0382\n&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&"+ + "\3&\7&\u038f\n&\f&\16&\u0392\13&\3&\3&\3&\5&\u0397\n&\3\'\3\'\5\'\u039b"+ + "\n\'\3(\3(\3(\3)\5)\u03a1\n)\3)\3)\3)\5)\u03a6\n)\3*\5*\u03a9\n*\3*\3"+ + "*\3*\3*\7*\u03af\n*\f*\16*\u03b2\13*\3*\3*\3+\3+\3+\5+\u03b9\n+\3+\3+"+ + "\3,\3,\3-\3-\3-\7-\u03c2\n-\f-\16-\u03c5\13-\3.\3.\5.\u03c9\n.\3/\3/\3"+ + "/\5/\u03ce\n/\5/\u03d0\n/\3/\3/\3\60\3\60\3\60\7\60\u03d7\n\60\f\60\16"+ + "\60\u03da\13\60\3\61\3\61\3\61\3\61\3\61\5\61\u03e1\n\61\3\61\3\61\3\61"+ + "\3\62\3\62\5\62\u03e8\n\62\3\63\3\63\3\63\3\63\7\63\u03ee\n\63\f\63\16"+ + "\63\u03f1\13\63\3\63\5\63\u03f4\n\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64"+ + "\5\64\u03fd\n\64\3\65\3\65\3\65\5\65\u0402\n\65\5\65\u0404\n\65\3\65\3"+ + "\65\3\66\3\66\3\66\7\66\u040b\n\66\f\66\16\66\u040e\13\66\3\67\3\67\3"+ + "\67\3\67\3\67\5\67\u0415\n\67\38\38\58\u0419\n8\38\38\38\58\u041e\n8\5"+ + "8\u0420\n8\38\38\38\58\u0425\n8\78\u0427\n8\f8\168\u042a\138\39\39\79"+ + "\u042e\n9\f9\169\u0431\139\39\39\3:\3:\3:\7:\u0438\n:\f:\16:\u043b\13"+ + ":\3:\5:\u043e\n:\3:\5:\u0441\n:\3:\5:\u0444\n:\3;\3;\3;\3;\7;\u044a\n"+ + ";\f;\16;\u044d\13;\3;\3;\3<\3<\3<\3<\3=\5=\u0456\n=\3=\3=\3=\3=\3>\3>"+ + "\3>\3>\3>\3>\3>\3>\3>\3>\3>\5>\u0467\n>\3?\3?\3?\7?\u046c\n?\f?\16?\u046f"+ + "\13?\3@\5@\u0472\n@\3@\3@\3@\3A\3A\3A\7A\u047a\nA\fA\16A\u047d\13A\3B"+ + "\3B\5B\u0481\nB\3C\3C\3C\3D\3D\5D\u0488\nD\3D\3D\3D\3D\3E\7E\u048f\nE"+ + "\fE\16E\u0492\13E\3E\3E\5E\u0496\nE\3F\3F\3F\3F\3F\5F\u049d\nF\3G\3G\3"+ + "G\3G\3G\3H\3H\3H\3I\3I\5I\u04a9\nI\3I\3I\3I\3I\3I\3I\3I\3I\3I\5I\u04b4"+ + "\nI\3J\3J\3J\3J\7J\u04ba\nJ\fJ\16J\u04bd\13J\3K\3K\5K\u04c1\nK\3L\3L\3"+ + "L\3L\3L\3L\3L\5L\u04ca\nL\3M\3M\3M\3M\3N\3N\3N\5N\u04d3\nN\3O\3O\3O\3"+ + "O\3O\3O\3O\5O\u04dc\nO\3P\3P\3P\3Q\5Q\u04e2\nQ\3Q\3Q\3Q\5Q\u04e7\nQ\3"+ + "Q\3Q\5Q\u04eb\nQ\3Q\3Q\5Q\u04ef\nQ\3R\3R\5R\u04f3\nR\3R\3R\5R\u04f7\n"+ + "R\3S\3S\3S\3S\3S\5S\u04fe\nS\3T\3T\3T\3T\3U\3U\5U\u0506\nU\3V\3V\3V\3"+ + "V\3V\3V\3V\3V\3V\3V\3V\5V\u0513\nV\3V\3V\3V\3V\3V\3V\7V\u051b\nV\fV\16"+ + "V\u051e\13V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\5"+ + "V\u0533\nV\3V\3V\5V\u0537\nV\3V\3V\5V\u053b\nV\3V\3V\3V\5V\u0540\nV\3"+ + "V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\5V\u0554\nV\3V\3"+ + "V\3V\5V\u0559\nV\3V\3V\3V\5V\u055e\nV\3V\3V\3V\3V\3V\5V\u0565\nV\3V\5"+ + "V\u0568\nV\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\3"+ + "V\5V\u057e\nV\3V\3V\3V\3V\3V\3V\3V\3V\3V\3V\5V\u058a\nV\3W\3W\5W\u058e"+ + "\nW\3W\3W\3X\3X\3X\3X\5X\u0596\nX\3X\3X\3X\3X\7X\u059c\nX\fX\16X\u059f"+ + "\13X\3X\3X\3X\3X\5X\u05a5\nX\3Y\3Y\5Y\u05a9\nY\3Z\3Z\3Z\5Z\u05ae\nZ\3"+ + "Z\5Z\u05b1\nZ\3[\3[\3[\5[\u05b6\n[\3\\\3\\\3\\\3\\\3]\3]\5]\u05be\n]\3"+ + "^\6^\u05c1\n^\r^\16^\u05c2\3^\3^\3_\3_\3_\5_\u05ca\n_\3_\3_\3_\3_\5_\u05d0"+ + "\n_\3`\3`\3`\3a\6a\u05d6\na\ra\16a\u05d7\3b\3b\3b\3b\7b\u05de\nb\fb\16"+ + "b\u05e1\13b\5b\u05e3\nb\3c\3c\3c\7c\u05e8\nc\fc\16c\u05eb\13c\3d\3d\7"+ + "d\u05ef\nd\fd\16d\u05f2\13d\3d\5d\u05f5\nd\3d\5d\u05f8\nd\3e\3e\3e\3e"+ + "\5e\u05fe\ne\3e\3e\5e\u0602\ne\3e\3e\3f\3f\5f\u0608\nf\3f\3f\3g\3g\3g"+ + "\3g\3g\3h\3h\3h\3i\3i\5i\u0616\ni\3j\3j\3j\3j\5j\u061c\nj\3k\3k\3k\7k"+ + "\u0621\nk\fk\16k\u0624\13k\3l\3l\5l\u0628\nl\3l\5l\u062b\nl\3l\5l\u062e"+ + "\nl\3l\3l\3m\6m\u0633\nm\rm\16m\u0634\3n\3n\3n\3n\3n\3o\6o\u063d\no\r"+ + "o\16o\u063e\3p\3p\3p\3p\3p\3p\3p\3p\3p\3p\3p\3p\3p\3p\3p\5p\u0650\np\3"+ + "q\6q\u0653\nq\rq\16q\u0654\3r\3r\5r\u0659\nr\3s\5s\u065c\ns\3s\5s\u065f"+ + "\ns\3s\3s\3s\3s\3s\5s\u0666\ns\3t\3t\3t\3t\5t\u066c\nt\3u\3u\3u\3u\7u"+ + "\u0672\nu\fu\16u\u0675\13u\3u\3u\3v\5v\u067a\nv\3v\3v\3w\3w\3w\3w\7w\u0682"+ + "\nw\fw\16w\u0685\13w\3x\3x\3x\7x\u068a\nx\fx\16x\u068d\13x\3y\6y\u0690"+ + "\ny\ry\16y\u0691\3z\3z\3z\3z\3z\3{\3{\3{\3{\5{\u069d\n{\3{\3{\5{\u06a1"+ + "\n{\5{\u06a3\n{\3|\3|\3|\5|\u06a8\n|\3|\3|\5|\u06ac\n|\3}\3}\3}\7}\u06b1"+ + "\n}\f}\16}\u06b4\13}\3~\3~\3~\3~\3\177\3\177\5\177\u06bc\n\177\3\177\3"+ + "\177\3\u0080\6\u0080\u06c1\n\u0080\r\u0080\16\u0080\u06c2\3\u0081\5\u0081"+ + "\u06c6\n\u0081\3\u0081\5\u0081\u06c9\n\u0081\3\u0081\3\u0081\5\u0081\u06cd"+ + "\n\u0081\3\u0082\6\u0082\u06d0\n\u0082\r\u0082\16\u0082\u06d1\3\u0083"+ + "\3\u0083\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084"+ + "\3\u0084\5\u0084\u06df\n\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084"+ + "\3\u0084\3\u0084\3\u0084\5\u0084\u06e9\n\u0084\3\u0085\3\u0085\3\u0085"+ + "\3\u0085\3\u0085\5\u0085\u06f0\n\u0085\3\u0085\3\u0085\3\u0085\3\u0085"+ + "\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\3\u0085\5\u0085\u06fc\n\u0085"+ + "\3\u0086\3\u0086\3\u0086\7\u0086\u0701\n\u0086\f\u0086\16\u0086\u0704"+ + "\13\u0086\3\u0087\3\u0087\3\u0087\3\u0087\3\u0088\3\u0088\3\u0088\7\u0088"+ + "\u070d\n\u0088\f\u0088\16\u0088\u0710\13\u0088\3\u0089\3\u0089\3\u0089"+ + "\5\u0089\u0715\n\u0089\3\u008a\3\u008a\5\u008a\u0719\n\u008a\3\u008b\3"+ + "\u008b\5\u008b\u071d\n\u008b\3\u008c\3\u008c\3\u008d\3\u008d\5\u008d\u0723"+ + "\n\u008d\3\u008e\3\u008e\3\u008e\3\u008e\5\u008e\u0729\n\u008e\5\u008e"+ + "\u072b\n\u008e\3\u008f\3\u008f\3\u008f\7\u008f\u0730\n\u008f\f\u008f\16"+ + "\u008f\u0733\13\u008f\3\u0090\5\u0090\u0736\n\u0090\3\u0090\5\u0090\u0739"+ + "\n\u0090\3\u0090\3\u0090\5\u0090\u073d\n\u0090\3\u0091\3\u0091\3\u0091"+ + "\3\u0091\3\u0091\3\u0091\3\u0091\3\u0091\5\u0091\u0747\n\u0091\3\u0092"+ + "\5\u0092\u074a\n\u0092\3\u0092\3\u0092\3\u0092\3\u0092\3\u0093\5\u0093"+ + "\u0751\n\u0093\3\u0093\5\u0093\u0754\n\u0093\3\u0093\3\u0093\3\u0093\5"+ + "\u0093\u0759\n\u0093\3\u0093\3\u0093\3\u0093\5\u0093\u075e\n\u0093\5\u0093"+ + "\u0760\n\u0093\3\u0094\5\u0094\u0763\n\u0094\3\u0094\5\u0094\u0766\n\u0094"+ + "\3\u0094\3\u0094\3\u0094\3\u0095\5\u0095\u076c\n\u0095\3\u0095\5\u0095"+ + "\u076f\n\u0095\3\u0095\3\u0095\3\u0095\3\u0096\3\u0096\3\u0096\3\u0096"+ + "\3\u0096\3\u0096\3\u0096\5\u0096\u077b\n\u0096\3\u0097\3\u0097\5\u0097"+ + "\u077f\n\u0097\3\u0098\5\u0098\u0782\n\u0098\3\u0098\3\u0098\3\u0098\3"+ + "\u0098\3\u0098\3\u0098\3\u0098\3\u0098\5\u0098\u078c\n\u0098\3\u0099\5"+ + "\u0099\u078f\n\u0099\3\u0099\3\u0099\3\u0099\3\u009a\5\u009a\u0795\n\u009a"+ + "\3\u009a\3\u009a\3\u009a\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b"+ + "\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b"+ + "\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\3\u009b\5\u009b\u07b0"+ + "\n\u009b\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009c\3\u009d"+ + "\3\u009d\3\u009d\3\u009d\5\u009d\u07bd\n\u009d\3\u009d\3\u009d\3\u009e"+ + "\3\u009e\5\u009e\u07c3\n\u009e\3\u009f\3\u009f\3\u009f\3\u00a0\3\u00a0"+ + "\7\u00a0\u07ca\n\u00a0\f\u00a0\16\u00a0\u07cd\13\u00a0\3\u00a0\3\u00a0"+ + "\3\u00a1\5\u00a1\u07d2\n\u00a1\3\u00a1\5\u00a1\u07d5\n\u00a1\3\u00a1\3"+ + "\u00a1\3\u00a1\3\u00a1\6\u00a1\u07db\n\u00a1\r\u00a1\16\u00a1\u07dc\3"+ + "\u00a1\3\u00a1\5\u00a1\u07e1\n\u00a1\3\u00a2\3\u00a2\7\u00a2\u07e5\n\u00a2"+ + "\f\u00a2\16\u00a2\u07e8\13\u00a2\3\u00a2\6\u00a2\u07eb\n\u00a2\r\u00a2"+ + "\16\u00a2\u07ec\3\u00a3\3\u00a3\7\u00a3\u07f1\n\u00a3\f\u00a3\16\u00a3"+ + "\u07f4\13\u00a3\3\u00a3\3\u00a3\3\u00a4\3\u00a4\3\u00a4\3\u00a4\7\u00a4"+ + "\u07fc\n\u00a4\f\u00a4\16\u00a4\u07ff\13\u00a4\3\u00a4\5\u00a4\u0802\n"+ + "\u00a4\5\u00a4\u0804\n\u00a4\3\u00a4\3\u00a4\3\u00a5\3\u00a5\3\u00a5\3"+ + "\u00a5\7\u00a5\u080c\n\u00a5\f\u00a5\16\u00a5\u080f\13\u00a5\3\u00a5\3"+ + "\u00a5\3\u00a6\5\u00a6\u0814\n\u00a6\3\u00a6\5\u00a6\u0817\n\u00a6\3\u00a6"+ + "\3\u00a6\3\u00a7\3\u00a7\3\u00a8\3\u00a8\3\u00a8\3\u00a9\3\u00a9\7\u00a9"+ + "\u0822\n\u00a9\f\u00a9\16\u00a9\u0825\13\u00a9\3\u00a9\3\u00a9\3\u00aa"+ + "\5\u00aa\u082a\n\u00aa\3\u00aa\5\u00aa\u082d\n\u00aa\3\u00aa\5\u00aa\u0830"+ + "\n\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u0837\n\u00aa"+ + "\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u083c\n\u00aa\3\u00aa\3\u00aa\5\u00aa"+ + "\u0840\n\u00aa\3\u00aa\3\u00aa\5\u00aa\u0844\n\u00aa\3\u00aa\3\u00aa\3"+ + "\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa"+ + "\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u0855\n\u00aa\3\u00aa\5\u00aa"+ + "\u0858\n\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u085d\n\u00aa\3\u00aa\3"+ + "\u00aa\5\u00aa\u0861\n\u00aa\3\u00aa\3\u00aa\5\u00aa\u0865\n\u00aa\3\u00aa"+ + "\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\3\u00aa\5\u00aa\u086e\n\u00aa"+ + "\3\u00ab\5\u00ab\u0871\n\u00ab\3\u00ab\3\u00ab\3\u00ab\5\u00ab\u0876\n"+ + "\u00ab\3\u00ab\3\u00ab\5\u00ab\u087a\n\u00ab\3\u00ab\3\u00ab\3\u00ab\5"+ + "\u00ab\u087f\n\u00ab\3\u00ab\3\u00ab\5\u00ab\u0883\n\u00ab\5\u00ab\u0885"+ + "\n\u00ab\3\u00ac\3\u00ac\3\u00ac\3\u00ad\3\u00ad\3\u00ad\3\u00ad\7\u00ad"+ + "\u088e\n\u00ad\f\u00ad\16\u00ad\u0891\13\u00ad\3\u00ad\5\u00ad\u0894\n"+ + "\u00ad\5\u00ad\u0896\n\u00ad\3\u00ad\3\u00ad\3\u00ae\5\u00ae\u089b\n\u00ae"+ + "\3\u00ae\3\u00ae\3\u00ae\5\u00ae\u08a0\n\u00ae\3\u00af\3\u00af\3\u00af"+ + "\3\u00af\3\u00af\5\u00af\u08a7\n\u00af\3\u00af\3\u00af\3\u00b0\3\u00b0"+ + "\5\u00b0\u08ad\n\u00b0\3\u00b1\6\u00b1\u08b0\n\u00b1\r\u00b1\16\u00b1"+ + "\u08b1\3\u00b2\3\u00b2\3\u00b2\3\u00b2\5\u00b2\u08b8\n\u00b2\3\u00b2\3"+ + "\u00b2\5\u00b2\u08bc\n\u00b2\3\u00b2\3\u00b2\3\u00b3\3\u00b3\5\u00b3\u08c2"+ + "\n\u00b3\3\u00b4\3\u00b4\3\u00b4\7\u00b4\u08c7\n\u00b4\f\u00b4\16\u00b4"+ + "\u08ca\13\u00b4\3\u00b5\3\u00b5\3\u00b5\3\u00b5\3\u00b5\7\u00b5\u08d1"+ + "\n\u00b5\f\u00b5\16\u00b5\u08d4\13\u00b5\5\u00b5\u08d6\n\u00b5\3\u00b5"+ + "\5\u00b5\u08d9\n\u00b5\3\u00b6\3\u00b6\3\u00b6\5\u00b6\u08de\n\u00b6\3"+ + "\u00b6\3\u00b6\3\u00b7\3\u00b7\5\u00b7\u08e4\n\u00b7\3\u00b7\3\u00b7\7"+ + "\u00b7\u08e8\n\u00b7\f\u00b7\16\u00b7\u08eb\13\u00b7\3\u00b7\3\u00b7\3"+ + "\u00b7\3\u00b7\5\u00b7\u08f1\n\u00b7\3\u00b8\3\u00b8\3\u00b8\7\u00b8\u08f6"+ + "\n\u00b8\f\u00b8\16\u00b8\u08f9\13\u00b8\3\u00b9\3\u00b9\3\u00b9\3\u00b9"+ + "\3\u00ba\5\u00ba\u0900\n\u00ba\3\u00ba\3\u00ba\5\u00ba\u0904\n\u00ba\3"+ + "\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bb\3\u00bc\3\u00bc\3\u00bc\3\u00bc"+ + "\3\u00bc\3\u00bc\3\u00bc\3\u00bc\5\u00bc\u0913\n\u00bc\3\u00bc\3\u00bc"+ + "\5\u00bc\u0917\n\u00bc\3\u00bc\3\u00bc\3\u00bc\3\u00bc\3\u00bc\7\u00bc"+ + "\u091e\n\u00bc\f\u00bc\16\u00bc\u0921\13\u00bc\3\u00bc\5\u00bc\u0924\n"+ + "\u00bc\3\u00bc\3\u00bc\5\u00bc\u0928\n\u00bc\3\u00bd\3\u00bd\3\u00bd\3"+ + "\u00bd\3\u00be\3\u00be\3\u00be\3\u00be\3\u00bf\3\u00bf\3\u00bf\3\u00bf"+ + "\3\u00c0\3\u00c0\3\u00c0\3\u00c0\3\u00c0\3\u00c0\3\u00c0\3\u00c0\5\u00c0"+ + "\u093e\n\u00c0\3\u00c1\3\u00c1\3\u00c2\3\u00c2\3\u00c2\3\u00c2\5\u00c2"+ + "\u0946\n\u00c2\3\u00c3\3\u00c3\7\u00c3\u094a\n\u00c3\f\u00c3\16\u00c3"+ + "\u094d\13\u00c3\3\u00c3\3\u00c3\3\u00c4\3\u00c4\7\u00c4\u0953\n\u00c4"+ + "\f\u00c4\16\u00c4\u0956\13\u00c4\3\u00c4\3\u00c4\3\u00c5\3\u00c5\3\u00c5"+ + "\3\u00c5\5\u00c5\u095e\n\u00c5\3\u00c6\3\u00c6\3\u00c6\3\u00c6\5\u00c6"+ + "\u0964\n\u00c6\3\u00c7\3\u00c7\3\u00c7\7\u00c7\u0969\n\u00c7\f\u00c7\16"+ + "\u00c7\u096c\13\u00c7\3\u00c7\3\u00c7\6\u00c7\u0970\n\u00c7\r\u00c7\16"+ + "\u00c7\u0971\5\u00c7\u0974\n\u00c7\3\u00c8\3\u00c8\3\u00c9\3\u00c9\3\u00c9"+ + "\5\u00c9\u097b\n\u00c9\3\u00c9\5\u00c9\u097e\n\u00c9\3\u00c9\5\u00c9\u0981"+ + "\n\u00c9\3\u00c9\3\u00c9\5\u00c9\u0985\n\u00c9\3\u00ca\5\u00ca\u0988\n"+ + "\u00ca\3\u00ca\3\u00ca\3\u00ca\5\u00ca\u098d\n\u00ca\3\u00ca\5\u00ca\u0990"+ + "\n\u00ca\3\u00ca\5\u00ca\u0993\n\u00ca\3\u00ca\3\u00ca\5\u00ca\u0997\n"+ + "\u00ca\3\u00cb\3\u00cb\3\u00cb\5\u00cb\u099c\n\u00cb\3\u00cb\5\u00cb\u099f"+ + "\n\u00cb\3\u00cb\5\u00cb\u09a2\n\u00cb\3\u00cb\3\u00cb\5\u00cb\u09a6\n"+ + "\u00cb\3\u00cc\3\u00cc\3\u00cc\5\u00cc\u09ab\n\u00cc\3\u00cc\3\u00cc\5"+ + "\u00cc\u09af\n\u00cc\3\u00cd\3\u00cd\3\u00cd\3\u00cd\5\u00cd\u09b5\n\u00cd"+ + "\3\u00cd\3\u00cd\5\u00cd\u09b9\n\u00cd\3\u00cd\3\u00cd\5\u00cd\u09bd\n"+ + "\u00cd\3\u00cd\3\u00cd\3\u00ce\3\u00ce\3\u00ce\3\u00ce\3\u00ce\3\u00ce"+ + "\3\u00ce\3\u00ce\3\u00ce\3\u00ce\5\u00ce\u09cb\n\u00ce\3\u00cf\3\u00cf"+ + "\3\u00cf\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d0"+ + "\5\u00d0\u09d8\n\u00d0\3\u00d0\3\u00d0\3\u00d0\3\u00d0\5\u00d0\u09de\n"+ + "\u00d0\3\u00d1\3\u00d1\3\u00d1\3\u00d1\3\u00d1\3\u00d2\3\u00d2\3\u00d2"+ + "\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2\3\u00d2"+ + "\5\u00d2\u09f1\n\u00d2\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3\3\u00d3"+ + "\3\u00d4\3\u00d4\3\u00d4\5\u00d4\u09fc\n\u00d4\3\u00d4\3\u00d4\5\u00d4"+ + "\u0a00\n\u00d4\3\u00d4\3\u00d4\3\u00d5\3\u00d5\5\u00d5\u0a06\n\u00d5\3"+ + "\u00d5\3\u00d5\5\u00d5\u0a0a\n\u00d5\3\u00d5\3\u00d5\5\u00d5\u0a0e\n\u00d5"+ + "\3\u00d5\3\u00d5\3\u00d5\3\u00d5\3\u00d5\5\u00d5\u0a15\n\u00d5\3\u00d6"+ + "\3\u00d6\3\u00d6\3\u00d6\3\u00d6\5\u00d6\u0a1c\n\u00d6\3\u00d6\5\u00d6"+ + "\u0a1f\n\u00d6\3\u00d6\3\u00d6\7\u00d6\u0a23\n\u00d6\f\u00d6\16\u00d6"+ + "\u0a26\13\u00d6\3\u00d7\3\u00d7\3\u00d7\3\u00d7\5\u00d7\u0a2c\n\u00d7"+ + "\3\u00d7\3\u00d7\3\u00d7\5\u00d7\u0a31\n\u00d7\3\u00d7\5\u00d7\u0a34\n"+ + "\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7\3\u00d7\5\u00d7\u0a3c\n"+ + "\u00d7\3\u00d8\3\u00d8\3\u00d8\3\u00d8\5\u00d8\u0a42\n\u00d8\3\u00d9\3"+ + "\u00d9\5\u00d9\u0a46\n\u00d9\3\u00d9\3\u00d9\3\u00da\3\u00da\5\u00da\u0a4c"+ + "\n\u00da\3\u00da\3\u00da\5\u00da\u0a50\n\u00da\3\u00db\3\u00db\3\u00db"+ + "\2\2\u00dc\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\66"+ + "8:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a"+ + "\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2"+ + "\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba"+ + "\u00bc\u00be\u00c0\u00c2\u00c4\u00c6\u00c8\u00ca\u00cc\u00ce\u00d0\u00d2"+ + "\u00d4\u00d6\u00d8\u00da\u00dc\u00de\u00e0\u00e2\u00e4\u00e6\u00e8\u00ea"+ + "\u00ec\u00ee\u00f0\u00f2\u00f4\u00f6\u00f8\u00fa\u00fc\u00fe\u0100\u0102"+ + "\u0104\u0106\u0108\u010a\u010c\u010e\u0110\u0112\u0114\u0116\u0118\u011a"+ + "\u011c\u011e\u0120\u0122\u0124\u0126\u0128\u012a\u012c\u012e\u0130\u0132"+ + "\u0134\u0136\u0138\u013a\u013c\u013e\u0140\u0142\u0144\u0146\u0148\u014a"+ + "\u014c\u014e\u0150\u0152\u0154\u0156\u0158\u015a\u015c\u015e\u0160\u0162"+ + "\u0164\u0166\u0168\u016a\u016c\u016e\u0170\u0172\u0174\u0176\u0178\u017a"+ + "\u017c\u017e\u0180\u0182\u0184\u0186\u0188\u018a\u018c\u018e\u0190\u0192"+ + "\u0194\u0196\u0198\u019a\u019c\u019e\u01a0\u01a2\u01a4\u01a6\u01a8\u01aa"+ + "\u01ac\u01ae\u01b0\u01b2\u01b4\2\25\n\2\27\27\32\3299AAUUYYefjj\4\2$$"+ + "//\5\288JJRR\3\2\u009e\u009f\4\2\u0094\u0095\u00a0\u00a1\3\2\u0089\u008a"+ + "\3\2\u008b\u008d\20\2\24\24\27\27\32\32\37\37$$//99AAFFUUYY]]efjj\4\2"+ + "\20\20\"\"\4\2\21\21ii\16\2\13\13\21\21++;;DDKKMQVV\\\\iimmoo\4\2**\67"+ + "\67\4\2\23\23``\4\2\u008b\u008b\u0096\u0096\4\288JJ\4\2,,bb\25\2\13\13"+ + "\17\17\23\25\27!#$&\')\61\64\64\66;==@ACFHHJLNRTVYkmorr\3\2QR\26\2\f\16"+ + "\20\22\26\26\"\"%%((\62\63\65\65<<>?BBGGIIMMSSWXhhllpqst\2\u0b62\2\u01b7"+ + "\3\2\2\2\4\u01cf\3\2\2\2\6\u01db\3\2\2\2\b\u01e9\3\2\2\2\n\u01eb\3\2\2"+ + "\2\f\u01f5\3\2\2\2\16\u01fb\3\2\2\2\20\u0200\3\2\2\2\22\u0202\3\2\2\2"+ + "\24\u0204\3\2\2\2\26\u020a\3\2\2\2\30\u020c\3\2\2\2\32\u0217\3\2\2\2\34"+ + "\u0222\3\2\2\2\36\u0231\3\2\2\2 \u0236\3\2\2\2\"\u0240\3\2\2\2$\u024d"+ + "\3\2\2\2&\u024f\3\2\2\2(\u0257\3\2\2\2*\u025f\3\2\2\2,\u0267\3\2\2\2."+ + "\u026f\3\2\2\2\60\u0277\3\2\2\2\62\u027f\3\2\2\2\64\u0287\3\2\2\2\66\u028f"+ + "\3\2\2\28\u029b\3\2\2\2:\u02a6\3\2\2\2<\u02ae\3\2\2\2>\u02b6\3\2\2\2@"+ + "\u02c2\3\2\2\2B\u02ca\3\2\2\2D\u02d9\3\2\2\2F\u02f5\3\2\2\2H\u02f7\3\2"+ + "\2\2J\u0396\3\2\2\2L\u039a\3\2\2\2N\u039c\3\2\2\2P\u03a0\3\2\2\2R\u03a8"+ + "\3\2\2\2T\u03b8\3\2\2\2V\u03bc\3\2\2\2X\u03be\3\2\2\2Z\u03c8\3\2\2\2\\"+ + "\u03ca\3\2\2\2^\u03d3\3\2\2\2`\u03e0\3\2\2\2b\u03e7\3\2\2\2d\u03e9\3\2"+ + "\2\2f\u03fc\3\2\2\2h\u03fe\3\2\2\2j\u0407\3\2\2\2l\u0414\3\2\2\2n\u0416"+ + "\3\2\2\2p\u042b\3\2\2\2r\u0434\3\2\2\2t\u0445\3\2\2\2v\u0450\3\2\2\2x"+ + "\u0455\3\2\2\2z\u0466\3\2\2\2|\u0468\3\2\2\2~\u0471\3\2\2\2\u0080\u0476"+ + "\3\2\2\2\u0082\u0480\3\2\2\2\u0084\u0482\3\2\2\2\u0086\u0485\3\2\2\2\u0088"+ + "\u0490\3\2\2\2\u008a\u049c\3\2\2\2\u008c\u049e\3\2\2\2\u008e\u04a3\3\2"+ + "\2\2\u0090\u04a6\3\2\2\2\u0092\u04b5\3\2\2\2\u0094\u04be\3\2\2\2\u0096"+ + "\u04c9\3\2\2\2\u0098\u04cb\3\2\2\2\u009a\u04d2\3\2\2\2\u009c\u04db\3\2"+ + "\2\2\u009e\u04dd\3\2\2\2\u00a0\u04e1\3\2\2\2\u00a2\u04f6\3\2\2\2\u00a4"+ + "\u04fd\3\2\2\2\u00a6\u04ff\3\2\2\2\u00a8\u0505\3\2\2\2\u00aa\u0589\3\2"+ + "\2\2\u00ac\u058b\3\2\2\2\u00ae\u05a4\3\2\2\2\u00b0\u05a8\3\2\2\2\u00b2"+ + "\u05aa\3\2\2\2\u00b4\u05b5\3\2\2\2\u00b6\u05b7\3\2\2\2\u00b8\u05bd\3\2"+ + "\2\2\u00ba\u05c0\3\2\2\2\u00bc\u05cf\3\2\2\2\u00be\u05d1\3\2\2\2\u00c0"+ + "\u05d5\3\2\2\2\u00c2\u05e2\3\2\2\2\u00c4\u05e4\3\2\2\2\u00c6\u05f7\3\2"+ + "\2\2\u00c8\u05f9\3\2\2\2\u00ca\u0605\3\2\2\2\u00cc\u060b\3\2\2\2\u00ce"+ + "\u0610\3\2\2\2\u00d0\u0615\3\2\2\2\u00d2\u0617\3\2\2\2\u00d4\u061d\3\2"+ + "\2\2\u00d6\u0625\3\2\2\2\u00d8\u0632\3\2\2\2\u00da\u0636\3\2\2\2\u00dc"+ + "\u063c\3\2\2\2\u00de\u064f\3\2\2\2\u00e0\u0652\3\2\2\2\u00e2\u0658\3\2"+ + "\2\2\u00e4\u065b\3\2\2\2\u00e6\u0667\3\2\2\2\u00e8\u066d\3\2\2\2\u00ea"+ + "\u0679\3\2\2\2\u00ec\u067d\3\2\2\2\u00ee\u0686\3\2\2\2\u00f0\u068f\3\2"+ + "\2\2\u00f2\u0693\3\2\2\2\u00f4\u06a2\3\2\2\2\u00f6\u06ab\3\2\2\2\u00f8"+ + "\u06ad\3\2\2\2\u00fa\u06b5\3\2\2\2\u00fc\u06b9\3\2\2\2\u00fe\u06c0\3\2"+ + "\2\2\u0100\u06c5\3\2\2\2\u0102\u06cf\3\2\2\2\u0104\u06d3\3\2\2\2\u0106"+ + "\u06e8\3\2\2\2\u0108\u06ef\3\2\2\2\u010a\u06fd\3\2\2\2\u010c\u0705\3\2"+ + "\2\2\u010e\u0709\3\2\2\2\u0110\u0711\3\2\2\2\u0112\u0718\3\2\2\2\u0114"+ + "\u071c\3\2\2\2\u0116\u071e\3\2\2\2\u0118\u0722\3\2\2\2\u011a\u072a\3\2"+ + "\2\2\u011c\u072c\3\2\2\2\u011e\u073c\3\2\2\2\u0120\u0746\3\2\2\2\u0122"+ + "\u0749\3\2\2\2\u0124\u0750\3\2\2\2\u0126\u0762\3\2\2\2\u0128\u076b\3\2"+ + "\2\2\u012a\u077a\3\2\2\2\u012c\u077e\3\2\2\2\u012e\u0781\3\2\2\2\u0130"+ + "\u078e\3\2\2\2\u0132\u0794\3\2\2\2\u0134\u07af\3\2\2\2\u0136\u07b1\3\2"+ + "\2\2\u0138\u07b8\3\2\2\2\u013a\u07c2\3\2\2\2\u013c\u07c4\3\2\2\2\u013e"+ + "\u07c7\3\2\2\2\u0140\u07d1\3\2\2\2\u0142\u07e2\3\2\2\2\u0144\u07ee\3\2"+ + "\2\2\u0146\u07f7\3\2\2\2\u0148\u0807\3\2\2\2\u014a\u0813\3\2\2\2\u014c"+ + "\u081a\3\2\2\2\u014e\u081c\3\2\2\2\u0150\u081f\3\2\2\2\u0152\u0829\3\2"+ + "\2\2\u0154\u0870\3\2\2\2\u0156\u0886\3\2\2\2\u0158\u0889\3\2\2\2\u015a"+ + "\u089a\3\2\2\2\u015c\u08a1\3\2\2\2\u015e\u08ac\3\2\2\2\u0160\u08af\3\2"+ + "\2\2\u0162\u08b3\3\2\2\2\u0164\u08c1\3\2\2\2\u0166\u08c3\3\2\2\2\u0168"+ + "\u08cb\3\2\2\2\u016a\u08dd\3\2\2\2\u016c\u08f0\3\2\2\2\u016e\u08f2\3\2"+ + "\2\2\u0170\u08fa\3\2\2\2\u0172\u0903\3\2\2\2\u0174\u0905\3\2\2\2\u0176"+ + "\u0927\3\2\2\2\u0178\u0929\3\2\2\2\u017a\u092d\3\2\2\2\u017c\u0931\3\2"+ + "\2\2\u017e\u093d\3\2\2\2\u0180\u093f\3\2\2\2\u0182\u0945\3\2\2\2\u0184"+ + "\u0947\3\2\2\2\u0186\u0950\3\2\2\2\u0188\u095d\3\2\2\2\u018a\u0963\3\2"+ + "\2\2\u018c\u0965\3\2\2\2\u018e\u0975\3\2\2\2\u0190\u0977\3\2\2\2\u0192"+ + "\u0987\3\2\2\2\u0194\u0998\3\2\2\2\u0196\u09a7\3\2\2\2\u0198\u09b0\3\2"+ + "\2\2\u019a\u09c0\3\2\2\2\u019c\u09cc\3\2\2\2\u019e\u09cf\3\2\2\2\u01a0"+ + "\u09df\3\2\2\2\u01a2\u09e4\3\2\2\2\u01a4\u09f2\3\2\2\2\u01a6\u09f8\3\2"+ + "\2\2\u01a8\u0a03\3\2\2\2\u01aa\u0a1b\3\2\2\2\u01ac\u0a27\3\2\2\2\u01ae"+ + "\u0a3d\3\2\2\2\u01b0\u0a43\3\2\2\2\u01b2\u0a49\3\2\2\2\u01b4\u0a51\3\2"+ + "\2\2\u01b6\u01b8\7\3\2\2\u01b7\u01b6\3\2\2\2\u01b7\u01b8\3\2\2\2\u01b8"+ + "\u01ba\3\2\2\2\u01b9\u01bb\5\u00d8m\2\u01ba\u01b9\3\2\2\2\u01ba\u01bb"+ + "\3\2\2\2\u01bb\u01bd\3\2\2\2\u01bc\u01be\5\u00dco\2\u01bd\u01bc\3\2\2"+ + "\2\u01bd\u01be\3\2\2\2\u01be\u01c2\3\2\2\2\u01bf\u01c1\5\u015c\u00af\2"+ + "\u01c0\u01bf\3\2\2\2\u01c1\u01c4\3\2\2\2\u01c2\u01c0\3\2\2\2\u01c2\u01c3"+ + "\3\2\2\2\u01c3\u01c6\3\2\2\2\u01c4\u01c2\3\2\2\2\u01c5\u01c7\5\u00e0q"+ + "\2\u01c6\u01c5\3\2\2\2\u01c6\u01c7\3\2\2\2\u01c7\u01c8\3\2\2\2\u01c8\u01c9"+ + "\7\2\2\3\u01c9\3\3\2\2\2\u01ca\u01cc\5\u01b4\u00db\2\u01cb\u01cd\5\30"+ + "\r\2\u01cc\u01cb\3\2\2\2\u01cc\u01cd\3\2\2\2\u01cd\u01d0\3\2\2\2\u01ce"+ + "\u01d0\5\u00e6t\2\u01cf\u01ca\3\2\2\2\u01cf\u01ce\3\2\2\2\u01d0\u01d8"+ + "\3\2\2\2\u01d1\u01d2\7\u0085\2\2\u01d2\u01d4\5\u01b4\u00db\2\u01d3\u01d5"+ + "\5\30\r\2\u01d4\u01d3\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d7\3\2\2\2"+ + "\u01d6\u01d1\3\2\2\2\u01d7\u01da\3\2\2\2\u01d8\u01d6\3\2\2\2\u01d8\u01d9"+ + "\3\2\2\2\u01d9\5\3\2\2\2\u01da\u01d8\3\2\2\2\u01db\u01e1\5\b\5\2\u01dc"+ + "\u01e0\7\u0096\2\2\u01dd\u01e0\5\u0144\u00a3\2\u01de\u01e0\7\u008b\2\2"+ + "\u01df\u01dc\3\2\2\2\u01df\u01dd\3\2\2\2\u01df\u01de\3\2\2\2\u01e0\u01e3"+ + "\3\2\2\2\u01e1\u01df\3\2\2\2\u01e1\u01e2\3\2\2\2\u01e2\7\3\2\2\2\u01e3"+ + "\u01e1\3\2\2\2\u01e4\u01ea\5\16\b\2\u01e5\u01ea\5\26\f\2\u01e6\u01e7\7"+ + "n\2\2\u01e7\u01ea\7\u008b\2\2\u01e8\u01ea\5\n\6\2\u01e9\u01e4\3\2\2\2"+ + "\u01e9\u01e5\3\2\2\2\u01e9\u01e6\3\2\2\2\u01e9\u01e8\3\2\2\2\u01ea\t\3"+ + "\2\2\2\u01eb\u01ec\7\u0083\2\2\u01ec\u01ef\5\f\7\2\u01ed\u01ee\7\u0086"+ + "\2\2\u01ee\u01f0\5\f\7\2\u01ef\u01ed\3\2\2\2\u01f0\u01f1\3\2\2\2\u01f1"+ + "\u01ef\3\2\2\2\u01f1\u01f2\3\2\2\2\u01f2\u01f3\3\2\2\2\u01f3\u01f4\7\u0084"+ + "\2\2\u01f4\13\3\2\2\2\u01f5\u01f7\5\6\4\2\u01f6\u01f8\5\u01b4\u00db\2"+ + "\u01f7\u01f6\3\2\2\2\u01f7\u01f8\3\2\2\2\u01f8\r\3\2\2\2\u01f9\u01fc\5"+ + "\20\t\2\u01fa\u01fc\7\24\2\2\u01fb\u01f9\3\2\2\2\u01fb\u01fa\3\2\2\2\u01fc"+ + "\17\3\2\2\2\u01fd\u0201\5\22\n\2\u01fe\u0201\5\24\13\2\u01ff\u0201\7\37"+ + "\2\2\u0200\u01fd\3\2\2\2\u0200\u01fe\3\2\2\2\u0200\u01ff\3\2\2\2\u0201"+ + "\21\3\2\2\2\u0202\u0203\t\2\2\2\u0203\23\3\2\2\2\u0204\u0205\t\3\2\2\u0205"+ + "\25\3\2\2\2\u0206\u020b\5\4\3\2\u0207\u020b\7F\2\2\u0208\u020b\7%\2\2"+ + "\u0209\u020b\7]\2\2\u020a\u0206\3\2\2\2\u020a\u0207\3\2\2\2\u020a\u0208"+ + "\3\2\2\2\u020a\u0209\3\2\2\2\u020b\27\3\2\2\2\u020c\u020d\7\u0094\2\2"+ + "\u020d\u0212\5\6\4\2\u020e\u020f\7\u0086\2\2\u020f\u0211\5\6\4\2\u0210"+ + "\u020e\3\2\2\2\u0211\u0214\3\2\2\2\u0212\u0210\3\2\2\2\u0212\u0213\3\2"+ + "\2\2\u0213\u0215\3\2\2\2\u0214\u0212\3\2\2\2\u0215\u0216\7\u0095\2\2\u0216"+ + "\31\3\2\2\2\u0217\u021c\5\34\17\2\u0218\u0219\7\u0086\2\2\u0219\u021b"+ + "\5\34\17\2\u021a\u0218\3\2\2\2\u021b\u021e\3\2\2\2\u021c\u021a\3\2\2\2"+ + "\u021c\u021d\3\2\2\2\u021d\33\3\2\2\2\u021e\u021c\3\2\2\2\u021f\u0220"+ + "\5\u01b4\u00db\2\u0220\u0221\7\u0087\2\2\u0221\u0223\3\2\2\2\u0222\u021f"+ + "\3\2\2\2\u0222\u0223\3\2\2\2\u0223\u0225\3\2\2\2\u0224\u0226\t\4\2\2\u0225"+ + "\u0224\3\2\2\2\u0225\u0226\3\2\2\2\u0226\u0229\3\2\2\2\u0227\u022a\7l"+ + "\2\2\u0228\u022a\5\6\4\2\u0229\u0227\3\2\2\2\u0229\u0228\3\2\2\2\u0229"+ + "\u022a\3\2\2\2\u022a\u022b\3\2\2\2\u022b\u022c\5\36\20\2\u022c\35\3\2"+ + "\2\2\u022d\u0232\5\"\22\2\u022e\u0232\5 \21\2\u022f\u0230\7R\2\2\u0230"+ + "\u0232\5 \21\2\u0231\u022d\3\2\2\2\u0231\u022e\3\2\2\2\u0231\u022f\3\2"+ + "\2\2\u0232\37\3\2\2\2\u0233\u0237\5x=\2\u0234\u0237\5\u0084C\2\u0235\u0237"+ + "\5&\24\2\u0236\u0233\3\2\2\2\u0236\u0234\3\2\2\2\u0236\u0235\3\2\2\2\u0237"+ + "!\3\2\2\2\u0238\u0239\5F$\2\u0239\u023a\5$\23\2\u023a\u023b\5\36\20\2"+ + "\u023b\u0241\3\2\2\2\u023c\u023d\5F$\2\u023d\u023e\7\u00ac\2\2\u023e\u023f"+ + "\5L\'\2\u023f\u0241\3\2\2\2\u0240\u0238\3\2\2\2\u0240\u023c\3\2\2\2\u0241"+ + "#\3\2\2\2\u0242\u024e\7\u0093\2\2\u0243\u024e\7\u00a2\2\2\u0244\u024e"+ + "\7\u00a3\2\2\u0245\u024e\7\u00a4\2\2\u0246\u024e\7\u00a5\2\2\u0247\u024e"+ + "\7\u00a6\2\2\u0248\u024e\7\u00a7\2\2\u0249\u024e\7\u00a8\2\2\u024a\u024e"+ + "\7\u00a9\2\2\u024b\u024e\7\u00ab\2\2\u024c\u024e\5\u017c\u00bf\2\u024d"+ + "\u0242\3\2\2\2\u024d\u0243\3\2\2\2\u024d\u0244\3\2\2\2\u024d\u0245\3\2"+ + "\2\2\u024d\u0246\3\2\2\2\u024d\u0247\3\2\2\2\u024d\u0248\3\2\2\2\u024d"+ + "\u0249\3\2\2\2\u024d\u024a\3\2\2\2\u024d\u024b\3\2\2\2\u024d\u024c\3\2"+ + "\2\2\u024e%\3\2\2\2\u024f\u0255\5(\25\2\u0250\u0251\7\u0096\2\2\u0251"+ + "\u0252\5L\'\2\u0252\u0253\7\u0087\2\2\u0253\u0254\5L\'\2\u0254\u0256\3"+ + "\2\2\2\u0255\u0250\3\2\2\2\u0255\u0256\3\2\2\2\u0256\'\3\2\2\2\u0257\u025d"+ + "\5*\26\2\u0258\u025b\7\u0098\2\2\u0259\u025c\5(\25\2\u025a\u025c\5N(\2"+ + "\u025b\u0259\3\2\2\2\u025b\u025a\3\2\2\2\u025c\u025e\3\2\2\2\u025d\u0258"+ + "\3\2\2\2\u025d\u025e\3\2\2\2\u025e)\3\2\2\2\u025f\u0264\5,\27\2\u0260"+ + "\u0261\7\u009c\2\2\u0261\u0263\5,\27\2\u0262\u0260\3\2\2\2\u0263\u0266"+ + "\3\2\2\2\u0264\u0262\3\2\2\2\u0264\u0265\3\2\2\2\u0265+\3\2\2\2\u0266"+ + "\u0264\3\2\2\2\u0267\u026c\5.\30\2\u0268\u0269\7\u009b\2\2\u0269\u026b"+ + "\5.\30\2\u026a\u0268\3\2\2\2\u026b\u026e\3\2\2\2\u026c\u026a\3\2\2\2\u026c"+ + "\u026d\3\2\2\2\u026d-\3\2\2\2\u026e\u026c\3\2\2\2\u026f\u0274\5\60\31"+ + "\2\u0270\u0271\7\u008f\2\2\u0271\u0273\5\60\31\2\u0272\u0270\3\2\2\2\u0273"+ + "\u0276\3\2\2\2\u0274\u0272\3\2\2\2\u0274\u0275\3\2\2\2\u0275/\3\2\2\2"+ + "\u0276\u0274\3\2\2\2\u0277\u027c\5\62\32\2\u0278\u0279\7\u0090\2\2\u0279"+ + "\u027b\5\62\32\2\u027a\u0278\3\2\2\2\u027b\u027e\3\2\2\2\u027c\u027a\3"+ + "\2\2\2\u027c\u027d\3\2\2\2\u027d\61\3\2\2\2\u027e\u027c\3\2\2\2\u027f"+ + "\u0284\5\64\33\2\u0280\u0281\7\u008e\2\2\u0281\u0283\5\64\33\2\u0282\u0280"+ + "\3\2\2\2\u0283\u0286\3\2\2\2\u0284\u0282\3\2\2\2\u0284\u0285\3\2\2\2\u0285"+ + "\63\3\2\2\2\u0286\u0284\3\2\2\2\u0287\u028c\5\66\34\2\u0288\u0289\t\5"+ + "\2\2\u0289\u028b\5\66\34\2\u028a\u0288\3\2\2\2\u028b\u028e\3\2\2\2\u028c"+ + "\u028a\3\2\2\2\u028c\u028d\3\2\2\2\u028d\65\3\2\2\2\u028e\u028c\3\2\2"+ + "\2\u028f\u0298\58\35\2\u0290\u0291\t\6\2\2\u0291\u0297\58\35\2\u0292\u0293"+ + "\7=\2\2\u0293\u0297\5r:\2\u0294\u0295\7\17\2\2\u0295\u0297\5\6\4\2\u0296"+ + "\u0290\3\2\2\2\u0296\u0292\3\2\2\2\u0296\u0294\3\2\2\2\u0297\u029a\3\2"+ + "\2\2\u0298\u0296\3\2\2\2\u0298\u0299\3\2\2\2\u0299\67\3\2\2\2\u029a\u0298"+ + "\3\2\2\2\u029b\u02a3\5:\36\2\u029c\u029f\7\u00aa\2\2\u029d\u029f\5\u017a"+ + "\u00be\2\u029e\u029c\3\2\2\2\u029e\u029d\3\2\2\2\u029f\u02a0\3\2\2\2\u02a0"+ + "\u02a2\5:\36\2\u02a1\u029e\3\2\2\2\u02a2\u02a5\3\2\2\2\u02a3\u02a1\3\2"+ + "\2\2\u02a3\u02a4\3\2\2\2\u02a49\3\2\2\2\u02a5\u02a3\3\2\2\2\u02a6\u02ab"+ + "\5<\37\2\u02a7\u02a8\t\7\2\2\u02a8\u02aa\5<\37\2\u02a9\u02a7\3\2\2\2\u02aa"+ + "\u02ad\3\2\2\2\u02ab\u02a9\3\2\2\2\u02ab\u02ac\3\2\2\2\u02ac;\3\2\2\2"+ + "\u02ad\u02ab\3\2\2\2\u02ae\u02b3\5> \2\u02af\u02b0\t\b\2\2\u02b0\u02b2"+ + "\5> \2\u02b1\u02af\3\2\2\2\u02b2\u02b5\3\2\2\2\u02b3\u02b1\3\2\2\2\u02b3"+ + "\u02b4\3\2\2\2\u02b4=\3\2\2\2\u02b5\u02b3\3\2\2\2\u02b6\u02c0\5D#\2\u02b7"+ + "\u02b8\7_\2\2\u02b8\u02bd\7\177\2\2\u02b9\u02bb\5@!\2\u02ba\u02bc\7\u0086"+ + "\2\2\u02bb\u02ba\3\2\2\2\u02bb\u02bc\3\2\2\2\u02bc\u02be\3\2\2\2\u02bd"+ + "\u02b9\3\2\2\2\u02bd\u02be\3\2\2\2\u02be\u02bf\3\2\2\2\u02bf\u02c1\7\u0080"+ + "\2\2\u02c0\u02b7\3\2\2\2\u02c0\u02c1\3\2\2\2\u02c1?\3\2\2\2\u02c2\u02c7"+ + "\5B\"\2\u02c3\u02c4\7\u0086\2\2\u02c4\u02c6\5B\"\2\u02c5\u02c3\3\2\2\2"+ + "\u02c6\u02c9\3\2\2\2\u02c7\u02c5\3\2\2\2\u02c7\u02c8\3\2\2\2\u02c8A\3"+ + "\2\2\2\u02c9\u02c7\3\2\2\2\u02ca\u02cc\5\36\20\2\u02cb\u02cd\5\u00be`"+ + "\2\u02cc\u02cb\3\2\2\2\u02cc\u02cd\3\2\2\2\u02cd\u02ce\3\2\2\2\u02ce\u02cf"+ + "\5\u0178\u00bd\2\u02cf\u02d0\5L\'\2\u02d0C\3\2\2\2\u02d1\u02da\5F$\2\u02d2"+ + "\u02d4\5F$\2\u02d3\u02d2\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4\u02d5\3\2\2"+ + "\2\u02d5\u02d7\7\u00ad\2\2\u02d6\u02d8\5F$\2\u02d7\u02d6\3\2\2\2\u02d7"+ + "\u02d8\3\2\2\2\u02d8\u02da\3\2\2\2\u02d9\u02d1\3\2\2\2\u02d9\u02d3\3\2"+ + "\2\2\u02daE\3\2\2\2\u02db\u02f6\5H%\2\u02dc\u02dd\7\u0089\2\2\u02dd\u02f6"+ + "\5F$\2\u02de\u02df\7\u008a\2\2\u02df\u02f6\5F$\2\u02e0\u02e1\7\u0091\2"+ + "\2\u02e1\u02f6\5F$\2\u02e2\u02e3\7\u0092\2\2\u02e3\u02f6\5F$\2\u02e4\u02e5"+ + "\7\u0099\2\2\u02e5\u02f6\5F$\2\u02e6\u02e7\7\u009a\2\2\u02e7\u02f6\5F"+ + "$\2\u02e8\u02e9\7\u0083\2\2\u02e9\u02ea\5\6\4\2\u02ea\u02eb\7\u0084\2"+ + "\2\u02eb\u02ec\5F$\2\u02ec\u02f6\3\2\2\2\u02ed\u02ee\7\22\2\2\u02ee\u02f6"+ + "\5F$\2\u02ef\u02f0\7\u008e\2\2\u02f0\u02f6\5F$\2\u02f1\u02f2\7\u008b\2"+ + "\2\u02f2\u02f6\5F$\2\u02f3\u02f4\7\u0090\2\2\u02f4\u02f6\5F$\2\u02f5\u02db"+ + "\3\2\2\2\u02f5\u02dc\3\2\2\2\u02f5\u02de\3\2\2\2\u02f5\u02e0\3\2\2\2\u02f5"+ + "\u02e2\3\2\2\2\u02f5\u02e4\3\2\2\2\u02f5\u02e6\3\2\2\2\u02f5\u02e8\3\2"+ + "\2\2\u02f5\u02ed\3\2\2\2\u02f5\u02ef\3\2\2\2\u02f5\u02f1\3\2\2\2\u02f5"+ + "\u02f3\3\2\2\2\u02f6G\3\2\2\2\u02f7\u02f9\5J&\2\u02f8\u02fa\7\u0091\2"+ + "\2\u02f9\u02f8\3\2\2\2\u02f9\u02fa\3\2\2\2\u02fa\u02fe\3\2\2\2\u02fb\u02fd"+ + "\5R*\2\u02fc\u02fb\3\2\2\2\u02fd\u0300\3\2\2\2\u02fe\u02fc\3\2\2\2\u02fe"+ + "\u02ff\3\2\2\2\u02ff\u0302\3\2\2\2\u0300\u02fe\3\2\2\2\u0301\u0303\7\u0091"+ + "\2\2\u0302\u0301\3\2\2\2\u0302\u0303\3\2\2\2\u0303\u031a\3\2\2\2\u0304"+ + "\u030b\5P)\2\u0305\u030b\5\u01b0\u00d9\2\u0306\u030b\7\u0099\2\2\u0307"+ + "\u030b\7\u009a\2\2\u0308\u0309\7\u009d\2\2\u0309\u030b\5\u01b4\u00db\2"+ + "\u030a\u0304\3\2\2\2\u030a\u0305\3\2\2\2\u030a\u0306\3\2\2\2\u030a\u0307"+ + "\3\2\2\2\u030a\u0308\3\2\2\2\u030b\u030d\3\2\2\2\u030c\u030e\7\u0091\2"+ + "\2\u030d\u030c\3\2\2\2\u030d\u030e\3\2\2\2\u030e\u0312\3\2\2\2\u030f\u0311"+ + "\5R*\2\u0310\u030f\3\2\2\2\u0311\u0314\3\2\2\2\u0312\u0310\3\2\2\2\u0312"+ + "\u0313\3\2\2\2\u0313\u0316\3\2\2\2\u0314\u0312\3\2\2\2\u0315\u0317\7\u0091"+ + "\2\2\u0316\u0315\3\2\2\2\u0316\u0317\3\2\2\2\u0317\u0319\3\2\2\2\u0318"+ + "\u030a\3\2\2\2\u0319\u031c\3\2\2\2\u031a\u0318\3\2\2\2\u031a\u031b\3\2"+ + "\2\2\u031bI\3\2\2\2\u031c\u031a\3\2\2\2\u031d\u0397\5\u017e\u00c0\2\u031e"+ + "\u0320\5\u01b4\u00db\2\u031f\u0321\5\30\r\2\u0320\u031f\3\2\2\2\u0320"+ + "\u0321\3\2\2\2\u0321\u0397\3\2\2\2\u0322\u0323\7\u0083\2\2\u0323\u0324"+ + "\5\36\20\2\u0324\u0325\7\u0084\2\2\u0325\u0397\3\2\2\2\u0326\u0397\5V"+ + ",\2\u0327\u0397\5\u00e6t\2\u0328\u0397\7u\2\2\u0329\u0397\7`\2\2\u032a"+ + "\u0334\7\23\2\2\u032b\u032c\7\u0085\2\2\u032c\u032e\5\u01b4\u00db\2\u032d"+ + "\u032f\5\30\r\2\u032e\u032d\3\2\2\2\u032e\u032f\3\2\2\2\u032f\u0335\3"+ + "\2\2\2\u0330\u0331\7\u0081\2\2\u0331\u0332\5X-\2\u0332\u0333\7\u0082\2"+ + "\2\u0333\u0335\3\2\2\2\u0334\u032b\3\2\2\2\u0334\u0330\3\2\2\2\u0335\u0397"+ + "\3\2\2\2\u0336\u0353\7D\2\2\u0337\u034d\5\6\4\2\u0338\u034e\5\u01b2\u00da"+ + "\2\u0339\u034e\5Z.\2\u033a\u033b\7\u0081\2\2\u033b\u033c\5X-\2\u033c\u0340"+ + "\7\u0082\2\2\u033d\u033f\5\u0144\u00a3\2\u033e\u033d\3\2\2\2\u033f\u0342"+ + "\3\2\2\2\u0340\u033e\3\2\2\2\u0340\u0341\3\2\2\2\u0341\u0344\3\2\2\2\u0342"+ + "\u0340\3\2\2\2\u0343\u0345\5\u0146\u00a4\2\u0344\u0343\3\2\2\2\u0344\u0345"+ + "\3\2\2\2\u0345\u034e\3\2\2\2\u0346\u0348\5\u0144\u00a3\2\u0347\u0346\3"+ + "\2\2\2\u0348\u0349\3\2\2\2\u0349\u0347\3\2\2\2\u0349\u034a\3\2\2\2\u034a"+ + "\u034b\3\2\2\2\u034b\u034c\5\u0146\u00a4\2\u034c\u034e\3\2\2\2\u034d\u0338"+ + "\3\2\2\2\u034d\u0339\3\2\2\2\u034d\u033a\3\2\2\2\u034d\u0347\3\2\2\2\u034e"+ + "\u0354\3\2\2\2\u034f\u0354\5h\65\2\u0350\u0351\5\u0144\u00a3\2\u0351\u0352"+ + "\5\u0146\u00a4\2\u0352\u0354\3\2\2\2\u0353\u0337\3\2\2\2\u0353\u034f\3"+ + "\2\2\2\u0353\u0350\3\2\2\2\u0354\u0397\3\2\2\2\u0355\u0356\7\u0083\2\2"+ + "\u0356\u0359\5\34\17\2\u0357\u0358\7\u0086\2\2\u0358\u035a\5\34\17\2\u0359"+ + "\u0357\3\2\2\2\u035a\u035b\3\2\2\2\u035b\u0359\3\2\2\2\u035b\u035c\3\2"+ + "\2\2\u035c\u035d\3\2\2\2\u035d\u035e\7\u0084\2\2\u035e\u0397\3\2\2\2\u035f"+ + "\u0360\7d\2\2\u0360\u0364\7\u0083\2\2\u0361\u0365\5n8\2\u0362\u0365\5"+ + "\6\4\2\u0363\u0365\7n\2\2\u0364\u0361\3\2\2\2\u0364\u0362\3\2\2\2\u0364"+ + "\u0363\3\2\2\2\u0365\u0366\3\2\2\2\u0366\u0397\7\u0084\2\2\u0367\u0368"+ + "\7\33\2\2\u0368\u0369\7\u0083\2\2\u0369\u036a\5\36\20\2\u036a\u036b\7"+ + "\u0084\2\2\u036b\u0397\3\2\2\2\u036c\u036d\7g\2\2\u036d\u036e\7\u0083"+ + "\2\2\u036e\u036f\5\36\20\2\u036f\u0370\7\u0084\2\2\u0370\u0397\3\2\2\2"+ + "\u0371\u0376\7 \2\2\u0372\u0373\7\u0083\2\2\u0373\u0374\5\6\4\2\u0374"+ + "\u0375\7\u0084\2\2\u0375\u0377\3\2\2\2\u0376\u0372\3\2\2\2\u0376\u0377"+ + "\3\2\2\2\u0377\u0397\3\2\2\2\u0378\u037a\7\21\2\2\u0379\u0378\3\2\2\2"+ + "\u0379\u037a\3\2\2\2\u037a\u037b\3\2\2\2\u037b\u0381\7!\2\2\u037c\u037e"+ + "\7\u0083\2\2\u037d\u037f\5|?\2\u037e\u037d\3\2\2\2\u037e\u037f\3\2\2\2"+ + "\u037f\u0380\3\2\2\2\u0380\u0382\7\u0084\2\2\u0381\u037c\3\2\2\2\u0381"+ + "\u0382\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0397\5\u00acW\2\u0384\u0385"+ + "\7Z\2\2\u0385\u0386\7\u0083\2\2\u0386\u0387\5\6\4\2\u0387\u0388\7\u0084"+ + "\2\2\u0388\u0397\3\2\2\2\u0389\u038a\7B\2\2\u038a\u0390\7\u0083\2\2\u038b"+ + "\u038c\5\u01b4\u00db\2\u038c\u038d\7\u0085\2\2\u038d\u038f\3\2\2\2\u038e"+ + "\u038b\3\2\2\2\u038f\u0392\3\2\2\2\u0390\u038e\3\2\2\2\u0390\u0391\3\2"+ + "\2\2\u0391\u0393\3\2\2\2\u0392\u0390\3\2\2\2\u0393\u0394\5\u01b4\u00db"+ + "\2\u0394\u0395\7\u0084\2\2\u0395\u0397\3\2\2\2\u0396\u031d\3\2\2\2\u0396"+ + "\u031e\3\2\2\2\u0396\u0322\3\2\2\2\u0396\u0326\3\2\2\2\u0396\u0327\3\2"+ + "\2\2\u0396\u0328\3\2\2\2\u0396\u0329\3\2\2\2\u0396\u032a\3\2\2\2\u0396"+ + "\u0336\3\2\2\2\u0396\u0355\3\2\2\2\u0396\u035f\3\2\2\2\u0396\u0367\3\2"+ + "\2\2\u0396\u036c\3\2\2\2\u0396\u0371\3\2\2\2\u0396\u0379\3\2\2\2\u0396"+ + "\u0384\3\2\2\2\u0396\u0389\3\2\2\2\u0397K\3\2\2\2\u0398\u039b\5\36\20"+ + "\2\u0399\u039b\5N(\2\u039a\u0398\3\2\2\2\u039a\u0399\3\2\2\2\u039bM\3"+ + "\2\2\2\u039c\u039d\7a\2\2\u039d\u039e\5\36\20\2\u039eO\3\2\2\2\u039f\u03a1"+ + "\7\u0096\2\2\u03a0\u039f\3\2\2\2\u03a0\u03a1\3\2\2\2\u03a1\u03a2\3\2\2"+ + "\2\u03a2\u03a3\7\u0085\2\2\u03a3\u03a5\5\u01b4\u00db\2\u03a4\u03a6\5\30"+ + "\r\2\u03a5\u03a4\3\2\2\2\u03a5\u03a6\3\2\2\2\u03a6Q\3\2\2\2\u03a7\u03a9"+ + "\7\u0096\2\2\u03a8\u03a7\3\2\2\2\u03a8\u03a9\3\2\2\2\u03a9\u03aa\3\2\2"+ + "\2\u03aa\u03ab\7\u0081\2\2\u03ab\u03b0\5T+\2\u03ac\u03ad\7\u0086\2\2\u03ad"+ + "\u03af\5T+\2\u03ae\u03ac\3\2\2\2\u03af\u03b2\3\2\2\2\u03b0\u03ae\3\2\2"+ + "\2\u03b0\u03b1\3\2\2\2\u03b1\u03b3\3\2\2\2\u03b2\u03b0\3\2\2\2\u03b3\u03b4"+ + "\7\u0082\2\2\u03b4S\3\2\2\2\u03b5\u03b6\5\u01b4\u00db\2\u03b6\u03b7\7"+ + "\u0087\2\2\u03b7\u03b9\3\2\2\2\u03b8\u03b5\3\2\2\2\u03b8\u03b9\3\2\2\2"+ + "\u03b9\u03ba\3\2\2\2\u03ba\u03bb\5\36\20\2\u03bbU\3\2\2\2\u03bc\u03bd"+ + "\t\t\2\2\u03bdW\3\2\2\2\u03be\u03c3\5\36\20\2\u03bf\u03c0\7\u0086\2\2"+ + "\u03c0\u03c2\5\36\20\2\u03c1\u03bf\3\2\2\2\u03c2\u03c5\3\2\2\2\u03c3\u03c1"+ + "\3\2\2\2\u03c3\u03c4\3\2\2\2\u03c4Y\3\2\2\2\u03c5\u03c3\3\2\2\2\u03c6"+ + "\u03c9\5\\/\2\u03c7\u03c9\5d\63\2\u03c8\u03c6\3\2\2\2\u03c8\u03c7\3\2"+ + "\2\2\u03c9[\3\2\2\2\u03ca\u03cf\7\177\2\2\u03cb\u03cd\5^\60\2\u03cc\u03ce"+ + "\7\u0086\2\2\u03cd\u03cc\3\2\2\2\u03cd\u03ce\3\2\2\2\u03ce\u03d0\3\2\2"+ + "\2\u03cf\u03cb\3\2\2\2\u03cf\u03d0\3\2\2\2\u03d0\u03d1\3\2\2\2\u03d1\u03d2"+ + "\7\u0080\2\2\u03d2]\3\2\2\2\u03d3\u03d8\5`\61\2\u03d4\u03d5\7\u0086\2"+ + "\2\u03d5\u03d7\5`\61\2\u03d6\u03d4\3\2\2\2\u03d7\u03da\3\2\2\2\u03d8\u03d6"+ + "\3\2\2\2\u03d8\u03d9\3\2\2\2\u03d9_\3\2\2\2\u03da\u03d8\3\2\2\2\u03db"+ + "\u03e1\5\u01b4\u00db\2\u03dc\u03dd\7\u0081\2\2\u03dd\u03de\5\36\20\2\u03de"+ + "\u03df\7\u0082\2\2\u03df\u03e1\3\2\2\2\u03e0\u03db\3\2\2\2\u03e0\u03dc"+ + "\3\2\2\2\u03e1\u03e2\3\2\2\2\u03e2\u03e3\7\u0093\2\2\u03e3\u03e4\5b\62"+ + "\2\u03e4a\3\2\2\2\u03e5\u03e8\5\36\20\2\u03e6\u03e8\5Z.\2\u03e7\u03e5"+ + "\3\2\2\2\u03e7\u03e6\3\2\2\2\u03e8c\3\2\2\2\u03e9\u03ea\7\177\2\2\u03ea"+ + "\u03ef\5f\64\2\u03eb\u03ec\7\u0086\2\2\u03ec\u03ee\5f\64\2\u03ed\u03eb"+ + "\3\2\2\2\u03ee\u03f1\3\2\2\2\u03ef\u03ed\3\2\2\2\u03ef\u03f0\3\2\2\2\u03f0"+ + "\u03f3\3\2\2\2\u03f1\u03ef\3\2\2\2\u03f2\u03f4\7\u0086\2\2\u03f3\u03f2"+ + "\3\2\2\2\u03f3\u03f4\3\2\2\2\u03f4\u03f5\3\2\2\2\u03f5\u03f6\7\u0080\2"+ + "\2\u03f6e\3\2\2\2\u03f7\u03fd\5 \21\2\u03f8\u03f9\7\177\2\2\u03f9\u03fa"+ + "\5X-\2\u03fa\u03fb\7\u0080\2\2\u03fb\u03fd\3\2\2\2\u03fc\u03f7\3\2\2\2"+ + "\u03fc\u03f8\3\2\2\2\u03fdg\3\2\2\2\u03fe\u0403\7\177\2\2\u03ff\u0401"+ + "\5j\66\2\u0400\u0402\7\u0086\2\2\u0401\u0400\3\2\2\2\u0401\u0402\3\2\2"+ + "\2\u0402\u0404\3\2\2\2\u0403\u03ff\3\2\2\2\u0403\u0404\3\2\2\2\u0404\u0405"+ + "\3\2\2\2\u0405\u0406\7\u0080\2\2\u0406i\3\2\2\2\u0407\u040c\5l\67\2\u0408"+ + "\u0409\7\u0086\2\2\u0409\u040b\5l\67\2\u040a\u0408\3\2\2\2\u040b\u040e"+ + "\3\2\2\2\u040c\u040a\3\2\2\2\u040c\u040d\3\2\2\2\u040dk\3\2\2\2\u040e"+ + "\u040c\3\2\2\2\u040f\u0415\5H%\2\u0410\u0411\5\u01b4\u00db\2\u0411\u0412"+ + "\7\u0093\2\2\u0412\u0413\5\36\20\2\u0413\u0415\3\2\2\2\u0414\u040f\3\2"+ + "\2\2\u0414\u0410\3\2\2\2\u0415m\3\2\2\2\u0416\u041f\5\u01b4\u00db\2\u0417"+ + "\u0419\5p9\2\u0418\u0417\3\2\2\2\u0418\u0419\3\2\2\2\u0419\u0420\3\2\2"+ + "\2\u041a\u041b\7\u0097\2\2\u041b\u041d\5\u01b4\u00db\2\u041c\u041e\5p"+ + "9\2\u041d\u041c\3\2\2\2\u041d\u041e\3\2\2\2\u041e\u0420\3\2\2\2\u041f"+ + "\u0418\3\2\2\2\u041f\u041a\3\2\2\2\u0420\u0428\3\2\2\2\u0421\u0422\7\u0085"+ + "\2\2\u0422\u0424\5\u01b4\u00db\2\u0423\u0425\5p9\2\u0424\u0423\3\2\2\2"+ + "\u0424\u0425\3\2\2\2\u0425\u0427\3\2\2\2\u0426\u0421\3\2\2\2\u0427\u042a"+ + "\3\2\2\2\u0428\u0426\3\2\2\2\u0428\u0429\3\2\2\2\u0429o\3\2\2\2\u042a"+ + "\u0428\3\2\2\2\u042b\u042f\7\u0094\2\2\u042c\u042e\7\u0086\2\2\u042d\u042c"+ + "\3\2\2\2\u042e\u0431\3\2\2\2\u042f\u042d\3\2\2\2\u042f\u0430\3\2\2\2\u0430"+ + "\u0432\3\2\2\2\u0431\u042f\3\2\2\2\u0432\u0433\7\u0095\2\2\u0433q\3\2"+ + "\2\2\u0434\u0439\5\b\5\2\u0435\u0438\5\u0144\u00a3\2\u0436\u0438\7\u008b"+ + "\2\2\u0437\u0435\3\2\2\2\u0437\u0436\3\2\2\2\u0438\u043b\3\2\2\2\u0439"+ + "\u0437\3\2\2\2\u0439\u043a\3\2\2\2\u043a\u043d\3\2\2\2\u043b\u0439\3\2"+ + "\2\2\u043c\u043e\7\u0096\2\2\u043d\u043c\3\2\2\2\u043d\u043e\3\2\2\2\u043e"+ + "\u0440\3\2\2\2\u043f\u0441\5t;\2\u0440\u043f\3\2\2\2\u0440\u0441\3\2\2"+ + "\2\u0441\u0443\3\2\2\2\u0442\u0444\5\u01b4\u00db\2\u0443\u0442\3\2\2\2"+ + "\u0443\u0444\3\2\2\2\u0444s\3\2\2\2\u0445\u0446\7\177\2\2\u0446\u044b"+ + "\5v<\2\u0447\u0448\7\u0086\2\2\u0448\u044a\5v<\2\u0449\u0447\3\2\2\2\u044a"+ + "\u044d\3\2\2\2\u044b\u0449\3\2\2\2\u044b\u044c\3\2\2\2\u044c\u044e\3\2"+ + "\2\2\u044d\u044b\3\2\2\2\u044e\u044f\7\u0080\2\2\u044fu\3\2\2\2\u0450"+ + "\u0451\5\u01b4\u00db\2\u0451\u0452\7\u0087\2\2\u0452\u0453\5\36\20\2\u0453"+ + "w\3\2\2\2\u0454\u0456\7\21\2\2\u0455\u0454\3\2\2\2\u0455\u0456\3\2\2\2"+ + "\u0456\u0457\3\2\2\2\u0457\u0458\5z>\2\u0458\u0459\5\u0178\u00bd\2\u0459"+ + "\u045a\5\u0082B\2\u045ay\3\2\2\2\u045b\u045c\7\u0083\2\2\u045c\u0467\7"+ + "\u0084\2\2\u045d\u045e\7\u0083\2\2\u045e\u045f\5|?\2\u045f\u0460\7\u0084"+ + "\2\2\u0460\u0467\3\2\2\2\u0461\u0462\7\u0083\2\2\u0462\u0463\5\u0080A"+ + "\2\u0463\u0464\7\u0084\2\2\u0464\u0467\3\2\2\2\u0465\u0467\5\u01b4\u00db"+ + "\2\u0466\u045b\3\2\2\2\u0466\u045d\3\2\2\2\u0466\u0461\3\2\2\2\u0466\u0465"+ + "\3\2\2\2\u0467{\3\2\2\2\u0468\u046d\5~@\2\u0469\u046a\7\u0086\2\2\u046a"+ + "\u046c\5~@\2\u046b\u0469\3\2\2\2\u046c\u046f\3\2\2\2\u046d\u046b\3\2\2"+ + "\2\u046d\u046e\3\2\2\2\u046e}\3\2\2\2\u046f\u046d\3\2\2\2\u0470\u0472"+ + "\t\4\2\2\u0471\u0470\3\2\2\2\u0471\u0472\3\2\2\2\u0472\u0473\3\2\2\2\u0473"+ + "\u0474\5\6\4\2\u0474\u0475\5\u01b4\u00db\2\u0475\177\3\2\2\2\u0476\u047b"+ + "\5\u01b4\u00db\2\u0477\u0478\7\u0086\2\2\u0478\u047a\5\u01b4\u00db\2\u0479"+ + "\u0477\3\2\2\2\u047a\u047d\3\2\2\2\u047b\u0479\3\2\2\2\u047b\u047c\3\2"+ + "\2\2\u047c\u0081\3\2\2\2\u047d\u047b\3\2\2\2\u047e\u0481\5L\'\2\u047f"+ + "\u0481\5\u00acW\2\u0480\u047e\3\2\2\2\u0480\u047f\3\2\2\2\u0481\u0083"+ + "\3\2\2\2\u0482\u0483\5\u0086D\2\u0483\u0484\5\u0088E\2\u0484\u0085\3\2"+ + "\2\2\u0485\u0487\7\62\2\2\u0486\u0488\5\6\4\2\u0487\u0486\3\2\2\2\u0487"+ + "\u0488\3\2\2\2\u0488\u0489\3\2\2\2\u0489\u048a\5\u01b4\u00db\2\u048a\u048b"+ + "\78\2\2\u048b\u048c\5\36\20\2\u048c\u0087\3\2\2\2\u048d\u048f\5\u008a"+ + "F\2\u048e\u048d\3\2\2\2\u048f\u0492\3\2\2\2\u0490\u048e\3\2\2\2\u0490"+ + "\u0491\3\2\2\2\u0491\u0493\3\2\2\2\u0492\u0490\3\2\2\2\u0493\u0495\5\u0096"+ + "L\2\u0494\u0496\5\u0098M\2\u0495\u0494\3\2\2\2\u0495\u0496\3\2\2\2\u0496"+ + "\u0089\3\2\2\2\u0497\u049d\5\u0086D\2\u0498\u049d\5\u008cG\2\u0499\u049d"+ + "\5\u008eH\2\u049a\u049d\5\u0090I\2\u049b\u049d\5\u0092J\2\u049c\u0497"+ + "\3\2\2\2\u049c\u0498\3\2\2\2\u049c\u0499\3\2\2\2\u049c\u049a\3\2\2\2\u049c"+ + "\u049b\3\2\2\2\u049d\u008b\3\2\2\2\u049e\u049f\7?\2\2\u049f\u04a0\5\u01b4"+ + "\u00db\2\u04a0\u04a1\7\u0093\2\2\u04a1\u04a2\5\36\20\2\u04a2\u008d\3\2"+ + "\2\2\u04a3\u04a4\7q\2\2\u04a4\u04a5\5\36\20\2\u04a5\u008f\3\2\2\2\u04a6"+ + "\u04a8\7>\2\2\u04a7\u04a9\5\6\4\2\u04a8\u04a7\3\2\2\2\u04a8\u04a9\3\2"+ + "\2\2\u04a9\u04aa\3\2\2\2\u04aa\u04ab\5\u01b4\u00db\2\u04ab\u04ac\78\2"+ + "\2\u04ac\u04ad\5\36\20\2\u04ad\u04ae\7G\2\2\u04ae\u04af\5\36\20\2\u04af"+ + "\u04b0\7(\2\2\u04b0\u04b3\5\36\20\2\u04b1\u04b2\7<\2\2\u04b2\u04b4\5\u01b4"+ + "\u00db\2\u04b3\u04b1\3\2\2\2\u04b3\u04b4\3\2\2\2\u04b4\u0091\3\2\2\2\u04b5"+ + "\u04b6\7I\2\2\u04b6\u04bb\5\u0094K\2\u04b7\u04b8\7\u0086\2\2\u04b8\u04ba"+ + "\5\u0094K\2\u04b9\u04b7\3\2\2\2\u04ba\u04bd\3\2\2\2\u04bb\u04b9\3\2\2"+ + "\2\u04bb\u04bc\3\2\2\2\u04bc\u0093\3\2\2\2\u04bd\u04bb\3\2\2\2\u04be\u04c0"+ + "\5\36\20\2\u04bf\u04c1\t\n\2\2\u04c0\u04bf\3\2\2\2\u04c0\u04c1\3\2\2\2"+ + "\u04c1\u0095\3\2\2\2\u04c2\u04c3\7W\2\2\u04c3\u04ca\5\36\20\2\u04c4\u04c5"+ + "\7\65\2\2\u04c5\u04c6\5\36\20\2\u04c6\u04c7\7\26\2\2\u04c7\u04c8\5\36"+ + "\20\2\u04c8\u04ca\3\2\2\2\u04c9\u04c2\3\2\2\2\u04c9\u04c4\3\2\2\2\u04ca"+ + "\u0097\3\2\2\2\u04cb\u04cc\7<\2\2\u04cc\u04cd\5\u01b4\u00db\2\u04cd\u04ce"+ + "\5\u0088E\2\u04ce\u0099\3\2\2\2\u04cf\u04d3\5\u00a6T\2\u04d0\u04d3\5\u009c"+ + "O\2\u04d1\u04d3\5\u00a8U\2\u04d2\u04cf\3\2\2\2\u04d2\u04d0\3\2\2\2\u04d2"+ + "\u04d1\3\2\2\2\u04d3\u009b\3\2\2\2\u04d4\u04d5\5\u00aeX\2\u04d5\u04d6"+ + "\7\u0088\2\2\u04d6\u04dc\3\2\2\2\u04d7\u04d8\5\u00b6\\\2\u04d8\u04d9\7"+ + "\u0088\2\2\u04d9\u04dc\3\2\2\2\u04da\u04dc\5\u009eP\2\u04db\u04d4\3\2"+ + "\2\2\u04db\u04d7\3\2\2\2\u04db\u04da\3\2\2\2\u04dc\u009d\3\2\2\2\u04dd"+ + "\u04de\5\u00a0Q\2\u04de\u04df\5\u00a4S\2\u04df\u009f\3\2\2\2\u04e0\u04e2"+ + "\5\u00a2R\2\u04e1\u04e0\3\2\2\2\u04e1\u04e2\3\2\2\2\u04e2\u04e3\3\2\2"+ + "\2\u04e3\u04e4\5\u0114\u008b\2\u04e4\u04e6\5\u01b4\u00db\2\u04e5\u04e7"+ + "\5\u00e8u\2\u04e6\u04e5\3\2\2\2\u04e6\u04e7\3\2\2\2\u04e7\u04e8\3\2\2"+ + "\2\u04e8\u04ea\7\u0083\2\2\u04e9\u04eb\5\u011a\u008e\2\u04ea\u04e9\3\2"+ + "\2\2\u04ea\u04eb\3\2\2\2\u04eb\u04ec\3\2\2\2\u04ec\u04ee\7\u0084\2\2\u04ed"+ + "\u04ef\5\u00f0y\2\u04ee\u04ed\3\2\2\2\u04ee\u04ef\3\2\2\2\u04ef\u00a1"+ + "\3\2\2\2\u04f0\u04f2\t\13\2\2\u04f1\u04f3\7\\\2\2\u04f2\u04f1\3\2\2\2"+ + "\u04f2\u04f3\3\2\2\2\u04f3\u04f7\3\2\2\2\u04f4\u04f5\7\\\2\2\u04f5\u04f7"+ + "\t\13\2\2\u04f6\u04f0\3\2\2\2\u04f6\u04f4\3\2\2\2\u04f7\u00a3\3\2\2\2"+ + "\u04f8\u04fe\5\u00acW\2\u04f9\u04fa\5\u0178\u00bd\2\u04fa\u04fb\5L\'\2"+ + "\u04fb\u04fc\7\u0088\2\2\u04fc\u04fe\3\2\2\2\u04fd\u04f8\3\2\2\2\u04fd"+ + "\u04f9\3\2\2\2\u04fe\u00a5\3\2\2\2\u04ff\u0500\5\u01b4\u00db\2\u0500\u0501"+ + "\7\u0087\2\2\u0501\u0502\5\u009aN\2\u0502\u00a7\3\2\2\2\u0503\u0506\5"+ + "\u00acW\2\u0504\u0506\5\u00aaV\2\u0505\u0503\3\2\2\2\u0505\u0504\3\2\2"+ + "\2\u0506\u00a9\3\2\2\2\u0507\u058a\7\u0088\2\2\u0508\u0509\5\36\20\2\u0509"+ + "\u050a\7\u0088\2\2\u050a\u058a\3\2\2\2\u050b\u050c\7\66\2\2\u050c\u050d"+ + "\7\u0083\2\2\u050d\u050e\5\36\20\2\u050e\u050f\7\u0084\2\2\u050f\u0512"+ + "\5\u00b8]\2\u0510\u0511\7&\2\2\u0511\u0513\5\u00b8]\2\u0512\u0510\3\2"+ + "\2\2\u0512\u0513\3\2\2\2\u0513\u058a\3\2\2\2\u0514\u0515\7_\2\2\u0515"+ + "\u0516\7\u0083\2\2\u0516\u0517\5\36\20\2\u0517\u0518\7\u0084\2\2\u0518"+ + "\u051c\7\177\2\2\u0519\u051b\5\u00ba^\2\u051a\u0519\3\2\2\2\u051b\u051e"+ + "\3\2\2\2\u051c\u051a\3\2\2\2\u051c\u051d\3\2\2\2\u051d\u051f\3\2\2\2\u051e"+ + "\u051c\3\2\2\2\u051f\u0520\7\u0080\2\2\u0520\u058a\3\2\2\2\u0521\u0522"+ + "\7r\2\2\u0522\u0523\7\u0083\2\2\u0523\u0524\5\36\20\2\u0524\u0525\7\u0084"+ + "\2\2\u0525\u0526\5\u00a8U\2\u0526\u058a\3\2\2\2\u0527\u0528\7#\2\2\u0528"+ + "\u0529\5\u00a8U\2\u0529\u052a\7r\2\2\u052a\u052b\7\u0083\2\2\u052b\u052c"+ + "\5\36\20\2\u052c\u052d\7\u0084\2\2\u052d\u052e\7\u0088\2\2\u052e\u058a"+ + "\3\2\2\2\u052f\u0530\7\60\2\2\u0530\u0532\7\u0083\2\2\u0531\u0533\5\u00c2"+ + "b\2\u0532\u0531\3\2\2\2\u0532\u0533\3\2\2\2\u0533\u0534\3\2\2\2\u0534"+ + "\u0536\7\u0088\2\2\u0535\u0537\5\36\20\2\u0536\u0535\3\2\2\2\u0536\u0537"+ + "\3\2\2\2\u0537\u0538\3\2\2\2\u0538\u053a\7\u0088\2\2\u0539\u053b\5\u00c4"+ + "c\2\u053a\u0539\3\2\2\2\u053a\u053b\3\2\2\2\u053b\u053c\3\2\2\2\u053c"+ + "\u053d\7\u0084\2\2\u053d\u058a\5\u00a8U\2\u053e\u0540\7\22\2\2\u053f\u053e"+ + "\3\2\2\2\u053f\u0540\3\2\2\2\u0540\u0541\3\2\2\2\u0541\u0542\7\61\2\2"+ + "\u0542\u0543\7\u0083\2\2\u0543\u0544\5\u00b0Y\2\u0544\u0545\5\u01b4\u00db"+ + "\2\u0545\u0546\78\2\2\u0546\u0547\5\36\20\2\u0547\u0548\7\u0084\2\2\u0548"+ + "\u0549\5\u00a8U\2\u0549\u058a\3\2\2\2\u054a\u054b\7\25\2\2\u054b\u058a"+ + "\7\u0088\2\2\u054c\u054d\7\36\2\2\u054d\u058a\7\u0088\2\2\u054e\u0553"+ + "\7\64\2\2\u054f\u0554\5\u01b4\u00db\2\u0550\u0551\7\30\2\2\u0551\u0554"+ + "\5\36\20\2\u0552\u0554\7 \2\2\u0553\u054f\3\2\2\2\u0553\u0550\3\2\2\2"+ + "\u0553\u0552\3\2\2\2\u0554\u0555\3\2\2\2\u0555\u058a\7\u0088\2\2\u0556"+ + "\u0558\7T\2\2\u0557\u0559\5\36\20\2\u0558\u0557\3\2\2\2\u0558\u0559\3"+ + "\2\2\2\u0559\u055a\3\2\2\2\u055a\u058a\7\u0088\2\2\u055b\u055d\7a\2\2"+ + "\u055c\u055e\5\36\20\2\u055d\u055c\3\2\2\2\u055d\u055e\3\2\2\2\u055e\u055f"+ + "\3\2\2\2\u055f\u058a\7\u0088\2\2\u0560\u0561\7c\2\2\u0561\u0567\5\u00ac"+ + "W\2\u0562\u0564\5\u00c6d\2\u0563\u0565\5\u00ceh\2\u0564\u0563\3\2\2\2"+ + "\u0564\u0565\3\2\2\2\u0565\u0568\3\2\2\2\u0566\u0568\5\u00ceh\2\u0567"+ + "\u0562\3\2\2\2\u0567\u0566\3\2\2\2\u0568\u058a\3\2\2\2\u0569\u056a\7\33"+ + "\2\2\u056a\u058a\5\u00acW\2\u056b\u056c\7g\2\2\u056c\u058a\5\u00acW\2"+ + "\u056d\u056e\7@\2\2\u056e\u056f\7\u0083\2\2\u056f\u0570\5\36\20\2\u0570"+ + "\u0571\7\u0084\2\2\u0571\u0572\5\u00a8U\2\u0572\u058a\3\2\2\2\u0573\u0574"+ + "\7k\2\2\u0574\u0575\7\u0083\2\2\u0575\u0576\5\u00d0i\2\u0576\u0577\7\u0084"+ + "\2\2\u0577\u0578\5\u00a8U\2\u0578\u058a\3\2\2\2\u0579\u057d\7s\2\2\u057a"+ + "\u057b\7T\2\2\u057b\u057e\5\36\20\2\u057c\u057e\7\25\2\2\u057d\u057a\3"+ + "\2\2\2\u057d\u057c\3\2\2\2\u057e\u057f\3\2\2\2\u057f\u058a\7\u0088\2\2"+ + "\u0580\u0581\7i\2\2\u0581\u058a\5\u00acW\2\u0582\u0583\7.\2\2\u0583\u0584"+ + "\7\u0083\2\2\u0584\u0585\5\u016c\u00b7\2\u0585\u0586\5\u016e\u00b8\2\u0586"+ + "\u0587\7\u0084\2\2\u0587\u0588\5\u00a8U\2\u0588\u058a\3\2\2\2\u0589\u0507"+ + "\3\2\2\2\u0589\u0508\3\2\2\2\u0589\u050b\3\2\2\2\u0589\u0514\3\2\2\2\u0589"+ + "\u0521\3\2\2\2\u0589\u0527\3\2\2\2\u0589\u052f\3\2\2\2\u0589\u053f\3\2"+ + "\2\2\u0589\u054a\3\2\2\2\u0589\u054c\3\2\2\2\u0589\u054e\3\2\2\2\u0589"+ + "\u0556\3\2\2\2\u0589\u055b\3\2\2\2\u0589\u0560\3\2\2\2\u0589\u0569\3\2"+ + "\2\2\u0589\u056b\3\2\2\2\u0589\u056d\3\2\2\2\u0589\u0573\3\2\2\2\u0589"+ + "\u0579\3\2\2\2\u0589\u0580\3\2\2\2\u0589\u0582\3\2\2\2\u058a\u00ab\3\2"+ + "\2\2\u058b\u058d\7\177\2\2\u058c\u058e\5\u00c0a\2\u058d\u058c\3\2\2\2"+ + "\u058d\u058e\3\2\2\2\u058e\u058f\3\2\2\2\u058f\u0590\7\u0080\2\2\u0590"+ + "\u00ad\3\2\2\2\u0591\u0596\7k\2\2\u0592\u0596\7R\2\2\u0593\u0594\7R\2"+ + "\2\u0594\u0596\7Q\2\2\u0595\u0591\3\2\2\2\u0595\u0592\3\2\2\2\u0595\u0593"+ + "\3\2\2\2\u0595\u0596\3\2\2\2\u0596\u0597\3\2\2\2\u0597\u0598\5\u00b0Y"+ + "\2\u0598\u059d\5\u00b2Z\2\u0599\u059a\7\u0086\2\2\u059a\u059c\5\u00b2"+ + "Z\2\u059b\u0599\3\2\2\2\u059c\u059f\3\2\2\2\u059d\u059b\3\2\2\2\u059d"+ + "\u059e\3\2\2\2\u059e\u05a5\3\2\2\2\u059f\u059d\3\2\2\2\u05a0\u05a1\7."+ + "\2\2\u05a1\u05a2\5\u016c\u00b7\2\u05a2\u05a3\5\u016e\u00b8\2\u05a3\u05a5"+ + "\3\2\2\2\u05a4\u0595\3\2\2\2\u05a4\u05a0\3\2\2\2\u05a5\u00af\3\2\2\2\u05a6"+ + "\u05a9\7l\2\2\u05a7\u05a9\5\6\4\2\u05a8\u05a6\3\2\2\2\u05a8\u05a7\3\2"+ + "\2\2\u05a9\u00b1\3\2\2\2\u05aa\u05b0\5\u01b4\u00db\2\u05ab\u05ad\7\u0093"+ + "\2\2\u05ac\u05ae\7R\2\2\u05ad\u05ac\3\2\2\2\u05ad\u05ae\3\2\2\2\u05ae"+ + "\u05af\3\2\2\2\u05af\u05b1\5\u00b4[\2\u05b0\u05ab\3\2\2\2\u05b0\u05b1"+ + "\3\2\2\2\u05b1\u00b3\3\2\2\2\u05b2\u05b6\5\36\20\2\u05b3\u05b6\5\u0146"+ + "\u00a4\2\u05b4\u05b6\5\u0176\u00bc\2\u05b5\u05b2\3\2\2\2\u05b5\u05b3\3"+ + "\2\2\2\u05b5\u05b4\3\2\2\2\u05b6\u00b5\3\2\2\2\u05b7\u05b8\7\35\2\2\u05b8"+ + "\u05b9\5\6\4\2\u05b9\u05ba\5\u010a\u0086\2\u05ba\u00b7\3\2\2\2\u05bb\u05be"+ + "\5\u00acW\2\u05bc\u05be\5\u00aaV\2\u05bd\u05bb\3\2\2\2\u05bd\u05bc\3\2"+ + "\2\2\u05be\u00b9\3\2\2\2\u05bf\u05c1\5\u00bc_\2\u05c0\u05bf\3\2\2\2\u05c1"+ + "\u05c2\3\2\2\2\u05c2\u05c0\3\2\2\2\u05c2\u05c3\3\2\2\2\u05c3\u05c4\3\2"+ + "\2\2\u05c4\u05c5\5\u00c0a\2\u05c5\u00bb\3\2\2\2\u05c6\u05c7\7\30\2\2\u05c7"+ + "\u05c9\5\36\20\2\u05c8\u05ca\5\u00be`\2\u05c9\u05c8\3\2\2\2\u05c9\u05ca"+ + "\3\2\2\2\u05ca\u05cb\3\2\2\2\u05cb\u05cc\7\u0087\2\2\u05cc\u05d0\3\2\2"+ + "\2\u05cd\u05ce\7 \2\2\u05ce\u05d0\7\u0087\2\2\u05cf\u05c6\3\2\2\2\u05cf"+ + "\u05cd\3\2\2\2\u05d0\u00bd\3\2\2\2\u05d1\u05d2\7p\2\2\u05d2\u05d3\5\36"+ + "\20\2\u05d3\u00bf\3\2\2\2\u05d4\u05d6\5\u009aN\2\u05d5\u05d4\3\2\2\2\u05d6"+ + "\u05d7\3\2\2\2\u05d7\u05d5\3\2\2\2\u05d7\u05d8\3\2\2\2\u05d8\u00c1\3\2"+ + "\2\2\u05d9\u05e3\5\u00aeX\2\u05da\u05df\5\36\20\2\u05db\u05dc\7\u0086"+ + "\2\2\u05dc\u05de\5\36\20\2\u05dd\u05db\3\2\2\2\u05de\u05e1\3\2\2\2\u05df"+ + "\u05dd\3\2\2\2\u05df\u05e0\3\2\2\2\u05e0\u05e3\3\2\2\2\u05e1\u05df\3\2"+ + "\2\2\u05e2\u05d9\3\2\2\2\u05e2\u05da\3\2\2\2\u05e3\u00c3\3\2\2\2\u05e4"+ + "\u05e9\5\36\20\2\u05e5\u05e6\7\u0086\2\2\u05e6\u05e8\5\36\20\2\u05e7\u05e5"+ + "\3\2\2\2\u05e8\u05eb\3\2\2\2\u05e9\u05e7\3\2\2\2\u05e9\u05ea\3\2\2\2\u05ea"+ + "\u00c5\3\2\2\2\u05eb\u05e9\3\2\2\2\u05ec\u05f0\5\u00c8e\2\u05ed\u05ef"+ + "\5\u00c8e\2\u05ee\u05ed\3\2\2\2\u05ef\u05f2\3\2\2\2\u05f0\u05ee\3\2\2"+ + "\2\u05f0\u05f1\3\2\2\2\u05f1\u05f4\3\2\2\2\u05f2\u05f0\3\2\2\2\u05f3\u05f5"+ + "\5\u00caf\2\u05f4\u05f3\3\2\2\2\u05f4\u05f5\3\2\2\2\u05f5\u05f8\3\2\2"+ + "\2\u05f6\u05f8\5\u00caf\2\u05f7\u05ec\3\2\2\2\u05f7\u05f6\3\2\2\2\u05f8"+ + "\u00c7\3\2\2\2\u05f9\u05fa\7\31\2\2\u05fa\u05fb\7\u0083\2\2\u05fb\u05fd"+ + "\5\26\f\2\u05fc\u05fe\5\u01b4\u00db\2\u05fd\u05fc\3\2\2\2\u05fd\u05fe"+ + "\3\2\2\2\u05fe\u05ff\3\2\2\2\u05ff\u0601\7\u0084\2\2\u0600\u0602\5\u00cc"+ + "g\2\u0601\u0600\3\2\2\2\u0601\u0602\3\2\2\2\u0602\u0603\3\2\2\2\u0603"+ + "\u0604\5\u00acW\2\u0604\u00c9\3\2\2\2\u0605\u0607\7\31\2\2\u0606\u0608"+ + "\5\u00ccg\2\u0607\u0606\3\2\2\2\u0607\u0608\3\2\2\2\u0608\u0609\3\2\2"+ + "\2\u0609\u060a\5\u00acW\2\u060a\u00cb\3\2\2\2\u060b\u060c\7p\2\2\u060c"+ + "\u060d\7\u0083\2\2\u060d\u060e\5\36\20\2\u060e\u060f\7\u0084\2\2\u060f"+ + "\u00cd\3\2\2\2\u0610\u0611\7-\2\2\u0611\u0612\5\u00acW\2\u0612\u00cf\3"+ + "\2\2\2\u0613\u0616\5\u00aeX\2\u0614\u0616\5\36\20\2\u0615\u0613\3\2\2"+ + "\2\u0615\u0614\3\2\2\2\u0616\u00d1\3\2\2\2\u0617\u0618\7C\2\2\u0618\u0619"+ + "\5\u00d4k\2\u0619\u061b\5\u00d6l\2\u061a\u061c\7\u0088\2\2\u061b\u061a"+ + "\3\2\2\2\u061b\u061c\3\2\2\2\u061c\u00d3\3\2\2\2\u061d\u0622\5\u01b4\u00db"+ + "\2\u061e\u061f\7\u0085\2\2\u061f\u0621\5\u01b4\u00db\2\u0620\u061e\3\2"+ + "\2\2\u0621\u0624\3\2\2\2\u0622\u0620\3\2\2\2\u0622\u0623\3\2\2\2\u0623"+ + "\u00d5\3\2\2\2\u0624\u0622\3\2\2\2\u0625\u0627\7\177\2\2\u0626\u0628\5"+ + "\u00d8m\2\u0627\u0626\3\2\2\2\u0627\u0628\3\2\2\2\u0628\u062a\3\2\2\2"+ + "\u0629\u062b\5\u00dco\2\u062a\u0629\3\2\2\2\u062a\u062b\3\2\2\2\u062b"+ + "\u062d\3\2\2\2\u062c\u062e\5\u00e0q\2\u062d\u062c\3\2\2\2\u062d\u062e"+ + "\3\2\2\2\u062e\u062f\3\2\2\2\u062f\u0630\7\u0080\2\2\u0630\u00d7\3\2\2"+ + "\2\u0631\u0633\5\u00dan\2\u0632\u0631\3\2\2\2\u0633\u0634\3\2\2\2\u0634"+ + "\u0632\3\2\2\2\u0634\u0635\3\2\2\2\u0635\u00d9\3\2\2\2\u0636\u0637\7+"+ + "\2\2\u0637\u0638\7\r\2\2\u0638\u0639\5\u01b4\u00db\2\u0639\u063a\7\u0088"+ + "\2\2\u063a\u00db\3\2\2\2\u063b\u063d\5\u00dep\2\u063c\u063b\3\2\2\2\u063d"+ + "\u063e\3\2\2\2\u063e\u063c\3\2\2\2\u063e\u063f\3\2\2\2\u063f\u00dd\3\2"+ + "\2\2\u0640\u0641\7k\2\2\u0641\u0642\5\u01b4\u00db\2\u0642\u0643\7\u0093"+ + "\2\2\u0643\u0644\5\4\3\2\u0644\u0645\7\u0088\2\2\u0645\u0650\3\2\2\2\u0646"+ + "\u0647\7k\2\2\u0647\u0648\5\4\3\2\u0648\u0649\7\u0088\2\2\u0649\u0650"+ + "\3\2\2\2\u064a\u064b\7k\2\2\u064b\u064c\7\\\2\2\u064c\u064d\5\4\3\2\u064d"+ + "\u064e\7\u0088\2\2\u064e\u0650\3\2\2\2\u064f\u0640\3\2\2\2\u064f\u0646"+ + "\3\2\2\2\u064f\u064a\3\2\2\2\u0650\u00df\3\2\2\2\u0651\u0653\5\u00e2r"+ + "\2\u0652\u0651\3\2\2\2\u0653\u0654\3\2\2\2\u0654\u0652\3\2\2\2\u0654\u0655"+ + "\3\2\2\2\u0655\u00e1\3\2\2\2\u0656\u0659\5\u00d2j\2\u0657\u0659\5\u00e4"+ + "s\2\u0658\u0656\3\2\2\2\u0658\u0657\3\2\2\2\u0659\u00e3\3\2\2\2\u065a"+ + "\u065c\5\u0160\u00b1\2\u065b\u065a\3\2\2\2\u065b\u065c\3\2\2\2\u065c\u065e"+ + "\3\2\2\2\u065d\u065f\5\u0102\u0082\2\u065e\u065d\3\2\2\2\u065e\u065f\3"+ + "\2\2\2\u065f\u0665\3\2\2\2\u0660\u0666\5\u0190\u00c9\2\u0661\u0666\5\u0192"+ + "\u00ca\2\u0662\u0666\5\u0194\u00cb\2\u0663\u0666\5\u0196\u00cc\2\u0664"+ + "\u0666\5\u0198\u00cd\2\u0665\u0660\3\2\2\2\u0665\u0661\3\2\2\2\u0665\u0662"+ + "\3\2\2\2\u0665\u0663\3\2\2\2\u0665\u0664\3\2\2\2\u0666\u00e5\3\2\2\2\u0667"+ + "\u0668\5\u01b4\u00db\2\u0668\u0669\7\u0097\2\2\u0669\u066b\5\u01b4\u00db"+ + "\2\u066a\u066c\5\30\r\2\u066b\u066a\3\2\2\2\u066b\u066c\3\2\2\2\u066c"+ + "\u00e7\3\2\2\2\u066d\u066e\7\u0094\2\2\u066e\u0673\5\u00eav\2\u066f\u0670"+ + "\7\u0086\2\2\u0670\u0672\5\u00eav\2\u0671\u066f\3\2\2\2\u0672\u0675\3"+ + "\2\2\2\u0673\u0671\3\2\2\2\u0673\u0674\3\2\2\2\u0674\u0676\3\2\2\2\u0675"+ + "\u0673\3\2\2\2\u0676\u0677\7\u0095\2\2\u0677\u00e9\3\2\2\2\u0678\u067a"+ + "\5\u0160\u00b1\2\u0679\u0678\3\2\2\2\u0679\u067a\3\2\2\2\u067a\u067b\3"+ + "\2\2\2\u067b\u067c\5\u01b4\u00db\2\u067c\u00eb\3\2\2\2\u067d\u067e\7\u0087"+ + "\2\2\u067e\u0683\5\26\f\2\u067f\u0680\7\u0086\2\2\u0680\u0682\5\4\3\2"+ + "\u0681\u067f\3\2\2\2\u0682\u0685\3\2\2\2\u0683\u0681\3\2\2\2\u0683\u0684"+ + "\3\2\2\2\u0684\u00ed\3\2\2\2\u0685\u0683\3\2\2\2\u0686\u068b\5\4\3\2\u0687"+ + "\u0688\7\u0086\2\2\u0688\u068a\5\4\3\2\u0689\u0687\3\2\2\2\u068a\u068d"+ + "\3\2\2\2\u068b\u0689\3\2\2\2\u068b\u068c\3\2\2\2\u068c\u00ef\3\2\2\2\u068d"+ + "\u068b\3\2\2\2\u068e\u0690\5\u00f2z\2\u068f\u068e\3\2\2\2\u0690\u0691"+ + "\3\2\2\2\u0691\u068f\3\2\2\2\u0691\u0692\3\2\2\2\u0692\u00f1\3\2\2\2\u0693"+ + "\u0694\7q\2\2\u0694\u0695\5\u01b4\u00db\2\u0695\u0696\7\u0087\2\2\u0696"+ + "\u0697\5\u00f4{\2\u0697\u00f3\3\2\2\2\u0698\u06a3\5\u00fa~\2\u0699\u069c"+ + "\5\u00f6|\2\u069a\u069b\7\u0086\2\2\u069b\u069d\5\u00f8}\2\u069c\u069a"+ + "\3\2\2\2\u069c\u069d\3\2\2\2\u069d\u06a0\3\2\2\2\u069e\u069f\7\u0086\2"+ + "\2\u069f\u06a1\5\u00fa~\2\u06a0\u069e\3\2\2\2\u06a0\u06a1\3\2\2\2\u06a1"+ + "\u06a3\3\2\2\2\u06a2\u0698\3\2\2\2\u06a2\u0699\3\2\2\2\u06a3\u00f5\3\2"+ + "\2\2\u06a4\u06ac\5\26\f\2\u06a5\u06a7\7\34\2\2\u06a6\u06a8\7\u0096\2\2"+ + "\u06a7\u06a6\3\2\2\2\u06a7\u06a8\3\2\2\2\u06a8\u06ac\3\2\2\2\u06a9\u06ac"+ + "\7^\2\2\u06aa\u06ac\7h\2\2\u06ab\u06a4\3\2\2\2\u06ab\u06a5\3\2\2\2\u06ab"+ + "\u06a9\3\2\2\2\u06ab\u06aa\3\2\2\2\u06ac\u00f7\3\2\2\2\u06ad\u06b2\5\4"+ + "\3\2\u06ae\u06af\7\u0086\2\2\u06af\u06b1\5\4\3\2\u06b0\u06ae\3\2\2\2\u06b1"+ + "\u06b4\3\2\2\2\u06b2\u06b0\3\2\2\2\u06b2\u06b3\3\2\2\2\u06b3\u00f9\3\2"+ + "\2\2\u06b4\u06b2\3\2\2\2\u06b5\u06b6\7D\2\2\u06b6\u06b7\7\u0083\2\2\u06b7"+ + "\u06b8\7\u0084\2\2\u06b8\u00fb\3\2\2\2\u06b9\u06bb\7\177\2\2\u06ba\u06bc"+ + "\5\u00fe\u0080\2\u06bb\u06ba\3\2\2\2\u06bb\u06bc\3\2\2\2\u06bc\u06bd\3"+ + "\2\2\2\u06bd\u06be\7\u0080\2\2\u06be\u00fd\3\2\2\2\u06bf\u06c1\5\u0100"+ + "\u0081\2\u06c0\u06bf\3\2\2\2\u06c1\u06c2\3\2\2\2\u06c2\u06c0\3\2\2\2\u06c2"+ + "\u06c3\3\2\2\2\u06c3\u00ff\3\2\2\2\u06c4\u06c6\5\u0160\u00b1\2\u06c5\u06c4"+ + "\3\2\2\2\u06c5\u06c6\3\2\2\2\u06c6\u06c8\3\2\2\2\u06c7\u06c9\5\u0102\u0082"+ + "\2\u06c8\u06c7\3\2\2\2\u06c8\u06c9\3\2\2\2\u06c9\u06cc\3\2\2\2\u06ca\u06cd"+ + "\5\u0106\u0084\2\u06cb\u06cd\5\u01a4\u00d3\2\u06cc\u06ca\3\2\2\2\u06cc"+ + "\u06cb\3\2\2\2\u06cd\u0101\3\2\2\2\u06ce\u06d0\5\u0104\u0083\2\u06cf\u06ce"+ + "\3\2\2\2\u06d0\u06d1\3\2\2\2\u06d1\u06cf\3\2\2\2\u06d1\u06d2\3\2\2\2\u06d2"+ + "\u0103\3\2\2\2\u06d3\u06d4\t\f\2\2\u06d4\u0105\3\2\2\2\u06d5\u06e9\5\u01a0"+ + "\u00d1\2\u06d6\u06e9\5\u0108\u0085\2\u06d7\u06e9\5\u019a\u00ce\2\u06d8"+ + "\u06de\5\u0136\u009c\2\u06d9\u06df\5\u013a\u009e\2\u06da\u06db\5\u0178"+ + "\u00bd\2\u06db\u06dc\5L\'\2\u06dc\u06dd\7\u0088\2\2\u06dd\u06df\3\2\2"+ + "\2\u06de\u06d9\3\2\2\2\u06de\u06da\3\2\2\2\u06df\u06e9\3\2\2\2\u06e0\u06e9"+ + "\5\u01a6\u00d4\2\u06e1\u06e2\7n\2\2\u06e2\u06e9\5\u01a8\u00d5\2\u06e3"+ + "\u06e9\5\u0190\u00c9\2\u06e4\u06e9\5\u0192\u00ca\2\u06e5\u06e9\5\u0194"+ + "\u00cb\2\u06e6\u06e9\5\u0196\u00cc\2\u06e7\u06e9\5\u0198\u00cd\2\u06e8"+ + "\u06d5\3\2\2\2\u06e8\u06d6\3\2\2\2\u06e8\u06d7\3\2\2\2\u06e8\u06d8\3\2"+ + "\2\2\u06e8\u06e0\3\2\2\2\u06e8\u06e1\3\2\2\2\u06e8\u06e3\3\2\2\2\u06e8"+ + "\u06e4\3\2\2\2\u06e8\u06e5\3\2\2\2\u06e8\u06e6\3\2\2\2\u06e8\u06e7\3\2"+ + "\2\2\u06e9\u0107\3\2\2\2\u06ea\u06f0\7R\2\2\u06eb\u06ec\7Q\2\2\u06ec\u06f0"+ + "\7R\2\2\u06ed\u06ee\7R\2\2\u06ee\u06f0\7Q\2\2\u06ef\u06ea\3\2\2\2\u06ef"+ + "\u06eb\3\2\2\2\u06ef\u06ed\3\2\2\2\u06ef\u06f0\3\2\2\2\u06f0\u06f1\3\2"+ + "\2\2\u06f1\u06fb\5\6\4\2\u06f2\u06f3\5\4\3\2\u06f3\u06f4\7\u0085\2\2\u06f4"+ + "\u06f5\5\u01a2\u00d2\2\u06f5\u06fc\3\2\2\2\u06f6\u06fc\5\u01a8\u00d5\2"+ + "\u06f7\u06fc\5\u019e\u00d0\2\u06f8\u06fc\5\u01a2\u00d2\2\u06f9\u06fc\5"+ + "\u01ac\u00d7\2\u06fa\u06fc\5\u019c\u00cf\2\u06fb\u06f2\3\2\2\2\u06fb\u06f6"+ + "\3\2\2\2\u06fb\u06f7\3\2\2\2\u06fb\u06f8\3\2\2\2\u06fb\u06f9\3\2\2\2\u06fb"+ + "\u06fa\3\2\2\2\u06fc\u0109\3\2\2\2\u06fd\u0702\5\u010c\u0087\2\u06fe\u06ff"+ + "\7\u0086\2\2\u06ff\u0701\5\u010c\u0087\2\u0700\u06fe\3\2\2\2\u0701\u0704"+ + "\3\2\2\2\u0702\u0700\3\2\2\2\u0702\u0703\3\2\2\2\u0703\u010b\3\2\2\2\u0704"+ + "\u0702\3\2\2\2\u0705\u0706\5\u01b4\u00db\2\u0706\u0707\7\u0093\2\2\u0707"+ + "\u0708\5\36\20\2\u0708\u010d\3\2\2\2\u0709\u070e\5\u0110\u0089\2\u070a"+ + "\u070b\7\u0086\2\2\u070b\u070d\5\u0110\u0089\2\u070c\u070a\3\2\2\2\u070d"+ + "\u0710\3\2\2\2\u070e\u070c\3\2\2\2\u070e\u070f\3\2\2\2\u070f\u010f\3\2"+ + "\2\2\u0710\u070e\3\2\2\2\u0711\u0714\5\u01b4\u00db\2\u0712\u0713\7\u0093"+ + "\2\2\u0713\u0715\5\u0112\u008a\2\u0714\u0712\3\2\2\2\u0714\u0715\3\2\2"+ + "\2\u0715\u0111\3\2\2\2\u0716\u0719\5\36\20\2\u0717\u0719\5\u0146\u00a4"+ + "\2\u0718\u0716\3\2\2\2\u0718\u0717\3\2\2\2\u0719\u0113\3\2\2\2\u071a\u071d"+ + "\5\6\4\2\u071b\u071d\7n\2\2\u071c\u071a\3\2\2\2\u071c\u071b\3\2\2\2\u071d"+ + "\u0115\3\2\2\2\u071e\u071f\5\4\3\2\u071f\u0117\3\2\2\2\u0720\u0723\5\u00ac"+ + "W\2\u0721\u0723\7\u0088\2\2\u0722\u0720\3\2\2\2\u0722\u0721\3\2\2\2\u0723"+ + "\u0119\3\2\2\2\u0724\u072b\5\u0122\u0092\2\u0725\u0728\5\u011c\u008f\2"+ + "\u0726\u0727\7\u0086\2\2\u0727\u0729\5\u0122\u0092\2\u0728\u0726\3\2\2"+ + "\2\u0728\u0729\3\2\2\2\u0729\u072b\3\2\2\2\u072a\u0724\3\2\2\2\u072a\u0725"+ + "\3\2\2\2\u072b\u011b\3\2\2\2\u072c\u0731\5\u011e\u0090\2\u072d\u072e\7"+ + "\u0086\2\2\u072e\u0730\5\u011e\u0090\2\u072f\u072d\3\2\2\2\u0730\u0733"+ + "\3\2\2\2\u0731\u072f\3\2\2\2\u0731\u0732\3\2\2\2\u0732\u011d\3\2\2\2\u0733"+ + "\u0731\3\2\2\2\u0734\u0736\5\u0160\u00b1\2\u0735\u0734\3\2\2\2\u0735\u0736"+ + "\3\2\2\2\u0736\u0738\3\2\2\2\u0737\u0739\5\u0120\u0091\2\u0738\u0737\3"+ + "\2\2\2\u0738\u0739\3\2\2\2\u0739\u073a\3\2\2\2\u073a\u073d\5\u01ae\u00d8"+ + "\2\u073b\u073d\7\16\2\2\u073c\u0735\3\2\2\2\u073c\u073b\3\2\2\2\u073d"+ + "\u011f\3\2\2\2\u073e\u0747\7R\2\2\u073f\u0747\7J\2\2\u0740\u0747\78\2"+ + "\2\u0741\u0742\7R\2\2\u0742\u0747\7`\2\2\u0743\u0744\78\2\2\u0744\u0747"+ + "\7`\2\2\u0745\u0747\7`\2\2\u0746\u073e\3\2\2\2\u0746\u073f\3\2\2\2\u0746"+ + "\u0740\3\2\2\2\u0746\u0741\3\2\2\2\u0746\u0743\3\2\2\2\u0746\u0745\3\2"+ + "\2\2\u0747\u0121\3\2\2\2\u0748\u074a\5\u0160\u00b1\2\u0749\u0748\3\2\2"+ + "\2\u0749\u074a\3\2\2\2\u074a\u074b\3\2\2\2\u074b\u074c\7L\2\2\u074c\u074d"+ + "\5\u0142\u00a2\2\u074d\u074e\5\u01b4\u00db\2\u074e\u0123\3\2\2\2\u074f"+ + "\u0751\5\u0160\u00b1\2\u0750\u074f\3\2\2\2\u0750\u0751\3\2\2\2\u0751\u0753"+ + "\3\2\2\2\u0752\u0754\5\u012a\u0096\2\u0753\u0752\3\2\2\2\u0753\u0754\3"+ + "\2\2\2\u0754\u075f\3\2\2\2\u0755\u0756\7\63\2\2\u0756\u0758\5\u012c\u0097"+ + "\2\u0757\u0759\5\u0128\u0095\2\u0758\u0757\3\2\2\2\u0758\u0759\3\2\2\2"+ + "\u0759\u0760\3\2\2\2\u075a\u075b\7X\2\2\u075b\u075d\5\u012c\u0097\2\u075c"+ + "\u075e\5\u0126\u0094\2\u075d\u075c\3\2\2\2\u075d\u075e\3\2\2\2\u075e\u0760"+ + "\3\2\2\2\u075f\u0755\3\2\2\2\u075f\u075a\3\2\2\2\u0760\u0125\3\2\2\2\u0761"+ + "\u0763\5\u0160\u00b1\2\u0762\u0761\3\2\2\2\u0762\u0763\3\2\2\2\u0763\u0765"+ + "\3\2\2\2\u0764\u0766\5\u012a\u0096\2\u0765\u0764\3\2\2\2\u0765\u0766\3"+ + "\2\2\2\u0766\u0767\3\2\2\2\u0767\u0768\7\63\2\2\u0768\u0769\5\u012c\u0097"+ + "\2\u0769\u0127\3\2\2\2\u076a\u076c\5\u0160\u00b1\2\u076b\u076a\3\2\2\2"+ + "\u076b\u076c\3\2\2\2\u076c\u076e\3\2\2\2\u076d\u076f\5\u012a\u0096\2\u076e"+ + "\u076d\3\2\2\2\u076e\u076f\3\2\2\2\u076f\u0770\3\2\2\2\u0770\u0771\7X"+ + "\2\2\u0771\u0772\5\u012c\u0097\2\u0772\u0129\3\2\2\2\u0773\u077b\7O\2"+ + "\2\u0774\u077b\7;\2\2\u0775\u077b\7N\2\2\u0776\u0777\7O\2\2\u0777\u077b"+ + "\7;\2\2\u0778\u0779\7;\2\2\u0779\u077b\7O\2\2\u077a\u0773\3\2\2\2\u077a"+ + "\u0774\3\2\2\2\u077a\u0775\3\2\2\2\u077a\u0776\3\2\2\2\u077a\u0778\3\2"+ + "\2\2\u077b\u012b\3\2\2\2\u077c\u077f\5\u00acW\2\u077d\u077f\7\u0088\2"+ + "\2\u077e\u077c\3\2\2\2\u077e\u077d\3\2\2\2\u077f\u012d\3\2\2\2\u0780\u0782"+ + "\5\u0160\u00b1\2\u0781\u0780\3\2\2\2\u0781\u0782\3\2\2\2\u0782\u078b\3"+ + "\2\2\2\u0783\u0784\7\f\2\2\u0784\u0785\5\u00acW\2\u0785\u0786\5\u0132"+ + "\u009a\2\u0786\u078c\3\2\2\2\u0787\u0788\7S\2\2\u0788\u0789\5\u00acW\2"+ + "\u0789\u078a\5\u0130\u0099\2\u078a\u078c\3\2\2\2\u078b\u0783\3\2\2\2\u078b"+ + "\u0787\3\2\2\2\u078c\u012f\3\2\2\2\u078d\u078f\5\u0160\u00b1\2\u078e\u078d"+ + "\3\2\2\2\u078e\u078f\3\2\2\2\u078f\u0790\3\2\2\2\u0790\u0791\7\f\2\2\u0791"+ + "\u0792\5\u00acW\2\u0792\u0131\3\2\2\2\u0793\u0795\5\u0160\u00b1\2\u0794"+ + "\u0793\3\2\2\2\u0794\u0795\3\2\2\2\u0795\u0796\3\2\2\2\u0796\u0797\7S"+ + "\2\2\u0797\u0798\5\u00acW\2\u0798\u0133\3\2\2\2\u0799\u07b0\7\u0089\2"+ + "\2\u079a\u07b0\7\u008a\2\2\u079b\u07b0\7\u0091\2\2\u079c\u07b0\7\u0092"+ + "\2\2\u079d\u07b0\7\u0099\2\2\u079e\u07b0\7\u009a\2\2\u079f\u07b0\7b\2"+ + "\2\u07a0\u07b0\7,\2\2\u07a1\u07b0\7\u008b\2\2\u07a2\u07b0\7\u008c\2\2"+ + "\u07a3\u07b0\7\u008d\2\2\u07a4\u07b0\7\u008e\2\2\u07a5\u07b0\7\u008f\2"+ + "\2\u07a6\u07b0\7\u0090\2\2\u07a7\u07b0\7\u00aa\2\2\u07a8\u07b0\5\u017a"+ + "\u00be\2\u07a9\u07b0\7\u009e\2\2\u07aa\u07b0\7\u009f\2\2\u07ab\u07b0\7"+ + "\u0095\2\2\u07ac\u07b0\7\u0094\2\2\u07ad\u07b0\7\u00a1\2\2\u07ae\u07b0"+ + "\7\u00a0\2\2\u07af\u0799\3\2\2\2\u07af\u079a\3\2\2\2\u07af\u079b\3\2\2"+ + "\2\u07af\u079c\3\2\2\2\u07af\u079d\3\2\2\2\u07af\u079e\3\2\2\2\u07af\u079f"+ + "\3\2\2\2\u07af\u07a0\3\2\2\2\u07af\u07a1\3\2\2\2\u07af\u07a2\3\2\2\2\u07af"+ + "\u07a3\3\2\2\2\u07af\u07a4\3\2\2\2\u07af\u07a5\3\2\2\2\u07af\u07a6\3\2"+ + "\2\2\u07af\u07a7\3\2\2\2\u07af\u07a8\3\2\2\2\u07af\u07a9\3\2\2\2\u07af"+ + "\u07aa\3\2\2\2\u07af\u07ab\3\2\2\2\u07af\u07ac\3\2\2\2\u07af\u07ad\3\2"+ + "\2\2\u07af\u07ae\3\2\2\2\u07b0\u0135\3\2\2\2\u07b1\u07b2\t\r\2\2\u07b2"+ + "\u07b3\7H\2\2\u07b3\u07b4\5\6\4\2\u07b4\u07b5\7\u0083\2\2\u07b5\u07b6"+ + "\5\u01ae\u00d8\2\u07b6\u07b7\7\u0084\2\2\u07b7\u0137\3\2\2\2\u07b8\u07b9"+ + "\7\u0087\2\2\u07b9\u07ba\t\16\2\2\u07ba\u07bc\7\u0083\2\2\u07bb\u07bd"+ + "\5\32\16\2\u07bc\u07bb\3\2\2\2\u07bc\u07bd\3\2\2\2\u07bd\u07be\3\2\2\2"+ + "\u07be\u07bf\7\u0084\2\2\u07bf\u0139\3\2\2\2\u07c0\u07c3\5\u00acW\2\u07c1"+ + "\u07c3\7\u0088\2\2\u07c2\u07c0\3\2\2\2\u07c2\u07c1\3\2\2\2\u07c3\u013b"+ + "\3\2\2\2\u07c4\u07c5\7\u0087\2\2\u07c5\u07c6\5\u00eex\2\u07c6\u013d\3"+ + "\2\2\2\u07c7\u07cb\7\177\2\2\u07c8\u07ca\5\u0140\u00a1\2\u07c9\u07c8\3"+ + "\2\2\2\u07ca\u07cd\3\2\2\2\u07cb\u07c9\3\2\2\2\u07cb\u07cc\3\2\2\2\u07cc"+ + "\u07ce\3\2\2\2\u07cd\u07cb\3\2\2\2\u07ce\u07cf\7\u0080\2\2\u07cf\u013f"+ + "\3\2\2\2\u07d0\u07d2\5\u0160\u00b1\2\u07d1\u07d0\3\2\2\2\u07d1\u07d2\3"+ + "\2\2\2\u07d2\u07d4\3\2\2\2\u07d3\u07d5\5\u0102\u0082\2\u07d4\u07d3\3\2"+ + "\2\2\u07d4\u07d5\3\2\2\2\u07d5\u07e0\3\2\2\2\u07d6\u07e1\5\u0106\u0084"+ + "\2\u07d7\u07d8\7.\2\2\u07d8\u07da\5\6\4\2\u07d9\u07db\5\u0174\u00bb\2"+ + "\u07da\u07d9\3\2\2\2\u07db\u07dc\3\2\2\2\u07dc\u07da\3\2\2\2\u07dc\u07dd"+ + "\3\2\2\2\u07dd\u07de\3\2\2\2\u07de\u07df\7\u0088\2\2\u07df\u07e1\3\2\2"+ + "\2\u07e0\u07d6\3\2\2\2\u07e0\u07d7\3\2\2\2\u07e1\u0141\3\2\2\2\u07e2\u07ea"+ + "\5\b\5\2\u07e3\u07e5\t\17\2\2\u07e4\u07e3\3\2\2\2\u07e5\u07e8\3\2\2\2"+ + "\u07e6\u07e4\3\2\2\2\u07e6\u07e7\3\2\2\2\u07e7\u07e9\3\2\2\2\u07e8\u07e6"+ + "\3\2\2\2\u07e9\u07eb\5\u0144\u00a3\2\u07ea\u07e6\3\2\2\2\u07eb\u07ec\3"+ + "\2\2\2\u07ec\u07ea\3\2\2\2\u07ec\u07ed\3\2\2\2\u07ed\u0143\3\2\2\2\u07ee"+ + "\u07f2\7\u0081\2\2\u07ef\u07f1\7\u0086\2\2\u07f0\u07ef\3\2\2\2\u07f1\u07f4"+ + "\3\2\2\2\u07f2\u07f0\3\2\2\2\u07f2\u07f3\3\2\2\2\u07f3\u07f5\3\2\2\2\u07f4"+ + "\u07f2\3\2\2\2\u07f5\u07f6\7\u0082\2\2\u07f6\u0145\3\2\2\2\u07f7\u0803"+ + "\7\177\2\2\u07f8\u07fd\5\u0112\u008a\2\u07f9\u07fa\7\u0086\2\2\u07fa\u07fc"+ + "\5\u0112\u008a\2\u07fb\u07f9\3\2\2\2\u07fc\u07ff\3\2\2\2\u07fd\u07fb\3"+ + "\2\2\2\u07fd\u07fe\3\2\2\2\u07fe\u0801\3\2\2\2\u07ff\u07fd\3\2\2\2\u0800"+ + "\u0802\7\u0086\2\2\u0801\u0800\3\2\2\2\u0801\u0802\3\2\2\2\u0802\u0804"+ + "\3\2\2\2\u0803\u07f8\3\2\2\2\u0803\u0804\3\2\2\2\u0804\u0805\3\2\2\2\u0805"+ + "\u0806\7\u0080\2\2\u0806\u0147\3\2\2\2\u0807\u0808\7\u0094\2\2\u0808\u080d"+ + "\5\u014a\u00a6\2\u0809\u080a\7\u0086\2\2\u080a\u080c\5\u014a\u00a6\2\u080b"+ + "\u0809\3\2\2\2\u080c\u080f\3\2\2\2\u080d\u080b\3\2\2\2\u080d\u080e\3\2"+ + "\2\2\u080e\u0810\3\2\2\2\u080f\u080d\3\2\2\2\u0810\u0811\7\u0095\2\2\u0811"+ + "\u0149\3\2\2\2\u0812\u0814\5\u0160\u00b1\2\u0813\u0812\3\2\2\2\u0813\u0814"+ + "\3\2\2\2\u0814\u0816\3\2\2\2\u0815\u0817\5\u014c\u00a7\2\u0816\u0815\3"+ + "\2\2\2\u0816\u0817\3\2\2\2\u0817\u0818\3\2\2\2\u0818\u0819\5\u01b4\u00db"+ + "\2\u0819\u014b\3\2\2\2\u081a\u081b\t\20\2\2\u081b\u014d\3\2\2\2\u081c"+ + "\u081d\7\u0087\2\2\u081d\u081e\5\u00eex\2\u081e\u014f\3\2\2\2\u081f\u0823"+ + "\7\177\2\2\u0820\u0822\5\u0152\u00aa\2\u0821\u0820\3\2\2\2\u0822\u0825"+ + "\3\2\2\2\u0823\u0821\3\2\2\2\u0823\u0824\3\2\2\2\u0824\u0826\3\2\2\2\u0825"+ + "\u0823\3\2\2\2\u0826\u0827\7\u0080\2\2\u0827\u0151\3\2\2\2\u0828\u082a"+ + "\5\u0160\u00b1\2\u0829\u0828\3\2\2\2\u0829\u082a\3\2\2\2\u082a\u082c\3"+ + "\2\2\2\u082b\u082d\7D\2\2\u082c\u082b\3\2\2\2\u082c\u082d\3\2\2\2\u082d"+ + "\u086d\3\2\2\2\u082e\u0830\7i\2\2\u082f\u082e\3\2\2\2\u082f\u0830\3\2"+ + "\2\2\u0830\u0836\3\2\2\2\u0831\u0837\7R\2\2\u0832\u0833\7R\2\2\u0833\u0837"+ + "\7Q\2\2\u0834\u0835\7Q\2\2\u0835\u0837\7R\2\2\u0836\u0831\3\2\2\2\u0836"+ + "\u0832\3\2\2\2\u0836\u0834\3\2\2\2\u0836\u0837\3\2\2\2\u0837\u0838\3\2"+ + "\2\2\u0838\u0854\5\6\4\2\u0839\u083b\5\u01b4\u00db\2\u083a\u083c\5\u00e8"+ + "u\2\u083b\u083a\3\2\2\2\u083b\u083c\3\2\2\2\u083c\u083d\3\2\2\2\u083d"+ + "\u083f\7\u0083\2\2\u083e\u0840\5\u011a\u008e\2\u083f\u083e\3\2\2\2\u083f"+ + "\u0840\3\2\2\2\u0840\u0841\3\2\2\2\u0841\u0843\7\u0084\2\2\u0842\u0844"+ + "\5\u00f0y\2\u0843\u0842\3\2\2\2\u0843\u0844\3\2\2\2\u0844\u0845\3\2\2"+ + "\2\u0845\u0846\7\u0088\2\2\u0846\u0855\3\2\2\2\u0847\u0848\5\u01b4\u00db"+ + "\2\u0848\u0849\7\177\2\2\u0849\u084a\5\u0154\u00ab\2\u084a\u084b\7\u0080"+ + "\2\2\u084b\u0855\3\2\2\2\u084c\u084d\7`\2\2\u084d\u084e\7\u0081\2\2\u084e"+ + "\u084f\5\u011a\u008e\2\u084f\u0850\7\u0082\2\2\u0850\u0851\7\177\2\2\u0851"+ + "\u0852\5\u0154\u00ab\2\u0852\u0853\7\u0080\2\2\u0853\u0855\3\2\2\2\u0854"+ + "\u0839\3\2\2\2\u0854\u0847\3\2\2\2\u0854\u084c\3\2\2\2\u0855\u086e\3\2"+ + "\2\2\u0856\u0858\7i\2\2\u0857\u0856\3\2\2\2\u0857\u0858\3\2\2\2\u0858"+ + "\u0859\3\2\2\2\u0859\u085a\7n\2\2\u085a\u085c\5\u01b4\u00db\2\u085b\u085d"+ + "\5\u00e8u\2\u085c\u085b\3\2\2\2\u085c\u085d\3\2\2\2\u085d\u085e\3\2\2"+ + "\2\u085e\u0860\7\u0083\2\2\u085f\u0861\5\u011a\u008e\2\u0860\u085f\3\2"+ + "\2\2\u0860\u0861\3\2\2\2\u0861\u0862\3\2\2\2\u0862\u0864\7\u0084\2\2\u0863"+ + "\u0865\5\u00f0y\2\u0864\u0863\3\2\2\2\u0864\u0865\3\2\2\2\u0865\u0866"+ + "\3\2\2\2\u0866\u0867\7\u0088\2\2\u0867\u086e\3\2\2\2\u0868\u0869\7)\2"+ + "\2\u0869\u086a\5\6\4\2\u086a\u086b\5\u01b4\u00db\2\u086b\u086c\7\u0088"+ + "\2\2\u086c\u086e\3\2\2\2\u086d\u082f\3\2\2\2\u086d\u0857\3\2\2\2\u086d"+ + "\u0868\3\2\2\2\u086e\u0153\3\2\2\2\u086f\u0871\5\u0160\u00b1\2\u0870\u086f"+ + "\3\2\2\2\u0870\u0871\3\2\2\2\u0871\u0884\3\2\2\2\u0872\u0873\7\63\2\2"+ + "\u0873\u0879\7\u0088\2\2\u0874\u0876\5\u0160\u00b1\2\u0875\u0874\3\2\2"+ + "\2\u0875\u0876\3\2\2\2\u0876\u0877\3\2\2\2\u0877\u0878\7X\2\2\u0878\u087a"+ + "\7\u0088\2\2\u0879\u0875\3\2\2\2\u0879\u087a\3\2\2\2\u087a\u0885\3\2\2"+ + "\2\u087b\u087c\7X\2\2\u087c\u0882\7\u0088\2\2\u087d\u087f\5\u0160\u00b1"+ + "\2\u087e\u087d\3\2\2\2\u087e\u087f\3\2\2\2\u087f\u0880\3\2\2\2\u0880\u0881"+ + "\7\63\2\2\u0881\u0883\7\u0088\2\2\u0882\u087e\3\2\2\2\u0882\u0883\3\2"+ + "\2\2\u0883\u0885\3\2\2\2\u0884\u0872\3\2\2\2\u0884\u087b\3\2\2\2\u0885"+ + "\u0155\3\2\2\2\u0886\u0887\7\u0087\2\2\u0887\u0888\5\6\4\2\u0888\u0157"+ + "\3\2\2\2\u0889\u0895\7\177\2\2\u088a\u088f\5\u015a\u00ae\2\u088b\u088c"+ + "\7\u0086\2\2\u088c\u088e\5\u015a\u00ae\2\u088d\u088b\3\2\2\2\u088e\u0891"+ + "\3\2\2\2\u088f\u088d\3\2\2\2\u088f\u0890\3\2\2\2\u0890\u0893\3\2\2\2\u0891"+ + "\u088f\3\2\2\2\u0892\u0894\7\u0086\2\2\u0893\u0892\3\2\2\2\u0893\u0894"+ + "\3\2\2\2\u0894\u0896\3\2\2\2\u0895\u088a\3\2\2\2\u0895\u0896\3\2\2\2\u0896"+ + "\u0897\3\2\2\2\u0897\u0898\7\u0080\2\2\u0898\u0159\3\2\2\2\u0899\u089b"+ + "\5\u0160\u00b1\2\u089a\u0899\3\2\2\2\u089a\u089b\3\2\2\2\u089b\u089c\3"+ + "\2\2\2\u089c\u089f\5\u01b4\u00db\2\u089d\u089e\7\u0093\2\2\u089e\u08a0"+ + "\5\36\20\2\u089f\u089d\3\2\2\2\u089f\u08a0\3\2\2\2\u08a0\u015b\3\2\2\2"+ + "\u08a1\u08a2\7\u0081\2\2\u08a2\u08a3\5\u015e\u00b0\2\u08a3\u08a4\7\u0087"+ + "\2\2\u08a4\u08a6\5\u0166\u00b4\2\u08a5\u08a7\7\u0086\2\2\u08a6\u08a5\3"+ + "\2\2\2\u08a6\u08a7\3\2\2\2\u08a7\u08a8\3\2\2\2\u08a8\u08a9\7\u0082\2\2"+ + "\u08a9\u015d\3\2\2\2\u08aa\u08ad\5\u018e\u00c8\2\u08ab\u08ad\5\u01b4\u00db"+ + "\2\u08ac\u08aa\3\2\2\2\u08ac\u08ab\3\2\2\2\u08ad\u015f\3\2\2\2\u08ae\u08b0"+ + "\5\u0162\u00b2\2\u08af\u08ae\3\2\2\2\u08b0\u08b1\3\2\2\2\u08b1\u08af\3"+ + "\2\2\2\u08b1\u08b2\3\2\2\2\u08b2\u0161\3\2\2\2\u08b3\u08b7\7\u0081\2\2"+ + "\u08b4\u08b5\5\u0164\u00b3\2\u08b5\u08b6\7\u0087\2\2\u08b6\u08b8\3\2\2"+ + "\2\u08b7\u08b4\3\2\2\2\u08b7\u08b8\3\2\2\2\u08b8\u08b9\3\2\2\2\u08b9\u08bb"+ + "\5\u0166\u00b4\2\u08ba\u08bc\7\u0086\2\2\u08bb\u08ba\3\2\2\2\u08bb\u08bc"+ + "\3\2\2\2\u08bc\u08bd\3\2\2\2\u08bd\u08be\7\u0082\2\2\u08be\u0163\3\2\2"+ + "\2\u08bf\u08c2\5\u018e\u00c8\2\u08c0\u08c2\5\u01b4\u00db\2\u08c1\u08bf"+ + "\3\2\2\2\u08c1\u08c0\3\2\2\2\u08c2\u0165\3\2\2\2\u08c3\u08c8\5\u0168\u00b5"+ + "\2\u08c4\u08c5\7\u0086\2\2\u08c5\u08c7\5\u0168\u00b5\2\u08c6\u08c4\3\2"+ + "\2\2\u08c7\u08ca\3\2\2\2\u08c8\u08c6\3\2\2\2\u08c8\u08c9\3\2\2\2\u08c9"+ + "\u0167\3\2\2\2\u08ca\u08c8\3\2\2\2\u08cb\u08d8\5\4\3\2\u08cc\u08d5\7\u0083"+ + "\2\2\u08cd\u08d2\5\u016a\u00b6\2\u08ce\u08cf\7\u0086\2\2\u08cf\u08d1\5"+ + "\u016a\u00b6\2\u08d0\u08ce\3\2\2\2\u08d1\u08d4\3\2\2\2\u08d2\u08d0\3\2"+ + "\2\2\u08d2\u08d3\3\2\2\2\u08d3\u08d6\3\2\2\2\u08d4\u08d2\3\2\2\2\u08d5"+ + "\u08cd\3\2\2\2\u08d5\u08d6\3\2\2\2\u08d6\u08d7\3\2\2\2\u08d7\u08d9\7\u0084"+ + "\2\2\u08d8\u08cc\3\2\2\2\u08d8\u08d9\3\2\2\2\u08d9\u0169\3\2\2\2\u08da"+ + "\u08db\5\u01b4\u00db\2\u08db\u08dc\7\u0087\2\2\u08dc\u08de\3\2\2\2\u08dd"+ + "\u08da\3\2\2\2\u08dd\u08de\3\2\2\2\u08de\u08df\3\2\2\2\u08df\u08e0\5\36"+ + "\20\2\u08e0\u016b\3\2\2\2\u08e1\u08e4\5\16\b\2\u08e2\u08e4\5\26\f\2\u08e3"+ + "\u08e1\3\2\2\2\u08e3\u08e2\3\2\2\2\u08e4\u08e9\3\2\2\2\u08e5\u08e8\5\u0144"+ + "\u00a3\2\u08e6\u08e8\7\u0096\2\2\u08e7\u08e5\3\2\2\2\u08e7\u08e6\3\2\2"+ + "\2\u08e8\u08eb\3\2\2\2\u08e9\u08e7\3\2\2\2\u08e9\u08ea\3\2\2\2\u08ea\u08ec"+ + "\3\2\2\2\u08eb\u08e9\3\2\2\2\u08ec\u08ed\7\u008b\2\2\u08ed\u08f1\3\2\2"+ + "\2\u08ee\u08ef\7n\2\2\u08ef\u08f1\7\u008b\2\2\u08f0\u08e3\3\2\2\2\u08f0"+ + "\u08ee\3\2\2\2\u08f1\u016d\3\2\2\2\u08f2\u08f7\5\u0170\u00b9\2\u08f3\u08f4"+ + "\7\u0086\2\2\u08f4\u08f6\5\u0170\u00b9\2\u08f5\u08f3\3\2\2\2\u08f6\u08f9"+ + "\3\2\2\2\u08f7\u08f5\3\2\2\2\u08f7\u08f8\3\2\2\2\u08f8\u016f\3\2\2\2\u08f9"+ + "\u08f7\3\2\2\2\u08fa\u08fb\5\u01b4\u00db\2\u08fb\u08fc\7\u0093\2\2\u08fc"+ + "\u08fd\5\u0172\u00ba\2\u08fd\u0171\3\2\2\2\u08fe\u0900\7\u008e\2\2\u08ff"+ + "\u08fe\3\2\2\2\u08ff\u0900\3\2\2\2\u0900\u0901\3\2\2\2\u0901\u0904\5\36"+ + "\20\2\u0902\u0904\5\u0176\u00bc\2\u0903\u08ff\3\2\2\2\u0903\u0902\3\2"+ + "\2\2\u0904\u0173\3\2\2\2\u0905\u0906\5\u01b4\u00db\2\u0906\u0907\7\u0081"+ + "\2\2\u0907\u0908\5\36\20\2\u0908\u0909\7\u0082\2\2\u0909\u0175\3\2\2\2"+ + "\u090a\u090b\7[\2\2\u090b\u090c\5\6\4\2\u090c\u090d\7\u0081\2\2\u090d"+ + "\u090e\5\36\20\2\u090e\u090f\7\u0082\2\2\u090f\u0928\3\2\2\2\u0910\u0912"+ + "\7[\2\2\u0911\u0913\5\6\4\2\u0912\u0911\3\2\2\2\u0912\u0913\3\2\2\2\u0913"+ + "\u0914\3\2\2\2\u0914\u0916\7\u0081\2\2\u0915\u0917\5\36\20\2\u0916\u0915"+ + "\3\2\2\2\u0916\u0917\3\2\2\2\u0917\u0918\3\2\2\2\u0918\u0919\7\u0082\2"+ + "\2\u0919\u091a\7\177\2\2\u091a\u091f\5\36\20\2\u091b\u091c\7\u0086\2\2"+ + "\u091c\u091e\5\36\20\2\u091d\u091b\3\2\2\2\u091e\u0921\3\2\2\2\u091f\u091d"+ + "\3\2\2\2\u091f\u0920\3\2\2\2\u0920\u0923\3\2\2\2\u0921\u091f\3\2\2\2\u0922"+ + "\u0924\7\u0086\2\2\u0923\u0922\3\2\2\2\u0923\u0924\3\2\2\2\u0924\u0925"+ + "\3\2\2\2\u0925\u0926\7\u0080\2\2\u0926\u0928\3\2\2\2\u0927\u090a\3\2\2"+ + "\2\u0927\u0910\3\2\2\2\u0928\u0177\3\2\2\2\u0929\u092a\7\u0093\2\2\u092a"+ + "\u092b\7\u0095\2\2\u092b\u092c\6\u00bd\2\3\u092c\u0179\3\2\2\2\u092d\u092e"+ + "\7\u0095\2\2\u092e\u092f\7\u0095\2\2\u092f\u0930\6\u00be\3\3\u0930\u017b"+ + "\3\2\2\2\u0931\u0932\7\u0095\2\2\u0932\u0933\7\u00a1\2\2\u0933\u0934\6"+ + "\u00bf\4\3\u0934\u017d\3\2\2\2\u0935\u093e\5\u0180\u00c1\2\u0936\u093e"+ + "\5\u0182\u00c2\2\u0937\u093e\7v\2\2\u0938\u093e\7w\2\2\u0939\u093e\7x"+ + "\2\2\u093a\u093e\7y\2\2\u093b\u093e\7z\2\2\u093c\u093e\7E\2\2\u093d\u0935"+ + "\3\2\2\2\u093d\u0936\3\2\2\2\u093d\u0937\3\2\2\2\u093d\u0938\3\2\2\2\u093d"+ + "\u0939\3\2\2\2\u093d\u093a\3\2\2\2\u093d\u093b\3\2\2\2\u093d\u093c\3\2"+ + "\2\2\u093e\u017f\3\2\2\2\u093f\u0940\t\21\2\2\u0940\u0181\3\2\2\2\u0941"+ + "\u0946\5\u0184\u00c3\2\u0942\u0946\5\u0186\u00c4\2\u0943\u0946\7{\2\2"+ + "\u0944\u0946\7|\2\2\u0945\u0941\3\2\2\2\u0945\u0942\3\2\2\2\u0945\u0943"+ + "\3\2\2\2\u0945\u0944\3\2\2\2\u0946\u0183\3\2\2\2\u0947\u094b\7}\2\2\u0948"+ + "\u094a\5\u0188\u00c5\2\u0949\u0948\3\2\2\2\u094a\u094d\3\2\2\2\u094b\u0949"+ + "\3\2\2\2\u094b\u094c\3\2\2\2\u094c\u094e\3\2\2\2\u094d\u094b\3\2\2\2\u094e"+ + "\u094f\7\u00b2\2\2\u094f\u0185\3\2\2\2\u0950\u0954\7~\2\2\u0951\u0953"+ + "\5\u018a\u00c6\2\u0952\u0951\3\2\2\2\u0953\u0956\3\2\2\2\u0954\u0952\3"+ + "\2\2\2\u0954\u0955\3\2\2\2\u0955\u0957\3\2\2\2\u0956\u0954\3\2\2\2"; + private static final String _serializedATNSegment1 = + "\u0957\u0958\7\u00b2\2\2\u0958\u0187\3\2\2\2\u0959\u095e\5\u018c\u00c7"+ + "\2\u095a\u095e\7\u00ae\2\2\u095b\u095e\7\u00b0\2\2\u095c\u095e\7\u00b3"+ + "\2\2\u095d\u0959\3\2\2\2\u095d\u095a\3\2\2\2\u095d\u095b\3\2\2\2\u095d"+ + "\u095c\3\2\2\2\u095e\u0189\3\2\2\2\u095f\u0964\5\u018c\u00c7\2\u0960\u0964"+ + "\7\u00ae\2\2\u0961\u0964\7\u00b1\2\2\u0962\u0964\7\u00b4\2\2\u0963\u095f"+ + "\3\2\2\2\u0963\u0960\3\2\2\2\u0963\u0961\3\2\2\2\u0963\u0962\3\2\2\2\u0964"+ + "\u018b\3\2\2\2\u0965\u096a\5\36\20\2\u0966\u0967\7\u0086\2\2\u0967\u0969"+ + "\5\36\20\2\u0968\u0966\3\2\2\2\u0969\u096c\3\2\2\2\u096a\u0968\3\2\2\2"+ + "\u096a\u096b\3\2\2\2\u096b\u0973\3\2\2\2\u096c\u096a\3\2\2\2\u096d\u096f"+ + "\7\u0087\2\2\u096e\u0970\7\u00b6\2\2\u096f\u096e\3\2\2\2\u0970\u0971\3"+ + "\2\2\2\u0971\u096f\3\2\2\2\u0971\u0972\3\2\2\2\u0972\u0974\3\2\2\2\u0973"+ + "\u096d\3\2\2\2\u0973\u0974\3\2\2\2\u0974\u018d\3\2\2\2\u0975\u0976\t\22"+ + "\2\2\u0976\u018f\3\2\2\2\u0977\u0978\7\34\2\2\u0978\u097a\5\u01b4\u00db"+ + "\2\u0979\u097b\5\u00e8u\2\u097a\u0979\3\2\2\2\u097a\u097b\3\2\2\2\u097b"+ + "\u097d\3\2\2\2\u097c\u097e\5\u00ecw\2\u097d\u097c\3\2\2\2\u097d\u097e"+ + "\3\2\2\2\u097e\u0980\3\2\2\2\u097f\u0981\5\u00f0y\2\u0980\u097f\3\2\2"+ + "\2\u0980\u0981\3\2\2\2\u0981\u0982\3\2\2\2\u0982\u0984\5\u00fc\177\2\u0983"+ + "\u0985\7\u0088\2\2\u0984\u0983\3\2\2\2\u0984\u0985\3\2\2\2\u0985\u0191"+ + "\3\2\2\2\u0986\u0988\t\23\2\2\u0987\u0986\3\2\2\2\u0987\u0988\3\2\2\2"+ + "\u0988\u0989\3\2\2\2\u0989\u098a\7^\2\2\u098a\u098c\5\u01b4\u00db\2\u098b"+ + "\u098d\5\u00e8u\2\u098c\u098b\3\2\2\2\u098c\u098d\3\2\2\2\u098d\u098f"+ + "\3\2\2\2\u098e\u0990\5\u013c\u009f\2\u098f\u098e\3\2\2\2\u098f\u0990\3"+ + "\2\2\2\u0990\u0992\3\2\2\2\u0991\u0993\5\u00f0y\2\u0992\u0991\3\2\2\2"+ + "\u0992\u0993\3\2\2\2\u0993\u0994\3\2\2\2\u0994\u0996\5\u013e\u00a0\2\u0995"+ + "\u0997\7\u0088\2\2\u0996\u0995\3\2\2\2\u0996\u0997\3\2\2\2\u0997\u0193"+ + "\3\2\2\2\u0998\u0999\7:\2\2\u0999\u099b\5\u01b4\u00db\2\u099a\u099c\5"+ + "\u0148\u00a5\2\u099b\u099a\3\2\2\2\u099b\u099c\3\2\2\2\u099c\u099e\3\2"+ + "\2\2\u099d\u099f\5\u014e\u00a8\2\u099e\u099d\3\2\2\2\u099e\u099f\3\2\2"+ + "\2\u099f\u09a1\3\2\2\2\u09a0\u09a2\5\u00f0y\2\u09a1\u09a0\3\2\2\2\u09a1"+ + "\u09a2\3\2\2\2\u09a2\u09a3\3\2\2\2\u09a3\u09a5\5\u00fc\177\2\u09a4\u09a6"+ + "\7\u0088\2\2\u09a5\u09a4\3\2\2\2\u09a5\u09a6\3\2\2\2\u09a6\u0195\3\2\2"+ + "\2\u09a7\u09a8\7\'\2\2\u09a8\u09aa\5\u01b4\u00db\2\u09a9\u09ab\5\u0156"+ + "\u00ac\2\u09aa\u09a9\3\2\2\2\u09aa\u09ab\3\2\2\2\u09ab\u09ac\3\2\2\2\u09ac"+ + "\u09ae\5\u0158\u00ad\2\u09ad\u09af\7\u0088\2\2\u09ae\u09ad\3\2\2\2\u09ae"+ + "\u09af\3\2\2\2\u09af\u0197\3\2\2\2\u09b0\u09b1\7!\2\2\u09b1\u09b2\5\u0114"+ + "\u008b\2\u09b2\u09b4\5\u01b4\u00db\2\u09b3\u09b5\5\u0148\u00a5\2\u09b4"+ + "\u09b3\3\2\2\2\u09b4\u09b5\3\2\2\2\u09b5\u09b6\3\2\2\2\u09b6\u09b8\7\u0083"+ + "\2\2\u09b7\u09b9\5\u011a\u008e\2\u09b8\u09b7\3\2\2\2\u09b8\u09b9\3\2\2"+ + "\2\u09b9\u09ba\3\2\2\2\u09ba\u09bc\7\u0084\2\2\u09bb\u09bd\5\u00f0y\2"+ + "\u09bc\u09bb\3\2\2\2\u09bc\u09bd\3\2\2\2\u09bd\u09be\3\2\2\2\u09be\u09bf"+ + "\7\u0088\2\2\u09bf\u0199\3\2\2\2\u09c0\u09c1\7)\2\2\u09c1\u09ca\5\6\4"+ + "\2\u09c2\u09c3\5\u010e\u0088\2\u09c3\u09c4\7\u0088\2\2\u09c4\u09cb\3\2"+ + "\2\2\u09c5\u09c6\5\u0116\u008c\2\u09c6\u09c7\7\177\2\2\u09c7\u09c8\5\u012e"+ + "\u0098\2\u09c8\u09c9\7\u0080\2\2\u09c9\u09cb\3\2\2\2\u09ca\u09c2\3\2\2"+ + "\2\u09ca\u09c5\3\2\2\2\u09cb\u019b\3\2\2\2\u09cc\u09cd\5\u010e\u0088\2"+ + "\u09cd\u09ce\7\u0088\2\2\u09ce\u019d\3\2\2\2\u09cf\u09dd\5\u0116\u008c"+ + "\2\u09d0\u09d1\7\177\2\2\u09d1\u09d2\5\u0124\u0093\2\u09d2\u09d7\7\u0080"+ + "\2\2\u09d3\u09d4\7\u0093\2\2\u09d4\u09d5\5\u0112\u008a\2\u09d5\u09d6\7"+ + "\u0088\2\2\u09d6\u09d8\3\2\2\2\u09d7\u09d3\3\2\2\2\u09d7\u09d8\3\2\2\2"+ + "\u09d8\u09de\3\2\2\2\u09d9\u09da\5\u0178\u00bd\2\u09da\u09db\5L\'\2\u09db"+ + "\u09dc\7\u0088\2\2\u09dc\u09de\3\2\2\2\u09dd\u09d0\3\2\2\2\u09dd\u09d9"+ + "\3\2\2\2\u09de\u019f\3\2\2\2\u09df\u09e0\7\35\2\2\u09e0\u09e1\5\6\4\2"+ + "\u09e1\u09e2\5\u010a\u0086\2\u09e2\u09e3\7\u0088\2\2\u09e3\u01a1\3\2\2"+ + "\2\u09e4\u09e5\7`\2\2\u09e5\u09e6\7\u0081\2\2\u09e6\u09e7\5\u011a\u008e"+ + "\2\u09e7\u09f0\7\u0082\2\2\u09e8\u09e9\7\177\2\2\u09e9\u09ea\5\u0124\u0093"+ + "\2\u09ea\u09eb\7\u0080\2\2\u09eb\u09f1\3\2\2\2\u09ec\u09ed\5\u0178\u00bd"+ + "\2\u09ed\u09ee\5L\'\2\u09ee\u09ef\7\u0088\2\2\u09ef\u09f1\3\2\2\2\u09f0"+ + "\u09e8\3\2\2\2\u09f0\u09ec\3\2\2\2\u09f1\u01a3\3\2\2\2\u09f2\u09f3\7\u0092"+ + "\2\2\u09f3\u09f4\5\u01b4\u00db\2\u09f4\u09f5\7\u0083\2\2\u09f5\u09f6\7"+ + "\u0084\2\2\u09f6\u09f7\5\u013a\u009e\2\u09f7\u01a5\3\2\2\2\u09f8\u09f9"+ + "\5\u01b4\u00db\2\u09f9\u09fb\7\u0083\2\2\u09fa\u09fc\5\u011a\u008e\2\u09fb"+ + "\u09fa\3\2\2\2\u09fb\u09fc\3\2\2\2\u09fc\u09fd\3\2\2\2\u09fd\u09ff\7\u0084"+ + "\2\2\u09fe\u0a00\5\u0138\u009d\2\u09ff\u09fe\3\2\2\2\u09ff\u0a00\3\2\2"+ + "\2\u0a00\u0a01\3\2\2\2\u0a01\u0a02\5\u013a\u009e\2\u0a02\u01a7\3\2\2\2"+ + "\u0a03\u0a05\5\u01aa\u00d6\2\u0a04\u0a06\5\u00e8u\2\u0a05\u0a04\3\2\2"+ + "\2\u0a05\u0a06\3\2\2\2\u0a06\u0a07\3\2\2\2\u0a07\u0a09\7\u0083\2\2\u0a08"+ + "\u0a0a\5\u011a\u008e\2\u0a09\u0a08\3\2\2\2\u0a09\u0a0a\3\2\2\2\u0a0a\u0a0b"+ + "\3\2\2\2\u0a0b\u0a0d\7\u0084\2\2\u0a0c\u0a0e\5\u00f0y\2\u0a0d\u0a0c\3"+ + "\2\2\2\u0a0d\u0a0e\3\2\2\2\u0a0e\u0a14\3\2\2\2\u0a0f\u0a15\5\u0118\u008d"+ + "\2\u0a10\u0a11\5\u0178\u00bd\2\u0a11\u0a12\5L\'\2\u0a12\u0a13\7\u0088"+ + "\2\2\u0a13\u0a15\3\2\2\2\u0a14\u0a0f\3\2\2\2\u0a14\u0a10\3\2\2\2\u0a15"+ + "\u01a9\3\2\2\2\u0a16\u0a1c\5\u01b4\u00db\2\u0a17\u0a18\5\u01b4\u00db\2"+ + "\u0a18\u0a19\7\u0097\2\2\u0a19\u0a1a\5\u01b4\u00db\2\u0a1a\u0a1c\3\2\2"+ + "\2\u0a1b\u0a16\3\2\2\2\u0a1b\u0a17\3\2\2\2\u0a1c\u0a24\3\2\2\2\u0a1d\u0a1f"+ + "\5\30\r\2\u0a1e\u0a1d\3\2\2\2\u0a1e\u0a1f\3\2\2\2\u0a1f\u0a20\3\2\2\2"+ + "\u0a20\u0a21\7\u0085\2\2\u0a21\u0a23\5\u01b4\u00db\2\u0a22\u0a1e\3\2\2"+ + "\2\u0a23\u0a26\3\2\2\2\u0a24\u0a22\3\2\2\2\u0a24\u0a25\3\2\2\2\u0a25\u01ab"+ + "\3\2\2\2\u0a26\u0a24\3\2\2\2\u0a27\u0a28\7H\2\2\u0a28\u0a29\5\u0134\u009b"+ + "\2\u0a29\u0a2b\7\u0083\2\2\u0a2a\u0a2c\78\2\2\u0a2b\u0a2a\3\2\2\2\u0a2b"+ + "\u0a2c\3\2\2\2\u0a2c\u0a2d\3\2\2\2\u0a2d\u0a33\5\u01ae\u00d8\2\u0a2e\u0a30"+ + "\7\u0086\2\2\u0a2f\u0a31\78\2\2\u0a30\u0a2f\3\2\2\2\u0a30\u0a31\3\2\2"+ + "\2\u0a31\u0a32\3\2\2\2\u0a32\u0a34\5\u01ae\u00d8\2\u0a33\u0a2e\3\2\2\2"+ + "\u0a33\u0a34\3\2\2\2\u0a34\u0a35\3\2\2\2\u0a35\u0a3b\7\u0084\2\2\u0a36"+ + "\u0a3c\5\u013a\u009e\2\u0a37\u0a38\5\u0178\u00bd\2\u0a38\u0a39\5L\'\2"+ + "\u0a39\u0a3a\7\u0088\2\2\u0a3a\u0a3c\3\2\2\2\u0a3b\u0a36\3\2\2\2\u0a3b"+ + "\u0a37\3\2\2\2\u0a3c\u01ad\3\2\2\2\u0a3d\u0a3e\5\6\4\2\u0a3e\u0a41\5\u01b4"+ + "\u00db\2\u0a3f\u0a40\7\u0093\2\2\u0a40\u0a42\5\36\20\2\u0a41\u0a3f\3\2"+ + "\2\2\u0a41\u0a42\3\2\2\2\u0a42\u01af\3\2\2\2\u0a43\u0a45\7\u0083\2\2\u0a44"+ + "\u0a46\5\32\16\2\u0a45\u0a44\3\2\2\2\u0a45\u0a46\3\2\2\2\u0a46\u0a47\3"+ + "\2\2\2\u0a47\u0a48\7\u0084\2\2\u0a48\u01b1\3\2\2\2\u0a49\u0a4b\7\u0083"+ + "\2\2\u0a4a\u0a4c\5\32\16\2\u0a4b\u0a4a\3\2\2\2\u0a4b\u0a4c\3\2\2\2\u0a4c"+ + "\u0a4d\3\2\2\2\u0a4d\u0a4f\7\u0084\2\2\u0a4e\u0a50\5Z.\2\u0a4f\u0a4e\3"+ + "\2\2\2\u0a4f\u0a50\3\2\2\2\u0a50\u01b3\3\2\2\2\u0a51\u0a52\t\24\2\2\u0a52"+ + "\u01b5\3\2\2\2\u015a\u01b7\u01ba\u01bd\u01c2\u01c6\u01cc\u01cf\u01d4\u01d8"+ + "\u01df\u01e1\u01e9\u01f1\u01f7\u01fb\u0200\u020a\u0212\u021c\u0222\u0225"+ + "\u0229\u0231\u0236\u0240\u024d\u0255\u025b\u025d\u0264\u026c\u0274\u027c"+ + "\u0284\u028c\u0296\u0298\u029e\u02a3\u02ab\u02b3\u02bb\u02bd\u02c0\u02c7"+ + "\u02cc\u02d3\u02d7\u02d9\u02f5\u02f9\u02fe\u0302\u030a\u030d\u0312\u0316"+ + "\u031a\u0320\u032e\u0334\u0340\u0344\u0349\u034d\u0353\u035b\u0364\u0376"+ + "\u0379\u037e\u0381\u0390\u0396\u039a\u03a0\u03a5\u03a8\u03b0\u03b8\u03c3"+ + "\u03c8\u03cd\u03cf\u03d8\u03e0\u03e7\u03ef\u03f3\u03fc\u0401\u0403\u040c"+ + "\u0414\u0418\u041d\u041f\u0424\u0428\u042f\u0437\u0439\u043d\u0440\u0443"+ + "\u044b\u0455\u0466\u046d\u0471\u047b\u0480\u0487\u0490\u0495\u049c\u04a8"+ + "\u04b3\u04bb\u04c0\u04c9\u04d2\u04db\u04e1\u04e6\u04ea\u04ee\u04f2\u04f6"+ + "\u04fd\u0505\u0512\u051c\u0532\u0536\u053a\u053f\u0553\u0558\u055d\u0564"+ + "\u0567\u057d\u0589\u058d\u0595\u059d\u05a4\u05a8\u05ad\u05b0\u05b5\u05bd"+ + "\u05c2\u05c9\u05cf\u05d7\u05df\u05e2\u05e9\u05f0\u05f4\u05f7\u05fd\u0601"+ + "\u0607\u0615\u061b\u0622\u0627\u062a\u062d\u0634\u063e\u064f\u0654\u0658"+ + "\u065b\u065e\u0665\u066b\u0673\u0679\u0683\u068b\u0691\u069c\u06a0\u06a2"+ + "\u06a7\u06ab\u06b2\u06bb\u06c2\u06c5\u06c8\u06cc\u06d1\u06de\u06e8\u06ef"+ + "\u06fb\u0702\u070e\u0714\u0718\u071c\u0722\u0728\u072a\u0731\u0735\u0738"+ + "\u073c\u0746\u0749\u0750\u0753\u0758\u075d\u075f\u0762\u0765\u076b\u076e"+ + "\u077a\u077e\u0781\u078b\u078e\u0794\u07af\u07bc\u07c2\u07cb\u07d1\u07d4"+ + "\u07dc\u07e0\u07e6\u07ec\u07f2\u07fd\u0801\u0803\u080d\u0813\u0816\u0823"+ + "\u0829\u082c\u082f\u0836\u083b\u083f\u0843\u0854\u0857\u085c\u0860\u0864"+ + "\u086d\u0870\u0875\u0879\u087e\u0882\u0884\u088f\u0893\u0895\u089a\u089f"+ + "\u08a6\u08ac\u08b1\u08b7\u08bb\u08c1\u08c8\u08d2\u08d5\u08d8\u08dd\u08e3"+ + "\u08e7\u08e9\u08f0\u08f7\u08ff\u0903\u0912\u0916\u091f\u0923\u0927\u093d"+ + "\u0945\u094b\u0954\u095d\u0963\u096a\u0971\u0973\u097a\u097d\u0980\u0984"+ + "\u0987\u098c\u098f\u0992\u0996\u099b\u099e\u09a1\u09a5\u09aa\u09ae\u09b4"+ + "\u09b8\u09bc\u09ca\u09d7\u09dd\u09f0\u09fb\u09ff\u0a05\u0a09\u0a0d\u0a14"+ + "\u0a1b\u0a1e\u0a24\u0a2b\u0a30\u0a33\u0a3b\u0a41\u0a45\u0a4b\u0a4f"; + public static final String _serializedATN = Utils.join( + new String[] { + _serializedATNSegment0, + _serializedATNSegment1 + }, + "" + ); + 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); + } + } +} diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpParserBaseListener.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpParserBaseListener.java new file mode 100644 index 0000000000..7ac5d6f0c1 --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpParserBaseListener.java @@ -0,0 +1,3103 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.antlr; + +// Generated from CSharpParser.g4 by ANTLR 4.9.2 + +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 CSharpParserListener}, + * which can be extended to create a listener which only needs to handle a subset + * of the available methods. + */ +public class CSharpParserBaseListener implements CSharpParserListener { + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCompilation_unit(CSharpParser.Compilation_unitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCompilation_unit(CSharpParser.Compilation_unitContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNamespace_or_type_name(CSharpParser.Namespace_or_type_nameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNamespace_or_type_name(CSharpParser.Namespace_or_type_nameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterType_(CSharpParser.Type_Context ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitType_(CSharpParser.Type_Context ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBase_type(CSharpParser.Base_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBase_type(CSharpParser.Base_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTuple_type(CSharpParser.Tuple_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTuple_type(CSharpParser.Tuple_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTuple_element(CSharpParser.Tuple_elementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTuple_element(CSharpParser.Tuple_elementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSimple_type(CSharpParser.Simple_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSimple_type(CSharpParser.Simple_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNumeric_type(CSharpParser.Numeric_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNumeric_type(CSharpParser.Numeric_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIntegral_type(CSharpParser.Integral_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIntegral_type(CSharpParser.Integral_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFloating_point_type(CSharpParser.Floating_point_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFloating_point_type(CSharpParser.Floating_point_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterClass_type(CSharpParser.Class_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitClass_type(CSharpParser.Class_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterType_argument_list(CSharpParser.Type_argument_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitType_argument_list(CSharpParser.Type_argument_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArgument_list(CSharpParser.Argument_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArgument_list(CSharpParser.Argument_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArgument(CSharpParser.ArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArgument(CSharpParser.ArgumentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExpression(CSharpParser.ExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExpression(CSharpParser.ExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNon_assignment_expression(CSharpParser.Non_assignment_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNon_assignment_expression(CSharpParser.Non_assignment_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAssignment(CSharpParser.AssignmentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAssignment(CSharpParser.AssignmentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAssignment_operator(CSharpParser.Assignment_operatorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAssignment_operator(CSharpParser.Assignment_operatorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConditional_expression(CSharpParser.Conditional_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConditional_expression(CSharpParser.Conditional_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNull_coalescing_expression(CSharpParser.Null_coalescing_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNull_coalescing_expression(CSharpParser.Null_coalescing_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConditional_or_expression(CSharpParser.Conditional_or_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConditional_or_expression(CSharpParser.Conditional_or_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConditional_and_expression(CSharpParser.Conditional_and_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConditional_and_expression(CSharpParser.Conditional_and_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInclusive_or_expression(CSharpParser.Inclusive_or_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInclusive_or_expression(CSharpParser.Inclusive_or_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExclusive_or_expression(CSharpParser.Exclusive_or_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExclusive_or_expression(CSharpParser.Exclusive_or_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAnd_expression(CSharpParser.And_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAnd_expression(CSharpParser.And_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEquality_expression(CSharpParser.Equality_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEquality_expression(CSharpParser.Equality_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRelational_expression(CSharpParser.Relational_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRelational_expression(CSharpParser.Relational_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterShift_expression(CSharpParser.Shift_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitShift_expression(CSharpParser.Shift_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAdditive_expression(CSharpParser.Additive_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAdditive_expression(CSharpParser.Additive_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMultiplicative_expression(CSharpParser.Multiplicative_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMultiplicative_expression(CSharpParser.Multiplicative_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSwitch_expression(CSharpParser.Switch_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSwitch_expression(CSharpParser.Switch_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSwitch_expression_arms(CSharpParser.Switch_expression_armsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSwitch_expression_arms(CSharpParser.Switch_expression_armsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSwitch_expression_arm(CSharpParser.Switch_expression_armContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSwitch_expression_arm(CSharpParser.Switch_expression_armContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRange_expression(CSharpParser.Range_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRange_expression(CSharpParser.Range_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUnary_expression(CSharpParser.Unary_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUnary_expression(CSharpParser.Unary_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPrimary_expression(CSharpParser.Primary_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPrimary_expression(CSharpParser.Primary_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLiteralExpression(CSharpParser.LiteralExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLiteralExpression(CSharpParser.LiteralExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSimpleNameExpression(CSharpParser.SimpleNameExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSimpleNameExpression(CSharpParser.SimpleNameExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterParenthesisExpressions(CSharpParser.ParenthesisExpressionsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitParenthesisExpressions(CSharpParser.ParenthesisExpressionsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMemberAccessExpression(CSharpParser.MemberAccessExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMemberAccessExpression(CSharpParser.MemberAccessExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLiteralAccessExpression(CSharpParser.LiteralAccessExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLiteralAccessExpression(CSharpParser.LiteralAccessExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterThisReferenceExpression(CSharpParser.ThisReferenceExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitThisReferenceExpression(CSharpParser.ThisReferenceExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBaseAccessExpression(CSharpParser.BaseAccessExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBaseAccessExpression(CSharpParser.BaseAccessExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterObjectCreationExpression(CSharpParser.ObjectCreationExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitObjectCreationExpression(CSharpParser.ObjectCreationExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTupleExpression(CSharpParser.TupleExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTupleExpression(CSharpParser.TupleExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTypeofExpression(CSharpParser.TypeofExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTypeofExpression(CSharpParser.TypeofExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCheckedExpression(CSharpParser.CheckedExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCheckedExpression(CSharpParser.CheckedExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUncheckedExpression(CSharpParser.UncheckedExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUncheckedExpression(CSharpParser.UncheckedExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDefaultValueExpression(CSharpParser.DefaultValueExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDefaultValueExpression(CSharpParser.DefaultValueExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAnonymousMethodExpression(CSharpParser.AnonymousMethodExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAnonymousMethodExpression(CSharpParser.AnonymousMethodExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSizeofExpression(CSharpParser.SizeofExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSizeofExpression(CSharpParser.SizeofExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNameofExpression(CSharpParser.NameofExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNameofExpression(CSharpParser.NameofExpressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterThrowable_expression(CSharpParser.Throwable_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitThrowable_expression(CSharpParser.Throwable_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterThrow_expression(CSharpParser.Throw_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitThrow_expression(CSharpParser.Throw_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMember_access(CSharpParser.Member_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMember_access(CSharpParser.Member_accessContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBracket_expression(CSharpParser.Bracket_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBracket_expression(CSharpParser.Bracket_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIndexer_argument(CSharpParser.Indexer_argumentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIndexer_argument(CSharpParser.Indexer_argumentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPredefined_type(CSharpParser.Predefined_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPredefined_type(CSharpParser.Predefined_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExpression_list(CSharpParser.Expression_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExpression_list(CSharpParser.Expression_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterObject_or_collection_initializer(CSharpParser.Object_or_collection_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitObject_or_collection_initializer(CSharpParser.Object_or_collection_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterObject_initializer(CSharpParser.Object_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitObject_initializer(CSharpParser.Object_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMember_initializer_list(CSharpParser.Member_initializer_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMember_initializer_list(CSharpParser.Member_initializer_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMember_initializer(CSharpParser.Member_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMember_initializer(CSharpParser.Member_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInitializer_value(CSharpParser.Initializer_valueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInitializer_value(CSharpParser.Initializer_valueContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCollection_initializer(CSharpParser.Collection_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCollection_initializer(CSharpParser.Collection_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterElement_initializer(CSharpParser.Element_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitElement_initializer(CSharpParser.Element_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAnonymous_object_initializer(CSharpParser.Anonymous_object_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAnonymous_object_initializer(CSharpParser.Anonymous_object_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMember_declarator_list(CSharpParser.Member_declarator_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMember_declarator_list(CSharpParser.Member_declarator_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMember_declarator(CSharpParser.Member_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMember_declarator(CSharpParser.Member_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUnbound_type_name(CSharpParser.Unbound_type_nameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUnbound_type_name(CSharpParser.Unbound_type_nameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGeneric_dimension_specifier(CSharpParser.Generic_dimension_specifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGeneric_dimension_specifier(CSharpParser.Generic_dimension_specifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIsType(CSharpParser.IsTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIsType(CSharpParser.IsTypeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIsTypePatternArms(CSharpParser.IsTypePatternArmsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIsTypePatternArms(CSharpParser.IsTypePatternArmsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIsTypePatternArm(CSharpParser.IsTypePatternArmContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIsTypePatternArm(CSharpParser.IsTypePatternArmContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLambda_expression(CSharpParser.Lambda_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLambda_expression(CSharpParser.Lambda_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAnonymous_function_signature(CSharpParser.Anonymous_function_signatureContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAnonymous_function_signature(CSharpParser.Anonymous_function_signatureContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExplicit_anonymous_function_parameter_list(CSharpParser.Explicit_anonymous_function_parameter_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExplicit_anonymous_function_parameter_list(CSharpParser.Explicit_anonymous_function_parameter_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExplicit_anonymous_function_parameter(CSharpParser.Explicit_anonymous_function_parameterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExplicit_anonymous_function_parameter(CSharpParser.Explicit_anonymous_function_parameterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterImplicit_anonymous_function_parameter_list(CSharpParser.Implicit_anonymous_function_parameter_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitImplicit_anonymous_function_parameter_list(CSharpParser.Implicit_anonymous_function_parameter_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAnonymous_function_body(CSharpParser.Anonymous_function_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAnonymous_function_body(CSharpParser.Anonymous_function_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQuery_expression(CSharpParser.Query_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQuery_expression(CSharpParser.Query_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFrom_clause(CSharpParser.From_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFrom_clause(CSharpParser.From_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQuery_body(CSharpParser.Query_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQuery_body(CSharpParser.Query_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQuery_body_clause(CSharpParser.Query_body_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQuery_body_clause(CSharpParser.Query_body_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLet_clause(CSharpParser.Let_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLet_clause(CSharpParser.Let_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterWhere_clause(CSharpParser.Where_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitWhere_clause(CSharpParser.Where_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCombined_join_clause(CSharpParser.Combined_join_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCombined_join_clause(CSharpParser.Combined_join_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOrderby_clause(CSharpParser.Orderby_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOrderby_clause(CSharpParser.Orderby_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOrdering(CSharpParser.OrderingContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOrdering(CSharpParser.OrderingContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSelect_or_group_clause(CSharpParser.Select_or_group_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSelect_or_group_clause(CSharpParser.Select_or_group_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQuery_continuation(CSharpParser.Query_continuationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQuery_continuation(CSharpParser.Query_continuationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStatement(CSharpParser.StatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStatement(CSharpParser.StatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDeclarationStatement(CSharpParser.DeclarationStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDeclarationStatement(CSharpParser.DeclarationStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLocal_function_declaration(CSharpParser.Local_function_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLocal_function_declaration(CSharpParser.Local_function_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLocal_function_header(CSharpParser.Local_function_headerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLocal_function_header(CSharpParser.Local_function_headerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLocal_function_modifiers(CSharpParser.Local_function_modifiersContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLocal_function_modifiers(CSharpParser.Local_function_modifiersContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLocal_function_body(CSharpParser.Local_function_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLocal_function_body(CSharpParser.Local_function_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLabeled_Statement(CSharpParser.Labeled_StatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLabeled_Statement(CSharpParser.Labeled_StatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEmbedded_statement(CSharpParser.Embedded_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEmbedded_statement(CSharpParser.Embedded_statementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTheEmptyStatement(CSharpParser.TheEmptyStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTheEmptyStatement(CSharpParser.TheEmptyStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExpressionStatement(CSharpParser.ExpressionStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExpressionStatement(CSharpParser.ExpressionStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIfStatement(CSharpParser.IfStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIfStatement(CSharpParser.IfStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSwitchStatement(CSharpParser.SwitchStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSwitchStatement(CSharpParser.SwitchStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterWhileStatement(CSharpParser.WhileStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitWhileStatement(CSharpParser.WhileStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDoStatement(CSharpParser.DoStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDoStatement(CSharpParser.DoStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterForStatement(CSharpParser.ForStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitForStatement(CSharpParser.ForStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterForeachStatement(CSharpParser.ForeachStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitForeachStatement(CSharpParser.ForeachStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBreakStatement(CSharpParser.BreakStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBreakStatement(CSharpParser.BreakStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterContinueStatement(CSharpParser.ContinueStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitContinueStatement(CSharpParser.ContinueStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGotoStatement(CSharpParser.GotoStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGotoStatement(CSharpParser.GotoStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterReturnStatement(CSharpParser.ReturnStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitReturnStatement(CSharpParser.ReturnStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterThrowStatement(CSharpParser.ThrowStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitThrowStatement(CSharpParser.ThrowStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTryStatement(CSharpParser.TryStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTryStatement(CSharpParser.TryStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCheckedStatement(CSharpParser.CheckedStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCheckedStatement(CSharpParser.CheckedStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUncheckedStatement(CSharpParser.UncheckedStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUncheckedStatement(CSharpParser.UncheckedStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLockStatement(CSharpParser.LockStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLockStatement(CSharpParser.LockStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUsingStatement(CSharpParser.UsingStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUsingStatement(CSharpParser.UsingStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterYieldStatement(CSharpParser.YieldStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitYieldStatement(CSharpParser.YieldStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUnsafeStatement(CSharpParser.UnsafeStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUnsafeStatement(CSharpParser.UnsafeStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFixedStatement(CSharpParser.FixedStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFixedStatement(CSharpParser.FixedStatementContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBlock(CSharpParser.BlockContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBlock(CSharpParser.BlockContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLocal_variable_declaration(CSharpParser.Local_variable_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLocal_variable_declaration(CSharpParser.Local_variable_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLocal_variable_type(CSharpParser.Local_variable_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLocal_variable_type(CSharpParser.Local_variable_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLocal_variable_declarator(CSharpParser.Local_variable_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLocal_variable_declarator(CSharpParser.Local_variable_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLocal_variable_initializer(CSharpParser.Local_variable_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLocal_variable_initializer(CSharpParser.Local_variable_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLocal_constant_declaration(CSharpParser.Local_constant_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLocal_constant_declaration(CSharpParser.Local_constant_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIf_body(CSharpParser.If_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIf_body(CSharpParser.If_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSwitch_section(CSharpParser.Switch_sectionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSwitch_section(CSharpParser.Switch_sectionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSwitch_label(CSharpParser.Switch_labelContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSwitch_label(CSharpParser.Switch_labelContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCase_guard(CSharpParser.Case_guardContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCase_guard(CSharpParser.Case_guardContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStatement_list(CSharpParser.Statement_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStatement_list(CSharpParser.Statement_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFor_initializer(CSharpParser.For_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFor_initializer(CSharpParser.For_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFor_iterator(CSharpParser.For_iteratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFor_iterator(CSharpParser.For_iteratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCatch_clauses(CSharpParser.Catch_clausesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCatch_clauses(CSharpParser.Catch_clausesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSpecific_catch_clause(CSharpParser.Specific_catch_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSpecific_catch_clause(CSharpParser.Specific_catch_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGeneral_catch_clause(CSharpParser.General_catch_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGeneral_catch_clause(CSharpParser.General_catch_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterException_filter(CSharpParser.Exception_filterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitException_filter(CSharpParser.Exception_filterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFinally_clause(CSharpParser.Finally_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFinally_clause(CSharpParser.Finally_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterResource_acquisition(CSharpParser.Resource_acquisitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitResource_acquisition(CSharpParser.Resource_acquisitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNamespace_declaration(CSharpParser.Namespace_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNamespace_declaration(CSharpParser.Namespace_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQualified_identifier(CSharpParser.Qualified_identifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQualified_identifier(CSharpParser.Qualified_identifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNamespace_body(CSharpParser.Namespace_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNamespace_body(CSharpParser.Namespace_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExtern_alias_directives(CSharpParser.Extern_alias_directivesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExtern_alias_directives(CSharpParser.Extern_alias_directivesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterExtern_alias_directive(CSharpParser.Extern_alias_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitExtern_alias_directive(CSharpParser.Extern_alias_directiveContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUsing_directives(CSharpParser.Using_directivesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUsing_directives(CSharpParser.Using_directivesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUsingAliasDirective(CSharpParser.UsingAliasDirectiveContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUsingAliasDirective(CSharpParser.UsingAliasDirectiveContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUsingNamespaceDirective(CSharpParser.UsingNamespaceDirectiveContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUsingNamespaceDirective(CSharpParser.UsingNamespaceDirectiveContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterUsingStaticDirective(CSharpParser.UsingStaticDirectiveContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitUsingStaticDirective(CSharpParser.UsingStaticDirectiveContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNamespace_member_declarations(CSharpParser.Namespace_member_declarationsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNamespace_member_declarations(CSharpParser.Namespace_member_declarationsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterNamespace_member_declaration(CSharpParser.Namespace_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitNamespace_member_declaration(CSharpParser.Namespace_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterType_declaration(CSharpParser.Type_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitType_declaration(CSharpParser.Type_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterQualified_alias_member(CSharpParser.Qualified_alias_memberContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitQualified_alias_member(CSharpParser.Qualified_alias_memberContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterType_parameter_list(CSharpParser.Type_parameter_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitType_parameter_list(CSharpParser.Type_parameter_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterType_parameter(CSharpParser.Type_parameterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitType_parameter(CSharpParser.Type_parameterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterClass_base(CSharpParser.Class_baseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitClass_base(CSharpParser.Class_baseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInterface_type_list(CSharpParser.Interface_type_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInterface_type_list(CSharpParser.Interface_type_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterType_parameter_constraints_clauses(CSharpParser.Type_parameter_constraints_clausesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitType_parameter_constraints_clauses(CSharpParser.Type_parameter_constraints_clausesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterType_parameter_constraints_clause(CSharpParser.Type_parameter_constraints_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitType_parameter_constraints_clause(CSharpParser.Type_parameter_constraints_clauseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterType_parameter_constraints(CSharpParser.Type_parameter_constraintsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitType_parameter_constraints(CSharpParser.Type_parameter_constraintsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPrimary_constraint(CSharpParser.Primary_constraintContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPrimary_constraint(CSharpParser.Primary_constraintContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSecondary_constraints(CSharpParser.Secondary_constraintsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSecondary_constraints(CSharpParser.Secondary_constraintsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConstructor_constraint(CSharpParser.Constructor_constraintContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConstructor_constraint(CSharpParser.Constructor_constraintContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterClass_body(CSharpParser.Class_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitClass_body(CSharpParser.Class_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterClass_member_declarations(CSharpParser.Class_member_declarationsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitClass_member_declarations(CSharpParser.Class_member_declarationsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterClass_member_declaration(CSharpParser.Class_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitClass_member_declaration(CSharpParser.Class_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAll_member_modifiers(CSharpParser.All_member_modifiersContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAll_member_modifiers(CSharpParser.All_member_modifiersContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAll_member_modifier(CSharpParser.All_member_modifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAll_member_modifier(CSharpParser.All_member_modifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterCommon_member_declaration(CSharpParser.Common_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitCommon_member_declaration(CSharpParser.Common_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterTyped_member_declaration(CSharpParser.Typed_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitTyped_member_declaration(CSharpParser.Typed_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConstant_declarators(CSharpParser.Constant_declaratorsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConstant_declarators(CSharpParser.Constant_declaratorsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConstant_declarator(CSharpParser.Constant_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConstant_declarator(CSharpParser.Constant_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterVariable_declarators(CSharpParser.Variable_declaratorsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitVariable_declarators(CSharpParser.Variable_declaratorsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterVariable_declarator(CSharpParser.Variable_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitVariable_declarator(CSharpParser.Variable_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterVariable_initializer(CSharpParser.Variable_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitVariable_initializer(CSharpParser.Variable_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterReturn_type(CSharpParser.Return_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitReturn_type(CSharpParser.Return_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMember_name(CSharpParser.Member_nameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMember_name(CSharpParser.Member_nameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMethod_body(CSharpParser.Method_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMethod_body(CSharpParser.Method_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFormal_parameter_list(CSharpParser.Formal_parameter_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFormal_parameter_list(CSharpParser.Formal_parameter_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFixed_parameters(CSharpParser.Fixed_parametersContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFixed_parameters(CSharpParser.Fixed_parametersContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFixed_parameter(CSharpParser.Fixed_parameterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFixed_parameter(CSharpParser.Fixed_parameterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterParameter_modifier(CSharpParser.Parameter_modifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitParameter_modifier(CSharpParser.Parameter_modifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterParameter_array(CSharpParser.Parameter_arrayContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitParameter_array(CSharpParser.Parameter_arrayContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAccessor_declarations(CSharpParser.Accessor_declarationsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAccessor_declarations(CSharpParser.Accessor_declarationsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGet_accessor_declaration(CSharpParser.Get_accessor_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGet_accessor_declaration(CSharpParser.Get_accessor_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterSet_accessor_declaration(CSharpParser.Set_accessor_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitSet_accessor_declaration(CSharpParser.Set_accessor_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAccessor_modifier(CSharpParser.Accessor_modifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAccessor_modifier(CSharpParser.Accessor_modifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAccessor_body(CSharpParser.Accessor_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAccessor_body(CSharpParser.Accessor_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEvent_accessor_declarations(CSharpParser.Event_accessor_declarationsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEvent_accessor_declarations(CSharpParser.Event_accessor_declarationsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAdd_accessor_declaration(CSharpParser.Add_accessor_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAdd_accessor_declaration(CSharpParser.Add_accessor_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRemove_accessor_declaration(CSharpParser.Remove_accessor_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRemove_accessor_declaration(CSharpParser.Remove_accessor_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOverloadable_operator(CSharpParser.Overloadable_operatorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOverloadable_operator(CSharpParser.Overloadable_operatorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConversion_operator_declarator(CSharpParser.Conversion_operator_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConversion_operator_declarator(CSharpParser.Conversion_operator_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConstructor_initializer(CSharpParser.Constructor_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConstructor_initializer(CSharpParser.Constructor_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBody(CSharpParser.BodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBody(CSharpParser.BodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStruct_interfaces(CSharpParser.Struct_interfacesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStruct_interfaces(CSharpParser.Struct_interfacesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStruct_body(CSharpParser.Struct_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStruct_body(CSharpParser.Struct_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStruct_member_declaration(CSharpParser.Struct_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStruct_member_declaration(CSharpParser.Struct_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArray_type(CSharpParser.Array_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArray_type(CSharpParser.Array_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRank_specifier(CSharpParser.Rank_specifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRank_specifier(CSharpParser.Rank_specifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArray_initializer(CSharpParser.Array_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArray_initializer(CSharpParser.Array_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterVariant_type_parameter_list(CSharpParser.Variant_type_parameter_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitVariant_type_parameter_list(CSharpParser.Variant_type_parameter_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterVariant_type_parameter(CSharpParser.Variant_type_parameterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitVariant_type_parameter(CSharpParser.Variant_type_parameterContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterVariance_annotation(CSharpParser.Variance_annotationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitVariance_annotation(CSharpParser.Variance_annotationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInterface_base(CSharpParser.Interface_baseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInterface_base(CSharpParser.Interface_baseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInterface_body(CSharpParser.Interface_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInterface_body(CSharpParser.Interface_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInterface_member_declaration(CSharpParser.Interface_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInterface_member_declaration(CSharpParser.Interface_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInterface_accessors(CSharpParser.Interface_accessorsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInterface_accessors(CSharpParser.Interface_accessorsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEnum_base(CSharpParser.Enum_baseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEnum_base(CSharpParser.Enum_baseContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEnum_body(CSharpParser.Enum_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEnum_body(CSharpParser.Enum_bodyContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEnum_member_declaration(CSharpParser.Enum_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEnum_member_declaration(CSharpParser.Enum_member_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGlobal_attribute_section(CSharpParser.Global_attribute_sectionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGlobal_attribute_section(CSharpParser.Global_attribute_sectionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGlobal_attribute_target(CSharpParser.Global_attribute_targetContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGlobal_attribute_target(CSharpParser.Global_attribute_targetContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAttributes(CSharpParser.AttributesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAttributes(CSharpParser.AttributesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAttribute_section(CSharpParser.Attribute_sectionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAttribute_section(CSharpParser.Attribute_sectionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAttribute_target(CSharpParser.Attribute_targetContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAttribute_target(CSharpParser.Attribute_targetContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAttribute_list(CSharpParser.Attribute_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAttribute_list(CSharpParser.Attribute_listContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAttribute(CSharpParser.AttributeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAttribute(CSharpParser.AttributeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterAttribute_argument(CSharpParser.Attribute_argumentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitAttribute_argument(CSharpParser.Attribute_argumentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterPointer_type(CSharpParser.Pointer_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitPointer_type(CSharpParser.Pointer_typeContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFixed_pointer_declarators(CSharpParser.Fixed_pointer_declaratorsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFixed_pointer_declarators(CSharpParser.Fixed_pointer_declaratorsContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFixed_pointer_declarator(CSharpParser.Fixed_pointer_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFixed_pointer_declarator(CSharpParser.Fixed_pointer_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFixed_pointer_initializer(CSharpParser.Fixed_pointer_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFixed_pointer_initializer(CSharpParser.Fixed_pointer_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterFixed_size_buffer_declarator(CSharpParser.Fixed_size_buffer_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitFixed_size_buffer_declarator(CSharpParser.Fixed_size_buffer_declaratorContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStackalloc_initializer(CSharpParser.Stackalloc_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStackalloc_initializer(CSharpParser.Stackalloc_initializerContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRight_arrow(CSharpParser.Right_arrowContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRight_arrow(CSharpParser.Right_arrowContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRight_shift(CSharpParser.Right_shiftContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRight_shift(CSharpParser.Right_shiftContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterRight_shift_assignment(CSharpParser.Right_shift_assignmentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitRight_shift_assignment(CSharpParser.Right_shift_assignmentContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterLiteral(CSharpParser.LiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitLiteral(CSharpParser.LiteralContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterBoolean_literal(CSharpParser.Boolean_literalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitBoolean_literal(CSharpParser.Boolean_literalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterString_literal(CSharpParser.String_literalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitString_literal(CSharpParser.String_literalContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInterpolated_regular_string(CSharpParser.Interpolated_regular_stringContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInterpolated_regular_string(CSharpParser.Interpolated_regular_stringContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInterpolated_verbatium_string(CSharpParser.Interpolated_verbatium_stringContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInterpolated_verbatium_string(CSharpParser.Interpolated_verbatium_stringContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInterpolated_regular_string_part(CSharpParser.Interpolated_regular_string_partContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInterpolated_regular_string_part(CSharpParser.Interpolated_regular_string_partContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInterpolated_verbatium_string_part(CSharpParser.Interpolated_verbatium_string_partContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInterpolated_verbatium_string_part(CSharpParser.Interpolated_verbatium_string_partContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInterpolated_string_expression(CSharpParser.Interpolated_string_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInterpolated_string_expression(CSharpParser.Interpolated_string_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterKeyword(CSharpParser.KeywordContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitKeyword(CSharpParser.KeywordContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterClass_definition(CSharpParser.Class_definitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitClass_definition(CSharpParser.Class_definitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterStruct_definition(CSharpParser.Struct_definitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitStruct_definition(CSharpParser.Struct_definitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterInterface_definition(CSharpParser.Interface_definitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitInterface_definition(CSharpParser.Interface_definitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEnum_definition(CSharpParser.Enum_definitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEnum_definition(CSharpParser.Enum_definitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDelegate_definition(CSharpParser.Delegate_definitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDelegate_definition(CSharpParser.Delegate_definitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterEvent_declaration(CSharpParser.Event_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitEvent_declaration(CSharpParser.Event_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterField_declaration(CSharpParser.Field_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitField_declaration(CSharpParser.Field_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterProperty_declaration(CSharpParser.Property_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitProperty_declaration(CSharpParser.Property_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConstant_declaration(CSharpParser.Constant_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConstant_declaration(CSharpParser.Constant_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIndexer_declaration(CSharpParser.Indexer_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIndexer_declaration(CSharpParser.Indexer_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDestructor_definition(CSharpParser.Destructor_definitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDestructor_definition(CSharpParser.Destructor_definitionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterConstructor_declaration(CSharpParser.Constructor_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitConstructor_declaration(CSharpParser.Constructor_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMethod_declaration(CSharpParser.Method_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMethod_declaration(CSharpParser.Method_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMethod_member_name(CSharpParser.Method_member_nameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMethod_member_name(CSharpParser.Method_member_nameContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterOperator_declaration(CSharpParser.Operator_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitOperator_declaration(CSharpParser.Operator_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterArg_declaration(CSharpParser.Arg_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitArg_declaration(CSharpParser.Arg_declarationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterMethod_invocation(CSharpParser.Method_invocationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitMethod_invocation(CSharpParser.Method_invocationContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterObject_creation_expression(CSharpParser.Object_creation_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitObject_creation_expression(CSharpParser.Object_creation_expressionContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterIdentifier(CSharpParser.IdentifierContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitIdentifier(CSharpParser.IdentifierContext 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) { } +} diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpParserListener.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpParserListener.java new file mode 100644 index 0000000000..cf9321a748 --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/antlr/CSharpParserListener.java @@ -0,0 +1,2644 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.antlr; + +// Generated from CSharpParser.g4 by ANTLR 4.9.2 +import org.antlr.v4.runtime.tree.ParseTreeListener; + +/** + * This interface defines a complete listener for a parse tree produced by + * {@link CSharpParser}. + */ +public interface CSharpParserListener extends ParseTreeListener { + /** + * Enter a parse tree produced by {@link CSharpParser#compilation_unit}. + * @param ctx the parse tree + */ + void enterCompilation_unit(CSharpParser.Compilation_unitContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#compilation_unit}. + * @param ctx the parse tree + */ + void exitCompilation_unit(CSharpParser.Compilation_unitContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#namespace_or_type_name}. + * @param ctx the parse tree + */ + void enterNamespace_or_type_name(CSharpParser.Namespace_or_type_nameContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#namespace_or_type_name}. + * @param ctx the parse tree + */ + void exitNamespace_or_type_name(CSharpParser.Namespace_or_type_nameContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#type_}. + * @param ctx the parse tree + */ + void enterType_(CSharpParser.Type_Context ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#type_}. + * @param ctx the parse tree + */ + void exitType_(CSharpParser.Type_Context ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#base_type}. + * @param ctx the parse tree + */ + void enterBase_type(CSharpParser.Base_typeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#base_type}. + * @param ctx the parse tree + */ + void exitBase_type(CSharpParser.Base_typeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#tuple_type}. + * @param ctx the parse tree + */ + void enterTuple_type(CSharpParser.Tuple_typeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#tuple_type}. + * @param ctx the parse tree + */ + void exitTuple_type(CSharpParser.Tuple_typeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#tuple_element}. + * @param ctx the parse tree + */ + void enterTuple_element(CSharpParser.Tuple_elementContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#tuple_element}. + * @param ctx the parse tree + */ + void exitTuple_element(CSharpParser.Tuple_elementContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#simple_type}. + * @param ctx the parse tree + */ + void enterSimple_type(CSharpParser.Simple_typeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#simple_type}. + * @param ctx the parse tree + */ + void exitSimple_type(CSharpParser.Simple_typeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#numeric_type}. + * @param ctx the parse tree + */ + void enterNumeric_type(CSharpParser.Numeric_typeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#numeric_type}. + * @param ctx the parse tree + */ + void exitNumeric_type(CSharpParser.Numeric_typeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#integral_type}. + * @param ctx the parse tree + */ + void enterIntegral_type(CSharpParser.Integral_typeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#integral_type}. + * @param ctx the parse tree + */ + void exitIntegral_type(CSharpParser.Integral_typeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#floating_point_type}. + * @param ctx the parse tree + */ + void enterFloating_point_type(CSharpParser.Floating_point_typeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#floating_point_type}. + * @param ctx the parse tree + */ + void exitFloating_point_type(CSharpParser.Floating_point_typeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#class_type}. + * @param ctx the parse tree + */ + void enterClass_type(CSharpParser.Class_typeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#class_type}. + * @param ctx the parse tree + */ + void exitClass_type(CSharpParser.Class_typeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#type_argument_list}. + * @param ctx the parse tree + */ + void enterType_argument_list(CSharpParser.Type_argument_listContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#type_argument_list}. + * @param ctx the parse tree + */ + void exitType_argument_list(CSharpParser.Type_argument_listContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#argument_list}. + * @param ctx the parse tree + */ + void enterArgument_list(CSharpParser.Argument_listContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#argument_list}. + * @param ctx the parse tree + */ + void exitArgument_list(CSharpParser.Argument_listContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#argument}. + * @param ctx the parse tree + */ + void enterArgument(CSharpParser.ArgumentContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#argument}. + * @param ctx the parse tree + */ + void exitArgument(CSharpParser.ArgumentContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#expression}. + * @param ctx the parse tree + */ + void enterExpression(CSharpParser.ExpressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#expression}. + * @param ctx the parse tree + */ + void exitExpression(CSharpParser.ExpressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#non_assignment_expression}. + * @param ctx the parse tree + */ + void enterNon_assignment_expression(CSharpParser.Non_assignment_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#non_assignment_expression}. + * @param ctx the parse tree + */ + void exitNon_assignment_expression(CSharpParser.Non_assignment_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#assignment}. + * @param ctx the parse tree + */ + void enterAssignment(CSharpParser.AssignmentContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#assignment}. + * @param ctx the parse tree + */ + void exitAssignment(CSharpParser.AssignmentContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#assignment_operator}. + * @param ctx the parse tree + */ + void enterAssignment_operator(CSharpParser.Assignment_operatorContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#assignment_operator}. + * @param ctx the parse tree + */ + void exitAssignment_operator(CSharpParser.Assignment_operatorContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#conditional_expression}. + * @param ctx the parse tree + */ + void enterConditional_expression(CSharpParser.Conditional_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#conditional_expression}. + * @param ctx the parse tree + */ + void exitConditional_expression(CSharpParser.Conditional_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#null_coalescing_expression}. + * @param ctx the parse tree + */ + void enterNull_coalescing_expression(CSharpParser.Null_coalescing_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#null_coalescing_expression}. + * @param ctx the parse tree + */ + void exitNull_coalescing_expression(CSharpParser.Null_coalescing_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#conditional_or_expression}. + * @param ctx the parse tree + */ + void enterConditional_or_expression(CSharpParser.Conditional_or_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#conditional_or_expression}. + * @param ctx the parse tree + */ + void exitConditional_or_expression(CSharpParser.Conditional_or_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#conditional_and_expression}. + * @param ctx the parse tree + */ + void enterConditional_and_expression(CSharpParser.Conditional_and_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#conditional_and_expression}. + * @param ctx the parse tree + */ + void exitConditional_and_expression(CSharpParser.Conditional_and_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#inclusive_or_expression}. + * @param ctx the parse tree + */ + void enterInclusive_or_expression(CSharpParser.Inclusive_or_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#inclusive_or_expression}. + * @param ctx the parse tree + */ + void exitInclusive_or_expression(CSharpParser.Inclusive_or_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#exclusive_or_expression}. + * @param ctx the parse tree + */ + void enterExclusive_or_expression(CSharpParser.Exclusive_or_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#exclusive_or_expression}. + * @param ctx the parse tree + */ + void exitExclusive_or_expression(CSharpParser.Exclusive_or_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#and_expression}. + * @param ctx the parse tree + */ + void enterAnd_expression(CSharpParser.And_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#and_expression}. + * @param ctx the parse tree + */ + void exitAnd_expression(CSharpParser.And_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#equality_expression}. + * @param ctx the parse tree + */ + void enterEquality_expression(CSharpParser.Equality_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#equality_expression}. + * @param ctx the parse tree + */ + void exitEquality_expression(CSharpParser.Equality_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#relational_expression}. + * @param ctx the parse tree + */ + void enterRelational_expression(CSharpParser.Relational_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#relational_expression}. + * @param ctx the parse tree + */ + void exitRelational_expression(CSharpParser.Relational_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#shift_expression}. + * @param ctx the parse tree + */ + void enterShift_expression(CSharpParser.Shift_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#shift_expression}. + * @param ctx the parse tree + */ + void exitShift_expression(CSharpParser.Shift_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#additive_expression}. + * @param ctx the parse tree + */ + void enterAdditive_expression(CSharpParser.Additive_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#additive_expression}. + * @param ctx the parse tree + */ + void exitAdditive_expression(CSharpParser.Additive_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#multiplicative_expression}. + * @param ctx the parse tree + */ + void enterMultiplicative_expression(CSharpParser.Multiplicative_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#multiplicative_expression}. + * @param ctx the parse tree + */ + void exitMultiplicative_expression(CSharpParser.Multiplicative_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#switch_expression}. + * @param ctx the parse tree + */ + void enterSwitch_expression(CSharpParser.Switch_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#switch_expression}. + * @param ctx the parse tree + */ + void exitSwitch_expression(CSharpParser.Switch_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#switch_expression_arms}. + * @param ctx the parse tree + */ + void enterSwitch_expression_arms(CSharpParser.Switch_expression_armsContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#switch_expression_arms}. + * @param ctx the parse tree + */ + void exitSwitch_expression_arms(CSharpParser.Switch_expression_armsContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#switch_expression_arm}. + * @param ctx the parse tree + */ + void enterSwitch_expression_arm(CSharpParser.Switch_expression_armContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#switch_expression_arm}. + * @param ctx the parse tree + */ + void exitSwitch_expression_arm(CSharpParser.Switch_expression_armContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#range_expression}. + * @param ctx the parse tree + */ + void enterRange_expression(CSharpParser.Range_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#range_expression}. + * @param ctx the parse tree + */ + void exitRange_expression(CSharpParser.Range_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#unary_expression}. + * @param ctx the parse tree + */ + void enterUnary_expression(CSharpParser.Unary_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#unary_expression}. + * @param ctx the parse tree + */ + void exitUnary_expression(CSharpParser.Unary_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#primary_expression}. + * @param ctx the parse tree + */ + void enterPrimary_expression(CSharpParser.Primary_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#primary_expression}. + * @param ctx the parse tree + */ + void exitPrimary_expression(CSharpParser.Primary_expressionContext ctx); + /** + * Enter a parse tree produced by the {@code literalExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterLiteralExpression(CSharpParser.LiteralExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code literalExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitLiteralExpression(CSharpParser.LiteralExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code simpleNameExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterSimpleNameExpression(CSharpParser.SimpleNameExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code simpleNameExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitSimpleNameExpression(CSharpParser.SimpleNameExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code parenthesisExpressions} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterParenthesisExpressions(CSharpParser.ParenthesisExpressionsContext ctx); + /** + * Exit a parse tree produced by the {@code parenthesisExpressions} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitParenthesisExpressions(CSharpParser.ParenthesisExpressionsContext ctx); + /** + * Enter a parse tree produced by the {@code memberAccessExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterMemberAccessExpression(CSharpParser.MemberAccessExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code memberAccessExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitMemberAccessExpression(CSharpParser.MemberAccessExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code literalAccessExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterLiteralAccessExpression(CSharpParser.LiteralAccessExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code literalAccessExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitLiteralAccessExpression(CSharpParser.LiteralAccessExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code thisReferenceExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterThisReferenceExpression(CSharpParser.ThisReferenceExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code thisReferenceExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitThisReferenceExpression(CSharpParser.ThisReferenceExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code baseAccessExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterBaseAccessExpression(CSharpParser.BaseAccessExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code baseAccessExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitBaseAccessExpression(CSharpParser.BaseAccessExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code objectCreationExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterObjectCreationExpression(CSharpParser.ObjectCreationExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code objectCreationExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitObjectCreationExpression(CSharpParser.ObjectCreationExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code tupleExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterTupleExpression(CSharpParser.TupleExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code tupleExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitTupleExpression(CSharpParser.TupleExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code typeofExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterTypeofExpression(CSharpParser.TypeofExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code typeofExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitTypeofExpression(CSharpParser.TypeofExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code checkedExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterCheckedExpression(CSharpParser.CheckedExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code checkedExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitCheckedExpression(CSharpParser.CheckedExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code uncheckedExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterUncheckedExpression(CSharpParser.UncheckedExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code uncheckedExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitUncheckedExpression(CSharpParser.UncheckedExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code defaultValueExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterDefaultValueExpression(CSharpParser.DefaultValueExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code defaultValueExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitDefaultValueExpression(CSharpParser.DefaultValueExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code anonymousMethodExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterAnonymousMethodExpression(CSharpParser.AnonymousMethodExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code anonymousMethodExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitAnonymousMethodExpression(CSharpParser.AnonymousMethodExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code sizeofExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterSizeofExpression(CSharpParser.SizeofExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code sizeofExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitSizeofExpression(CSharpParser.SizeofExpressionContext ctx); + /** + * Enter a parse tree produced by the {@code nameofExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void enterNameofExpression(CSharpParser.NameofExpressionContext ctx); + /** + * Exit a parse tree produced by the {@code nameofExpression} + * labeled alternative in {@link CSharpParser#primary_expression_start}. + * @param ctx the parse tree + */ + void exitNameofExpression(CSharpParser.NameofExpressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#throwable_expression}. + * @param ctx the parse tree + */ + void enterThrowable_expression(CSharpParser.Throwable_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#throwable_expression}. + * @param ctx the parse tree + */ + void exitThrowable_expression(CSharpParser.Throwable_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#throw_expression}. + * @param ctx the parse tree + */ + void enterThrow_expression(CSharpParser.Throw_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#throw_expression}. + * @param ctx the parse tree + */ + void exitThrow_expression(CSharpParser.Throw_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#member_access}. + * @param ctx the parse tree + */ + void enterMember_access(CSharpParser.Member_accessContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#member_access}. + * @param ctx the parse tree + */ + void exitMember_access(CSharpParser.Member_accessContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#bracket_expression}. + * @param ctx the parse tree + */ + void enterBracket_expression(CSharpParser.Bracket_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#bracket_expression}. + * @param ctx the parse tree + */ + void exitBracket_expression(CSharpParser.Bracket_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#indexer_argument}. + * @param ctx the parse tree + */ + void enterIndexer_argument(CSharpParser.Indexer_argumentContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#indexer_argument}. + * @param ctx the parse tree + */ + void exitIndexer_argument(CSharpParser.Indexer_argumentContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#predefined_type}. + * @param ctx the parse tree + */ + void enterPredefined_type(CSharpParser.Predefined_typeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#predefined_type}. + * @param ctx the parse tree + */ + void exitPredefined_type(CSharpParser.Predefined_typeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#expression_list}. + * @param ctx the parse tree + */ + void enterExpression_list(CSharpParser.Expression_listContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#expression_list}. + * @param ctx the parse tree + */ + void exitExpression_list(CSharpParser.Expression_listContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#object_or_collection_initializer}. + * @param ctx the parse tree + */ + void enterObject_or_collection_initializer(CSharpParser.Object_or_collection_initializerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#object_or_collection_initializer}. + * @param ctx the parse tree + */ + void exitObject_or_collection_initializer(CSharpParser.Object_or_collection_initializerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#object_initializer}. + * @param ctx the parse tree + */ + void enterObject_initializer(CSharpParser.Object_initializerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#object_initializer}. + * @param ctx the parse tree + */ + void exitObject_initializer(CSharpParser.Object_initializerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#member_initializer_list}. + * @param ctx the parse tree + */ + void enterMember_initializer_list(CSharpParser.Member_initializer_listContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#member_initializer_list}. + * @param ctx the parse tree + */ + void exitMember_initializer_list(CSharpParser.Member_initializer_listContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#member_initializer}. + * @param ctx the parse tree + */ + void enterMember_initializer(CSharpParser.Member_initializerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#member_initializer}. + * @param ctx the parse tree + */ + void exitMember_initializer(CSharpParser.Member_initializerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#initializer_value}. + * @param ctx the parse tree + */ + void enterInitializer_value(CSharpParser.Initializer_valueContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#initializer_value}. + * @param ctx the parse tree + */ + void exitInitializer_value(CSharpParser.Initializer_valueContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#collection_initializer}. + * @param ctx the parse tree + */ + void enterCollection_initializer(CSharpParser.Collection_initializerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#collection_initializer}. + * @param ctx the parse tree + */ + void exitCollection_initializer(CSharpParser.Collection_initializerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#element_initializer}. + * @param ctx the parse tree + */ + void enterElement_initializer(CSharpParser.Element_initializerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#element_initializer}. + * @param ctx the parse tree + */ + void exitElement_initializer(CSharpParser.Element_initializerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#anonymous_object_initializer}. + * @param ctx the parse tree + */ + void enterAnonymous_object_initializer(CSharpParser.Anonymous_object_initializerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#anonymous_object_initializer}. + * @param ctx the parse tree + */ + void exitAnonymous_object_initializer(CSharpParser.Anonymous_object_initializerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#member_declarator_list}. + * @param ctx the parse tree + */ + void enterMember_declarator_list(CSharpParser.Member_declarator_listContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#member_declarator_list}. + * @param ctx the parse tree + */ + void exitMember_declarator_list(CSharpParser.Member_declarator_listContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#member_declarator}. + * @param ctx the parse tree + */ + void enterMember_declarator(CSharpParser.Member_declaratorContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#member_declarator}. + * @param ctx the parse tree + */ + void exitMember_declarator(CSharpParser.Member_declaratorContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#unbound_type_name}. + * @param ctx the parse tree + */ + void enterUnbound_type_name(CSharpParser.Unbound_type_nameContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#unbound_type_name}. + * @param ctx the parse tree + */ + void exitUnbound_type_name(CSharpParser.Unbound_type_nameContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#generic_dimension_specifier}. + * @param ctx the parse tree + */ + void enterGeneric_dimension_specifier(CSharpParser.Generic_dimension_specifierContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#generic_dimension_specifier}. + * @param ctx the parse tree + */ + void exitGeneric_dimension_specifier(CSharpParser.Generic_dimension_specifierContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#isType}. + * @param ctx the parse tree + */ + void enterIsType(CSharpParser.IsTypeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#isType}. + * @param ctx the parse tree + */ + void exitIsType(CSharpParser.IsTypeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#isTypePatternArms}. + * @param ctx the parse tree + */ + void enterIsTypePatternArms(CSharpParser.IsTypePatternArmsContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#isTypePatternArms}. + * @param ctx the parse tree + */ + void exitIsTypePatternArms(CSharpParser.IsTypePatternArmsContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#isTypePatternArm}. + * @param ctx the parse tree + */ + void enterIsTypePatternArm(CSharpParser.IsTypePatternArmContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#isTypePatternArm}. + * @param ctx the parse tree + */ + void exitIsTypePatternArm(CSharpParser.IsTypePatternArmContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#lambda_expression}. + * @param ctx the parse tree + */ + void enterLambda_expression(CSharpParser.Lambda_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#lambda_expression}. + * @param ctx the parse tree + */ + void exitLambda_expression(CSharpParser.Lambda_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#anonymous_function_signature}. + * @param ctx the parse tree + */ + void enterAnonymous_function_signature(CSharpParser.Anonymous_function_signatureContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#anonymous_function_signature}. + * @param ctx the parse tree + */ + void exitAnonymous_function_signature(CSharpParser.Anonymous_function_signatureContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#explicit_anonymous_function_parameter_list}. + * @param ctx the parse tree + */ + void enterExplicit_anonymous_function_parameter_list(CSharpParser.Explicit_anonymous_function_parameter_listContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#explicit_anonymous_function_parameter_list}. + * @param ctx the parse tree + */ + void exitExplicit_anonymous_function_parameter_list(CSharpParser.Explicit_anonymous_function_parameter_listContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#explicit_anonymous_function_parameter}. + * @param ctx the parse tree + */ + void enterExplicit_anonymous_function_parameter(CSharpParser.Explicit_anonymous_function_parameterContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#explicit_anonymous_function_parameter}. + * @param ctx the parse tree + */ + void exitExplicit_anonymous_function_parameter(CSharpParser.Explicit_anonymous_function_parameterContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#implicit_anonymous_function_parameter_list}. + * @param ctx the parse tree + */ + void enterImplicit_anonymous_function_parameter_list(CSharpParser.Implicit_anonymous_function_parameter_listContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#implicit_anonymous_function_parameter_list}. + * @param ctx the parse tree + */ + void exitImplicit_anonymous_function_parameter_list(CSharpParser.Implicit_anonymous_function_parameter_listContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#anonymous_function_body}. + * @param ctx the parse tree + */ + void enterAnonymous_function_body(CSharpParser.Anonymous_function_bodyContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#anonymous_function_body}. + * @param ctx the parse tree + */ + void exitAnonymous_function_body(CSharpParser.Anonymous_function_bodyContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#query_expression}. + * @param ctx the parse tree + */ + void enterQuery_expression(CSharpParser.Query_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#query_expression}. + * @param ctx the parse tree + */ + void exitQuery_expression(CSharpParser.Query_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#from_clause}. + * @param ctx the parse tree + */ + void enterFrom_clause(CSharpParser.From_clauseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#from_clause}. + * @param ctx the parse tree + */ + void exitFrom_clause(CSharpParser.From_clauseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#query_body}. + * @param ctx the parse tree + */ + void enterQuery_body(CSharpParser.Query_bodyContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#query_body}. + * @param ctx the parse tree + */ + void exitQuery_body(CSharpParser.Query_bodyContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#query_body_clause}. + * @param ctx the parse tree + */ + void enterQuery_body_clause(CSharpParser.Query_body_clauseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#query_body_clause}. + * @param ctx the parse tree + */ + void exitQuery_body_clause(CSharpParser.Query_body_clauseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#let_clause}. + * @param ctx the parse tree + */ + void enterLet_clause(CSharpParser.Let_clauseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#let_clause}. + * @param ctx the parse tree + */ + void exitLet_clause(CSharpParser.Let_clauseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#where_clause}. + * @param ctx the parse tree + */ + void enterWhere_clause(CSharpParser.Where_clauseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#where_clause}. + * @param ctx the parse tree + */ + void exitWhere_clause(CSharpParser.Where_clauseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#combined_join_clause}. + * @param ctx the parse tree + */ + void enterCombined_join_clause(CSharpParser.Combined_join_clauseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#combined_join_clause}. + * @param ctx the parse tree + */ + void exitCombined_join_clause(CSharpParser.Combined_join_clauseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#orderby_clause}. + * @param ctx the parse tree + */ + void enterOrderby_clause(CSharpParser.Orderby_clauseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#orderby_clause}. + * @param ctx the parse tree + */ + void exitOrderby_clause(CSharpParser.Orderby_clauseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#ordering}. + * @param ctx the parse tree + */ + void enterOrdering(CSharpParser.OrderingContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#ordering}. + * @param ctx the parse tree + */ + void exitOrdering(CSharpParser.OrderingContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#select_or_group_clause}. + * @param ctx the parse tree + */ + void enterSelect_or_group_clause(CSharpParser.Select_or_group_clauseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#select_or_group_clause}. + * @param ctx the parse tree + */ + void exitSelect_or_group_clause(CSharpParser.Select_or_group_clauseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#query_continuation}. + * @param ctx the parse tree + */ + void enterQuery_continuation(CSharpParser.Query_continuationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#query_continuation}. + * @param ctx the parse tree + */ + void exitQuery_continuation(CSharpParser.Query_continuationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#statement}. + * @param ctx the parse tree + */ + void enterStatement(CSharpParser.StatementContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#statement}. + * @param ctx the parse tree + */ + void exitStatement(CSharpParser.StatementContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#declarationStatement}. + * @param ctx the parse tree + */ + void enterDeclarationStatement(CSharpParser.DeclarationStatementContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#declarationStatement}. + * @param ctx the parse tree + */ + void exitDeclarationStatement(CSharpParser.DeclarationStatementContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#local_function_declaration}. + * @param ctx the parse tree + */ + void enterLocal_function_declaration(CSharpParser.Local_function_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#local_function_declaration}. + * @param ctx the parse tree + */ + void exitLocal_function_declaration(CSharpParser.Local_function_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#local_function_header}. + * @param ctx the parse tree + */ + void enterLocal_function_header(CSharpParser.Local_function_headerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#local_function_header}. + * @param ctx the parse tree + */ + void exitLocal_function_header(CSharpParser.Local_function_headerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#local_function_modifiers}. + * @param ctx the parse tree + */ + void enterLocal_function_modifiers(CSharpParser.Local_function_modifiersContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#local_function_modifiers}. + * @param ctx the parse tree + */ + void exitLocal_function_modifiers(CSharpParser.Local_function_modifiersContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#local_function_body}. + * @param ctx the parse tree + */ + void enterLocal_function_body(CSharpParser.Local_function_bodyContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#local_function_body}. + * @param ctx the parse tree + */ + void exitLocal_function_body(CSharpParser.Local_function_bodyContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#labeled_Statement}. + * @param ctx the parse tree + */ + void enterLabeled_Statement(CSharpParser.Labeled_StatementContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#labeled_Statement}. + * @param ctx the parse tree + */ + void exitLabeled_Statement(CSharpParser.Labeled_StatementContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#embedded_statement}. + * @param ctx the parse tree + */ + void enterEmbedded_statement(CSharpParser.Embedded_statementContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#embedded_statement}. + * @param ctx the parse tree + */ + void exitEmbedded_statement(CSharpParser.Embedded_statementContext ctx); + /** + * Enter a parse tree produced by the {@code theEmptyStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterTheEmptyStatement(CSharpParser.TheEmptyStatementContext ctx); + /** + * Exit a parse tree produced by the {@code theEmptyStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitTheEmptyStatement(CSharpParser.TheEmptyStatementContext ctx); + /** + * Enter a parse tree produced by the {@code expressionStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterExpressionStatement(CSharpParser.ExpressionStatementContext ctx); + /** + * Exit a parse tree produced by the {@code expressionStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitExpressionStatement(CSharpParser.ExpressionStatementContext ctx); + /** + * Enter a parse tree produced by the {@code ifStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterIfStatement(CSharpParser.IfStatementContext ctx); + /** + * Exit a parse tree produced by the {@code ifStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitIfStatement(CSharpParser.IfStatementContext ctx); + /** + * Enter a parse tree produced by the {@code switchStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterSwitchStatement(CSharpParser.SwitchStatementContext ctx); + /** + * Exit a parse tree produced by the {@code switchStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitSwitchStatement(CSharpParser.SwitchStatementContext ctx); + /** + * Enter a parse tree produced by the {@code whileStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterWhileStatement(CSharpParser.WhileStatementContext ctx); + /** + * Exit a parse tree produced by the {@code whileStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitWhileStatement(CSharpParser.WhileStatementContext ctx); + /** + * Enter a parse tree produced by the {@code doStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterDoStatement(CSharpParser.DoStatementContext ctx); + /** + * Exit a parse tree produced by the {@code doStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitDoStatement(CSharpParser.DoStatementContext ctx); + /** + * Enter a parse tree produced by the {@code forStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterForStatement(CSharpParser.ForStatementContext ctx); + /** + * Exit a parse tree produced by the {@code forStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitForStatement(CSharpParser.ForStatementContext ctx); + /** + * Enter a parse tree produced by the {@code foreachStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterForeachStatement(CSharpParser.ForeachStatementContext ctx); + /** + * Exit a parse tree produced by the {@code foreachStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitForeachStatement(CSharpParser.ForeachStatementContext ctx); + /** + * Enter a parse tree produced by the {@code breakStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterBreakStatement(CSharpParser.BreakStatementContext ctx); + /** + * Exit a parse tree produced by the {@code breakStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitBreakStatement(CSharpParser.BreakStatementContext ctx); + /** + * Enter a parse tree produced by the {@code continueStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterContinueStatement(CSharpParser.ContinueStatementContext ctx); + /** + * Exit a parse tree produced by the {@code continueStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitContinueStatement(CSharpParser.ContinueStatementContext ctx); + /** + * Enter a parse tree produced by the {@code gotoStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterGotoStatement(CSharpParser.GotoStatementContext ctx); + /** + * Exit a parse tree produced by the {@code gotoStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitGotoStatement(CSharpParser.GotoStatementContext ctx); + /** + * Enter a parse tree produced by the {@code returnStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterReturnStatement(CSharpParser.ReturnStatementContext ctx); + /** + * Exit a parse tree produced by the {@code returnStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitReturnStatement(CSharpParser.ReturnStatementContext ctx); + /** + * Enter a parse tree produced by the {@code throwStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterThrowStatement(CSharpParser.ThrowStatementContext ctx); + /** + * Exit a parse tree produced by the {@code throwStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitThrowStatement(CSharpParser.ThrowStatementContext ctx); + /** + * Enter a parse tree produced by the {@code tryStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterTryStatement(CSharpParser.TryStatementContext ctx); + /** + * Exit a parse tree produced by the {@code tryStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitTryStatement(CSharpParser.TryStatementContext ctx); + /** + * Enter a parse tree produced by the {@code checkedStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterCheckedStatement(CSharpParser.CheckedStatementContext ctx); + /** + * Exit a parse tree produced by the {@code checkedStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitCheckedStatement(CSharpParser.CheckedStatementContext ctx); + /** + * Enter a parse tree produced by the {@code uncheckedStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterUncheckedStatement(CSharpParser.UncheckedStatementContext ctx); + /** + * Exit a parse tree produced by the {@code uncheckedStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitUncheckedStatement(CSharpParser.UncheckedStatementContext ctx); + /** + * Enter a parse tree produced by the {@code lockStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterLockStatement(CSharpParser.LockStatementContext ctx); + /** + * Exit a parse tree produced by the {@code lockStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitLockStatement(CSharpParser.LockStatementContext ctx); + /** + * Enter a parse tree produced by the {@code usingStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterUsingStatement(CSharpParser.UsingStatementContext ctx); + /** + * Exit a parse tree produced by the {@code usingStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitUsingStatement(CSharpParser.UsingStatementContext ctx); + /** + * Enter a parse tree produced by the {@code yieldStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterYieldStatement(CSharpParser.YieldStatementContext ctx); + /** + * Exit a parse tree produced by the {@code yieldStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitYieldStatement(CSharpParser.YieldStatementContext ctx); + /** + * Enter a parse tree produced by the {@code unsafeStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterUnsafeStatement(CSharpParser.UnsafeStatementContext ctx); + /** + * Exit a parse tree produced by the {@code unsafeStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitUnsafeStatement(CSharpParser.UnsafeStatementContext ctx); + /** + * Enter a parse tree produced by the {@code fixedStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void enterFixedStatement(CSharpParser.FixedStatementContext ctx); + /** + * Exit a parse tree produced by the {@code fixedStatement} + * labeled alternative in {@link CSharpParser#simple_embedded_statement}. + * @param ctx the parse tree + */ + void exitFixedStatement(CSharpParser.FixedStatementContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#block}. + * @param ctx the parse tree + */ + void enterBlock(CSharpParser.BlockContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#block}. + * @param ctx the parse tree + */ + void exitBlock(CSharpParser.BlockContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#local_variable_declaration}. + * @param ctx the parse tree + */ + void enterLocal_variable_declaration(CSharpParser.Local_variable_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#local_variable_declaration}. + * @param ctx the parse tree + */ + void exitLocal_variable_declaration(CSharpParser.Local_variable_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#local_variable_type}. + * @param ctx the parse tree + */ + void enterLocal_variable_type(CSharpParser.Local_variable_typeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#local_variable_type}. + * @param ctx the parse tree + */ + void exitLocal_variable_type(CSharpParser.Local_variable_typeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#local_variable_declarator}. + * @param ctx the parse tree + */ + void enterLocal_variable_declarator(CSharpParser.Local_variable_declaratorContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#local_variable_declarator}. + * @param ctx the parse tree + */ + void exitLocal_variable_declarator(CSharpParser.Local_variable_declaratorContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#local_variable_initializer}. + * @param ctx the parse tree + */ + void enterLocal_variable_initializer(CSharpParser.Local_variable_initializerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#local_variable_initializer}. + * @param ctx the parse tree + */ + void exitLocal_variable_initializer(CSharpParser.Local_variable_initializerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#local_constant_declaration}. + * @param ctx the parse tree + */ + void enterLocal_constant_declaration(CSharpParser.Local_constant_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#local_constant_declaration}. + * @param ctx the parse tree + */ + void exitLocal_constant_declaration(CSharpParser.Local_constant_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#if_body}. + * @param ctx the parse tree + */ + void enterIf_body(CSharpParser.If_bodyContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#if_body}. + * @param ctx the parse tree + */ + void exitIf_body(CSharpParser.If_bodyContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#switch_section}. + * @param ctx the parse tree + */ + void enterSwitch_section(CSharpParser.Switch_sectionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#switch_section}. + * @param ctx the parse tree + */ + void exitSwitch_section(CSharpParser.Switch_sectionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#switch_label}. + * @param ctx the parse tree + */ + void enterSwitch_label(CSharpParser.Switch_labelContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#switch_label}. + * @param ctx the parse tree + */ + void exitSwitch_label(CSharpParser.Switch_labelContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#case_guard}. + * @param ctx the parse tree + */ + void enterCase_guard(CSharpParser.Case_guardContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#case_guard}. + * @param ctx the parse tree + */ + void exitCase_guard(CSharpParser.Case_guardContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#statement_list}. + * @param ctx the parse tree + */ + void enterStatement_list(CSharpParser.Statement_listContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#statement_list}. + * @param ctx the parse tree + */ + void exitStatement_list(CSharpParser.Statement_listContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#for_initializer}. + * @param ctx the parse tree + */ + void enterFor_initializer(CSharpParser.For_initializerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#for_initializer}. + * @param ctx the parse tree + */ + void exitFor_initializer(CSharpParser.For_initializerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#for_iterator}. + * @param ctx the parse tree + */ + void enterFor_iterator(CSharpParser.For_iteratorContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#for_iterator}. + * @param ctx the parse tree + */ + void exitFor_iterator(CSharpParser.For_iteratorContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#catch_clauses}. + * @param ctx the parse tree + */ + void enterCatch_clauses(CSharpParser.Catch_clausesContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#catch_clauses}. + * @param ctx the parse tree + */ + void exitCatch_clauses(CSharpParser.Catch_clausesContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#specific_catch_clause}. + * @param ctx the parse tree + */ + void enterSpecific_catch_clause(CSharpParser.Specific_catch_clauseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#specific_catch_clause}. + * @param ctx the parse tree + */ + void exitSpecific_catch_clause(CSharpParser.Specific_catch_clauseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#general_catch_clause}. + * @param ctx the parse tree + */ + void enterGeneral_catch_clause(CSharpParser.General_catch_clauseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#general_catch_clause}. + * @param ctx the parse tree + */ + void exitGeneral_catch_clause(CSharpParser.General_catch_clauseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#exception_filter}. + * @param ctx the parse tree + */ + void enterException_filter(CSharpParser.Exception_filterContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#exception_filter}. + * @param ctx the parse tree + */ + void exitException_filter(CSharpParser.Exception_filterContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#finally_clause}. + * @param ctx the parse tree + */ + void enterFinally_clause(CSharpParser.Finally_clauseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#finally_clause}. + * @param ctx the parse tree + */ + void exitFinally_clause(CSharpParser.Finally_clauseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#resource_acquisition}. + * @param ctx the parse tree + */ + void enterResource_acquisition(CSharpParser.Resource_acquisitionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#resource_acquisition}. + * @param ctx the parse tree + */ + void exitResource_acquisition(CSharpParser.Resource_acquisitionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#namespace_declaration}. + * @param ctx the parse tree + */ + void enterNamespace_declaration(CSharpParser.Namespace_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#namespace_declaration}. + * @param ctx the parse tree + */ + void exitNamespace_declaration(CSharpParser.Namespace_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#qualified_identifier}. + * @param ctx the parse tree + */ + void enterQualified_identifier(CSharpParser.Qualified_identifierContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#qualified_identifier}. + * @param ctx the parse tree + */ + void exitQualified_identifier(CSharpParser.Qualified_identifierContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#namespace_body}. + * @param ctx the parse tree + */ + void enterNamespace_body(CSharpParser.Namespace_bodyContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#namespace_body}. + * @param ctx the parse tree + */ + void exitNamespace_body(CSharpParser.Namespace_bodyContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#extern_alias_directives}. + * @param ctx the parse tree + */ + void enterExtern_alias_directives(CSharpParser.Extern_alias_directivesContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#extern_alias_directives}. + * @param ctx the parse tree + */ + void exitExtern_alias_directives(CSharpParser.Extern_alias_directivesContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#extern_alias_directive}. + * @param ctx the parse tree + */ + void enterExtern_alias_directive(CSharpParser.Extern_alias_directiveContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#extern_alias_directive}. + * @param ctx the parse tree + */ + void exitExtern_alias_directive(CSharpParser.Extern_alias_directiveContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#using_directives}. + * @param ctx the parse tree + */ + void enterUsing_directives(CSharpParser.Using_directivesContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#using_directives}. + * @param ctx the parse tree + */ + void exitUsing_directives(CSharpParser.Using_directivesContext ctx); + /** + * Enter a parse tree produced by the {@code usingAliasDirective} + * labeled alternative in {@link CSharpParser#using_directive}. + * @param ctx the parse tree + */ + void enterUsingAliasDirective(CSharpParser.UsingAliasDirectiveContext ctx); + /** + * Exit a parse tree produced by the {@code usingAliasDirective} + * labeled alternative in {@link CSharpParser#using_directive}. + * @param ctx the parse tree + */ + void exitUsingAliasDirective(CSharpParser.UsingAliasDirectiveContext ctx); + /** + * Enter a parse tree produced by the {@code usingNamespaceDirective} + * labeled alternative in {@link CSharpParser#using_directive}. + * @param ctx the parse tree + */ + void enterUsingNamespaceDirective(CSharpParser.UsingNamespaceDirectiveContext ctx); + /** + * Exit a parse tree produced by the {@code usingNamespaceDirective} + * labeled alternative in {@link CSharpParser#using_directive}. + * @param ctx the parse tree + */ + void exitUsingNamespaceDirective(CSharpParser.UsingNamespaceDirectiveContext ctx); + /** + * Enter a parse tree produced by the {@code usingStaticDirective} + * labeled alternative in {@link CSharpParser#using_directive}. + * @param ctx the parse tree + */ + void enterUsingStaticDirective(CSharpParser.UsingStaticDirectiveContext ctx); + /** + * Exit a parse tree produced by the {@code usingStaticDirective} + * labeled alternative in {@link CSharpParser#using_directive}. + * @param ctx the parse tree + */ + void exitUsingStaticDirective(CSharpParser.UsingStaticDirectiveContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#namespace_member_declarations}. + * @param ctx the parse tree + */ + void enterNamespace_member_declarations(CSharpParser.Namespace_member_declarationsContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#namespace_member_declarations}. + * @param ctx the parse tree + */ + void exitNamespace_member_declarations(CSharpParser.Namespace_member_declarationsContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#namespace_member_declaration}. + * @param ctx the parse tree + */ + void enterNamespace_member_declaration(CSharpParser.Namespace_member_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#namespace_member_declaration}. + * @param ctx the parse tree + */ + void exitNamespace_member_declaration(CSharpParser.Namespace_member_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#type_declaration}. + * @param ctx the parse tree + */ + void enterType_declaration(CSharpParser.Type_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#type_declaration}. + * @param ctx the parse tree + */ + void exitType_declaration(CSharpParser.Type_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#qualified_alias_member}. + * @param ctx the parse tree + */ + void enterQualified_alias_member(CSharpParser.Qualified_alias_memberContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#qualified_alias_member}. + * @param ctx the parse tree + */ + void exitQualified_alias_member(CSharpParser.Qualified_alias_memberContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#type_parameter_list}. + * @param ctx the parse tree + */ + void enterType_parameter_list(CSharpParser.Type_parameter_listContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#type_parameter_list}. + * @param ctx the parse tree + */ + void exitType_parameter_list(CSharpParser.Type_parameter_listContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#type_parameter}. + * @param ctx the parse tree + */ + void enterType_parameter(CSharpParser.Type_parameterContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#type_parameter}. + * @param ctx the parse tree + */ + void exitType_parameter(CSharpParser.Type_parameterContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#class_base}. + * @param ctx the parse tree + */ + void enterClass_base(CSharpParser.Class_baseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#class_base}. + * @param ctx the parse tree + */ + void exitClass_base(CSharpParser.Class_baseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#interface_type_list}. + * @param ctx the parse tree + */ + void enterInterface_type_list(CSharpParser.Interface_type_listContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#interface_type_list}. + * @param ctx the parse tree + */ + void exitInterface_type_list(CSharpParser.Interface_type_listContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#type_parameter_constraints_clauses}. + * @param ctx the parse tree + */ + void enterType_parameter_constraints_clauses(CSharpParser.Type_parameter_constraints_clausesContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#type_parameter_constraints_clauses}. + * @param ctx the parse tree + */ + void exitType_parameter_constraints_clauses(CSharpParser.Type_parameter_constraints_clausesContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#type_parameter_constraints_clause}. + * @param ctx the parse tree + */ + void enterType_parameter_constraints_clause(CSharpParser.Type_parameter_constraints_clauseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#type_parameter_constraints_clause}. + * @param ctx the parse tree + */ + void exitType_parameter_constraints_clause(CSharpParser.Type_parameter_constraints_clauseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#type_parameter_constraints}. + * @param ctx the parse tree + */ + void enterType_parameter_constraints(CSharpParser.Type_parameter_constraintsContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#type_parameter_constraints}. + * @param ctx the parse tree + */ + void exitType_parameter_constraints(CSharpParser.Type_parameter_constraintsContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#primary_constraint}. + * @param ctx the parse tree + */ + void enterPrimary_constraint(CSharpParser.Primary_constraintContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#primary_constraint}. + * @param ctx the parse tree + */ + void exitPrimary_constraint(CSharpParser.Primary_constraintContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#secondary_constraints}. + * @param ctx the parse tree + */ + void enterSecondary_constraints(CSharpParser.Secondary_constraintsContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#secondary_constraints}. + * @param ctx the parse tree + */ + void exitSecondary_constraints(CSharpParser.Secondary_constraintsContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#constructor_constraint}. + * @param ctx the parse tree + */ + void enterConstructor_constraint(CSharpParser.Constructor_constraintContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#constructor_constraint}. + * @param ctx the parse tree + */ + void exitConstructor_constraint(CSharpParser.Constructor_constraintContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#class_body}. + * @param ctx the parse tree + */ + void enterClass_body(CSharpParser.Class_bodyContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#class_body}. + * @param ctx the parse tree + */ + void exitClass_body(CSharpParser.Class_bodyContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#class_member_declarations}. + * @param ctx the parse tree + */ + void enterClass_member_declarations(CSharpParser.Class_member_declarationsContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#class_member_declarations}. + * @param ctx the parse tree + */ + void exitClass_member_declarations(CSharpParser.Class_member_declarationsContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#class_member_declaration}. + * @param ctx the parse tree + */ + void enterClass_member_declaration(CSharpParser.Class_member_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#class_member_declaration}. + * @param ctx the parse tree + */ + void exitClass_member_declaration(CSharpParser.Class_member_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#all_member_modifiers}. + * @param ctx the parse tree + */ + void enterAll_member_modifiers(CSharpParser.All_member_modifiersContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#all_member_modifiers}. + * @param ctx the parse tree + */ + void exitAll_member_modifiers(CSharpParser.All_member_modifiersContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#all_member_modifier}. + * @param ctx the parse tree + */ + void enterAll_member_modifier(CSharpParser.All_member_modifierContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#all_member_modifier}. + * @param ctx the parse tree + */ + void exitAll_member_modifier(CSharpParser.All_member_modifierContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#common_member_declaration}. + * @param ctx the parse tree + */ + void enterCommon_member_declaration(CSharpParser.Common_member_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#common_member_declaration}. + * @param ctx the parse tree + */ + void exitCommon_member_declaration(CSharpParser.Common_member_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#typed_member_declaration}. + * @param ctx the parse tree + */ + void enterTyped_member_declaration(CSharpParser.Typed_member_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#typed_member_declaration}. + * @param ctx the parse tree + */ + void exitTyped_member_declaration(CSharpParser.Typed_member_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#constant_declarators}. + * @param ctx the parse tree + */ + void enterConstant_declarators(CSharpParser.Constant_declaratorsContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#constant_declarators}. + * @param ctx the parse tree + */ + void exitConstant_declarators(CSharpParser.Constant_declaratorsContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#constant_declarator}. + * @param ctx the parse tree + */ + void enterConstant_declarator(CSharpParser.Constant_declaratorContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#constant_declarator}. + * @param ctx the parse tree + */ + void exitConstant_declarator(CSharpParser.Constant_declaratorContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#variable_declarators}. + * @param ctx the parse tree + */ + void enterVariable_declarators(CSharpParser.Variable_declaratorsContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#variable_declarators}. + * @param ctx the parse tree + */ + void exitVariable_declarators(CSharpParser.Variable_declaratorsContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#variable_declarator}. + * @param ctx the parse tree + */ + void enterVariable_declarator(CSharpParser.Variable_declaratorContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#variable_declarator}. + * @param ctx the parse tree + */ + void exitVariable_declarator(CSharpParser.Variable_declaratorContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#variable_initializer}. + * @param ctx the parse tree + */ + void enterVariable_initializer(CSharpParser.Variable_initializerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#variable_initializer}. + * @param ctx the parse tree + */ + void exitVariable_initializer(CSharpParser.Variable_initializerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#return_type}. + * @param ctx the parse tree + */ + void enterReturn_type(CSharpParser.Return_typeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#return_type}. + * @param ctx the parse tree + */ + void exitReturn_type(CSharpParser.Return_typeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#member_name}. + * @param ctx the parse tree + */ + void enterMember_name(CSharpParser.Member_nameContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#member_name}. + * @param ctx the parse tree + */ + void exitMember_name(CSharpParser.Member_nameContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#method_body}. + * @param ctx the parse tree + */ + void enterMethod_body(CSharpParser.Method_bodyContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#method_body}. + * @param ctx the parse tree + */ + void exitMethod_body(CSharpParser.Method_bodyContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#formal_parameter_list}. + * @param ctx the parse tree + */ + void enterFormal_parameter_list(CSharpParser.Formal_parameter_listContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#formal_parameter_list}. + * @param ctx the parse tree + */ + void exitFormal_parameter_list(CSharpParser.Formal_parameter_listContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#fixed_parameters}. + * @param ctx the parse tree + */ + void enterFixed_parameters(CSharpParser.Fixed_parametersContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#fixed_parameters}. + * @param ctx the parse tree + */ + void exitFixed_parameters(CSharpParser.Fixed_parametersContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#fixed_parameter}. + * @param ctx the parse tree + */ + void enterFixed_parameter(CSharpParser.Fixed_parameterContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#fixed_parameter}. + * @param ctx the parse tree + */ + void exitFixed_parameter(CSharpParser.Fixed_parameterContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#parameter_modifier}. + * @param ctx the parse tree + */ + void enterParameter_modifier(CSharpParser.Parameter_modifierContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#parameter_modifier}. + * @param ctx the parse tree + */ + void exitParameter_modifier(CSharpParser.Parameter_modifierContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#parameter_array}. + * @param ctx the parse tree + */ + void enterParameter_array(CSharpParser.Parameter_arrayContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#parameter_array}. + * @param ctx the parse tree + */ + void exitParameter_array(CSharpParser.Parameter_arrayContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#accessor_declarations}. + * @param ctx the parse tree + */ + void enterAccessor_declarations(CSharpParser.Accessor_declarationsContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#accessor_declarations}. + * @param ctx the parse tree + */ + void exitAccessor_declarations(CSharpParser.Accessor_declarationsContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#get_accessor_declaration}. + * @param ctx the parse tree + */ + void enterGet_accessor_declaration(CSharpParser.Get_accessor_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#get_accessor_declaration}. + * @param ctx the parse tree + */ + void exitGet_accessor_declaration(CSharpParser.Get_accessor_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#set_accessor_declaration}. + * @param ctx the parse tree + */ + void enterSet_accessor_declaration(CSharpParser.Set_accessor_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#set_accessor_declaration}. + * @param ctx the parse tree + */ + void exitSet_accessor_declaration(CSharpParser.Set_accessor_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#accessor_modifier}. + * @param ctx the parse tree + */ + void enterAccessor_modifier(CSharpParser.Accessor_modifierContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#accessor_modifier}. + * @param ctx the parse tree + */ + void exitAccessor_modifier(CSharpParser.Accessor_modifierContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#accessor_body}. + * @param ctx the parse tree + */ + void enterAccessor_body(CSharpParser.Accessor_bodyContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#accessor_body}. + * @param ctx the parse tree + */ + void exitAccessor_body(CSharpParser.Accessor_bodyContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#event_accessor_declarations}. + * @param ctx the parse tree + */ + void enterEvent_accessor_declarations(CSharpParser.Event_accessor_declarationsContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#event_accessor_declarations}. + * @param ctx the parse tree + */ + void exitEvent_accessor_declarations(CSharpParser.Event_accessor_declarationsContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#add_accessor_declaration}. + * @param ctx the parse tree + */ + void enterAdd_accessor_declaration(CSharpParser.Add_accessor_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#add_accessor_declaration}. + * @param ctx the parse tree + */ + void exitAdd_accessor_declaration(CSharpParser.Add_accessor_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#remove_accessor_declaration}. + * @param ctx the parse tree + */ + void enterRemove_accessor_declaration(CSharpParser.Remove_accessor_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#remove_accessor_declaration}. + * @param ctx the parse tree + */ + void exitRemove_accessor_declaration(CSharpParser.Remove_accessor_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#overloadable_operator}. + * @param ctx the parse tree + */ + void enterOverloadable_operator(CSharpParser.Overloadable_operatorContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#overloadable_operator}. + * @param ctx the parse tree + */ + void exitOverloadable_operator(CSharpParser.Overloadable_operatorContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#conversion_operator_declarator}. + * @param ctx the parse tree + */ + void enterConversion_operator_declarator(CSharpParser.Conversion_operator_declaratorContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#conversion_operator_declarator}. + * @param ctx the parse tree + */ + void exitConversion_operator_declarator(CSharpParser.Conversion_operator_declaratorContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#constructor_initializer}. + * @param ctx the parse tree + */ + void enterConstructor_initializer(CSharpParser.Constructor_initializerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#constructor_initializer}. + * @param ctx the parse tree + */ + void exitConstructor_initializer(CSharpParser.Constructor_initializerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#body}. + * @param ctx the parse tree + */ + void enterBody(CSharpParser.BodyContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#body}. + * @param ctx the parse tree + */ + void exitBody(CSharpParser.BodyContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#struct_interfaces}. + * @param ctx the parse tree + */ + void enterStruct_interfaces(CSharpParser.Struct_interfacesContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#struct_interfaces}. + * @param ctx the parse tree + */ + void exitStruct_interfaces(CSharpParser.Struct_interfacesContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#struct_body}. + * @param ctx the parse tree + */ + void enterStruct_body(CSharpParser.Struct_bodyContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#struct_body}. + * @param ctx the parse tree + */ + void exitStruct_body(CSharpParser.Struct_bodyContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#struct_member_declaration}. + * @param ctx the parse tree + */ + void enterStruct_member_declaration(CSharpParser.Struct_member_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#struct_member_declaration}. + * @param ctx the parse tree + */ + void exitStruct_member_declaration(CSharpParser.Struct_member_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#array_type}. + * @param ctx the parse tree + */ + void enterArray_type(CSharpParser.Array_typeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#array_type}. + * @param ctx the parse tree + */ + void exitArray_type(CSharpParser.Array_typeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#rank_specifier}. + * @param ctx the parse tree + */ + void enterRank_specifier(CSharpParser.Rank_specifierContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#rank_specifier}. + * @param ctx the parse tree + */ + void exitRank_specifier(CSharpParser.Rank_specifierContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#array_initializer}. + * @param ctx the parse tree + */ + void enterArray_initializer(CSharpParser.Array_initializerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#array_initializer}. + * @param ctx the parse tree + */ + void exitArray_initializer(CSharpParser.Array_initializerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#variant_type_parameter_list}. + * @param ctx the parse tree + */ + void enterVariant_type_parameter_list(CSharpParser.Variant_type_parameter_listContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#variant_type_parameter_list}. + * @param ctx the parse tree + */ + void exitVariant_type_parameter_list(CSharpParser.Variant_type_parameter_listContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#variant_type_parameter}. + * @param ctx the parse tree + */ + void enterVariant_type_parameter(CSharpParser.Variant_type_parameterContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#variant_type_parameter}. + * @param ctx the parse tree + */ + void exitVariant_type_parameter(CSharpParser.Variant_type_parameterContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#variance_annotation}. + * @param ctx the parse tree + */ + void enterVariance_annotation(CSharpParser.Variance_annotationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#variance_annotation}. + * @param ctx the parse tree + */ + void exitVariance_annotation(CSharpParser.Variance_annotationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#interface_base}. + * @param ctx the parse tree + */ + void enterInterface_base(CSharpParser.Interface_baseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#interface_base}. + * @param ctx the parse tree + */ + void exitInterface_base(CSharpParser.Interface_baseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#interface_body}. + * @param ctx the parse tree + */ + void enterInterface_body(CSharpParser.Interface_bodyContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#interface_body}. + * @param ctx the parse tree + */ + void exitInterface_body(CSharpParser.Interface_bodyContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#interface_member_declaration}. + * @param ctx the parse tree + */ + void enterInterface_member_declaration(CSharpParser.Interface_member_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#interface_member_declaration}. + * @param ctx the parse tree + */ + void exitInterface_member_declaration(CSharpParser.Interface_member_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#interface_accessors}. + * @param ctx the parse tree + */ + void enterInterface_accessors(CSharpParser.Interface_accessorsContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#interface_accessors}. + * @param ctx the parse tree + */ + void exitInterface_accessors(CSharpParser.Interface_accessorsContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#enum_base}. + * @param ctx the parse tree + */ + void enterEnum_base(CSharpParser.Enum_baseContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#enum_base}. + * @param ctx the parse tree + */ + void exitEnum_base(CSharpParser.Enum_baseContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#enum_body}. + * @param ctx the parse tree + */ + void enterEnum_body(CSharpParser.Enum_bodyContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#enum_body}. + * @param ctx the parse tree + */ + void exitEnum_body(CSharpParser.Enum_bodyContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#enum_member_declaration}. + * @param ctx the parse tree + */ + void enterEnum_member_declaration(CSharpParser.Enum_member_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#enum_member_declaration}. + * @param ctx the parse tree + */ + void exitEnum_member_declaration(CSharpParser.Enum_member_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#global_attribute_section}. + * @param ctx the parse tree + */ + void enterGlobal_attribute_section(CSharpParser.Global_attribute_sectionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#global_attribute_section}. + * @param ctx the parse tree + */ + void exitGlobal_attribute_section(CSharpParser.Global_attribute_sectionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#global_attribute_target}. + * @param ctx the parse tree + */ + void enterGlobal_attribute_target(CSharpParser.Global_attribute_targetContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#global_attribute_target}. + * @param ctx the parse tree + */ + void exitGlobal_attribute_target(CSharpParser.Global_attribute_targetContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#attributes}. + * @param ctx the parse tree + */ + void enterAttributes(CSharpParser.AttributesContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#attributes}. + * @param ctx the parse tree + */ + void exitAttributes(CSharpParser.AttributesContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#attribute_section}. + * @param ctx the parse tree + */ + void enterAttribute_section(CSharpParser.Attribute_sectionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#attribute_section}. + * @param ctx the parse tree + */ + void exitAttribute_section(CSharpParser.Attribute_sectionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#attribute_target}. + * @param ctx the parse tree + */ + void enterAttribute_target(CSharpParser.Attribute_targetContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#attribute_target}. + * @param ctx the parse tree + */ + void exitAttribute_target(CSharpParser.Attribute_targetContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#attribute_list}. + * @param ctx the parse tree + */ + void enterAttribute_list(CSharpParser.Attribute_listContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#attribute_list}. + * @param ctx the parse tree + */ + void exitAttribute_list(CSharpParser.Attribute_listContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#attribute}. + * @param ctx the parse tree + */ + void enterAttribute(CSharpParser.AttributeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#attribute}. + * @param ctx the parse tree + */ + void exitAttribute(CSharpParser.AttributeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#attribute_argument}. + * @param ctx the parse tree + */ + void enterAttribute_argument(CSharpParser.Attribute_argumentContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#attribute_argument}. + * @param ctx the parse tree + */ + void exitAttribute_argument(CSharpParser.Attribute_argumentContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#pointer_type}. + * @param ctx the parse tree + */ + void enterPointer_type(CSharpParser.Pointer_typeContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#pointer_type}. + * @param ctx the parse tree + */ + void exitPointer_type(CSharpParser.Pointer_typeContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#fixed_pointer_declarators}. + * @param ctx the parse tree + */ + void enterFixed_pointer_declarators(CSharpParser.Fixed_pointer_declaratorsContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#fixed_pointer_declarators}. + * @param ctx the parse tree + */ + void exitFixed_pointer_declarators(CSharpParser.Fixed_pointer_declaratorsContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#fixed_pointer_declarator}. + * @param ctx the parse tree + */ + void enterFixed_pointer_declarator(CSharpParser.Fixed_pointer_declaratorContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#fixed_pointer_declarator}. + * @param ctx the parse tree + */ + void exitFixed_pointer_declarator(CSharpParser.Fixed_pointer_declaratorContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#fixed_pointer_initializer}. + * @param ctx the parse tree + */ + void enterFixed_pointer_initializer(CSharpParser.Fixed_pointer_initializerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#fixed_pointer_initializer}. + * @param ctx the parse tree + */ + void exitFixed_pointer_initializer(CSharpParser.Fixed_pointer_initializerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#fixed_size_buffer_declarator}. + * @param ctx the parse tree + */ + void enterFixed_size_buffer_declarator(CSharpParser.Fixed_size_buffer_declaratorContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#fixed_size_buffer_declarator}. + * @param ctx the parse tree + */ + void exitFixed_size_buffer_declarator(CSharpParser.Fixed_size_buffer_declaratorContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#stackalloc_initializer}. + * @param ctx the parse tree + */ + void enterStackalloc_initializer(CSharpParser.Stackalloc_initializerContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#stackalloc_initializer}. + * @param ctx the parse tree + */ + void exitStackalloc_initializer(CSharpParser.Stackalloc_initializerContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#right_arrow}. + * @param ctx the parse tree + */ + void enterRight_arrow(CSharpParser.Right_arrowContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#right_arrow}. + * @param ctx the parse tree + */ + void exitRight_arrow(CSharpParser.Right_arrowContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#right_shift}. + * @param ctx the parse tree + */ + void enterRight_shift(CSharpParser.Right_shiftContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#right_shift}. + * @param ctx the parse tree + */ + void exitRight_shift(CSharpParser.Right_shiftContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#right_shift_assignment}. + * @param ctx the parse tree + */ + void enterRight_shift_assignment(CSharpParser.Right_shift_assignmentContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#right_shift_assignment}. + * @param ctx the parse tree + */ + void exitRight_shift_assignment(CSharpParser.Right_shift_assignmentContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#literal}. + * @param ctx the parse tree + */ + void enterLiteral(CSharpParser.LiteralContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#literal}. + * @param ctx the parse tree + */ + void exitLiteral(CSharpParser.LiteralContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#boolean_literal}. + * @param ctx the parse tree + */ + void enterBoolean_literal(CSharpParser.Boolean_literalContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#boolean_literal}. + * @param ctx the parse tree + */ + void exitBoolean_literal(CSharpParser.Boolean_literalContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#string_literal}. + * @param ctx the parse tree + */ + void enterString_literal(CSharpParser.String_literalContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#string_literal}. + * @param ctx the parse tree + */ + void exitString_literal(CSharpParser.String_literalContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#interpolated_regular_string}. + * @param ctx the parse tree + */ + void enterInterpolated_regular_string(CSharpParser.Interpolated_regular_stringContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#interpolated_regular_string}. + * @param ctx the parse tree + */ + void exitInterpolated_regular_string(CSharpParser.Interpolated_regular_stringContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#interpolated_verbatium_string}. + * @param ctx the parse tree + */ + void enterInterpolated_verbatium_string(CSharpParser.Interpolated_verbatium_stringContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#interpolated_verbatium_string}. + * @param ctx the parse tree + */ + void exitInterpolated_verbatium_string(CSharpParser.Interpolated_verbatium_stringContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#interpolated_regular_string_part}. + * @param ctx the parse tree + */ + void enterInterpolated_regular_string_part(CSharpParser.Interpolated_regular_string_partContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#interpolated_regular_string_part}. + * @param ctx the parse tree + */ + void exitInterpolated_regular_string_part(CSharpParser.Interpolated_regular_string_partContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#interpolated_verbatium_string_part}. + * @param ctx the parse tree + */ + void enterInterpolated_verbatium_string_part(CSharpParser.Interpolated_verbatium_string_partContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#interpolated_verbatium_string_part}. + * @param ctx the parse tree + */ + void exitInterpolated_verbatium_string_part(CSharpParser.Interpolated_verbatium_string_partContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#interpolated_string_expression}. + * @param ctx the parse tree + */ + void enterInterpolated_string_expression(CSharpParser.Interpolated_string_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#interpolated_string_expression}. + * @param ctx the parse tree + */ + void exitInterpolated_string_expression(CSharpParser.Interpolated_string_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#keyword}. + * @param ctx the parse tree + */ + void enterKeyword(CSharpParser.KeywordContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#keyword}. + * @param ctx the parse tree + */ + void exitKeyword(CSharpParser.KeywordContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#class_definition}. + * @param ctx the parse tree + */ + void enterClass_definition(CSharpParser.Class_definitionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#class_definition}. + * @param ctx the parse tree + */ + void exitClass_definition(CSharpParser.Class_definitionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#struct_definition}. + * @param ctx the parse tree + */ + void enterStruct_definition(CSharpParser.Struct_definitionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#struct_definition}. + * @param ctx the parse tree + */ + void exitStruct_definition(CSharpParser.Struct_definitionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#interface_definition}. + * @param ctx the parse tree + */ + void enterInterface_definition(CSharpParser.Interface_definitionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#interface_definition}. + * @param ctx the parse tree + */ + void exitInterface_definition(CSharpParser.Interface_definitionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#enum_definition}. + * @param ctx the parse tree + */ + void enterEnum_definition(CSharpParser.Enum_definitionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#enum_definition}. + * @param ctx the parse tree + */ + void exitEnum_definition(CSharpParser.Enum_definitionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#delegate_definition}. + * @param ctx the parse tree + */ + void enterDelegate_definition(CSharpParser.Delegate_definitionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#delegate_definition}. + * @param ctx the parse tree + */ + void exitDelegate_definition(CSharpParser.Delegate_definitionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#event_declaration}. + * @param ctx the parse tree + */ + void enterEvent_declaration(CSharpParser.Event_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#event_declaration}. + * @param ctx the parse tree + */ + void exitEvent_declaration(CSharpParser.Event_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#field_declaration}. + * @param ctx the parse tree + */ + void enterField_declaration(CSharpParser.Field_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#field_declaration}. + * @param ctx the parse tree + */ + void exitField_declaration(CSharpParser.Field_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#property_declaration}. + * @param ctx the parse tree + */ + void enterProperty_declaration(CSharpParser.Property_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#property_declaration}. + * @param ctx the parse tree + */ + void exitProperty_declaration(CSharpParser.Property_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#constant_declaration}. + * @param ctx the parse tree + */ + void enterConstant_declaration(CSharpParser.Constant_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#constant_declaration}. + * @param ctx the parse tree + */ + void exitConstant_declaration(CSharpParser.Constant_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#indexer_declaration}. + * @param ctx the parse tree + */ + void enterIndexer_declaration(CSharpParser.Indexer_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#indexer_declaration}. + * @param ctx the parse tree + */ + void exitIndexer_declaration(CSharpParser.Indexer_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#destructor_definition}. + * @param ctx the parse tree + */ + void enterDestructor_definition(CSharpParser.Destructor_definitionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#destructor_definition}. + * @param ctx the parse tree + */ + void exitDestructor_definition(CSharpParser.Destructor_definitionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#constructor_declaration}. + * @param ctx the parse tree + */ + void enterConstructor_declaration(CSharpParser.Constructor_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#constructor_declaration}. + * @param ctx the parse tree + */ + void exitConstructor_declaration(CSharpParser.Constructor_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#method_declaration}. + * @param ctx the parse tree + */ + void enterMethod_declaration(CSharpParser.Method_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#method_declaration}. + * @param ctx the parse tree + */ + void exitMethod_declaration(CSharpParser.Method_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#method_member_name}. + * @param ctx the parse tree + */ + void enterMethod_member_name(CSharpParser.Method_member_nameContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#method_member_name}. + * @param ctx the parse tree + */ + void exitMethod_member_name(CSharpParser.Method_member_nameContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#operator_declaration}. + * @param ctx the parse tree + */ + void enterOperator_declaration(CSharpParser.Operator_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#operator_declaration}. + * @param ctx the parse tree + */ + void exitOperator_declaration(CSharpParser.Operator_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#arg_declaration}. + * @param ctx the parse tree + */ + void enterArg_declaration(CSharpParser.Arg_declarationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#arg_declaration}. + * @param ctx the parse tree + */ + void exitArg_declaration(CSharpParser.Arg_declarationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#method_invocation}. + * @param ctx the parse tree + */ + void enterMethod_invocation(CSharpParser.Method_invocationContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#method_invocation}. + * @param ctx the parse tree + */ + void exitMethod_invocation(CSharpParser.Method_invocationContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#object_creation_expression}. + * @param ctx the parse tree + */ + void enterObject_creation_expression(CSharpParser.Object_creation_expressionContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#object_creation_expression}. + * @param ctx the parse tree + */ + void exitObject_creation_expression(CSharpParser.Object_creation_expressionContext ctx); + /** + * Enter a parse tree produced by {@link CSharpParser#identifier}. + * @param ctx the parse tree + */ + void enterIdentifier(CSharpParser.IdentifierContext ctx); + /** + * Exit a parse tree produced by {@link CSharpParser#identifier}. + * @param ctx the parse tree + */ + void exitIdentifier(CSharpParser.IdentifierContext ctx); +} diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydafny/DafnyApiCodegenTest.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydafny/DafnyApiCodegenTest.java new file mode 100644 index 0000000000..892ecee37c --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydafny/DafnyApiCodegenTest.java @@ -0,0 +1,398 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydafny; + +import org.junit.Test; +import software.amazon.polymorph.util.TestModel; +import software.amazon.polymorph.util.Tokenizer; +import software.amazon.polymorph.util.Tokenizer.ParseToken; +import software.amazon.polymorph.utils.TokenTree; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.loader.ModelAssembler; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StructureShape; + +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.function.BiConsumer; + +import static org.junit.Assert.*; +import static software.amazon.polymorph.util.TestModel.SERVICE_NAMESPACE; +import static software.amazon.polymorph.util.TestModel.SERVICE_SHAPE_ID; + +// TODO: use Dafny tokenizer instead of C# tokenizer +public class DafnyApiCodegenTest { + private static DafnyApiCodegen setupCodegen(final BiConsumer updater) { + final Model model = TestModel.setupModel(updater); + return new DafnyApiCodegen(model, SERVICE_SHAPE_ID); + } + + @Test + public void testGenerate() { + final ShapeId operationShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "DoIt"); + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> { + builder.addOperation(operationShapeId); + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + operation DoIt {} + boolean SomeBool + @enum([{name: "A", value: "A"}, {name: "B", value: "B"}]) string SomeEnum + long SomeLong + list SomeList { member: String } + structure SomeStructure { someInt: Integer } + map EncryptionContextType { key: EncryptionContextKey, value: EncryptionContextValue } + @aws.polymorph#dafnyUtf8Bytes string EncryptionContextKey + @aws.polymorph#dafnyUtf8Bytes string EncryptionContextValue + """.formatted(SERVICE_NAMESPACE)); + }); + final Map codeByPath = codegen.generate(); + final String actualCode = codeByPath.get(Path.of("FoobarService.dfy")).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + include "../StandardLibrary/StandardLibrary.dfy" + include "../Util/UTF8.dfy" + module {:extern "Dafny.Test.Foobar"} Test.Foobar { + import opened Wrappers + import opened StandardLibrary.UInt + import opened UTF8 + type EncryptionContextKey = ValidUTF8Bytes + type EncryptionContextType = map + type EncryptionContextValue = ValidUTF8Bytes + trait IFoobarServiceClient { + predicate {:opaque} DoItCalledWith() {true} + predicate {:opaque} DoItSucceededWith() {true} + method DoIt() returns (output: Result<(), FoobarServiceError>) + ensures DoItCalledWith() + ensures output.Success? ==> DoItSucceededWith() + } + datatype FoobarServiceError = + | FoobarService_Unknown(unknownMessage: string) + function method CastFoobarServiceErrorToString (error: FoobarServiceError): string { + match error + case FoobarService_Unknown(arg) => "Unexpected Exception from AWS FoobarService: " + arg + } + type SomeBool = bool + datatype SomeEnum = | A | B + type SomeList = seq + type SomeLong = int64 + datatype SomeStructure = SomeStructure(nameonly someInt: Option) + } + """); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateBlobTypeDefinition() { + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + @length(min: 1, max: 1024) + blob SomeBlob + """.formatted(SERVICE_NAMESPACE))); + final String actualCode = codegen.generateBlobTypeDefinition( + ShapeId.fromParts(SERVICE_NAMESPACE, "SomeBlob")).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + type SomeBlob = x: seq | IsValid_SomeBlob(x) witness * + predicate method IsValid_SomeBlob(x: seq) { (1 <= |x| <= 1024) } + """); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateBoolTypeDefinition() { + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + boolean SomeBool + """.formatted(SERVICE_NAMESPACE))); + final String actualCode = codegen.generateBoolTypeDefinition( + ShapeId.fromParts(SERVICE_NAMESPACE, "SomeBool")).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize("type SomeBool = bool"); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateStringTypeDefinition() { + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + @length(min: 1, max: 1024) + string SomeString + """.formatted(SERVICE_NAMESPACE))); + final String actualCode = codegen.generateStringTypeDefinition( + ShapeId.fromParts(SERVICE_NAMESPACE, "SomeString")).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + type SomeString = x: string | IsValid_SomeString(x) witness * + predicate method IsValid_SomeString(x: string) { (1 <= |x| <= 1024) } + """); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateEnumTypeDefinition() { + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + @enum([ + {value: "V1", name: "N1"}, + {value: "V2", name: "N2"}, + {value: "V3", name: "N3"}, + ]) + string SomeEnum + """.formatted(SERVICE_NAMESPACE))); + final String actualCode = codegen.generateEnumTypeDefinition( + ShapeId.fromParts(SERVICE_NAMESPACE, "SomeEnum")).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize("datatype SomeEnum = | N1 | N2 | N3"); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateNumericTypeDefinitionInt() { + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + @range(min: 1, max: 10) + integer SomeInt + """.formatted(SERVICE_NAMESPACE))); + + final String actualCode = codegen.generateNumericTypeDefinition( + ShapeId.fromParts(SERVICE_NAMESPACE, "SomeInt")).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + type SomeInt = x: int32 | IsValid_SomeInt(x) witness * + predicate method IsValid_SomeInt(x: int32) { (1 <= x <= 10) } + """); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateNumericTypeDefinitionLong() { + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + @range(min: 1, max: 10) + long SomeLong + """.formatted(SERVICE_NAMESPACE))); + + final String actualCode = codegen.generateNumericTypeDefinition( + ShapeId.fromParts(SERVICE_NAMESPACE, "SomeLong")).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + type SomeLong = x: int64 | IsValid_SomeLong(x) witness * + predicate method IsValid_SomeLong(x: int64) { (1 <= x <= 10) } + """); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateListTypeDefinition() { + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + @length(min: 1, max: 10) + list SomeList { + member: Boolean + } + """.formatted(SERVICE_NAMESPACE))); + final String actualCode = codegen.generateListTypeDefinition( + ShapeId.fromParts(SERVICE_NAMESPACE, "SomeList")).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + type SomeList = x: seq | IsValid_SomeList(x) witness * + predicate method IsValid_SomeList(x: seq) { (1 <= |x| <= 10) } + """); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateMapTypeDefinition() { + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + @length(min: 1, max: 10) + map SomeMap { + key: String, + value: Boolean, + } + """.formatted(SERVICE_NAMESPACE))); + final String actualCode = codegen.generateMapTypeDefinition( + ShapeId.fromParts(SERVICE_NAMESPACE, "SomeMap")).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + type SomeMap = x: map | IsValid_SomeMap(x) witness * + predicate method IsValid_SomeMap(x: map) { (1 <= |x| <= 10) } + """); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateStructureTypeDefinition() { + final StructureShape foobarStructureShape = TestModel.setupFoobarStructureShape(); + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> modelAssembler.addShape(foobarStructureShape)); + + final String actualCode = codegen.generateStructureTypeDefinition(foobarStructureShape.getId()).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + datatype Foobar = Foobar( + nameonly someInt: Option, + nameonly someString: Option, + nameonly someBool: bool + ) + """); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateServiceTraitDefinition() { + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> { + builder.addOperation(ShapeId.fromParts(SERVICE_NAMESPACE, "DoThis")); + builder.addOperation(ShapeId.fromParts(SERVICE_NAMESPACE, "DoThat")); + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + operation DoThis {} + operation DoThat {} + """.formatted(SERVICE_NAMESPACE)); + }); + final String actualCode = codegen.generateServiceTraitDefinition().toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + trait IFoobarServiceClient { + predicate {:opaque} DoThisCalledWith() {true} + predicate {:opaque} DoThisSucceededWith() {true} + method DoThis() returns (output: Result<(), FoobarServiceError>) + ensures DoThisCalledWith() + ensures output.Success? ==> DoThisSucceededWith() + predicate {:opaque} DoThatCalledWith() {true} + predicate {:opaque} DoThatSucceededWith() {true} + method DoThat() returns (output: Result<(), FoobarServiceError>) + ensures DoThatCalledWith() + ensures output.Success? ==> DoThatSucceededWith() + }"""); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateOperationPredicatesAndMethod() { + final ShapeId operationShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "DoIt"); + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> { + builder.addOperation(operationShapeId); + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + operation DoIt { input: Foo, output: Bar, errors: [Oops] } + structure Foo {} + structure Bar {} + @error("client") structure Oops {} + """.formatted(SERVICE_NAMESPACE)); + }); + final String actualCode = codegen.generateOperationPredicatesAndMethod(operationShapeId).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + predicate {:opaque} DoItCalledWith( + input: Foo + ) {true} + predicate {:opaque} DoItSucceededWith( + input: Foo, + output: Bar + ) {true} + method DoIt(input: Foo) returns (output: Result) + ensures DoItCalledWith(input) + ensures output.Success? ==> DoItSucceededWith(input, output.value) + """); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateServiceErrorTypeDefinition() { + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> { + builder.addOperation(ShapeId.fromParts(SERVICE_NAMESPACE, "DoIt")); + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + operation DoIt { errors: [Oops, OhNo, Whoops] } + @error("client") structure Oops {} + @error("client") structure OhNo {} + @error("server") structure Whoops {} + """.formatted(SERVICE_NAMESPACE)); + }); + final String actualCode = codegen.generateServiceErrorTypeDefinition().toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + datatype FoobarServiceError = + | FoobarService_Unknown(unknownMessage: string) + | FoobarService_OhNo(OhNo: OhNo) + | FoobarService_Oops(Oops: Oops) + | FoobarService_Whoops(Whoops: Whoops) + function method CastFoobarServiceErrorToString (error: FoobarServiceError): string { + match error + case FoobarService_OhNo(arg) => arg.CastToString() + case FoobarService_Oops(arg) => arg.CastToString() + case FoobarService_Whoops(arg) => arg.CastToString() + case FoobarService_Unknown(arg) => "Unexpected Exception from AWS FoobarService: " + arg + } + """); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateErrorStructureTypeDefinition_WithMessage() { + final ShapeId shapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Oops"); + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> { + builder.addOperation(ShapeId.fromParts(SERVICE_NAMESPACE, "DoIt")); + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + string ErrorMessageType + operation DoIt { errors: [Oops, OhNo] } + @error("client") structure Oops { message: ErrorMessageType,} + @error("server") structure OhNo {} + """.formatted(SERVICE_NAMESPACE)); + }); + final String actualCode = codegen.generateErrorStructureTypeDefinition(shapeId).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + final List expectedTokens = Tokenizer.tokenize(""" + datatype Oops = Oops ( + nameonly message: Option ) { + function method CastToString(): string { + if message.Some? then "Oops: " + message.value else "Oops" + } + } + """); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateErrorStructureTypeDefinition_WithOutMessage() { + final ShapeId shapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "OhNo"); + final DafnyApiCodegen codegen = setupCodegen((builder, modelAssembler) -> { + builder.addOperation(ShapeId.fromParts(SERVICE_NAMESPACE, "DoIt")); + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + string ErrorMessageType + operation DoIt { errors: [Oops, OhNo] } + @error("client") structure Oops { message: ErrorMessageType,} + @error("server") structure OhNo {} + """.formatted(SERVICE_NAMESPACE)); + }); + final String actualCode = codegen.generateErrorStructureTypeDefinition(shapeId).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + final List expectedTokens = Tokenizer.tokenize(""" + datatype OhNo = OhNo () { + function method CastToString(): string { + "OhNo" + } + } + """); + assertEquals(expectedTokens, actualTokens); + } +} diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/AwsSdkShimCodegenTest.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/AwsSdkShimCodegenTest.java new file mode 100644 index 0000000000..28c2aba3fb --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/AwsSdkShimCodegenTest.java @@ -0,0 +1,214 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import org.junit.Test; +import software.amazon.polymorph.util.TestModel; +import software.amazon.polymorph.util.Tokenizer; +import software.amazon.polymorph.util.Tokenizer.ParseToken; +import software.amazon.polymorph.utils.TokenTree; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.loader.ModelAssembler; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.ShapeId; + +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiConsumer; + +import static org.junit.Assert.assertEquals; +import static software.amazon.polymorph.smithydotnet.TypeConversionDirection.FROM_DAFNY; +import static software.amazon.polymorph.smithydotnet.TypeConversionDirection.TO_DAFNY; + +public class AwsSdkShimCodegenTest { + private static final String SERVICE_NAMESPACE = "com.amazonaws.foobar"; + private static final String SERVICE_NAME = "FoobarService"; + private static final ShapeId SERVICE_SHAPE_ID = ShapeId.fromParts(SERVICE_NAMESPACE, SERVICE_NAME); + + private static AwsSdkShimCodegen setupCodegen(final BiConsumer updater) { + final Model model = TestModel.setupModel((builder, assembler) -> { + builder.id(SERVICE_SHAPE_ID); + updater.accept(builder, assembler); + }); + return new AwsSdkShimCodegen(model, SERVICE_SHAPE_ID); + } + + @Test + public void testGenerateEmptyService() { + final AwsSdkShimCodegen codegen = setupCodegen((_builder, _modelAssembler) -> {}); + final Map codeByPath = codegen.generate(); + final Path shimPath = Path.of("FoobarServiceShim.cs"); + assert codeByPath.keySet().equals(Set.of(shimPath)); + + final List actualTokens = Tokenizer.tokenize(codeByPath.get(shimPath).toString()); + + final String stringConverter = AwsSdkDotNetNameResolver.qualifiedTypeConverter( + ShapeId.from("smithy.api#String"), TO_DAFNY); + final List expectedTokens = Tokenizer.tokenize(""" + using System; + using System.IO; + using System.Collections.Generic; + + namespace Com.Amazonaws.Foobar { + internal class FoobarServiceShim : Dafny.Com.Amazonaws.Foobar.IFoobarServiceClient { + internal Amazon.FoobarService.AmazonFoobarServiceClient _impl; + + internal FoobarServiceShim(Amazon.FoobarService.AmazonFoobarServiceClient impl) { + this._impl = impl; + } + + private Dafny.Com.Amazonaws.Foobar.FoobarServiceError ConvertError( + Amazon.FoobarService.AmazonFoobarServiceException error) { + return Dafny.Com.Amazonaws.Foobar.FoobarServiceError.create_FoobarService__Unknown( + %s(error.Message)); + } + } + } + """.formatted(stringConverter)); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateServiceShim() { + final ShapeId inputOperation = ShapeId.fromParts(SERVICE_NAMESPACE, "DoInput"); + final ShapeId outputOperation = ShapeId.fromParts(SERVICE_NAMESPACE, "DoOutput"); + final AwsSdkShimCodegen codegen = setupCodegen((builder, modelAssembler) -> { + builder.addOperation(inputOperation); + builder.addOperation(outputOperation); + modelAssembler.addUnparsedModel("test.smithy", """ + namespace com.amazonaws.foobar + operation DoInput { + input: DoInputRequest, + errors: [Crash], + } + operation DoOutput { + output: DoOutputResponse, + errors: [Crash], + } + structure DoInputRequest {} + structure DoOutputResponse {} + @error("client") structure Crash { message: String } + """); + }); + final List actualTokens = Tokenizer.tokenize(codegen.generateServiceShim().toString()); + + final String expectedShimConstructor = codegen.generateServiceShimConstructor().toString(); + final String expectedInputOperationShim = codegen.generateOperationShim(inputOperation).toString(); + final String expectedOutputOperationShim = codegen.generateOperationShim(outputOperation).toString(); + final String expectedErrorTypeShim = codegen.generateErrorTypeShim().toString(); + final List expectedTokens = Tokenizer.tokenize(""" + namespace Com.Amazonaws.Foobar { + internal class FoobarServiceShim : Dafny.Com.Amazonaws.Foobar.IFoobarServiceClient { + internal Amazon.FoobarService.AmazonFoobarServiceClient _impl; + %s + %s + %s + %s + } + } + """.formatted( + expectedShimConstructor, + expectedInputOperationShim, + expectedOutputOperationShim, + expectedErrorTypeShim)); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateOperationShim() { + final ShapeId operationShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Go"); + final ShapeId requestShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "GoRequest"); + final ShapeId responseShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "GoResponse"); + final AwsSdkShimCodegen codegen = setupCodegen((builder, modelAssembler) -> { + builder.addOperation(operationShapeId); + modelAssembler.addUnparsedModel("test.smithy", """ + namespace com.amazonaws.foobar + operation Go { + input: GoRequest, + output: GoResponse, + errors: [Crash], + } + structure GoRequest {} + structure GoResponse {} + @error("client") structure Crash { message: String } + """); + }); + + final List actualTokens = Tokenizer.tokenize( + codegen.generateOperationShim(operationShapeId).toString()); + + final String resultType = "Wrappers_Compile.Result<%s, %s>" + .formatted("Dafny.Com.Amazonaws.Foobar.GoResponse", "Dafny.Com.Amazonaws.Foobar.FoobarServiceError"); + final String requestFromDafnyConverter = + AwsSdkDotNetNameResolver.qualifiedTypeConverter(requestShapeId, FROM_DAFNY); + final String responseToDafnyConverter = AwsSdkDotNetNameResolver.qualifiedTypeConverter(responseShapeId, TO_DAFNY); + final List expectedTokens = Tokenizer.tokenize(""" + public %1$s Go(Dafny.Com.Amazonaws.Foobar.GoRequest request) { + Amazon.FoobarService.Model.GoRequest sdkRequest = %2$s(request); + try { + Amazon.FoobarService.Model.GoResponse sdkResponse = + this._impl.GoAsync(sdkRequest).Result; + return %1$s.create_Success(%3$s(sdkResponse)); + } + catch (Amazon.FoobarService.AmazonFoobarServiceException ex) { + return %1$s.create_Failure(this.ConvertError(ex)); + } + } + """.formatted(resultType, requestFromDafnyConverter, responseToDafnyConverter)); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateErrorTypeShim() { + final ShapeId operationShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Go"); + final AwsSdkShimCodegen codegen = setupCodegen((builder, modelAssembler) -> { + builder.addOperation(operationShapeId); + modelAssembler.addUnparsedModel("test.smithy", """ + namespace com.amazonaws.foobar + operation Go { + errors: [Boom, Crash, Bang], + } + @error("client") structure Boom { message: String } + @error("client") structure Crash { message: String } + @error("client") structure Bang { message: String } + """); + }); + final List actualTokens = Tokenizer.tokenize(codegen.generateErrorTypeShim().toString()); + + final String bangConverter = AwsSdkDotNetNameResolver.qualifiedTypeConverter( + ShapeId.from("com.amazonaws.foobar#Bang"), TO_DAFNY); + final String boomConverter = AwsSdkDotNetNameResolver.qualifiedTypeConverter( + ShapeId.from("com.amazonaws.foobar#Boom"), TO_DAFNY); + final String crashConverter = AwsSdkDotNetNameResolver.qualifiedTypeConverter( + ShapeId.from("com.amazonaws.foobar#Crash"), TO_DAFNY); + final String stringConverter = AwsSdkDotNetNameResolver.qualifiedTypeConverter( + ShapeId.from("smithy.api#String"), TO_DAFNY); + final List expectedTokens = Tokenizer.tokenize(""" + private Dafny.Com.Amazonaws.Foobar.FoobarServiceError ConvertError( + Amazon.FoobarService.AmazonFoobarServiceException error) { + if (error is Amazon.FoobarService.Model.Bang) { + return Dafny.Com.Amazonaws.Foobar.FoobarServiceError.create_FoobarService__Bang( + %1$s((Amazon.FoobarService.Model.Bang) error)); + } + if (error is Amazon.FoobarService.Model.Boom) { + return Dafny.Com.Amazonaws.Foobar.FoobarServiceError.create_FoobarService__Boom( + %2$s((Amazon.FoobarService.Model.Boom) error)); + } + if (error is Amazon.FoobarService.Model.Crash) { + return Dafny.Com.Amazonaws.Foobar.FoobarServiceError.create_FoobarService__Crash( + %3$s((Amazon.FoobarService.Model.Crash) error)); + } + return Dafny.Com.Amazonaws.Foobar.FoobarServiceError.create_FoobarService__Unknown( + %4$s(error.Message)); + } + """.formatted(bangConverter, boomConverter, crashConverter, stringConverter)); + + assertEquals(expectedTokens, actualTokens); + } +} diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/AwsSdkTypeConversionCodegenTest.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/AwsSdkTypeConversionCodegenTest.java new file mode 100644 index 0000000000..9905f54aa5 --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/AwsSdkTypeConversionCodegenTest.java @@ -0,0 +1,76 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import org.junit.Test; +import software.amazon.polymorph.util.TestModel; +import software.amazon.polymorph.util.Tokenizer; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.loader.ModelAssembler; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StructureShape; + +import java.util.List; +import java.util.function.BiConsumer; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static software.amazon.polymorph.smithydotnet.TypeConversionDirection.FROM_DAFNY; +import static software.amazon.polymorph.smithydotnet.TypeConversionDirection.TO_DAFNY; + +public class AwsSdkTypeConversionCodegenTest { + private static final String SERVICE_NAMESPACE = "com.amazonaws.foobar"; + private static final String SERVICE_NAME = "FoobarService"; + private static final ShapeId SERVICE_SHAPE_ID = ShapeId.fromParts(SERVICE_NAMESPACE, SERVICE_NAME); + + private static AwsSdkTypeConversionCodegen setupCodegen(final BiConsumer updater) { + final Model model = TestModel.setupModel((builder, assembler) -> { + builder.id(SERVICE_SHAPE_ID); + updater.accept(builder, assembler); + }); + return new AwsSdkTypeConversionCodegen(model, SERVICE_SHAPE_ID); + } + + @Test + public void testGenerateStructureConverterErrorStructureWithMessage() { + final ShapeId shapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "OopsException"); + final ShapeId stringShapeId = ShapeId.from("smithy.api#String"); + final TypeConversionCodegen codegen = setupCodegen((builder, modelAssembler) -> + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + @error("client") + structure OopsException { message: String } + """.formatted(SERVICE_NAMESPACE))); + final TypeConversionCodegen.TypeConverter converter = codegen.generateStructureConverter( + codegen.getModel().expectShape(shapeId, StructureShape.class)); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String structureFromDafnyConverterName = AwsSdkDotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final String stringFromDafnyConverterName = AwsSdkDotNetNameResolver.typeConverterForShape(stringShapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static Amazon.FoobarService.Model.OopsException %s(Dafny.Com.Amazonaws.Foobar.OopsException value) { + string message = value.message.is_Some ? null : %s(value.message.Extract()); + return new Amazon.FoobarService.Model.OopsException(message); + }""".formatted( + structureFromDafnyConverterName, + stringFromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String structureToDafnyConverterName = AwsSdkDotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final String stringToDafnyConverterName = AwsSdkDotNetNameResolver.typeConverterForShape(stringShapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static Dafny.Com.Amazonaws.Foobar.OopsException %s(Amazon.FoobarService.Model.OopsException value) { + Wrappers_Compile.Option> message = System.String.IsNullOrEmpty(value.Message) + ? Wrappers_Compile.Option>.create_None() + : Wrappers_Compile.Option>.create_Some(%s(value.Message)); + return new Dafny.Com.Amazonaws.Foobar.OopsException(message); + }""".formatted( + structureToDafnyConverterName, + stringToDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } +} diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/DotNetNameResolverTest.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/DotNetNameResolverTest.java new file mode 100644 index 0000000000..c1edd3e199 --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/DotNetNameResolverTest.java @@ -0,0 +1,191 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import org.junit.Test; +import software.amazon.polymorph.smithydafny.DafnyNameResolver; +import software.amazon.polymorph.traits.DafnyUtf8BytesTrait; +import software.amazon.polymorph.traits.PositionalTrait; +import software.amazon.polymorph.traits.ReferenceTrait; +import software.amazon.polymorph.util.TestModel; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.loader.ModelAssembler; +import software.amazon.smithy.model.shapes.ListShape; +import software.amazon.smithy.model.shapes.MapShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StringShape; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.traits.EnumDefinition; +import software.amazon.smithy.model.traits.EnumTrait; + +import java.util.function.BiConsumer; + +import static org.junit.Assert.assertEquals; +import static software.amazon.polymorph.util.TestModel.SERVICE_NAMESPACE; +import static software.amazon.polymorph.util.TestModel.SERVICE_SHAPE_ID; + +public class DotNetNameResolverTest { + private DotNetNameResolver setupNameResolver(final BiConsumer updater) { + final Model model = TestModel.setupModel(updater); + final ServiceShape serviceShape = model.expectShape(SERVICE_SHAPE_ID, ServiceShape.class); + return new DotNetNameResolver(model, serviceShape); + } + + @Test + public void testEncodeShapeIdRoot() { + final ShapeId shapeId = ShapeId.fromParts("com.foo.bar_baz", "ShapeName"); + final String encodedShapeId = DotNetNameResolver.encodedIdentForShapeId(shapeId); + assertEquals(encodedShapeId, "N3_com__N3_foo__N7_bar_baz__S9_ShapeName"); + } + + @Test + public void testEncodeShapeIdWithMember() { + final ShapeId shapeId = ShapeId.fromParts("com.foo.bar_baz", "ShapeName", "MemberName"); + final String encodedShapeId = DotNetNameResolver.encodedIdentForShapeId(shapeId); + assertEquals(encodedShapeId, "N3_com__N3_foo__N7_bar_baz__S9_ShapeName__M10_MemberName"); + } + + @Test + public void testEncodeShapeIdWithSuspiciousIdents() { + final ShapeId shapeId = ShapeId.fromParts("N3_com__.__bar_baz.M10_MemberName", "N3_foo", "__SUS__S1__"); + final String encodedShapeId = DotNetNameResolver.encodedIdentForShapeId(shapeId); + assertEquals(encodedShapeId, "N8_N3_com____N9___bar_baz__N14_M10_MemberName__S6_N3_foo__M11___SUS__S1__"); + } + + @Test + public void testTypeConverterForShape() { + final StructureShape foobarStructureShape = TestModel.setupFoobarStructureShape(); + final DotNetNameResolver nameResolver = setupNameResolver( + (builder, modelAssembler) -> modelAssembler.addShape(foobarStructureShape)); + + final String toDafnyConverterName = DotNetNameResolver.typeConverterForShape(foobarStructureShape.getId(), + TypeConversionDirection.TO_DAFNY); + assertEquals("ToDafny_N4_test__N6_foobar__S6_Foobar", toDafnyConverterName); + + final String fromDafnyConverterName = DotNetNameResolver.typeConverterForShape(foobarStructureShape.getId(), + TypeConversionDirection.FROM_DAFNY); + assertEquals("FromDafny_N4_test__N6_foobar__S6_Foobar", fromDafnyConverterName); + } + + @Test + public void testDafnyNamespaceForShapeId() { + final ShapeId shapeId = ShapeId.fromParts("test.foobar.baz", "Whatever"); + final String dafnyNamespace = DafnyNameResolver.dafnyExternNamespaceForShapeId(shapeId); + assertEquals("Dafny.Test.Foobar.Baz", dafnyNamespace); + } + + @Test + public void testDafnyTypeForSimpleShapes() { + final DotNetNameResolver nameResolver = setupNameResolver((_builder, _modelAssembler) -> {}); + assertEquals("Dafny.ISequence", nameResolver.dafnyTypeForShape(ShapeId.from("smithy.api#Blob"))); + assertEquals("bool", nameResolver.dafnyTypeForShape(ShapeId.from("smithy.api#Boolean"))); + assertEquals("Dafny.ISequence", nameResolver.dafnyTypeForShape(ShapeId.from("smithy.api#String"))); + assertEquals("int", nameResolver.dafnyTypeForShape(ShapeId.from("smithy.api#Integer"))); + assertEquals("long", nameResolver.dafnyTypeForShape(ShapeId.from("smithy.api#Long"))); + } + + @Test + public void testDafnyTypeForEnum() { + final EnumTrait enumTrait = EnumTrait.builder() + .addEnum(EnumDefinition.builder().value("value").build()) + .build(); + final StringShape enumStringShape = StringShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "EnumString")) + .addTrait(enumTrait) + .build(); + final DotNetNameResolver nameResolver = setupNameResolver( + (builder, modelAssembler) -> modelAssembler.addShape(enumStringShape)); + assertEquals("Dafny.Test.Foobar.EnumString", nameResolver.dafnyTypeForShape(enumStringShape.getId())); + } + + @Test + public void testDafnyTypeForUtf8Bytes() { + final StringShape stringShape = StringShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "Utf8BytesString")) + .addTrait(new DafnyUtf8BytesTrait()) + .build(); + final DotNetNameResolver nameResolver = setupNameResolver( + (builder, modelAssembler) -> modelAssembler.addShape(stringShape)); + assertEquals("Dafny.ISequence", nameResolver.dafnyTypeForShape(stringShape.getId())); + } + + @Test + public void testDafnyTypeForAggregateTypes() { + final ShapeId listShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "BoolList"); + final ListShape listShape = ListShape.builder() + .id(listShapeId) + .member(ShapeId.from("smithy.api#Boolean")) + .build(); + final MapShape mapShape = MapShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "StringToBoolListMap")) + .key(ShapeId.from("smithy.api#String")) + .value(listShapeId) + .build(); + final DotNetNameResolver nameResolver = setupNameResolver(((builder, modelAssembler) -> { + modelAssembler.addShape(listShape); + modelAssembler.addShape(mapShape); + })); + assertEquals("Dafny.ISequence", nameResolver.dafnyTypeForShape(listShape.getId())); + assertEquals("Dafny.IMap, Dafny.ISequence>", + nameResolver.dafnyTypeForShape(mapShape.getId())); + } + + @Test + public void testDafnyTypeForStructure() { + final StructureShape foobarStructureShape = TestModel.setupFoobarStructureShape(); + final DotNetNameResolver nameResolver = setupNameResolver( + (builder, modelAssembler) -> modelAssembler.addShape(foobarStructureShape)); + assertEquals("Dafny.Test.Foobar.Foobar", nameResolver.dafnyTypeForShape(foobarStructureShape.getId())); + } + + @Test + public void testDafnyTypeForReferenceStructure() { + final ReferenceTrait referenceTrait = ReferenceTrait.builder() + .referentType(ReferenceTrait.ReferentType.SERVICE) + .referentId(SERVICE_SHAPE_ID) + .build(); + final StructureShape referenceShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "ServiceReference")) + .addTrait(referenceTrait) + .build(); + final DotNetNameResolver nameResolver = setupNameResolver( + (builder, modelAssembler) -> modelAssembler.addShape(referenceShape)); + assertEquals("Dafny.Test.Foobar.IFoobarServiceClient", nameResolver.dafnyTypeForShape(referenceShape.getId())); + } + + @Test + public void testDafnyTypeForPositionalStructure() { + final PositionalTrait positionalTrait = PositionalTrait.builder().build(); + final StructureShape positionalShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "PositionalShape")) + .addMember("aBoolean", ShapeId.from("smithy.api#Boolean")) + .addTrait(positionalTrait) + .build(); + final DotNetNameResolver nameResolver = setupNameResolver( + (builder, modelAssembler) -> modelAssembler.addShape(positionalShape)); + assertEquals("bool", nameResolver.dafnyTypeForShape(positionalShape.getId())); + } + + @Test + public void testDafnyTypeForMember() { + final StructureShape foobarStructureShape = TestModel.setupFoobarStructureShape(); + final DotNetNameResolver nameResolver = setupNameResolver( + (builder, modelAssembler) -> modelAssembler.addShape(foobarStructureShape)); + assertEquals("Wrappers_Compile.Option", + nameResolver.dafnyTypeForShape(ShapeId.fromParts(SERVICE_NAMESPACE, "Foobar", "someInt"))); + assertEquals("Wrappers_Compile.Option>", + nameResolver.dafnyTypeForShape(ShapeId.fromParts(SERVICE_NAMESPACE, "Foobar", "someString"))); + assertEquals("bool", + nameResolver.dafnyTypeForShape(ShapeId.fromParts(SERVICE_NAMESPACE, "Foobar", "someBool"))); + } + + @Test + public void testDafnyImplForServiceClient() { + final DotNetNameResolver nameResolver = setupNameResolver((_builder, _modelAssembler) -> {}); + final String actualName = nameResolver.dafnyImplForServiceClient(); + final String expectedName = "Dafny.Test.Foobar.FoobarServiceClient.FoobarServiceClient"; + assertEquals(expectedName, actualName); + } +} diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/ServiceCodegenSmokeTest.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/ServiceCodegenSmokeTest.java new file mode 100644 index 0000000000..51ecdad328 --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/ServiceCodegenSmokeTest.java @@ -0,0 +1,49 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import org.junit.Test; +import software.amazon.polymorph.utils.ModelUtils; +import software.amazon.polymorph.utils.TokenTree; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.loader.ModelAssembler; +import software.amazon.smithy.model.shapes.ShapeId; + +import java.net.URL; +import java.nio.file.Path; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.junit.Assert.*; + +public class ServiceCodegenSmokeTest { + @Test + public void testCorrectFilesGenerated() { + final URL modelUrl = Objects.requireNonNull(this.getClass().getClassLoader().getResource("model.smithy")); + final ModelAssembler assembler = new ModelAssembler(); + ModelUtils.addCustomTraitsToModelAssembler(assembler); + final Model model = assembler.addImport(modelUrl).assemble().unwrap(); + + final ShapeId serviceShapeId = ShapeId.fromParts("polymorph.demo", "StringLists"); + final ServiceCodegen serviceCodegen = new ServiceCodegen(model, serviceShapeId); + final Map codeByPath = serviceCodegen.generate(); + + final Set expectedPaths = Stream.of( + "IStringLists", + "StringListsClientBase", + "CreateArrayListInput", + "CreateArrayListOutput", + "IListOfStrings", + "ListOfStringsBase", + "GetElementInput", + "GetElementOutput", + "SetElementInput", + "IndexOutOfBoundsException" + ).map(name -> Path.of(name + ".cs")).collect(Collectors.toSet()); + assertEquals(expectedPaths, codeByPath.keySet()); + } +} diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/ServiceCodegenTest.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/ServiceCodegenTest.java new file mode 100644 index 0000000000..532ba172f6 --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/ServiceCodegenTest.java @@ -0,0 +1,659 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import org.junit.Test; +import software.amazon.polymorph.traits.ClientConfigTrait; +import software.amazon.polymorph.traits.PositionalTrait; +import software.amazon.polymorph.traits.ReferenceTrait; +import software.amazon.polymorph.util.TestModel; +import software.amazon.polymorph.util.Tokenizer; +import software.amazon.polymorph.util.Tokenizer.ParseToken; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.shapes.MemberShape; +import software.amazon.smithy.model.shapes.OperationShape; +import software.amazon.smithy.model.shapes.ResourceShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StringShape; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.traits.EnumDefinition; +import software.amazon.smithy.model.traits.EnumTrait; +import software.amazon.smithy.model.traits.TraitDefinition; + +import java.nio.file.Path; +import java.util.List; +import java.util.Objects; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static software.amazon.polymorph.util.TestModel.SERVICE_NAMESPACE; +import static software.amazon.polymorph.util.TestModel.SERVICE_SHAPE_ID; + +public class ServiceCodegenTest { + @Test + public void testGenerateEmptyService() { + final Model model = TestModel.setupModel(); + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + final Path expectedPath = Path.of("IFoobarService.cs"); + final String actualCode = Objects.requireNonNull(codegen.generate().get(expectedPath)).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + namespace Test.Foobar { + public interface IFoobarService { + } + } + """); + + // Ignore the prelude + final List lastActualTokens = actualTokens.subList( + actualTokens.size() - expectedTokens.size(), actualTokens.size()); + assertEquals(expectedTokens, lastActualTokens); + } + + @Test + public void testGenerateServiceClientBaseWithoutClientConfig() { + final StructureShape inputShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingInput")) + .build(); + final StructureShape outputShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingOutput")) + .build(); + final OperationShape operationShape = OperationShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomething")) + .input(inputShape.getId()) + .output(outputShape.getId()) + .build(); + final Model model = TestModel.setupModel((builder, modelAssembler) -> { + modelAssembler.addShape(inputShape); + modelAssembler.addShape(outputShape); + builder.addOperation(operationShape.getId()); + modelAssembler.addShape(operationShape); + }); + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + final ServiceShape serviceShape = model.expectShape(SERVICE_SHAPE_ID, ServiceShape.class); + final String actualCode = codegen.generateServiceClientBase(serviceShape).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + namespace Test.Foobar { + public abstract class FoobarServiceClientBase : IFoobarService { + protected FoobarServiceClientBase() {} + + public Test.Foobar.DoSomethingOutput DoSomething(Test.Foobar.DoSomethingInput input) { + input.Validate(); + return _DoSomething(input); + } + protected abstract Test.Foobar.DoSomethingOutput _DoSomething( + Test.Foobar.DoSomethingInput input); + } + } + """); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateServiceClientBaseWithClientConfig() { + final StructureShape configShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "FoobarServiceClientConfig")) + .build(); + final ClientConfigTrait configTrait = ClientConfigTrait.builder() + .clientConfigId(configShape.getId()) + .build(); + final StructureShape inputShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingInput")) + .build(); + final StructureShape outputShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingOutput")) + .build(); + final OperationShape operationShape = OperationShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomething")) + .input(inputShape.getId()) + .output(outputShape.getId()) + .build(); + final Model model = TestModel.setupModel((builder, modelAssembler) -> { + modelAssembler.addShape(configShape); + modelAssembler.addShape(inputShape); + modelAssembler.addShape(outputShape); + builder.addOperation(operationShape.getId()); + modelAssembler.addShape(operationShape); + modelAssembler.addTrait(SERVICE_SHAPE_ID, configTrait); + }); + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + final ServiceShape serviceShape = model.expectShape(SERVICE_SHAPE_ID, ServiceShape.class); + final String actualCode = codegen.generateServiceClientBase(serviceShape).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + final List expectedTokens = Tokenizer.tokenize(""" + namespace Test.Foobar { + public abstract class FoobarServiceClientBase : IFoobarService { + public Test.Foobar.FoobarServiceClientConfig Config { get ; private set; } + + protected FoobarServiceClientBase(Test.Foobar.FoobarServiceClientConfig Config) { + this.Config = Config; + } + + public Test.Foobar.DoSomethingOutput DoSomething(Test.Foobar.DoSomethingInput input) { + input.Validate(); + return _DoSomething(input); + } + protected abstract Test.Foobar.DoSomethingOutput _DoSomething( + Test.Foobar.DoSomethingInput input); + } + } + """); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateServiceInterfaceMethod() { + final StructureShape inputShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingInput")) + .build(); + final StructureShape outputShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingOutput")) + .build(); + final OperationShape operationShape = OperationShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomething")) + .input(inputShape.getId()) + .output(outputShape.getId()) + .build(); + final Model model = TestModel.setupModel((builder, modelAssembler) -> { + modelAssembler.addShape(inputShape); + modelAssembler.addShape(outputShape); + builder.addOperation(operationShape.getId()); + modelAssembler.addShape(operationShape); + }); + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + final String actualCode = codegen.generateInterfaceMethod(operationShape.getId()).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + Test.Foobar.DoSomethingOutput DoSomething(Test.Foobar.DoSomethingInput input); + """); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateServiceInterface() { + final StructureShape inputShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingInput")) + .build(); + final StructureShape outputShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingOutput")) + .build(); + final OperationShape operationShape = OperationShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomething")) + .input(inputShape.getId()) + .output(outputShape.getId()) + .build(); + final StructureShape inputShape2 = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingInput2")) + .build(); + final StructureShape outputShape2 = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingOutput2")) + .build(); + final OperationShape operationShape2 = OperationShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomething2")) + .input(inputShape2.getId()) + .output(outputShape2.getId()) + .build(); + final Model model = TestModel.setupModel((builder, modelAssembler) -> { + modelAssembler.addShape(inputShape); + modelAssembler.addShape(outputShape); + builder.addOperation(operationShape.getId()); + modelAssembler.addShape(operationShape); + + modelAssembler.addShape(inputShape2); + modelAssembler.addShape(outputShape2); + builder.addOperation(operationShape2.getId()); + modelAssembler.addShape(operationShape2); + }); + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + final String actualCode = codegen.generateServiceInterface().toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + namespace Test.Foobar { + public interface IFoobarService { + Test.Foobar.DoSomethingOutput DoSomething (Test.Foobar.DoSomethingInput input); + Test.Foobar.DoSomethingOutput2 DoSomething2(Test.Foobar.DoSomethingInput2 input); + } + } + """); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateStructureClass() { + final Model model = TestModel.setupModel((builder, modelAssembler) -> modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + structure Foobar { + SomeBool: Boolean, + @required + SomeInt: Integer, + SomeString: String, + } + """.formatted(SERVICE_NAMESPACE))); + + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + final ShapeId shapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Foobar"); + final StructureShape structureShape = model.expectShape(shapeId, StructureShape.class); + final String actualCode = codegen.generateStructureClass(structureShape).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize(""" + namespace Test.Foobar { + public class Foobar { + private bool? _someBool; + private int? _someInt; + private string _someString; + + public bool SomeBool { + get { return this._someBool.GetValueOrDefault(); } + set { this._someBool = value; } + } + public int SomeInt { + get { return this._someInt.GetValueOrDefault(); } + set { this._someInt = value; } + } + public string SomeString { + get { return this._someString; } + set { this._someString = value; } + } + + public void Validate() { + } + } + } + """); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateResourceInterface() { + // Input, no output + final StructureShape inputShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingInput")) + .build(); + final OperationShape operationInputShape = OperationShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingWithInput")) + .input(inputShape.getId()) + .build(); + + // Output, no input + final StructureShape outputShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingOutput")) + .build(); + final OperationShape operationOutputShape = OperationShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingWithOutput")) + .output(outputShape.getId()) + .build(); + + final ResourceShape resourceShape = ResourceShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "Baz")) + .addOperation(operationInputShape) + .addOperation(operationOutputShape) + .build(); + + final Model model = TestModel.setupModel((builder, modelAssembler) -> { + modelAssembler.addShape(inputShape); + modelAssembler.addShape(outputShape); + modelAssembler.addShape(operationInputShape); + modelAssembler.addShape(operationOutputShape); + modelAssembler.addShape(resourceShape); + }); + + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + final String actualCode = codegen.generateResourceInterface(resourceShape.getId()).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + final List expectedTokens = Tokenizer.tokenize(""" + namespace Test.Foobar { + public interface IBaz { + void DoSomethingWithInput(Test.Foobar.DoSomethingInput input); + Test.Foobar.DoSomethingOutput DoSomethingWithOutput(); + } + } + """); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateResourceClass() { + // Input, no output + final StructureShape inputShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingInput")) + .build(); + final OperationShape operationInputShape = OperationShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingWithInput")) + .input(inputShape.getId()) + .build(); + + // Output, no input + final StructureShape outputShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingOutput")) + .build(); + final OperationShape operationOutputShape = OperationShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingWithOutput")) + .output(outputShape.getId()) + .build(); + + final ResourceShape resourceShape = ResourceShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "Baz")) + .addOperation(operationInputShape) + .addOperation(operationOutputShape) + .build(); + + final Model model = TestModel.setupModel((builder, modelAssembler) -> { + modelAssembler.addShape(inputShape); + modelAssembler.addShape(outputShape); + modelAssembler.addShape(operationInputShape); + modelAssembler.addShape(operationOutputShape); + modelAssembler.addShape(resourceShape); + }); + + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + final String actualCode = codegen.generateResourceClass(resourceShape.getId()).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + final List expectedTokens = Tokenizer.tokenize(""" + namespace Test.Foobar { + public abstract class BazBase : IBaz { + public void DoSomethingWithInput(Test.Foobar.DoSomethingInput input) { + input.Validate(); + _DoSomethingWithInput(input); + } + protected abstract void _DoSomethingWithInput(Test.Foobar.DoSomethingInput input); + + public Test.Foobar.DoSomethingOutput DoSomethingWithOutput() { + return _DoSomethingWithOutput(); + } + protected abstract Test.Foobar.DoSomethingOutput _DoSomethingWithOutput(); + } + } + """); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateResourceClassWithPositionalOutput() { + /* + * Test that shapes marked with @positional are unwrapped to their single member shape rather than the wrapper + * shape. + */ + final StructureShape targetShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "TargetShape")) + .build(); + final StructureShape wrapperShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "WrapperShape")) + .addMember("baz", targetShape.getId()) + .addTrait(PositionalTrait.builder().build()) + .build(); + final OperationShape operationOutputShape = OperationShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingWithOutput")) + .output(wrapperShape.getId()) + .build(); + + final ResourceShape resourceShape = ResourceShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "Baz")) + .addOperation(operationOutputShape) + .build(); + + final Model model = TestModel.setupModel((builder, modelAssembler) -> { + modelAssembler.addShape(targetShape); + modelAssembler.addShape(wrapperShape); + modelAssembler.addShape(operationOutputShape); + modelAssembler.addShape(resourceShape); + }); + + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + final String actualCode = codegen.generateResourceClass(resourceShape.getId()).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + final List expectedTokens = Tokenizer.tokenize(""" + namespace Test.Foobar { + public abstract class BazBase : IBaz { + public Test.Foobar.TargetShape DoSomethingWithOutput() { + return _DoSomethingWithOutput(); + } + protected abstract Test.Foobar.TargetShape _DoSomethingWithOutput(); + } + } + """); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testBadPositionalTrait() { + /* + * Test that a shape marked with @positional that has two members throws an exception + */ + final StructureShape targetShape1 = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "TargetShape1")) + .build(); + final StructureShape targetShape2 = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "TargetShape2")) + .build(); + final StructureShape wrapperShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "WrapperShape")) + .addMember("baz", targetShape1.getId()) + .addMember("bar", targetShape2.getId()) + .addTrait(PositionalTrait.builder().build()) + .build(); + final OperationShape operationOutputShape = OperationShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "DoSomethingWithOutput")) + .output(wrapperShape.getId()) + .build(); + + final ResourceShape resourceShape = ResourceShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "Baz")) + .addOperation(operationOutputShape) + .build(); + + final Model model = TestModel.setupModel((builder, modelAssembler) -> { + modelAssembler.addShape(targetShape1); + modelAssembler.addShape(targetShape2); + modelAssembler.addShape(wrapperShape); + modelAssembler.addShape(operationOutputShape); + modelAssembler.addShape(resourceShape); + }); + + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + try { + codegen.generateResourceClass(resourceShape.getId()).toString(); + } catch (IllegalStateException e) { + assertEquals(e.getMessage(), "Structures marked with '@positional' must have exactly one member"); + } + } + + @Test + public void testGenerateStructureWithReference() { + /* + * Tests that structures which contain members which are marked with @reference correctly use the referenced + * service/resource rather than the wrapper. + */ + final Model model = TestModel.setupModel((builder, modelAssembler) -> { + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + use aws.polymorph#reference + resource Dummy {} + @reference(resource: Dummy) structure DummyReference {} + structure Container { dummy: DummyReference } + """.formatted(SERVICE_NAMESPACE)); + }); + + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + final ShapeId memberId = ShapeId.fromParts(SERVICE_NAMESPACE, "Container", "dummy"); + final MemberShape memberShape = model.expectShape(memberId, MemberShape.class); + final String actualCode = codegen.generateStructureClassField(memberShape).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + final List expectedTokens = Tokenizer.tokenize("private Test.Foobar.IDummy _dummy;"); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateNamedEnumClass() { + final EnumTrait enumTrait = EnumTrait.builder() + .addEnum(EnumDefinition.builder() + .value("t2.nano") + .name("T2_NANO") + .documentation("t2.nano documentation") + .tags(List.of("ebsOnly")) + .build()) + .addEnum(EnumDefinition.builder() + .value("t2.micro") + .name("T2_MICRO") + .documentation("t2.micro documentation") + .tags(List.of("ebsOnly")) + .build()) + .addEnum(EnumDefinition.builder() + .value("m256.mega") + .name("M256_MEGA") + .deprecated(true) + .build()) + .build(); + final StringShape instanceTypeShape = StringShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "InstanceType")) + .addTrait(enumTrait) + .build(); + final Model model = TestModel.setupModel((builder, modelAssembler) -> modelAssembler.addShape(instanceTypeShape)); + + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + final String actualCode = codegen.generateEnumClass(instanceTypeShape.getId()).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + final List expectedTokens = Tokenizer.tokenize(""" + namespace Test.Foobar { + using Amazon.Runtime; + + public class InstanceType : ConstantClass { + /// + /// t2.nano documentation + /// + public static readonly InstanceType T2_NANO = new InstanceType("t2.nano"); + + /// + /// t2.micro documentation + /// + public static readonly InstanceType T2_MICRO = new InstanceType("t2.micro"); + + [System.Obsolete] + public static readonly InstanceType M256_MEGA = new InstanceType("m256.mega"); + + public static readonly InstanceType[] Values = {M256_MEGA, T2_MICRO, T2_NANO}; + + public InstanceType(string value) : base(value) {} + } + } + """); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateUnnamedEnumClass() { + final EnumTrait enumTrait = EnumTrait.builder() + .addEnum(EnumDefinition.builder().value("t2.nano").build()) + .addEnum(EnumDefinition.builder().value("t2.micro").build()) + .build(); + final StringShape instanceTypeShape = StringShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "InstanceType")) + .addTrait(enumTrait) + .build(); + final Model model = TestModel.setupModel((builder, modelAssembler) -> modelAssembler.addShape(instanceTypeShape)); + + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + final String actualCode = codegen.generateEnumClass(instanceTypeShape.getId()).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + final List expectedTokens = Tokenizer.tokenize(""" + namespace Test.Foobar { + public class InstanceType { + public static readonly string[] Values = {"t2.micro", "t2.nano"}; + + public InstanceType(string value) : base(value) {} + } + } + """); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testShouldNotGenerateStructureReference() { + final ReferenceTrait trait = ReferenceTrait.builder() + .referentId(SERVICE_SHAPE_ID) + .referentType(ReferenceTrait.ReferentType.RESOURCE) + .build(); + final StructureShape foobarStructureShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "Foobar")) + .addTrait(trait) + .build(); + + final Model model = TestModel.setupModel((builder, modelAssembler) -> modelAssembler.addShape(foobarStructureShape)); + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + + assertFalse( + "Should not try to generate class for structure marked with @reference", + codegen.shouldGenerateStructure(foobarStructureShape) + ); + } + + @Test + public void testShouldNotGenerateStructurePositional() { + final PositionalTrait trait = PositionalTrait.builder().build(); + final StructureShape foobarStructureShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "Foobar")) + .addTrait(trait) + .build(); + + final Model model = TestModel.setupModel((builder, modelAssembler) -> modelAssembler.addShape(foobarStructureShape)); + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + + assertFalse( + "Should not try to generate class for structure marked with @positional", + codegen.shouldGenerateStructure(foobarStructureShape) + ); + } + + @Test + public void testShouldNotGenerateStructureTrait() { + final TraitDefinition trait = TraitDefinition.builder().build(); + final StructureShape foobarStructureShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "Foobar")) + .addTrait(trait) + .build(); + + final Model model = TestModel.setupModel((builder, modelAssembler) -> modelAssembler.addShape(foobarStructureShape)); + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + + assertFalse( + "Should not try to generate class for structure marked with @trait", + codegen.shouldGenerateStructure(foobarStructureShape) + ); + } + + @Test + public void testShouldGenerateStructureTrue() { + final TraitDefinition trait = TraitDefinition.builder().build(); + final StructureShape foobarStructureShape = StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "Foobar")) + .build(); + + final Model model = TestModel.setupModel((builder, modelAssembler) -> modelAssembler.addShape(foobarStructureShape)); + final ServiceCodegen codegen = new ServiceCodegen(model, SERVICE_SHAPE_ID); + + assertTrue( + "Should have generated class for structure", + codegen.shouldGenerateStructure(foobarStructureShape) + ); + } + +} diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/ShimCodegenTest.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/ShimCodegenTest.java new file mode 100644 index 0000000000..0b898b25c2 --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/ShimCodegenTest.java @@ -0,0 +1,251 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import org.junit.Test; +import software.amazon.polymorph.traits.ClientConfigTrait; +import software.amazon.polymorph.util.TestModel; +import software.amazon.polymorph.util.Tokenizer; +import software.amazon.polymorph.util.Tokenizer.ParseToken; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.loader.ModelAssembler; +import software.amazon.smithy.model.shapes.OperationShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StructureShape; + +import java.nio.file.Path; +import java.util.List; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.junit.Assert.*; +import static software.amazon.polymorph.util.TestModel.SERVICE_NAMESPACE; +import static software.amazon.polymorph.util.TestModel.SERVICE_SHAPE_ID; + +public class ShimCodegenTest { + private static ShimCodegen setupCodegen(final BiConsumer updater) { + final Model model = TestModel.setupModel(updater); + return new ShimCodegen(model, SERVICE_SHAPE_ID); + } + + @Test + public void testGenerateAll() { + final ShimCodegen codegen = setupCodegen((builder, modelAssembler) -> + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + resource Thing {} + """.formatted(SERVICE_NAMESPACE))); + + final Set expectedPaths = Stream.of("FoobarServiceClient", "Thing") + .map(name -> Path.of(name + ".cs")).collect(Collectors.toSet()); + final Set actualPaths = codegen.generate().keySet(); + assertEquals(expectedPaths, actualPaths); + } + + @Test + public void testGenerateServiceShim() { + final ShapeId operationShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "DoIt"); + final ShimCodegen codegen = setupCodegen((builder, modelAssembler) -> { + modelAssembler.addShape(OperationShape.builder().id(operationShapeId).build()); + builder.addOperation(operationShapeId); + }); + + final List expectedTokens = Tokenizer.tokenize(""" + namespace Test.Foobar { + public class FoobarServiceClient : FoobarServiceClientBase { + private Dafny.Test.Foobar.FoobarServiceClient.FoobarServiceClient _impl; + public FoobarServiceClient() { + this._impl = new Dafny.Test.Foobar.FoobarServiceClient.FoobarServiceClient(); + } + protected override void _DoIt() { this._impl.DoIt(); } + } + } + """); + + final String actualCode = codegen.generateServiceShim().toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateServiceConstructorWithConfig() { + final ShapeId configShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Config"); + final ShimCodegen codegen = setupCodegen((builder, modelAssembler) -> { + modelAssembler.addShape(StructureShape.builder().id(configShapeId).build()); + builder.addTrait(ClientConfigTrait.builder().clientConfigId(configShapeId).build()); + }); + + final List expectedTokens = Tokenizer.tokenize(""" + public FoobarServiceClient(Test.Foobar.Config config) : base(config) { + this._impl = new Dafny.Test.Foobar.FoobarServiceClient.FoobarServiceClient(%s(config)); + } + """.formatted(DotNetNameResolver.qualifiedTypeConverter(configShapeId, TypeConversionDirection.TO_DAFNY))); + + final String actualCode = codegen.generateServiceConstructor().toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateServiceConstructorWithoutConfig() { + final ShimCodegen codegen = setupCodegen((_builder, _modelAssembler) -> {}); + + final List expectedTokens = Tokenizer.tokenize(""" + public FoobarServiceClient() { + this._impl = new Dafny.Test.Foobar.FoobarServiceClient.FoobarServiceClient(); + } + """); + + final String actualCode = codegen.generateServiceConstructor().toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateResourceShim() { + final ShimCodegen codegen = setupCodegen((builder, modelAssembler) -> modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + resource Doer { operations: [DoIt] } + operation DoIt {} + """.formatted(SERVICE_NAMESPACE))); + final ShapeId resourceShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Doer"); + + final List expectedTokens = Tokenizer.tokenize(""" + namespace Test.Foobar { + internal class Doer : DoerBase { + internal Dafny.Test.Foobar.IDoer _impl { get; } + internal Doer(Dafny.Test.Foobar.IDoer impl) { this._impl = impl; } + protected override void _DoIt() { this._impl.DoIt(); } + } + } + """); + + final String actualCode = codegen.generateResourceShim(resourceShapeId).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateResourceConstructor() { + final ShimCodegen codegen = setupCodegen((builder, modelAssembler) -> modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + resource Thing {} + """.formatted(SERVICE_NAMESPACE))); + final ShapeId resourceShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Thing"); + + final List expectedTokens = Tokenizer.tokenize( + "internal Thing(Dafny.Test.Foobar.IThing impl) { this._impl = impl; }"); + + final String actualCode = codegen.generateResourceConstructor(resourceShapeId).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateOperationShims() { + final ShimCodegen codegen = setupCodegen((builder, modelAssembler) -> modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + resource Doer { operations: [DoThis, DoThat] } + operation DoThis {} + operation DoThat {} + """.formatted(SERVICE_NAMESPACE))); + final ShapeId resourceShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Doer"); + + final List expectedTokens = Tokenizer.tokenize(""" + protected override void _DoThis() { this._impl.DoThis(); } + protected override void _DoThat() { this._impl.DoThat(); } + """); + + final String actualCode = codegen.generateOperationShims(resourceShapeId).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateOperationShimInputOnly() { + final ShimCodegen codegen = setupCodegen((builder, modelAssembler) -> modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + operation DoIt { input: Input } + structure Input {} + """.formatted(SERVICE_NAMESPACE))); + final ShapeId operationShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "DoIt"); + final ShapeId inputShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Input"); + + final List expectedTokens = Tokenizer.tokenize(""" + protected override void _DoIt(Test.Foobar.Input input) { + Dafny.Test.Foobar.Input internalInput = %s(input); + this._impl.DoIt(internalInput); + } + """.formatted(DotNetNameResolver.qualifiedTypeConverter(inputShapeId, TypeConversionDirection.TO_DAFNY))); + + final String actualCode = codegen.generateOperationShim(operationShapeId).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateOperationShimOutputOnly() { + final ShimCodegen codegen = setupCodegen((builder, modelAssembler) -> modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + operation DoIt { output: Output } + structure Output {} + """.formatted(SERVICE_NAMESPACE))); + final ShapeId operationShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "DoIt"); + final ShapeId outputShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Output"); + + final List expectedTokens = Tokenizer.tokenize(""" + protected override Test.Foobar.Output _DoIt() { + Dafny.Test.Foobar.Output internalOutput = + this._impl.DoIt(); + return %s(internalOutput); + } + """.formatted(DotNetNameResolver.qualifiedTypeConverter(outputShapeId, TypeConversionDirection.FROM_DAFNY))); + + final String actualCode = codegen.generateOperationShim(operationShapeId).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateOperationShimInputAndOutput() { + final ShimCodegen codegen = setupCodegen((builder, modelAssembler) -> { + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + operation DoIt { input: Input, output: Output } + structure Input {} + structure Output {} + """.formatted(SERVICE_NAMESPACE)); + }); + final ShapeId operationShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "DoIt"); + final ShapeId inputShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Input"); + final ShapeId outputShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Output"); + + final List expectedTokens = Tokenizer.tokenize(""" + protected override Test.Foobar.Output _DoIt(Test.Foobar.Input input) { + Dafny.Test.Foobar.Input internalInput = %s(input); + Dafny.Test.Foobar.Output internalOutput = + this._impl.DoIt(internalInput); + return %s(internalOutput); + } + """.formatted( + DotNetNameResolver.qualifiedTypeConverter(inputShapeId, TypeConversionDirection.TO_DAFNY), + DotNetNameResolver.qualifiedTypeConverter(outputShapeId, TypeConversionDirection.FROM_DAFNY))); + + final String actualCode = codegen.generateOperationShim(operationShapeId).toString(); + final List actualTokens = Tokenizer.tokenize(actualCode); + + assertEquals(expectedTokens, actualTokens); + } +} diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/TypeConversionCodegenTest.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/TypeConversionCodegenTest.java new file mode 100644 index 0000000000..76a2845fb3 --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/smithydotnet/TypeConversionCodegenTest.java @@ -0,0 +1,674 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.smithydotnet; + +import org.junit.Test; +import software.amazon.polymorph.smithydotnet.TypeConversionCodegen.TypeConverter; +import software.amazon.polymorph.traits.ClientConfigTrait; +import software.amazon.polymorph.antlr.CSharpLexer; +import software.amazon.polymorph.util.TestModel; +import software.amazon.polymorph.util.Tokenizer; +import software.amazon.polymorph.util.Tokenizer.ParseToken; +import software.amazon.polymorph.utils.TokenTree; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.loader.ModelAssembler; +import software.amazon.smithy.model.shapes.BlobShape; +import software.amazon.smithy.model.shapes.BooleanShape; +import software.amazon.smithy.model.shapes.IntegerShape; +import software.amazon.smithy.model.shapes.ListShape; +import software.amazon.smithy.model.shapes.LongShape; +import software.amazon.smithy.model.shapes.MapShape; +import software.amazon.smithy.model.shapes.MemberShape; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StringShape; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.shapes.TimestampShape; + +import java.nio.file.Path; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.junit.Assert.*; +import static software.amazon.polymorph.smithydotnet.TypeConversionCodegen.TYPE_CONVERSION_CLASS_PATH; +import static software.amazon.polymorph.smithydotnet.TypeConversionDirection.FROM_DAFNY; +import static software.amazon.polymorph.smithydotnet.TypeConversionDirection.TO_DAFNY; +import static software.amazon.polymorph.util.TestModel.SERVICE_NAMESPACE; +import static software.amazon.polymorph.util.TestModel.SERVICE_SHAPE_ID; + +public class TypeConversionCodegenTest { + private static TypeConversionCodegen setupCodegen(final BiConsumer updater) { + final Model model = TestModel.setupModel(updater); + return new TypeConversionCodegen(model, SERVICE_SHAPE_ID); + } + + private static List generateAndTokenize(final TypeConversionCodegen codegen) { + final Map generatedCode = codegen.generate(); + assertTrue(generatedCode.containsKey(TYPE_CONVERSION_CLASS_PATH)); + final String actualCode = Objects.requireNonNull(generatedCode.get(TYPE_CONVERSION_CLASS_PATH)).toString(); + return Tokenizer.tokenize(actualCode); + } + + @Test + public void testGenerateEmptyModel() { + final TypeConversionCodegen codegen = setupCodegen((_builder, _modelAssembler) -> {}); + final List actualTokens = generateAndTokenize(codegen); + final List expectedTokens = Tokenizer.tokenize(""" + using System.Linq; + using Aws.Crypto; + namespace Test.Foobar { + internal static class TypeConversion {} + } + """); + assertEquals(expectedTokens, actualTokens); + } + + @Test + public void testGenerateSimpleModel() { + final TypeConversionCodegen codegen = setupCodegen((builder, modelAssembler) -> { + builder.addOperation(ShapeId.fromParts(SERVICE_NAMESPACE, "DoBar")); + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + operation DoBar { input: DoBarInput, output: DoBarOutput } + structure DoBarInput { bool: Boolean } + structure DoBarOutput { int: Integer } + """.formatted(SERVICE_NAMESPACE)); + }); + final Set actualTokens = new HashSet<>(generateAndTokenize(codegen)); + + final Stream expectedConverterMethods = Stream.of( + SERVICE_NAMESPACE + "#DoBarInput", + SERVICE_NAMESPACE + "#DoBarInput$bool", + SERVICE_NAMESPACE + "#DoBarOutput", + SERVICE_NAMESPACE + "#DoBarOutput$int", + "smithy.api#Boolean", + "smithy.api#Integer" + ) + .map(ShapeId::from) + .flatMap(shapeId -> Stream.of( + DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY), + DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY) + )) + .map(converterName -> new ParseToken(converterName, CSharpLexer.IDENTIFIER)); + assertTrue(expectedConverterMethods.allMatch(actualTokens::contains)); + } + + @Test + public void testFindShapeIdsToConvert() { + final TypeConversionCodegen codegen = setupCodegen((builder, modelAssembler) -> { + builder.addOperation(ShapeId.fromParts(SERVICE_NAMESPACE, "DoBar")); + builder.addTrait(ClientConfigTrait.builder() + .clientConfigId(ShapeId.fromParts(SERVICE_NAMESPACE, "FoobarConfig")) + .build()); + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + structure FoobarConfig {} + resource FooResource { operations: [DoBaz] } + operation DoBar { input: DoBarInput } + operation DoBaz { output: DoBazOutput } + structure DoBarInput { qux: Qux } + structure DoBazOutput { xyzzy: Xyzzy } + map Qux { key: String, value: Integer } + list Xyzzy { member: Blob } + """.formatted(SERVICE_NAMESPACE)); + }); + final Set expectedShapeIds = Stream.of( + SERVICE_NAMESPACE + "#FoobarConfig", + SERVICE_NAMESPACE + "#DoBarInput", + SERVICE_NAMESPACE + "#DoBarInput$qux", + SERVICE_NAMESPACE + "#DoBazOutput", + SERVICE_NAMESPACE + "#DoBazOutput$xyzzy", + SERVICE_NAMESPACE + "#Qux", + SERVICE_NAMESPACE + "#Qux$key", + SERVICE_NAMESPACE + "#Qux$value", + SERVICE_NAMESPACE + "#Xyzzy", + SERVICE_NAMESPACE + "#Xyzzy$member", + "smithy.api#String", + "smithy.api#Integer", + "smithy.api#Blob" + ).map(ShapeId::from).collect(Collectors.toSet()); + + final Set actualShapeIds = codegen.findShapeIdsToConvert(); + assertEquals(expectedShapeIds, actualShapeIds); + } + + @Test + public void testGenerateBlobConverter() { + final ShapeId shapeId = ShapeId.from("smithy.api#Blob"); + final TypeConversionCodegen codegen = setupCodegen((_builder, _modelAssembler) -> {}); + final TypeConverter converter = codegen.generateBlobConverter(BlobShape.builder().id(shapeId).build()); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String fromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static System.IO.MemoryStream %s(Dafny.ISequence value) { + return new System.IO.MemoryStream(value.Elements); + } + """.formatted(fromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String toDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static Dafny.ISequence %s(System.IO.MemoryStream value) { + return Dafny.Sequence.FromArray(value.ToArray()); + } + """.formatted(toDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateBooleanConverter() { + final ShapeId shapeId = ShapeId.from("smithy.api#Boolean"); + final TypeConversionCodegen codegen = setupCodegen((_builder, _modelAssembler) -> {}); + final TypeConverter converter = codegen.generateBooleanConverter(BooleanShape.builder().id(shapeId).build()); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String fromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize( + "public static bool %s(bool value) { return value; }".formatted(fromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String toDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize( + "public static bool %s(bool value) { return value; }".formatted(toDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateStringConverterRegularString() { + final ShapeId shapeId = ShapeId.from("smithy.api#String"); + final TypeConversionCodegen codegen = setupCodegen((_builder, _modelAssembler) -> {}); + final TypeConverter converter = codegen.generateStringConverter(StringShape.builder().id(shapeId).build()); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String fromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static string %s(Dafny.ISequence value) { + return new string(value.Elements); + }""".formatted(fromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String toDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static Dafny.ISequence %s(string value) { + return Dafny.Sequence.FromString(value); + }""".formatted(toDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateStringConverterEnumString() { + final ShapeId shapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "AnEnum"); + final TypeConversionCodegen codegen = setupCodegen((builder, modelAssembler) -> + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + @enum([ + { name: "VERSION_A", value: "bar" }, + { name: "VERSION_B", value: "baz" }, + ]) + string AnEnum + """.formatted(SERVICE_NAMESPACE))); + final TypeConverter converter = codegen.generateStringConverter( + codegen.getModel().expectShape(shapeId, StringShape.class)); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String fromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static Test.Foobar.AnEnum %s(Dafny.Test.Foobar.AnEnum value) { + if (value.is_VERSION__A) return Test.Foobar.AnEnum.VERSION_A; + if (value.is_VERSION__B) return Test.Foobar.AnEnum.VERSION_B; + throw new System.ArgumentException("Invalid Test.Foobar.AnEnum value"); + }""".formatted(fromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String toDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static Dafny.Test.Foobar.AnEnum %s(Test.Foobar.AnEnum value) { + if (Test.Foobar.AnEnum.VERSION_A.Equals(value)) return Dafny.Test.Foobar.AnEnum.create_VERSION__A(); + if (Test.Foobar.AnEnum.VERSION_B.Equals(value)) return Dafny.Test.Foobar.AnEnum.create_VERSION__B(); + throw new System.ArgumentException("Invalid Test.Foobar.AnEnum value"); + }""".formatted(toDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + /** + * Test that we generate an enum converter correctly when the enum has only one constructor. + * + * This is different than the "normal" case because Dafny doesn't generate a compiled constructor when there's only + * one. + */ + @Test + public void testGenerateStringConverterEnumStringSingleConstructor() { + final ShapeId shapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "AnEnum"); + final TypeConversionCodegen codegen = setupCodegen((builder, modelAssembler) -> + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + @enum([{ name: "VERSION_A", value: "bar" }]) + string AnEnum + """.formatted(SERVICE_NAMESPACE))); + final TypeConverter converter = codegen.generateStringConverter( + codegen.getModel().expectShape(shapeId, StringShape.class)); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String fromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static Test.Foobar.AnEnum %s(Dafny.Test.Foobar.AnEnum value) { + if (value.is_VERSION__A) return Test.Foobar.AnEnum.VERSION_A; + throw new System.ArgumentException("Invalid Test.Foobar.AnEnum value"); + }""".formatted(fromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String toDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static Dafny.Test.Foobar.AnEnum %s(Test.Foobar.AnEnum value) { + if (Test.Foobar.AnEnum.VERSION_A.Equals(value)) return new Dafny.Test.Foobar.AnEnum(); + throw new System.ArgumentException("Invalid Test.Foobar.AnEnum value"); + }""".formatted(toDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateStringConverterUtf8Bytes() { + final ShapeId shapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Utf8BytesString"); + final TypeConversionCodegen codegen = setupCodegen((builder, modelAssembler) -> + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + use aws.polymorph#dafnyUtf8Bytes + @dafnyUtf8Bytes + string Utf8BytesString + """.formatted(SERVICE_NAMESPACE))); + final TypeConverter converter = codegen.generateStringConverter( + codegen.getModel().expectShape(shapeId, StringShape.class)); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String fromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static string %s(Dafny.ISequence value) { + System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding(false, true); + return utf8.GetString(value.Elements); + }""".formatted(fromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String toDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static Dafny.ISequence %s(string value) { + System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding(false, true); + return Dafny.Sequence.FromArray(utf8.GetBytes(value)); + }""".formatted(toDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateIntegerConverter() { + final ShapeId shapeId = ShapeId.from("smithy.api#Integer"); + final TypeConversionCodegen codegen = setupCodegen((_builder, _modelAssembler) -> {}); + final TypeConverter converter = codegen.generateIntegerConverter(IntegerShape.builder().id(shapeId).build()); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String fromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize( + "public static int %s(int value) { return value; }".formatted(fromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String toDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize( + "public static int %s(int value) { return value; }".formatted(toDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateLongConverter() { + final ShapeId shapeId = ShapeId.from("smithy.api#Long"); + final TypeConversionCodegen codegen = setupCodegen((_builder, _modelAssembler) -> {}); + final TypeConverter converter = codegen.generateLongConverter(LongShape.builder().id(shapeId).build()); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String fromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize( + "public static long %s(long value) { return value; }".formatted(fromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String toDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize( + "public static long %s(long value) { return value; }".formatted(toDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateTimestampConverter() { + final ShapeId shapeId = ShapeId.from("smithy.api#Timestamp"); + final TypeConversionCodegen codegen = setupCodegen((_builder, _modelAssembler) -> {}); + final TypeConverter converter = codegen.generateTimestampConverter( + TimestampShape.builder().id(shapeId).build()); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String fromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static System.DateTime %s(Dafny.ISequence value) { + System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(""); + string timestampString = new string(value.Elements); + return System.DateTime.ParseExact(timestampString, "s", culture); + } + """.formatted(fromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String toDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static Dafny.ISequence %s(System.DateTime value) { + System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(""); + string timestampString = value.ToString("s", culture); + return Dafny.Sequence.FromString(timestampString); + } + """.formatted(toDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateListConverter() { + final ShapeId shapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "IntList"); + final ShapeId memberShapeId = shapeId.withMember("member"); + final TypeConversionCodegen codegen = setupCodegen((builder, modelAssembler) -> + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + list IntList { + member: Integer + } + """.formatted(SERVICE_NAMESPACE))); + final TypeConverter converter = codegen.generateListConverter( + codegen.getModel().expectShape(shapeId, ListShape.class)); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String listFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final String intFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(memberShapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static System.Collections.Generic.List %s(Dafny.ISequence value) { + return new System.Collections.Generic.List(value.Elements.Select(%s)); + }""".formatted(listFromDafnyConverterName, intFromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String listToDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final String intToDafnyConverterName = DotNetNameResolver.typeConverterForShape(memberShapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static Dafny.ISequence %s(System.Collections.Generic.List value) { + return Dafny.Sequence.FromArray(value.Select(%s).ToArray()); + }""".formatted(listToDafnyConverterName, intToDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateMapConverter() { + final ShapeId shapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "BoolMap"); + final ShapeId keyMemberId = shapeId.withMember("key"); + final ShapeId valueMemberId = shapeId.withMember("value"); + final TypeConversionCodegen codegen = setupCodegen((builder, modelAssembler) -> + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + map BoolMap { + key: String, + value: Boolean, + } + """.formatted(SERVICE_NAMESPACE))); + final TypeConverter converter = codegen.generateMapConverter( + codegen.getModel().expectShape(shapeId, MapShape.class)); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String mapFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final String keyFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(keyMemberId, FROM_DAFNY); + final String valueFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(valueMemberId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static System.Collections.Generic.Dictionary %s( + Dafny.IMap, bool> value) { + return value.ItemEnumerable.ToDictionary(pair => %s(pair.Car), pair => %s(pair.Cdr)); + }""".formatted(mapFromDafnyConverterName, keyFromDafnyConverterName, valueFromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String mapToDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final String keyToDafnyConverterName = DotNetNameResolver.typeConverterForShape(keyMemberId, TO_DAFNY); + final String valueToDafnyConverterName = DotNetNameResolver.typeConverterForShape(valueMemberId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static Dafny.IMap, bool> %s( + System.Collections.Generic.Dictionary value) { + return Dafny.Map, bool>.FromCollection( + value.Select(pair => + new Dafny.Pair, bool>(%s(pair.Key), %s(pair.Value)) + ) + ); + }""".formatted(mapToDafnyConverterName, keyToDafnyConverterName, valueToDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateStructureConverterRegularStructure() { + final ShapeId shapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "IntAndBool"); + final ShapeId intMemberId = shapeId.withMember("someInt"); + final ShapeId boolMemberId = shapeId.withMember("someBool"); + final ShapeId stringMemberId = shapeId.withMember("someString"); + final TypeConversionCodegen codegen = setupCodegen((builder, modelAssembler) -> + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + structure IntAndBool { + someInt: Integer, + @required + someBool: Boolean, + someString: String, + } + """.formatted(SERVICE_NAMESPACE))); + final TypeConverter converter = codegen.generateStructureConverter( + codegen.getModel().expectShape(shapeId, StructureShape.class)); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String structureFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final String intFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(intMemberId, FROM_DAFNY); + final String boolFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(boolMemberId, FROM_DAFNY); + final String stringFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(stringMemberId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static Test.Foobar.IntAndBool %s(Dafny.Test.Foobar.IntAndBool value) { + Test.Foobar.IntAndBool converted = new Test.Foobar.IntAndBool(); + if (value.someInt.is_Some) converted.SomeInt = (int) %s(value.someInt); + converted.SomeBool = (bool) %s(value.someBool); + if (value.someString.is_Some) converted.SomeString = (string) %s(value.someString); + return converted; + }""".formatted( + structureFromDafnyConverterName, + intFromDafnyConverterName, + boolFromDafnyConverterName, + stringFromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String structureToDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final String intToDafnyConverterName = DotNetNameResolver.typeConverterForShape(intMemberId, TO_DAFNY); + final String boolToDafnyConverterName = DotNetNameResolver.typeConverterForShape(boolMemberId, TO_DAFNY); + final String stringToDafnyConverterName = DotNetNameResolver.typeConverterForShape(stringMemberId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static Dafny.Test.Foobar.IntAndBool %s(Test.Foobar.IntAndBool value) { + return new Dafny.Test.Foobar.IntAndBool( + %s(value.SomeInt), + %s(value.SomeBool), + %s(value.SomeString) + ); + }""".formatted( + structureToDafnyConverterName, + intToDafnyConverterName, + boolToDafnyConverterName, + stringToDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateStructureConverterReferenceStructure() { + final ShapeId shapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "ThingReference"); + final TypeConversionCodegen codegen = setupCodegen((builder, modelAssembler) -> + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + use aws.polymorph#reference + resource Thing {} + @reference(resource: Thing) + structure ThingReference {} + """.formatted(SERVICE_NAMESPACE))); + final TypeConverter converter = codegen.generateStructureConverter( + codegen.getModel().expectShape(shapeId, StructureShape.class)); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String structureFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static Test.Foobar.IThing %s(Dafny.Test.Foobar.IThing value) { + return new Thing(value); + }""".formatted(structureFromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String structureToDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static Dafny.Test.Foobar.IThing %s(Test.Foobar.IThing value) { + if (value is Thing valueWithImpl) { + return valueWithImpl._impl; + } + throw new System.ArgumentException( + "Custom implementations of Test.Foobar.IThing are not supported yet"); + }""".formatted(structureToDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateStructureConverterPositionalStructure() { + final ShapeId shapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "CreateThingOutput"); + final ShapeId memberShapeId = shapeId.withMember("thing"); + final TypeConversionCodegen codegen = setupCodegen((builder, modelAssembler) -> + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + use aws.polymorph#positional + use aws.polymorph#reference + resource Thing {} + @reference(resource: Thing) + structure ThingReference {} + @positional + structure CreateThingOutput { thing: ThingReference } + """.formatted(SERVICE_NAMESPACE))); + final TypeConverter converter = codegen.generateStructureConverter( + codegen.getModel().expectShape(shapeId, StructureShape.class)); + assertEquals(shapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String structureFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, FROM_DAFNY); + final String memberFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(memberShapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static Test.Foobar.IThing %s(Dafny.Test.Foobar.IThing value) { + return %s(value); + }""".formatted(structureFromDafnyConverterName, memberFromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String structureToDafnyConverterName = DotNetNameResolver.typeConverterForShape(shapeId, TO_DAFNY); + final String memberToDafnyConverterName = DotNetNameResolver.typeConverterForShape(memberShapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static Dafny.Test.Foobar.IThing %s(Test.Foobar.IThing value) { + return %s(value); + }""".formatted(structureToDafnyConverterName, memberToDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateMemberConverterRequired() { + final ShapeId containerShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Container"); + final ShapeId memberShapeId = containerShapeId.withMember("content"); + final ShapeId targetShapeId = ShapeId.from("smithy.api#Integer"); + final TypeConversionCodegen codegen = setupCodegen((builder, modelAssembler) -> + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + structure Container { + @required + content: Integer + } + """.formatted(SERVICE_NAMESPACE))); + final TypeConverter converter = codegen.generateMemberConverter( + codegen.getModel().expectShape(memberShapeId, MemberShape.class)); + assertEquals(memberShapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String memberFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(memberShapeId, FROM_DAFNY); + final String targetFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(targetShapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static int %s(int value) { + return %s(value); + }""".formatted(memberFromDafnyConverterName, targetFromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String memberToDafnyConverterName = DotNetNameResolver.typeConverterForShape(memberShapeId, TO_DAFNY); + final String targetToDafnyConverterName = DotNetNameResolver.typeConverterForShape(targetShapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static int %s(int value) { + return %s(value); + }""".formatted(memberToDafnyConverterName, targetToDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } + + @Test + public void testGenerateMemberConverterOptional() { + final ShapeId containerShapeId = ShapeId.fromParts(SERVICE_NAMESPACE, "Container"); + final ShapeId memberShapeId = containerShapeId.withMember("content"); + final ShapeId targetShapeId = ShapeId.from("smithy.api#Integer"); + final TypeConversionCodegen codegen = setupCodegen((builder, modelAssembler) -> + modelAssembler.addUnparsedModel("test.smithy", """ + namespace %s + structure Container { + content: Integer + } + """.formatted(SERVICE_NAMESPACE))); + final TypeConverter converter = codegen.generateMemberConverter( + codegen.getModel().expectShape(memberShapeId, MemberShape.class)); + assertEquals(memberShapeId, converter.shapeId()); + + final List actualTokensFromDafny = Tokenizer.tokenize(converter.fromDafny().toString()); + final String memberFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(memberShapeId, FROM_DAFNY); + final String targetFromDafnyConverterName = DotNetNameResolver.typeConverterForShape(targetShapeId, FROM_DAFNY); + final List expectedTokensFromDafny = Tokenizer.tokenize(""" + public static int? %s(Wrappers_Compile.Option value) { + return value.is_None ? (int?) null : %s(value.Extract()); + }""".formatted(memberFromDafnyConverterName, targetFromDafnyConverterName)); + assertEquals(expectedTokensFromDafny, actualTokensFromDafny); + + final List actualTokensToDafny = Tokenizer.tokenize(converter.toDafny().toString()); + final String memberToDafnyConverterName = DotNetNameResolver.typeConverterForShape(memberShapeId, TO_DAFNY); + final String targetToDafnyConverterName = DotNetNameResolver.typeConverterForShape(targetShapeId, TO_DAFNY); + final List expectedTokensToDafny = Tokenizer.tokenize(""" + public static Wrappers_Compile.Option %s(int? value) { + return value == null + ? Wrappers_Compile.Option.create_None() + : Wrappers_Compile.Option.create_Some(%s((int) value)); + }""".formatted(memberToDafnyConverterName, targetToDafnyConverterName)); + assertEquals(expectedTokensToDafny, actualTokensToDafny); + } +} diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/util/TestModel.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/util/TestModel.java new file mode 100644 index 0000000000..dab19b0166 --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/util/TestModel.java @@ -0,0 +1,56 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.util; + +import software.amazon.polymorph.utils.ModelUtils; +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.loader.ModelAssembler; +import software.amazon.smithy.model.shapes.ServiceShape; +import software.amazon.smithy.model.shapes.ShapeId; +import software.amazon.smithy.model.shapes.StructureShape; +import software.amazon.smithy.model.traits.RequiredTrait; + +import java.util.function.BiConsumer; + +public class TestModel { + public static final String SERVICE_NAMESPACE = "test.foobar"; + public static final String SERVICE_NAME = "FoobarService"; + public static final ShapeId SERVICE_SHAPE_ID = ShapeId.fromParts(SERVICE_NAMESPACE, SERVICE_NAME); + + /** + * Sets up a test model. The updater can modify the {@link ServiceShape.Builder} or the {@link ModelAssembler} + * before either is assembled. The updater is not responsible for adding the ServiceShape to the model assembler; + * this method will do so before returning the assembled model. + */ + public static Model setupModel(final BiConsumer updater) { + final ServiceShape.Builder serviceShapeBuilder = new ServiceShape.Builder() + .version("1.0") + .id(SERVICE_SHAPE_ID); + final ModelAssembler assembler = new ModelAssembler(); + ModelUtils.addCustomTraitsToModelAssembler(assembler); + + updater.accept(serviceShapeBuilder, assembler); + assembler.addShape(serviceShapeBuilder.build()); + return assembler.assemble().unwrap(); + } + + /** + * Sets up a test model containing only the service shape. + */ + public static Model setupModel() { + return setupModel((ServiceShape.Builder _builder, ModelAssembler _assembler) -> {}); + } + + /** + * Sets up a simple "Foobar" structure shape. + */ + public static StructureShape setupFoobarStructureShape() { + return StructureShape.builder() + .id(ShapeId.fromParts(SERVICE_NAMESPACE, "Foobar")) + .addMember("someInt", ShapeId.from("smithy.api#Integer")) + .addMember("someString", ShapeId.from("smithy.api#String")) + .addMember("someBool", ShapeId.from("smithy.api#Boolean"), memberUpdater -> memberUpdater.addTrait(new RequiredTrait())) + .build(); + } +} diff --git a/smithy-dotnet/src/test/java/software/amazon/polymorph/util/Tokenizer.java b/smithy-dotnet/src/test/java/software/amazon/polymorph/util/Tokenizer.java new file mode 100644 index 0000000000..fea3ef8553 --- /dev/null +++ b/smithy-dotnet/src/test/java/software/amazon/polymorph/util/Tokenizer.java @@ -0,0 +1,30 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph.util; + +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.Token; +import software.amazon.polymorph.antlr.CSharpLexer; + +import java.util.List; + +/** + * Simple tokenizer for C# source code, intended for testing generated code in a format-agnostic manner. + * Uses the ANTLR-generated parser. + */ +public class Tokenizer { + public static List tokenize(final String source) { + final CharStream charStream = CharStreams.fromString(source); + final Lexer lexer = new CSharpLexer(charStream); + final List lexemes = lexer.getAllTokens(); + return lexemes + .stream() + .filter(lexeme -> lexeme.getType() != CSharpLexer.WHITESPACES) + .map(lexeme -> new ParseToken(lexeme.getText(), lexeme.getType())).toList(); + } + + public static record ParseToken(String text, int type) {} +} diff --git a/smithy-dotnet/src/test/resources/enum.smithy b/smithy-dotnet/src/test/resources/enum.smithy new file mode 100644 index 0000000000..8cb4694f5f --- /dev/null +++ b/smithy-dotnet/src/test/resources/enum.smithy @@ -0,0 +1,33 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +namespace aws.polymorph + +service AwsMaterialProviders { + version: "2021-11-01", + resources: [Keyring], +} + +resource Keyring { + operations: [OnEncrypt] +} + +operation OnEncrypt { + input: OnEncryptInput, + +} +structure OnEncryptInput { + test: AlgorithmSuite +} + +@enum([ + { + name: "ALG_AES_128_GCM_IV12_TAG16_NO_KDF", + value: "0x0014", + }, + { + name: "ALG_AES_192_GCM_IV12_TAG16_NO_KDF", + value: "0x0046", + }, +]) +string AlgorithmSuite diff --git a/smithy-dotnet/src/test/resources/model.smithy b/smithy-dotnet/src/test/resources/model.smithy new file mode 100644 index 0000000000..cf4efa515c --- /dev/null +++ b/smithy-dotnet/src/test/resources/model.smithy @@ -0,0 +1,68 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +$version: "1.0" + +namespace polymorph.demo + +use aws.polymorph#reference + +service StringLists { + version: "2021-06-23", + resources: [ListOfStrings], + operations: [CreateArrayList] +} + +operation CreateArrayList { + input: CreateArrayListInput, + output: CreateArrayListOutput +} +structure CreateArrayListInput { + @documentation("Length of the list to create") + @range(min: 0) + length: Integer +} +structure CreateArrayListOutput { + @required + list: ListOfStringsReference +} + +resource ListOfStrings { + operations: [GetElement, SetElement] +} +@reference(resource: ListOfStrings) +structure ListOfStringsReference {} + +@readonly +operation GetElement { + input: GetElementInput, + output: GetElementOutput, + errors: [IndexOutOfBoundsException] +} +structure GetElementInput { + @range(min: 0) + @required + index: Integer +} +structure GetElementOutput { + @required + value: String +} + +operation SetElement { + input: SetElementInput, + errors: [IndexOutOfBoundsException] +} +structure SetElementInput { + @range(min: 0) + @required + index: Integer, + + @required + value: String +} + +@error("client") +structure IndexOutOfBoundsException { + message: String +} diff --git a/smithy-dotnet/src/test/resources/positional.smithy b/smithy-dotnet/src/test/resources/positional.smithy new file mode 100644 index 0000000000..117a1545ef --- /dev/null +++ b/smithy-dotnet/src/test/resources/positional.smithy @@ -0,0 +1,33 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +namespace aws.polymorph + +service AwsMaterialProviders { + version: "2021-11-01", + resources: [Keyring], + operations: [CreateKeyring] +} + +resource Keyring {} + +@reference(resource: Keyring) +structure KeyringReference {} + +operation CreateKeyring { + output: CreateKeyringOutput +} + +@positional +structure CreateKeyringOutput { + keyring: KeyringReference +} + +@trait(selector: "structure") +structure positional {} + +@trait(selector: "structure") +structure reference { + service: String, + resource: String +} diff --git a/smithy-dotnet/src/test/resources/reference.smithy b/smithy-dotnet/src/test/resources/reference.smithy new file mode 100644 index 0000000000..c91914ace1 --- /dev/null +++ b/smithy-dotnet/src/test/resources/reference.smithy @@ -0,0 +1,30 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +namespace aws.polymorph + +service AwsMaterialProviders { + version: "2021-11-01", + resources: [Keyring], +} + +resource Keyring { + operations: [OnEncrypt] +} + +@reference(resource: Keyring) +structure KeyringReference {} + +operation OnEncrypt { + input: OnEncryptInput, + +} +structure OnEncryptInput { + test: KeyringReference +} + +@trait(selector: "structure") +structure reference { + service: String, + resource: String +} diff --git a/smithy-model-to-idl/.gitignore b/smithy-model-to-idl/.gitignore new file mode 100644 index 0000000000..54caf66065 --- /dev/null +++ b/smithy-model-to-idl/.gitignore @@ -0,0 +1,7 @@ +# Gradle +/.gradle/ +/build/ +/target/ + +# IDE +/.idea/ diff --git a/smithy-model-to-idl/README.md b/smithy-model-to-idl/README.md new file mode 100644 index 0000000000..da287a9da2 --- /dev/null +++ b/smithy-model-to-idl/README.md @@ -0,0 +1,46 @@ +# Smithy model to IDL + +This is a simple wrapper around [Smithy's `SmithyIdlModelSerializer`](https://github.com/awslabs/smithy/blob/main/smithy-model/src/main/java/software/amazon/smithy/model/shapes/SmithyIdlModelSerializer.java), +which allows to serialize a Smithy model (for example, one loaded from a JSON file) into Smithy IDL +in order to improve its legibility. + +## Usage + +Prerequisites: + +- Java 16 or above +- A model you want to serialize at `$MODEL_PATH`, e.g. the [KMS JSON model](https://github.com/aws/aws-models/blob/master/kms/smithy/model.json) +- A clone of the [Smithy repository](https://github.com/awslabs/smithy) at `$SMITHY_REPO_PATH` +- An output directory for the serialized models at `$DEST_PATH` + +```bash +$ # start in project root +$ pwd +~/Polymorph-smithy-dotnet/smithy-model-to-idl + +$ # build +$ ./gradlew build +BUILD SUCCESSFUL in 507ms + +$ # serialize +$ ./gradlew run --args="$DEST_PATH $SMITHY_REPO_PATH $MODEL_PATH" +... +INFO: Wrote /.../com.amazonaws.kms.smithy +... +``` + +If you want to serialize multiple aws models at once, simply append those paths as arguments. +For example: +``` +$ # serialize +$ ./gradlew run --args="$DEST_PATH $SMITHY_REPO_PATH /path/to/aws-models/kms/smithy/model.json /path/to/aws-models/dynamodb/smithy/model.json" +... +INFO: Wrote /.../com.amazonaws.kms.smithy +... +INFO: Wrote /Users/lavaleri/smithy-model-output/com.amazonaws.dynamodb.smithy +... +``` + +You'll find several files in `$DEST_PATH`, +including one for the model you specified (e.g. `$DEST_PATH/com.amazonaws.kms.smithy`) +and others for various namespaces found in the Smithy models. diff --git a/smithy-model-to-idl/build.gradle.kts b/smithy-model-to-idl/build.gradle.kts new file mode 100644 index 0000000000..6e3bc42134 --- /dev/null +++ b/smithy-model-to-idl/build.gradle.kts @@ -0,0 +1,26 @@ +plugins { + java + application +} + +group = "software.amazon.polymorph" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() +} + +dependencies { + implementation("software.amazon.smithy:smithy-model:1.10.0") + implementation("software.amazon.smithy:smithy-codegen-core:[1.0.2,1.1.0[") + implementation("software.amazon.smithy:smithy-protocol-test-traits:[1.0.2,1.1.0[") + + implementation("com.google.guava:guava:30.1-jre") + implementation("commons-cli:commons-cli:1.4") + implementation("org.slf4j:slf4j-api:1.7.32") + implementation("org.slf4j:slf4j-simple:1.7.32") +} + +application { + mainClass.set("software.amazon.polymorph.SmithyModelToIdl") +} diff --git a/smithy-model-to-idl/gradle/wrapper/gradle-wrapper.jar b/smithy-model-to-idl/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/smithy-model-to-idl/gradle/wrapper/gradle-wrapper.properties b/smithy-model-to-idl/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..69a9715077 --- /dev/null +++ b/smithy-model-to-idl/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/smithy-model-to-idl/gradlew b/smithy-model-to-idl/gradlew new file mode 100755 index 0000000000..744e882ed5 --- /dev/null +++ b/smithy-model-to-idl/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# 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 +# +# https://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. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MSYS* | MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/smithy-model-to-idl/gradlew.bat b/smithy-model-to-idl/gradlew.bat new file mode 100644 index 0000000000..ac1b06f938 --- /dev/null +++ b/smithy-model-to-idl/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/smithy-model-to-idl/settings.gradle b/smithy-model-to-idl/settings.gradle new file mode 100644 index 0000000000..21c9a72fc4 --- /dev/null +++ b/smithy-model-to-idl/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'SmithyModelToIdl' + diff --git a/smithy-model-to-idl/src/main/java/software/amazon/polymorph/SmithyModelToIdl.java b/smithy-model-to-idl/src/main/java/software/amazon/polymorph/SmithyModelToIdl.java new file mode 100644 index 0000000000..f9feefcadf --- /dev/null +++ b/smithy-model-to-idl/src/main/java/software/amazon/polymorph/SmithyModelToIdl.java @@ -0,0 +1,71 @@ +// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved. +// SPDX-License-Identifier: Apache-2.0 + +package software.amazon.polymorph; + +import software.amazon.smithy.model.Model; +import software.amazon.smithy.model.loader.ModelAssembler; +import software.amazon.smithy.model.shapes.SmithyIdlModelSerializer; +import software.amazon.smithy.model.traits.DocumentationTrait; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collections; +import java.util.Map; +import java.util.Objects; +import java.util.logging.Logger; +import java.util.stream.Stream; + +public class SmithyModelToIdl { + private static final Path PACKAGE_MODEL_RESOURCES_PATH = Path.of("src", "main", "resources", "META-INF", "smithy"); + + public static void main(String[] args) { + final Logger logger = Logger.getLogger(SmithyModelToIdl.class.getSimpleName()); + + if (args.length < 3) { + throw new IllegalStateException("usage: SmithyModelToIdl DEST_PATH SMITHY_REPO_PATH MODEL_PATH..."); + } + + final Path destPath = Path.of(args[0]); + final Path smithyRepoPath = Path.of(args[1]); + + final ModelAssembler modelAssembler = new ModelAssembler(); + + for (int i = 2; i < args.length; i++) { + final Path modelPath = Path.of(args[i]); + modelAssembler.addImport(modelPath); + } + + final File[] smithyRepoPackages = smithyRepoPath.toFile().listFiles(); + if (smithyRepoPackages == null) { + throw new IllegalStateException("no Smithy repo packages found"); + } + Arrays.stream(smithyRepoPackages) + .map(pkg -> pkg.toPath().resolve(PACKAGE_MODEL_RESOURCES_PATH).toFile()) + .map(dir -> dir.listFiles((_dir, name) -> name.endsWith(".smithy") || name.endsWith(".json"))) + .filter(Objects::nonNull) + .flatMap(Stream::of) + .map(File::toPath) + .forEach(modelAssembler::addImport); + + final Model model = modelAssembler.assemble().unwrap(); + + final var serializer = SmithyIdlModelSerializer.builder() + .basePath(destPath) + // Omit documentation since it's visually distracting + .traitFilter(trait -> !(trait instanceof DocumentationTrait)) + .build(); + final Map serializedFiles = serializer.serialize(model); + serializedFiles.forEach((path, code) -> { + try { + Files.write(path, Collections.singleton(code)); + logger.info("Wrote " + path.toAbsolutePath()); + } catch (IOException e) { + e.printStackTrace(); + } + }); + } +}