diff --git a/tool/playground/A.g4 b/tool/playground/A.g4 index 3efbfec66..f2b933a0e 100644 --- a/tool/playground/A.g4 +++ b/tool/playground/A.g4 @@ -14,7 +14,7 @@ a single rule. weird though that this one works -STRING : '"' ( '\\' '"' | . )* '"' ; +STRING : '"' ( '\\' '"' | . )*? '"' ; wouldn't it get to the end of the rule also by the wild-card route? Maybe it's a simple order of operations or order in which i process the @@ -23,5 +23,5 @@ wouldn't it get to the end of the rule also by the wild-card route? */ //STRING : '"' ( 'x' | . )* '"' ; -ACTION : '{' ( ACTION | . )* '}' ; +ACTION : '{' ( ACTION | . )*? '}' ; WS : [ \r\t\n]+ -> skip ; diff --git a/tool/playground/R.g4 b/tool/playground/R.g4 index 551228c4e..fdc93f455 100644 --- a/tool/playground/R.g4 +++ b/tool/playground/R.g4 @@ -156,9 +156,9 @@ ID : '.'? (LETTER|'_'|'.') (LETTER|DIGIT|'_'|'.')* fragment LETTER : 'a'..'z'|'A'..'Z'|'\u0080'..'\u00FF' ; -USER_OP : '%' .* '%' ; +USER_OP : '%' .*? '%' ; -COMMENT : '#' .* '\n' {skip();} ; +COMMENT : '#' .*? '\n' {skip();} ; /** Doesn't handle '\n' correctly. it's context-sensitive */ WS : (' '|'\t'|'\n'|'\r')+ {skip();} ; diff --git a/tool/playground/TestYang.java b/tool/playground/TestYang.java deleted file mode 100644 index c216ccc5b..000000000 --- a/tool/playground/TestYang.java +++ /dev/null @@ -1,116 +0,0 @@ -import org.antlr.runtime.debug.BlankDebugEventListener; -import org.antlr.v4.runtime.ANTLRFileStream; -import org.antlr.v4.runtime.CommonTokenStream; -import org.antlr.v4.runtime.atn.LexerATNSimulator; -import org.antlr.v4.runtime.atn.ParserATNSimulator; - -import java.io.File; - -/** Parse a java file or directory of java files using the generated parser - * ANTLR builds from java.g4 - */ -class TestYang { - public static long lexerTime = 0; - public static boolean profile = false; - public static YangJavaLexer lexer; - public static YangJavaParser parser = null; - - public static void main(String[] args) { - try { - long start = System.currentTimeMillis(); - if (args.length > 0 ) { - // for each directory/file specified on the command line - for(int i=0; i< args.length;i++) { - doFile(new File(args[i])); // parse it - } - } - else { - System.err.println("Usage: java Main "); - } - long stop = System.currentTimeMillis(); - System.out.println("Lexer total time " + lexerTime + "ms."); - System.out.println("Total time " + (stop - start) + "ms."); - - System.out.println("finished parsing OK"); - System.out.println(LexerATNSimulator.match_calls+" lexer match calls"); - System.out.println(ParserATNSimulator.ATN_failover+" parser failovers"); - System.out.println(ParserATNSimulator.predict_calls +" parser predict calls"); - if ( profile ) { - System.out.println("num decisions "+profiler.numDecisions); - } - } - catch(Exception e) { - System.err.println("exception: "+e); - e.printStackTrace(System.err); // so we can get stack trace - } - } - - - // This method decides what action to take based on the type of - // file we are looking at - public static void doFile(File f) - throws Exception { - // If this is a directory, walk each file/dir in that directory - if (f.isDirectory()) { - String files[] = f.list(); - for(int i=0; i < files.length; i++) - doFile(new File(f, files[i])); - } - - // otherwise, if this is a java file, parse it! - else if ( ((f.getName().length()>5) && - f.getName().substring(f.getName().length()-5).equals(".java")) - || f.getName().equals("input") ) - { - System.err.println("parsing "+f.getAbsolutePath()); - parseFile(f.getAbsolutePath()); - } - } - - static class CountDecisions extends BlankDebugEventListener { - public int numDecisions = 0; - public void enterDecision(int decisionNumber) { - numDecisions++; - } - } - static CountDecisions profiler = new CountDecisions(); - - // Here's where we do the real work... - public static void parseFile(String f) - throws Exception { - try { - // Create a scanner that reads from the input stream passed to us - if ( lexer==null ) { - lexer = new YangJavaLexer(null); - } - lexer.setInputStream(new ANTLRFileStream(f)); - - CommonTokenStream tokens = new CommonTokenStream(lexer); - long start = System.currentTimeMillis(); - tokens.fill(); -// System.out.println(tokens.getTokens()); - long stop = System.currentTimeMillis(); - lexerTime += stop-start; - for (Object t : tokens.getTokens()) { - System.out.println(t); - } - - if ( true ) { - // Create a parser that reads from the scanner - if ( parser==null ) { - parser = new YangJavaParser(tokens); - } - parser.setTokenStream(tokens); - // start parsing at the compilationUnit rule - parser.compilationUnit(); - //System.err.println("finished "+f); - } - } - catch (Exception e) { - System.err.println("parser exception: "+e); - e.printStackTrace(); // so we can get stack trace - } - } - -} - diff --git a/tool/playground/YangJavaLexer.g b/tool/playground/YangJavaLexer.g deleted file mode 100644 index 17cc0e469..000000000 --- a/tool/playground/YangJavaLexer.g +++ /dev/null @@ -1,1478 +0,0 @@ -/* - [The "BSD licence"] - Copyright (c) 2007-2008 Terence Parr - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * This file is modified by Yang Jiang (yang.jiang.z@gmail.com), taken from the original - * java grammar in www.antlr.org, with the goal to provide a standard ANTLR grammar - * for java, as well as an implementation to construct the same AST trees as javac does. - * - * The major changes of this version as compared to the original version include: - * 1) Top level rules are changed to include all of their sub-components. - * For example, the rule - * - * classOrInterfaceDeclaration - * : classOrInterfaceModifiers (classDeclaration | interfaceDeclaration) - * ; - * - * is changed to - * - * classOrInterfaceDeclaration - * : classDeclaration | interfaceDeclaration - * ; - * - * with classOrInterfaceModifiers been moved inside classDeclaration and - * interfaceDeclaration. - * - * 2) The original version is not quite clear on certain rules like memberDecl, - * where it mixed the styles of listing of top level rules and listing of sub rules. - * - * memberDecl - * : genericMethodOrConstructorDecl - * | memberDeclaration - * | 'void' Identifier voidMethodDeclaratorRest - * | Identifier constructorDeclaratorRest - * | interfaceDeclaration - * | classDeclaration - * ; - * - * This is changed to a - * - * memberDecl - * : fieldDeclaration - * | methodDeclaration - * | classDeclaration - * | interfaceDeclaration - * ; - * by folding similar rules into single rule. - * - * 3) Some syntactical predicates are added for efficiency, although this is not necessary - * for correctness. - * - * 4) Lexer part is rewritten completely to construct tokens needed for the parser. - * - * 5) This grammar adds more source level support - * - * - * This grammar also adds bug fixes. - * - * 1) Adding typeArguments to superSuffix to alHexSignificandlow input like - * super.method() - * - * 2) Adding typeArguments to innerCreator to allow input like - * new Type1().new Type2() - * - * 3) conditionalExpression is changed to - * conditionalExpression - * : conditionalOrExpression ( '?' expression ':' conditionalExpression )? - * ; - * to accept input like - * true?1:2=3 - * - * Note: note this is by no means a valid input, by the grammar should be able to parse - * this as - * (true?1:2)=3 - * rather than - * true?1:(2=3) - * - * - * Know problems: - * Won't pass input containing unicode sequence like this - * char c = '\uffff' - * String s = "\uffff"; - * Because Antlr does not treat '\uffff' as an valid char. This will be fixed in the next Antlr - * release. [Fixed in Antlr-3.1.1] - * - * Things to do: - * More effort to make this grammar faster. - * Error reporting/recovering. - * - * - * NOTE: If you try to compile this file from command line and Antlr gives an exception - * like error message while compiling, add option - * -Xconversiontimeout 100000 - * to the command line. - * If it still doesn't work or the compilation process - * takes too long, try to comment out the following two lines: - * | {isValidSurrogateIdentifierStart((char)input.LT(1), (char)input.LT(2))}?=>('\ud800'..'\udbff') ('\udc00'..'\udfff') - * | {isValidSurrogateIdentifierPart((char)input.LT(1), (char)input.LT(2))}?=>('\ud800'..'\udbff') ('\udc00'..'\udfff') - * - * - * Below are comments found in the original version. - */ - - -/** A Java 1.5 grammar for ANTLR v3 derived from the spec - * - * This is a very close representation of the spec; the changes - * are comestic (remove left recursion) and also fixes (the spec - * isn't exactly perfect). I have run this on the 1.4.2 source - * and some nasty looking enums from 1.5, but have not really - * tested for 1.5 compatibility. - * - * I built this with: java -Xmx100M org.antlr.Tool java.g - * and got two errors that are ok (for now): - * java.g:691:9: Decision can match input such as - * "'0'..'9'{'E', 'e'}{'+', '-'}'0'..'9'{'D', 'F', 'd', 'f'}" - * using multiple alternatives: 3, 4 - * As a result, alternative(s) 4 were disabled for that input - * java.g:734:35: Decision can match input such as "{'$', 'A'..'Z', - * '_', 'a'..'z', '\u00C0'..'\u00D6', '\u00D8'..'\u00F6', - * '\u00F8'..'\u1FFF', '\u3040'..'\u318F', '\u3300'..'\u337F', - * '\u3400'..'\u3D2D', '\u4E00'..'\u9FFF', '\uF900'..'\uFAFF'}" - * using multiple alternatives: 1, 2 - * As a result, alternative(s) 2 were disabled for that input - * - * You can turn enum on/off as a keyword :) - * - * Version 1.0 -- initial release July 5, 2006 (requires 3.0b2 or higher) - * - * Primary author: Terence Parr, July 2006 - * - * Version 1.0.1 -- corrections by Koen Vanderkimpen & Marko van Dooren, - * October 25, 2006; - * fixed normalInterfaceDeclaration: now uses typeParameters instead - * of typeParameter (according to JLS, 3rd edition) - * fixed castExpression: no longer allows expression next to type - * (according to semantics in JLS, in contrast with syntax in JLS) - * - * Version 1.0.2 -- Terence Parr, Nov 27, 2006 - * java spec I built this from had some bizarre for-loop control. - * Looked weird and so I looked elsewhere...Yep, it's messed up. - * simplified. - * - * Version 1.0.3 -- Chris Hogue, Feb 26, 2007 - * Factored out an annotationName rule and used it in the annotation rule. - * Not sure why, but typeName wasn't recognizing references to inner - * annotations (e.g. @InterfaceName.InnerAnnotation()) - * Factored out the elementValue section of an annotation reference. Created - * elementValuePair and elementValuePairs rules, then used them in the - * annotation rule. Allows it to recognize annotation references with - * multiple, comma separated attributes. - * Updated elementValueArrayInitializer so that it allows multiple elements. - * (It was only allowing 0 or 1 element). - * Updated localVariableDeclaration to allow annotations. Interestingly the JLS - * doesn't appear to indicate this is legal, but it does work as of at least - * JDK 1.5.0_06. - * Moved the Identifier portion of annotationTypeElementRest to annotationMethodRest. - * Because annotationConstantRest already references variableDeclarator which - * has the Identifier portion in it, the parser would fail on constants in - * annotation definitions because it expected two identifiers. - * Added optional trailing ';' to the alternatives in annotationTypeElementRest. - * Wouldn't handle an inner interface that has a trailing ';'. - * Swapped the expression and type rule reference order in castExpression to - * make it check for genericized casts first. It was failing to recognize a - * statement like "Class TYPE = (Class)...;" because it was seeing - * 'Class'. - * Changed createdName to use typeArguments instead of nonWildcardTypeArguments. - * - * Changed the 'this' alternative in primary to allow 'identifierSuffix' rather than - * just 'arguments'. The case it couldn't handle was a call to an explicit - * generic method invocation (e.g. this.doSomething()). Using identifierSuffix - * may be overly aggressive--perhaps should create a more constrained thisSuffix rule? - * - * Version 1.0.4 -- Hiroaki Nakamura, May 3, 2007 - * - * Fixed formalParameterDecls, localVariableDeclaration, forInit, - * and forVarControl to use variableModifier* not 'final'? (annotation)? - * - * Version 1.0.5 -- Terence, June 21, 2007 - * --a[i].foo didn't work. Fixed unaryExpression - * - * Version 1.0.6 -- John Ridgway, March 17, 2008 - * Made "assert" a switchable keyword like "enum". - * Fixed compilationUnit to disallow "annotation importDeclaration ...". - * Changed "Identifier ('.' Identifier)*" to "qualifiedName" in more - * places. - * Changed modifier* and/or variableModifier* to classOrInterfaceModifiers, - * modifiers or variableModifiers, as appropriate. - * Renamed "bound" to "typeBound" to better match language in the JLS. - * Added "memberDeclaration" which rewrites to methodDeclaration or - * fieldDeclaration and pulled type into memberDeclaration. So we parse - * type and then move on to decide whether we're dealing with a field - * or a method. - * Modified "constructorDeclaration" to use "constructorBody" instead of - * "methodBody". constructorBody starts with explicitConstructorInvocation, - * then goes on to blockStatement*. Pulling explicitConstructorInvocation - * out of expressions allowed me to simplify "primary". - * Changed variableDeclarator to simplify it. - * Changed type to use classOrInterfaceType, thus simplifying it; of course - * I then had to add classOrInterfaceType, but it is used in several - * places. - * Fixed annotations, old version allowed "@X(y,z)", which is illegal. - * Added optional comma to end of "elementValueArrayInitializer"; as per JLS. - * Changed annotationTypeElementRest to use normalClassDeclaration and - * normalInterfaceDeclaration rather than classDeclaration and - * interfaceDeclaration, thus getting rid of a couple of grammar ambiguities. - * Split localVariableDeclaration into localVariableDeclarationStatement - * (includes the terminating semi-colon) and localVariableDeclaration. - * This allowed me to use localVariableDeclaration in "forInit" clauses, - * simplifying them. - * Changed switchBlockStatementGroup to use multiple labels. This adds an - * ambiguity, but if one uses appropriately greedy parsing it yields the - * parse that is closest to the meaning of the switch statement. - * Renamed "forVarControl" to "enhancedForControl" -- JLS language. - * Added semantic predicates to test for shift operations rather than other - * things. Thus, for instance, the string "< <" will never be treated - * as a left-shift operator. - * In "creator" we rule out "nonWildcardTypeArguments" on arrayCreation, - * which are illegal. - * Moved "nonWildcardTypeArguments into innerCreator. - * Removed 'super' superSuffix from explicitGenericInvocation, since that - * is only used in explicitConstructorInvocation at the beginning of a - * constructorBody. (This is part of the simplification of expressions - * mentioned earlier.) - * Simplified primary (got rid of those things that are only used in - * explicitConstructorInvocation). - * Lexer -- removed "Exponent?" from FloatingPointLiteral choice 4, since it - * led to an ambiguity. - * - * This grammar successfully parses every .java file in the JDK 1.5 source - * tree (excluding those whose file names include '-', which are not - * valid Java compilation units). - * - * Known remaining problems: - * "Letter" and "JavaIDDigit" are wrong. The actual specification of - * "Letter" should be "a character for which the method - * Character.isJavaIdentifierStart(int) returns true." A "Java - * letter-or-digit is a character for which the method - * Character.isJavaIdentifierPart(int) returns true." - */ - - - /* - This is a merged file, containing two versions of the Java.g grammar. - To extract a version from the file, run the ver.jar with the command provided below. - - Version 1 - tree building version, with all source level support, error recovery etc. - This is the version for compiler grammar workspace. - This version can be extracted by invoking: - java -cp ver.jar Main 1 true true true true true Java.g - - Version 2 - clean version, with no source leve support, no error recovery, no predicts, - assumes 1.6 level, works in Antlrworks. - This is the version for Alex. - This version can be extracted by invoking: - java -cp ver.jar Main 2 false false false false false Java.g -*/ - -lexer grammar YangJavaLexer; - -LONGLITERAL - : IntegerNumber LongSuffix - ; - - -INTLITERAL - : IntegerNumber - ; - -fragment -IntegerNumber - : '0' - | '1'..'9' ('0'..'9')* - | '0' ('0'..'7')+ - | HexPrefix HexDigit+ - ; - -fragment -HexPrefix - : '0x' | '0X' - ; - -fragment -HexDigit - : ('0'..'9'|'a'..'f'|'A'..'F') - ; - -fragment -LongSuffix - : 'l' | 'L' - ; - -fragment -NonIntegerNumber - : ('0' .. '9')+ '.' ('0' .. '9')* Exponent? - | '.' ( '0' .. '9' )+ Exponent? - | ('0' .. '9')+ Exponent - | ('0' .. '9')+ - | HexPrefix HexDigit* - ('.' HexDigit*)? - ( 'p' | 'P' ) - ( '+' | '-' )? - ( '0' .. '9' )+ - ; - -fragment -Exponent - : ( 'e' | 'E' ) ( '+' | '-' )? ( '0' .. '9' )+ - ; - -fragment -FloatSuffix - : 'f' | 'F' - ; - -fragment -DoubleSuffix - : 'd' | 'D' - ; - -FLOATLITERAL - : NonIntegerNumber FloatSuffix - ; - -DOUBLELITERAL - : NonIntegerNumber DoubleSuffix? - ; - -CHARLITERAL - : '\'' - ( EscapeSequence - | ~( '\'' | '\\' | '\r' | '\n' ) - ) - '\'' - ; - -STRINGLITERAL - : '"' - ( EscapeSequence - | ~( '\\' | '"' | '\r' | '\n' ) - )* - '"' - ; - -// TJP alters to mirror my JavaLexer.g - -fragment -EscapeSequence - : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') - | UnicodeEscape - | OctalEscape - ; - -fragment -OctalEscape - : '\\' ('0'..'3') ('0'..'7') ('0'..'7') - | '\\' ('0'..'7') ('0'..'7') - | '\\' ('0'..'7') - ;// $ANTLR src "JavaCombined.g" 958 -fragment -UnicodeEscape - : '\\' 'u' HexDigit HexDigit HexDigit HexDigit - ; - -WS - : ( - ' ' - | '\r' - | '\t' - | '\u000C' - | '\n' - ) - { - skip(); - } - ; - -COMMENT - : '/*' .* '*/' {skip();} - ; - -LINE_COMMENT - : '//' .* ('\r\n' | '\r' | '\n') {skip();} - | '//' ~('\n'|'\r')* {skip();} // a line comment could appear at the end of the file without CR/LF - ; - -ABSTRACT - : 'abstract' - ; - -ASSERT - : 'assert' - ; - -BOOLEAN - : 'boolean' - ; - -BREAK - : 'break' - ; - -BYTE - : 'byte' - ; - -CASE - : 'case' - ; - -CATCH - : 'catch' - ; - -CHAR - : 'char' - ; - -CLASS - : 'class' - ; - -CONST - : 'const' - ; - -CONTINUE - : 'continue' - ; - -DEFAULT - : 'default' - ; - -DO - : 'do' - ; - -DOUBLE - : 'double' - ; - -ELSE - : 'else' - ; - -ENUM - : 'enum' - ; - -EXTENDS - : 'extends' - ; - -FINAL - : 'final' - ; - -FINALLY - : 'finally' - ; - -FLOAT - : 'float' - ; - -FOR - : 'for' - ; - -GOTO - : 'goto' - ; - -IF - : 'if' - ; - -IMPLEMENTS - : 'implements' - ; - -IMPORT - : 'import' - ; - -INSTANCEOF - : 'instanceof' - ; - -INT - : 'int' - ; - -INTERFACE - : 'interface' - ; - -LONG - : 'long' - ; - -NATIVE - : 'native' - ; - -NEW - : 'new' - ; - -PACKAGE - : 'package' - ; - -PRIVATE - : 'private' - ; - -PROTECTED - : 'protected' - ; - -PUBLIC - : 'public' - ; - -RETURN - : 'return' - ; - -SHORT - : 'short' - ; - -STATIC - : 'static' - ; - -STRICTFP - : 'strictfp' - ; - -SUPER - : 'super' - ; - -SWITCH - : 'switch' - ; - -SYNCHRONIZED - : 'synchronized' - ; - -THIS - : 'this' - ; - -THROW - : 'throw' - ; - -THROWS - : 'throws' - ; - -TRANSIENT - : 'transient' - ; - -TRY - : 'try' - ; - -VOID - : 'void' - ; - -VOLATILE - : 'volatile' - ; - -WHILE - : 'while' - ; - -TRUE - : 'true' - ; - -FALSE - : 'false' - ; - -NULL - : 'null' - ; - -LPAREN - : '(' - ; - -RPAREN - : ')' - ; - -LBRACE - : '{' - ; - -RBRACE - : '}' - ; - -LBRACKET - : '[' - ; - -RBRACKET - : ']' - ; - -SEMI - : ';' - ; - -COMMA - : ',' - ; - -DOT - : '.' - ; - -ELLIPSIS - : '...' - ; - -EQ - : '=' - ; - -BANG - : '!' - ; - -TILDE - : '~' - ; - -QUES - : '?' - ; - -COLON - : ':' - ; - -EQEQ - : '==' - ; - -AMPAMP - : '&&' - ; - -BARBAR - : '||' - ; - -PLUSPLUS - : '++' - ; - -SUBSUB - : '--' - ; - -PLUS - : '+' - ; - -SUB - : '-' - ; - -STAR - : '*' - ; - -SLASH - : '/' - ; - -AMP - : '&' - ; - -BAR - : '|' - ; - -CARET - : '^' - ; - -PERCENT - : '%' - ; - -PLUSEQ - : '+=' - ; - -SUBEQ - : '-=' - ; - -STAREQ - : '*=' - ; - -SLASHEQ - : '/=' - ; - -AMPEQ - : '&=' - ; - -BAREQ - : '|=' - ; - -CARETEQ - : '^=' - ; - -PERCENTEQ - : '%=' - ; - -MONKEYS_AT - : '@' - ; - -BANGEQ - : '!=' - ; - -GT - : '<' - ; - -LT - : '>' - ; - -IDENTIFIER - : IdentifierStart IdentifierPart* - ; - -fragment -SurrogateIdentifer - : ('\ud800'..'\udbff') ('\udc00'..'\udfff') - ; - -fragment -IdentifierStart - : '\u0024' - | '\u0041'..'\u005a' - | '\u005f' - | '\u0061'..'\u007a' - | '\u00a2'..'\u00a5' - | '\u00aa' - | '\u00b5' - | '\u00ba' - | '\u00c0'..'\u00d6' - | '\u00d8'..'\u00f6' - | '\u00f8'..'\u0236' - | '\u0250'..'\u02c1' - | '\u02c6'..'\u02d1' - | '\u02e0'..'\u02e4' - | '\u02ee' - | '\u037a' - | '\u0386' - | '\u0388'..'\u038a' - | '\u038c' - | '\u038e'..'\u03a1' - | '\u03a3'..'\u03ce' - | '\u03d0'..'\u03f5' - | '\u03f7'..'\u03fb' - | '\u0400'..'\u0481' - | '\u048a'..'\u04ce' - | '\u04d0'..'\u04f5' - | '\u04f8'..'\u04f9' - | '\u0500'..'\u050f' - | '\u0531'..'\u0556' - | '\u0559' - | '\u0561'..'\u0587' - | '\u05d0'..'\u05ea' - | '\u05f0'..'\u05f2' - | '\u0621'..'\u063a' - | '\u0640'..'\u064a' - | '\u066e'..'\u066f' - | '\u0671'..'\u06d3' - | '\u06d5' - | '\u06e5'..'\u06e6' - | '\u06ee'..'\u06ef' - | '\u06fa'..'\u06fc' - | '\u06ff' - | '\u0710' - | '\u0712'..'\u072f' - | '\u074d'..'\u074f' - | '\u0780'..'\u07a5' - | '\u07b1' - | '\u0904'..'\u0939' - | '\u093d' - | '\u0950' - | '\u0958'..'\u0961' - | '\u0985'..'\u098c' - | '\u098f'..'\u0990' - | '\u0993'..'\u09a8' - | '\u09aa'..'\u09b0' - | '\u09b2' - | '\u09b6'..'\u09b9' - | '\u09bd' - | '\u09dc'..'\u09dd' - | '\u09df'..'\u09e1' - | '\u09f0'..'\u09f3' - | '\u0a05'..'\u0a0a' - | '\u0a0f'..'\u0a10' - | '\u0a13'..'\u0a28' - | '\u0a2a'..'\u0a30' - | '\u0a32'..'\u0a33' - | '\u0a35'..'\u0a36' - | '\u0a38'..'\u0a39' - | '\u0a59'..'\u0a5c' - | '\u0a5e' - | '\u0a72'..'\u0a74' - | '\u0a85'..'\u0a8d' - | '\u0a8f'..'\u0a91' - | '\u0a93'..'\u0aa8' - | '\u0aaa'..'\u0ab0' - | '\u0ab2'..'\u0ab3' - | '\u0ab5'..'\u0ab9' - | '\u0abd' - | '\u0ad0' - | '\u0ae0'..'\u0ae1' - | '\u0af1' - | '\u0b05'..'\u0b0c' - | '\u0b0f'..'\u0b10' - | '\u0b13'..'\u0b28' - | '\u0b2a'..'\u0b30' - | '\u0b32'..'\u0b33' - | '\u0b35'..'\u0b39' - | '\u0b3d' - | '\u0b5c'..'\u0b5d' - | '\u0b5f'..'\u0b61' - | '\u0b71' - | '\u0b83' - | '\u0b85'..'\u0b8a' - | '\u0b8e'..'\u0b90' - | '\u0b92'..'\u0b95' - | '\u0b99'..'\u0b9a' - | '\u0b9c' - | '\u0b9e'..'\u0b9f' - | '\u0ba3'..'\u0ba4' - | '\u0ba8'..'\u0baa' - | '\u0bae'..'\u0bb5' - | '\u0bb7'..'\u0bb9' - | '\u0bf9' - | '\u0c05'..'\u0c0c' - | '\u0c0e'..'\u0c10' - | '\u0c12'..'\u0c28' - | '\u0c2a'..'\u0c33' - | '\u0c35'..'\u0c39' - | '\u0c60'..'\u0c61' - | '\u0c85'..'\u0c8c' - | '\u0c8e'..'\u0c90' - | '\u0c92'..'\u0ca8' - | '\u0caa'..'\u0cb3' - | '\u0cb5'..'\u0cb9' - | '\u0cbd' - | '\u0cde' - | '\u0ce0'..'\u0ce1' - | '\u0d05'..'\u0d0c' - | '\u0d0e'..'\u0d10' - | '\u0d12'..'\u0d28' - | '\u0d2a'..'\u0d39' - | '\u0d60'..'\u0d61' - | '\u0d85'..'\u0d96' - | '\u0d9a'..'\u0db1' - | '\u0db3'..'\u0dbb' - | '\u0dbd' - | '\u0dc0'..'\u0dc6' - | '\u0e01'..'\u0e30' - | '\u0e32'..'\u0e33' - | '\u0e3f'..'\u0e46' - | '\u0e81'..'\u0e82' - | '\u0e84' - | '\u0e87'..'\u0e88' - | '\u0e8a' - | '\u0e8d' - | '\u0e94'..'\u0e97' - | '\u0e99'..'\u0e9f' - | '\u0ea1'..'\u0ea3' - | '\u0ea5' - | '\u0ea7' - | '\u0eaa'..'\u0eab' - | '\u0ead'..'\u0eb0' - | '\u0eb2'..'\u0eb3' - | '\u0ebd' - | '\u0ec0'..'\u0ec4' - | '\u0ec6' - | '\u0edc'..'\u0edd' - | '\u0f00' - | '\u0f40'..'\u0f47' - | '\u0f49'..'\u0f6a' - | '\u0f88'..'\u0f8b' - | '\u1000'..'\u1021' - | '\u1023'..'\u1027' - | '\u1029'..'\u102a' - | '\u1050'..'\u1055' - | '\u10a0'..'\u10c5' - | '\u10d0'..'\u10f8' - | '\u1100'..'\u1159' - | '\u115f'..'\u11a2' - | '\u11a8'..'\u11f9' - | '\u1200'..'\u1206' - | '\u1208'..'\u1246' - | '\u1248' - | '\u124a'..'\u124d' - | '\u1250'..'\u1256' - | '\u1258' - | '\u125a'..'\u125d' - | '\u1260'..'\u1286' - | '\u1288' - | '\u128a'..'\u128d' - | '\u1290'..'\u12ae' - | '\u12b0' - | '\u12b2'..'\u12b5' - | '\u12b8'..'\u12be' - | '\u12c0' - | '\u12c2'..'\u12c5' - | '\u12c8'..'\u12ce' - | '\u12d0'..'\u12d6' - | '\u12d8'..'\u12ee' - | '\u12f0'..'\u130e' - | '\u1310' - | '\u1312'..'\u1315' - | '\u1318'..'\u131e' - | '\u1320'..'\u1346' - | '\u1348'..'\u135a' - | '\u13a0'..'\u13f4' - | '\u1401'..'\u166c' - | '\u166f'..'\u1676' - | '\u1681'..'\u169a' - | '\u16a0'..'\u16ea' - | '\u16ee'..'\u16f0' - | '\u1700'..'\u170c' - | '\u170e'..'\u1711' - | '\u1720'..'\u1731' - | '\u1740'..'\u1751' - | '\u1760'..'\u176c' - | '\u176e'..'\u1770' - | '\u1780'..'\u17b3' - | '\u17d7' - | '\u17db'..'\u17dc' - | '\u1820'..'\u1877' - | '\u1880'..'\u18a8' - | '\u1900'..'\u191c' - | '\u1950'..'\u196d' - | '\u1970'..'\u1974' - | '\u1d00'..'\u1d6b' - | '\u1e00'..'\u1e9b' - | '\u1ea0'..'\u1ef9' - | '\u1f00'..'\u1f15' - | '\u1f18'..'\u1f1d' - | '\u1f20'..'\u1f45' - | '\u1f48'..'\u1f4d' - | '\u1f50'..'\u1f57' - | '\u1f59' - | '\u1f5b' - | '\u1f5d' - | '\u1f5f'..'\u1f7d' - | '\u1f80'..'\u1fb4' - | '\u1fb6'..'\u1fbc' - | '\u1fbe' - | '\u1fc2'..'\u1fc4' - | '\u1fc6'..'\u1fcc' - | '\u1fd0'..'\u1fd3' - | '\u1fd6'..'\u1fdb' - | '\u1fe0'..'\u1fec' - | '\u1ff2'..'\u1ff4' - | '\u1ff6'..'\u1ffc' - | '\u203f'..'\u2040' - | '\u2054' - | '\u2071' - | '\u207f' - | '\u20a0'..'\u20b1' - | '\u2102' - | '\u2107' - | '\u210a'..'\u2113' - | '\u2115' - | '\u2119'..'\u211d' - | '\u2124' - | '\u2126' - | '\u2128' - | '\u212a'..'\u212d' - | '\u212f'..'\u2131' - | '\u2133'..'\u2139' - | '\u213d'..'\u213f' - | '\u2145'..'\u2149' - | '\u2160'..'\u2183' - | '\u3005'..'\u3007' - | '\u3021'..'\u3029' - | '\u3031'..'\u3035' - | '\u3038'..'\u303c' - | '\u3041'..'\u3096' - | '\u309d'..'\u309f' - | '\u30a1'..'\u30ff' - | '\u3105'..'\u312c' - | '\u3131'..'\u318e' - | '\u31a0'..'\u31b7' - | '\u31f0'..'\u31ff' - | '\u3400'..'\u4db5' - | '\u4e00'..'\u9fa5' - | '\ua000'..'\ua48c' - | '\uac00'..'\ud7a3' - | '\uf900'..'\ufa2d' - | '\ufa30'..'\ufa6a' - | '\ufb00'..'\ufb06' - | '\ufb13'..'\ufb17' - | '\ufb1d' - | '\ufb1f'..'\ufb28' - | '\ufb2a'..'\ufb36' - | '\ufb38'..'\ufb3c' - | '\ufb3e' - | '\ufb40'..'\ufb41' - | '\ufb43'..'\ufb44' - | '\ufb46'..'\ufbb1' - | '\ufbd3'..'\ufd3d' - | '\ufd50'..'\ufd8f' - | '\ufd92'..'\ufdc7' - | '\ufdf0'..'\ufdfc' - | '\ufe33'..'\ufe34' - | '\ufe4d'..'\ufe4f' - | '\ufe69' - | '\ufe70'..'\ufe74' - | '\ufe76'..'\ufefc' - | '\uff04' - | '\uff21'..'\uff3a' - | '\uff3f' - | '\uff41'..'\uff5a' - | '\uff65'..'\uffbe' - | '\uffc2'..'\uffc7' - | '\uffca'..'\uffcf' - | '\uffd2'..'\uffd7' - | '\uffda'..'\uffdc' - | '\uffe0'..'\uffe1' - | '\uffe5'..'\uffe6' - | ('\ud800'..'\udbff') ('\udc00'..'\udfff') - ; - -fragment -IdentifierPart - : '\u0000'..'\u0008' - | '\u000e'..'\u001b' - | '\u0024' - | '\u0030'..'\u0039' - | '\u0041'..'\u005a' - | '\u005f' - | '\u0061'..'\u007a' - | '\u007f'..'\u009f' - | '\u00a2'..'\u00a5' - | '\u00aa' - | '\u00ad' - | '\u00b5' - | '\u00ba' - | '\u00c0'..'\u00d6' - | '\u00d8'..'\u00f6' - | '\u00f8'..'\u0236' - | '\u0250'..'\u02c1' - | '\u02c6'..'\u02d1' - | '\u02e0'..'\u02e4' - | '\u02ee' - | '\u0300'..'\u0357' - | '\u035d'..'\u036f' - | '\u037a' - | '\u0386' - | '\u0388'..'\u038a' - | '\u038c' - | '\u038e'..'\u03a1' - | '\u03a3'..'\u03ce' - | '\u03d0'..'\u03f5' - | '\u03f7'..'\u03fb' - | '\u0400'..'\u0481' - | '\u0483'..'\u0486' - | '\u048a'..'\u04ce' - | '\u04d0'..'\u04f5' - | '\u04f8'..'\u04f9' - | '\u0500'..'\u050f' - | '\u0531'..'\u0556' - | '\u0559' - | '\u0561'..'\u0587' - | '\u0591'..'\u05a1' - | '\u05a3'..'\u05b9' - | '\u05bb'..'\u05bd' - | '\u05bf' - | '\u05c1'..'\u05c2' - | '\u05c4' - | '\u05d0'..'\u05ea' - | '\u05f0'..'\u05f2' - | '\u0600'..'\u0603' - | '\u0610'..'\u0615' - | '\u0621'..'\u063a' - | '\u0640'..'\u0658' - | '\u0660'..'\u0669' - | '\u066e'..'\u06d3' - | '\u06d5'..'\u06dd' - | '\u06df'..'\u06e8' - | '\u06ea'..'\u06fc' - | '\u06ff' - | '\u070f'..'\u074a' - | '\u074d'..'\u074f' - | '\u0780'..'\u07b1' - | '\u0901'..'\u0939' - | '\u093c'..'\u094d' - | '\u0950'..'\u0954' - | '\u0958'..'\u0963' - | '\u0966'..'\u096f' - | '\u0981'..'\u0983' - | '\u0985'..'\u098c' - | '\u098f'..'\u0990' - | '\u0993'..'\u09a8' - | '\u09aa'..'\u09b0' - | '\u09b2' - | '\u09b6'..'\u09b9' - | '\u09bc'..'\u09c4' - | '\u09c7'..'\u09c8' - | '\u09cb'..'\u09cd' - | '\u09d7' - | '\u09dc'..'\u09dd' - | '\u09df'..'\u09e3' - | '\u09e6'..'\u09f3' - | '\u0a01'..'\u0a03' - | '\u0a05'..'\u0a0a' - | '\u0a0f'..'\u0a10' - | '\u0a13'..'\u0a28' - | '\u0a2a'..'\u0a30' - | '\u0a32'..'\u0a33' - | '\u0a35'..'\u0a36' - | '\u0a38'..'\u0a39' - | '\u0a3c' - | '\u0a3e'..'\u0a42' - | '\u0a47'..'\u0a48' - | '\u0a4b'..'\u0a4d' - | '\u0a59'..'\u0a5c' - | '\u0a5e' - | '\u0a66'..'\u0a74' - | '\u0a81'..'\u0a83' - | '\u0a85'..'\u0a8d' - | '\u0a8f'..'\u0a91' - | '\u0a93'..'\u0aa8' - | '\u0aaa'..'\u0ab0' - | '\u0ab2'..'\u0ab3' - | '\u0ab5'..'\u0ab9' - | '\u0abc'..'\u0ac5' - | '\u0ac7'..'\u0ac9' - | '\u0acb'..'\u0acd' - | '\u0ad0' - | '\u0ae0'..'\u0ae3' - | '\u0ae6'..'\u0aef' - | '\u0af1' - | '\u0b01'..'\u0b03' - | '\u0b05'..'\u0b0c' - | '\u0b0f'..'\u0b10' - | '\u0b13'..'\u0b28' - | '\u0b2a'..'\u0b30' - | '\u0b32'..'\u0b33' - | '\u0b35'..'\u0b39' - | '\u0b3c'..'\u0b43' - | '\u0b47'..'\u0b48' - | '\u0b4b'..'\u0b4d' - | '\u0b56'..'\u0b57' - | '\u0b5c'..'\u0b5d' - | '\u0b5f'..'\u0b61' - | '\u0b66'..'\u0b6f' - | '\u0b71' - | '\u0b82'..'\u0b83' - | '\u0b85'..'\u0b8a' - | '\u0b8e'..'\u0b90' - | '\u0b92'..'\u0b95' - | '\u0b99'..'\u0b9a' - | '\u0b9c' - | '\u0b9e'..'\u0b9f' - | '\u0ba3'..'\u0ba4' - | '\u0ba8'..'\u0baa' - | '\u0bae'..'\u0bb5' - | '\u0bb7'..'\u0bb9' - | '\u0bbe'..'\u0bc2' - | '\u0bc6'..'\u0bc8' - | '\u0bca'..'\u0bcd' - | '\u0bd7' - | '\u0be7'..'\u0bef' - | '\u0bf9' - | '\u0c01'..'\u0c03' - | '\u0c05'..'\u0c0c' - | '\u0c0e'..'\u0c10' - | '\u0c12'..'\u0c28' - | '\u0c2a'..'\u0c33' - | '\u0c35'..'\u0c39' - | '\u0c3e'..'\u0c44' - | '\u0c46'..'\u0c48' - | '\u0c4a'..'\u0c4d' - | '\u0c55'..'\u0c56' - | '\u0c60'..'\u0c61' - | '\u0c66'..'\u0c6f' - | '\u0c82'..'\u0c83' - | '\u0c85'..'\u0c8c' - | '\u0c8e'..'\u0c90' - | '\u0c92'..'\u0ca8' - | '\u0caa'..'\u0cb3' - | '\u0cb5'..'\u0cb9' - | '\u0cbc'..'\u0cc4' - | '\u0cc6'..'\u0cc8' - | '\u0cca'..'\u0ccd' - | '\u0cd5'..'\u0cd6' - | '\u0cde' - | '\u0ce0'..'\u0ce1' - | '\u0ce6'..'\u0cef' - | '\u0d02'..'\u0d03' - | '\u0d05'..'\u0d0c' - | '\u0d0e'..'\u0d10' - | '\u0d12'..'\u0d28' - | '\u0d2a'..'\u0d39' - | '\u0d3e'..'\u0d43' - | '\u0d46'..'\u0d48' - | '\u0d4a'..'\u0d4d' - | '\u0d57' - | '\u0d60'..'\u0d61' - | '\u0d66'..'\u0d6f' - | '\u0d82'..'\u0d83' - | '\u0d85'..'\u0d96' - | '\u0d9a'..'\u0db1' - | '\u0db3'..'\u0dbb' - | '\u0dbd' - | '\u0dc0'..'\u0dc6' - | '\u0dca' - | '\u0dcf'..'\u0dd4' - | '\u0dd6' - | '\u0dd8'..'\u0ddf' - | '\u0df2'..'\u0df3' - | '\u0e01'..'\u0e3a' - | '\u0e3f'..'\u0e4e' - | '\u0e50'..'\u0e59' - | '\u0e81'..'\u0e82' - | '\u0e84' - | '\u0e87'..'\u0e88' - | '\u0e8a' - | '\u0e8d' - | '\u0e94'..'\u0e97' - | '\u0e99'..'\u0e9f' - | '\u0ea1'..'\u0ea3' - | '\u0ea5' - | '\u0ea7' - | '\u0eaa'..'\u0eab' - | '\u0ead'..'\u0eb9' - | '\u0ebb'..'\u0ebd' - | '\u0ec0'..'\u0ec4' - | '\u0ec6' - | '\u0ec8'..'\u0ecd' - | '\u0ed0'..'\u0ed9' - | '\u0edc'..'\u0edd' - | '\u0f00' - | '\u0f18'..'\u0f19' - | '\u0f20'..'\u0f29' - | '\u0f35' - | '\u0f37' - | '\u0f39' - | '\u0f3e'..'\u0f47' - | '\u0f49'..'\u0f6a' - | '\u0f71'..'\u0f84' - | '\u0f86'..'\u0f8b' - | '\u0f90'..'\u0f97' - | '\u0f99'..'\u0fbc' - | '\u0fc6' - | '\u1000'..'\u1021' - | '\u1023'..'\u1027' - | '\u1029'..'\u102a' - | '\u102c'..'\u1032' - | '\u1036'..'\u1039' - | '\u1040'..'\u1049' - | '\u1050'..'\u1059' - | '\u10a0'..'\u10c5' - | '\u10d0'..'\u10f8' - | '\u1100'..'\u1159' - | '\u115f'..'\u11a2' - | '\u11a8'..'\u11f9' - | '\u1200'..'\u1206' - | '\u1208'..'\u1246' - | '\u1248' - | '\u124a'..'\u124d' - | '\u1250'..'\u1256' - | '\u1258' - | '\u125a'..'\u125d' - | '\u1260'..'\u1286' - | '\u1288' - | '\u128a'..'\u128d' - | '\u1290'..'\u12ae' - | '\u12b0' - | '\u12b2'..'\u12b5' - | '\u12b8'..'\u12be' - | '\u12c0' - | '\u12c2'..'\u12c5' - | '\u12c8'..'\u12ce' - | '\u12d0'..'\u12d6' - | '\u12d8'..'\u12ee' - | '\u12f0'..'\u130e' - | '\u1310' - | '\u1312'..'\u1315' - | '\u1318'..'\u131e' - | '\u1320'..'\u1346' - | '\u1348'..'\u135a' - | '\u1369'..'\u1371' - | '\u13a0'..'\u13f4' - | '\u1401'..'\u166c' - | '\u166f'..'\u1676' - | '\u1681'..'\u169a' - | '\u16a0'..'\u16ea' - | '\u16ee'..'\u16f0' - | '\u1700'..'\u170c' - | '\u170e'..'\u1714' - | '\u1720'..'\u1734' - | '\u1740'..'\u1753' - | '\u1760'..'\u176c' - | '\u176e'..'\u1770' - | '\u1772'..'\u1773' - | '\u1780'..'\u17d3' - | '\u17d7' - | '\u17db'..'\u17dd' - | '\u17e0'..'\u17e9' - | '\u180b'..'\u180d' - | '\u1810'..'\u1819' - | '\u1820'..'\u1877' - | '\u1880'..'\u18a9' - | '\u1900'..'\u191c' - | '\u1920'..'\u192b' - | '\u1930'..'\u193b' - | '\u1946'..'\u196d' - | '\u1970'..'\u1974' - | '\u1d00'..'\u1d6b' - | '\u1e00'..'\u1e9b' - | '\u1ea0'..'\u1ef9' - | '\u1f00'..'\u1f15' - | '\u1f18'..'\u1f1d' - | '\u1f20'..'\u1f45' - | '\u1f48'..'\u1f4d' - | '\u1f50'..'\u1f57' - | '\u1f59' - | '\u1f5b' - | '\u1f5d' - | '\u1f5f'..'\u1f7d' - | '\u1f80'..'\u1fb4' - | '\u1fb6'..'\u1fbc' - | '\u1fbe' - | '\u1fc2'..'\u1fc4' - | '\u1fc6'..'\u1fcc' - | '\u1fd0'..'\u1fd3' - | '\u1fd6'..'\u1fdb' - | '\u1fe0'..'\u1fec' - | '\u1ff2'..'\u1ff4' - | '\u1ff6'..'\u1ffc' - | '\u200c'..'\u200f' - | '\u202a'..'\u202e' - | '\u203f'..'\u2040' - | '\u2054' - | '\u2060'..'\u2063' - | '\u206a'..'\u206f' - | '\u2071' - | '\u207f' - | '\u20a0'..'\u20b1' - | '\u20d0'..'\u20dc' - | '\u20e1' - | '\u20e5'..'\u20ea' - | '\u2102' - | '\u2107' - | '\u210a'..'\u2113' - | '\u2115' - | '\u2119'..'\u211d' - | '\u2124' - | '\u2126' - | '\u2128' - | '\u212a'..'\u212d' - | '\u212f'..'\u2131' - | '\u2133'..'\u2139' - | '\u213d'..'\u213f' - | '\u2145'..'\u2149' - | '\u2160'..'\u2183' - | '\u3005'..'\u3007' - | '\u3021'..'\u302f' - | '\u3031'..'\u3035' - | '\u3038'..'\u303c' - | '\u3041'..'\u3096' - | '\u3099'..'\u309a' - | '\u309d'..'\u309f' - | '\u30a1'..'\u30ff' - | '\u3105'..'\u312c' - | '\u3131'..'\u318e' - | '\u31a0'..'\u31b7' - | '\u31f0'..'\u31ff' - | '\u3400'..'\u4db5' - | '\u4e00'..'\u9fa5' - | '\ua000'..'\ua48c' - | '\uac00'..'\ud7a3' - | '\uf900'..'\ufa2d' - | '\ufa30'..'\ufa6a' - | '\ufb00'..'\ufb06' - | '\ufb13'..'\ufb17' - | '\ufb1d'..'\ufb28' - | '\ufb2a'..'\ufb36' - | '\ufb38'..'\ufb3c' - | '\ufb3e' - | '\ufb40'..'\ufb41' - | '\ufb43'..'\ufb44' - | '\ufb46'..'\ufbb1' - | '\ufbd3'..'\ufd3d' - | '\ufd50'..'\ufd8f' - | '\ufd92'..'\ufdc7' - | '\ufdf0'..'\ufdfc' - | '\ufe00'..'\ufe0f' - | '\ufe20'..'\ufe23' - | '\ufe33'..'\ufe34' - | '\ufe4d'..'\ufe4f' - | '\ufe69' - | '\ufe70'..'\ufe74' - | '\ufe76'..'\ufefc' - | '\ufeff' - | '\uff04' - | '\uff10'..'\uff19' - | '\uff21'..'\uff3a' - | '\uff3f' - | '\uff41'..'\uff5a' - | '\uff65'..'\uffbe' - | '\uffc2'..'\uffc7' - | '\uffca'..'\uffcf' - | '\uffd2'..'\uffd7' - | '\uffda'..'\uffdc' - | '\uffe0'..'\uffe1' - | '\uffe5'..'\uffe6' - | '\ufff9'..'\ufffb' - | ('\ud800'..'\udbff') ('\udc00'..'\udfff') - ; diff --git a/tool/playground/YangJavaParser.g b/tool/playground/YangJavaParser.g deleted file mode 100644 index 3e3bba2cc..000000000 --- a/tool/playground/YangJavaParser.g +++ /dev/null @@ -1,1238 +0,0 @@ -/* - [The "BSD licence"] - Copyright (c) 2007-2008 Terence Parr - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. The name of the author may not be used to endorse or promote products - derived from this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -/* - * This file is modified by Yang Jiang (yang.jiang.z@gmail.com), taken from the original - * java grammar in www.antlr.org, with the goal to provide a standard ANTLR grammar - * for java, as well as an implementation to construct the same AST trees as javac does. - * - * The major changes of this version as compared to the original version include: - * 1) Top level rules are changed to include all of their sub-components. - * For example, the rule - * - * classOrInterfaceDeclaration - * : classOrInterfaceModifiers (classDeclaration | interfaceDeclaration) - * ; - * - * is changed to - * - * classOrInterfaceDeclaration - * : classDeclaration | interfaceDeclaration - * ; - * - * with classOrInterfaceModifiers been moved inside classDeclaration and - * interfaceDeclaration. - * - * 2) The original version is not quite clear on certain rules like memberDecl, - * where it mixed the styles of listing of top level rules and listing of sub rules. - * - * memberDecl - * : genericMethodOrConstructorDecl - * | memberDeclaration - * | 'void' Identifier voidMethodDeclaratorRest - * | Identifier constructorDeclaratorRest - * | interfaceDeclaration - * | classDeclaration - * ; - * - * This is changed to a - * - * memberDecl - * : fieldDeclaration - * | methodDeclaration - * | classDeclaration - * | interfaceDeclaration - * ; - * by folding similar rules into single rule. - * - * 3) Some syntactical predicates are added for efficiency, although this is not necessary - * for correctness. - * - * 4) Lexer part is rewritten completely to construct tokens needed for the parser. - * - * 5) This grammar adds more source level support - * - * - * This grammar also adds bug fixes. - * - * 1) Adding typeArguments to superSuffix to alHexSignificandlow input like - * super.method() - * - * 2) Adding typeArguments to innerCreator to allow input like - * new Type1().new Type2() - * - * 3) conditionalExpression is changed to - * conditionalExpression - * : conditionalOrExpression ( '?' expression ':' conditionalExpression )? - * ; - * to accept input like - * true?1:2=3 - * - * Note: note this is by no means a valid input, by the grammar should be able to parse - * this as - * (true?1:2)=3 - * rather than - * true?1:(2=3) - * - * - * Know problems: - * Won't pass input containing unicode sequence like this - * char c = '\uffff' - * String s = "\uffff"; - * Because Antlr does not treat '\uffff' as an valid char. This will be fixed in the next Antlr - * release. [Fixed in Antlr-3.1.1] - * - * Things to do: - * More effort to make this grammar faster. - * Error reporting/recovering. - * - * - * NOTE: If you try to compile this file from command line and Antlr gives an exception - * like error message while compiling, add option - * -Xconversiontimeout 100000 - * to the command line. - * If it still doesn't work or the compilation process - * takes too long, try to comment out the following two lines: - * | {isValidSurrogateIdentifierStart((char)input.LT(1), (char)input.LT(2))}?=>('\ud800'..'\udbff') ('\udc00'..'\udfff') - * | {isValidSurrogateIdentifierPart((char)input.LT(1), (char)input.LT(2))}?=>('\ud800'..'\udbff') ('\udc00'..'\udfff') - * - * - * Below are comments found in the original version. - */ - - -/** A Java 1.5 grammar for ANTLR v3 derived from the spec - * - * This is a very close representation of the spec; the changes - * are comestic (remove left recursion) and also fixes (the spec - * isn't exactly perfect). I have run this on the 1.4.2 source - * and some nasty looking enums from 1.5, but have not really - * tested for 1.5 compatibility. - * - * I built this with: java -Xmx100M org.antlr.Tool java.g - * and got two errors that are ok (for now): - * java.g:691:9: Decision can match input such as - * "'0'..'9'{'E', 'e'}{'+', '-'}'0'..'9'{'D', 'F', 'd', 'f'}" - * using multiple alternatives: 3, 4 - * As a result, alternative(s) 4 were disabled for that input - * java.g:734:35: Decision can match input such as "{'$', 'A'..'Z', - * '_', 'a'..'z', '\u00C0'..'\u00D6', '\u00D8'..'\u00F6', - * '\u00F8'..'\u1FFF', '\u3040'..'\u318F', '\u3300'..'\u337F', - * '\u3400'..'\u3D2D', '\u4E00'..'\u9FFF', '\uF900'..'\uFAFF'}" - * using multiple alternatives: 1, 2 - * As a result, alternative(s) 2 were disabled for that input - * - * You can turn enum on/off as a keyword :) - * - * Version 1.0 -- initial release July 5, 2006 (requires 3.0b2 or higher) - * - * Primary author: Terence Parr, July 2006 - * - * Version 1.0.1 -- corrections by Koen Vanderkimpen & Marko van Dooren, - * October 25, 2006; - * fixed normalInterfaceDeclaration: now uses typeParameters instead - * of typeParameter (according to JLS, 3rd edition) - * fixed castExpression: no longer allows expression next to type - * (according to semantics in JLS, in contrast with syntax in JLS) - * - * Version 1.0.2 -- Terence Parr, Nov 27, 2006 - * java spec I built this from had some bizarre for-loop control. - * Looked weird and so I looked elsewhere...Yep, it's messed up. - * simplified. - * - * Version 1.0.3 -- Chris Hogue, Feb 26, 2007 - * Factored out an annotationName rule and used it in the annotation rule. - * Not sure why, but typeName wasn't recognizing references to inner - * annotations (e.g. @InterfaceName.InnerAnnotation()) - * Factored out the elementValue section of an annotation reference. Created - * elementValuePair and elementValuePairs rules, then used them in the - * annotation rule. Allows it to recognize annotation references with - * multiple, comma separated attributes. - * Updated elementValueArrayInitializer so that it allows multiple elements. - * (It was only allowing 0 or 1 element). - * Updated localVariableDeclaration to allow annotations. Interestingly the JLS - * doesn't appear to indicate this is legal, but it does work as of at least - * JDK 1.5.0_06. - * Moved the Identifier portion of annotationTypeElementRest to annotationMethodRest. - * Because annotationConstantRest already references variableDeclarator which - * has the Identifier portion in it, the parser would fail on constants in - * annotation definitions because it expected two identifiers. - * Added optional trailing ';' to the alternatives in annotationTypeElementRest. - * Wouldn't handle an inner interface that has a trailing ';'. - * Swapped the expression and type rule reference order in castExpression to - * make it check for genericized casts first. It was failing to recognize a - * statement like "Class TYPE = (Class)...;" because it was seeing - * 'Class'. - * Changed createdName to use typeArguments instead of nonWildcardTypeArguments. - * - * Changed the 'this' alternative in primary to allow 'identifierSuffix' rather than - * just 'arguments'. The case it couldn't handle was a call to an explicit - * generic method invocation (e.g. this.doSomething()). Using identifierSuffix - * may be overly aggressive--perhaps should create a more constrained thisSuffix rule? - * - * Version 1.0.4 -- Hiroaki Nakamura, May 3, 2007 - * - * Fixed formalParameterDecls, localVariableDeclaration, forInit, - * and forVarControl to use variableModifier* not 'final'? (annotation)? - * - * Version 1.0.5 -- Terence, June 21, 2007 - * --a[i].foo didn't work. Fixed unaryExpression - * - * Version 1.0.6 -- John Ridgway, March 17, 2008 - * Made "assert" a switchable keyword like "enum". - * Fixed compilationUnit to disallow "annotation importDeclaration ...". - * Changed "Identifier ('.' Identifier)*" to "qualifiedName" in more - * places. - * Changed modifier* and/or variableModifier* to classOrInterfaceModifiers, - * modifiers or variableModifiers, as appropriate. - * Renamed "bound" to "typeBound" to better match language in the JLS. - * Added "memberDeclaration" which rewrites to methodDeclaration or - * fieldDeclaration and pulled type into memberDeclaration. So we parse - * type and then move on to decide whether we're dealing with a field - * or a method. - * Modified "constructorDeclaration" to use "constructorBody" instead of - * "methodBody". constructorBody starts with explicitConstructorInvocation, - * then goes on to blockStatement*. Pulling explicitConstructorInvocation - * out of expressions allowed me to simplify "primary". - * Changed variableDeclarator to simplify it. - * Changed type to use classOrInterfaceType, thus simplifying it; of course - * I then had to add classOrInterfaceType, but it is used in several - * places. - * Fixed annotations, old version allowed "@X(y,z)", which is illegal. - * Added optional comma to end of "elementValueArrayInitializer"; as per JLS. - * Changed annotationTypeElementRest to use normalClassDeclaration and - * normalInterfaceDeclaration rather than classDeclaration and - * interfaceDeclaration, thus getting rid of a couple of grammar ambiguities. - * Split localVariableDeclaration into localVariableDeclarationStatement - * (includes the terminating semi-colon) and localVariableDeclaration. - * This allowed me to use localVariableDeclaration in "forInit" clauses, - * simplifying them. - * Changed switchBlockStatementGroup to use multiple labels. This adds an - * ambiguity, but if one uses appropriately greedy parsing it yields the - * parse that is closest to the meaning of the switch statement. - * Renamed "forVarControl" to "enhancedForControl" -- JLS language. - * Added semantic predicates to test for shift operations rather than other - * things. Thus, for instance, the string "< <" will never be treated - * as a left-shift operator. - * In "creator" we rule out "nonWildcardTypeArguments" on arrayCreation, - * which are illegal. - * Moved "nonWildcardTypeArguments into innerCreator. - * Removed 'super' superSuffix from explicitGenericInvocation, since that - * is only used in explicitConstructorInvocation at the beginning of a - * constructorBody. (This is part of the simplification of expressions - * mentioned earlier.) - * Simplified primary (got rid of those things that are only used in - * explicitConstructorInvocation). - * Lexer -- removed "Exponent?" from FloatingPointLiteral choice 4, since it - * led to an ambiguity. - * - * This grammar successfully parses every .java file in the JDK 1.5 source - * tree (excluding those whose file names include '-', which are not - * valid Java compilation units). - * - * Known remaining problems: - * "Letter" and "JavaIDDigit" are wrong. The actual specification of - * "Letter" should be "a character for which the method - * Character.isJavaIdentifierStart(int) returns true." A "Java - * letter-or-digit is a character for which the method - * Character.isJavaIdentifierPart(int) returns true." - */ - - - /* - This is a merged file, containing two versions of the Java.g grammar. - To extract a version from the file, run the ver.jar with the command provided below. - - Version 1 - tree building version, with all source level support, error recovery etc. - This is the version for compiler grammar workspace. - This version can be extracted by invoking: - java -cp ver.jar Main 1 true true true true true Java.g - - Version 2 - clean version, with no source leve support, no error recovery, no predicts, - assumes 1.6 level, works in Antlrworks. - This is the version for Alex. - This version can be extracted by invoking: - java -cp ver.jar Main 2 false false false false false Java.g -*/ - -parser grammar YangJavaParser; - -options { - tokenVocab = YangJavaLexer; -} - -/******************************************************************************************** - Parser section -*********************************************************************************************/ - -compilationUnit - : ( (annotations - )? - packageDeclaration - )? - (importDeclaration - )* - (typeDeclaration - )* - ; - -packageDeclaration - : 'package' qualifiedName - ';' - ; - -importDeclaration - : 'import' - ('static' - )? - IDENTIFIER '.' '*' - ';' - | 'import' - ('static' - )? - IDENTIFIER - ('.' IDENTIFIER - )+ - ('.' '*' - )? - ';' - ; - -qualifiedImportName - : IDENTIFIER - ('.' IDENTIFIER - )* - ; - -typeDeclaration - : classOrInterfaceDeclaration - | ';' - ; - -classOrInterfaceDeclaration - : classDeclaration - | interfaceDeclaration - ; - - -modifiers - : - ( annotation - | 'public' - | 'protected' - | 'private' - | 'static' - | 'abstract' - | 'final' - | 'native' - | 'synchronized' - | 'transient' - | 'volatile' - | 'strictfp' - )* - ; - - -variableModifiers - : ( 'final' - | annotation - )* - ; - - -classDeclaration - : normalClassDeclaration - | enumDeclaration - ; - -normalClassDeclaration - : modifiers 'class' IDENTIFIER - (typeParameters - )? - ('extends' type - )? - ('implements' typeList - )? - classBody - ; - - -typeParameters - : '<' - typeParameter - (',' typeParameter - )* - '>' - ; - -typeParameter - : IDENTIFIER - ('extends' typeBound - )? - ; - - -typeBound - : type - ('&' type - )* - ; - - -enumDeclaration - : modifiers - ('enum' - ) - IDENTIFIER - ('implements' typeList - )? - enumBody - ; - - -enumBody - : '{' - (enumConstants - )? - ','? - (enumBodyDeclarations - )? - '}' - ; - -enumConstants - : enumConstant - (',' enumConstant - )* - ; - -/** - * NOTE: here differs from the javac grammar, missing TypeArguments. - * EnumeratorDeclaration = AnnotationsOpt [TypeArguments] IDENTIFIER [ Arguments ] [ "{" ClassBody "}" ] - */ -enumConstant - : (annotations - )? - IDENTIFIER - (arguments - )? - (classBody - )? - /* TODO: $GScope::name = names.empty. enum constant body is actually - an anonymous class, where constructor isn't allowed, have to add this check*/ - ; - -enumBodyDeclarations - : ';' - (classBodyDeclaration - )* - ; - -interfaceDeclaration - : normalInterfaceDeclaration - | annotationTypeDeclaration - ; - -normalInterfaceDeclaration - : modifiers 'interface' IDENTIFIER - (typeParameters - )? - ('extends' typeList - )? - interfaceBody - ; - -typeList - : type - (',' type - )* - ; - -classBody - : '{' - (classBodyDeclaration - )* - '}' - ; - -interfaceBody - : '{' - interfaceBodyDeclaration* - '}' - ; - -classBodyDeclaration - : ';' - | ('static' - )? - block - | memberDecl - ; - -memberDecl - : fieldDeclaration - | methodDeclaration - | classDeclaration - | interfaceDeclaration - ; - - -methodDeclaration - : - /* For constructor, return type is null, name is 'init' */ - modifiers - (typeParameters - )? - IDENTIFIER - formalParameters - ('throws' qualifiedNameList - )? - '{' - (explicitConstructorInvocation - )? - (blockStatement - )* - '}' - | modifiers - (typeParameters - )? - (type - | 'void' - ) - IDENTIFIER - formalParameters - ('[' ']' - )* - ('throws' qualifiedNameList - )? - ( - block - | ';' - ) - ; - - -fieldDeclaration - : modifiers - type - variableDeclarator - (',' variableDeclarator - )* - ';' - ; - -variableDeclarator - : IDENTIFIER - ('[' ']' - )* - ('=' variableInitializer - )? - ; - -/** - *TODO: add predicates - */ -interfaceBodyDeclaration - : - interfaceFieldDeclaration - | interfaceMethodDeclaration - | interfaceDeclaration - | classDeclaration - | ';' - ; - -interfaceMethodDeclaration - : modifiers - (typeParameters - )? - (type - |'void' - ) - IDENTIFIER - formalParameters - ('[' ']' - )* - ('throws' qualifiedNameList - )? ';' - ; - -/** - * NOTE, should not use variableDeclarator here, as it doesn't necessary require - * an initializer, while an interface field does, or judge by the returned value. - * But this gives better diagnostic message, or antlr won't predict this rule. - */ -interfaceFieldDeclaration - : modifiers type variableDeclarator - (',' variableDeclarator - )* - ';' - ; - - -type - : classOrInterfaceType - ('[' ']' - )* - | primitiveType - ('[' ']' - )* - ; - - -classOrInterfaceType - : IDENTIFIER - (typeArguments - )? - ('.' IDENTIFIER - (typeArguments - )? - )* - ; - -primitiveType - : 'boolean' - | 'char' - | 'byte' - | 'short' - | 'int' - | 'long' - | 'float' - | 'double' - ; - -typeArguments - : '<' typeArgument - (',' typeArgument - )* - '>' - ; - -typeArgument - : type - | '?' - ( - ('extends' - |'super' - ) - type - )? - ; - -qualifiedNameList - : qualifiedName - (',' qualifiedName - )* - ; - -formalParameters - : '(' - (formalParameterDecls - )? - ')' - ; - -formalParameterDecls - : ellipsisParameterDecl - | normalParameterDecl - (',' normalParameterDecl - )* - | (normalParameterDecl - ',' - )+ - ellipsisParameterDecl - ; - -normalParameterDecl - : variableModifiers type IDENTIFIER - ('[' ']' - )* - ; - -ellipsisParameterDecl - : variableModifiers - type '...' - IDENTIFIER - ; - - -explicitConstructorInvocation - : (nonWildcardTypeArguments - )? //NOTE: the position of Identifier 'super' is set to the type args position here - ('this' - |'super' - ) - arguments ';' - - | primary - '.' - (nonWildcardTypeArguments - )? - 'super' - arguments ';' - ; - -qualifiedName - : IDENTIFIER - ('.' IDENTIFIER - )* - ; - -annotations - : (annotation - )+ - ; - -/** - * Using an annotation. - * '@' is flaged in modifier - */ -annotation - : '@' qualifiedName - ( '(' - ( elementValuePairs - | elementValue - )? - ')' - )? - ; - -elementValuePairs - : elementValuePair - (',' elementValuePair - )* - ; - -elementValuePair - : IDENTIFIER '=' elementValue - ; - -elementValue - : conditionalExpression - | annotation - | elementValueArrayInitializer - ; - -elementValueArrayInitializer - : '{' - (elementValue - (',' elementValue - )* - )? (',')? '}' - ; - - -/** - * Annotation declaration. - */ -annotationTypeDeclaration - : modifiers '@' - 'interface' - IDENTIFIER - annotationTypeBody - ; - - -annotationTypeBody - : '{' - (annotationTypeElementDeclaration - )* - '}' - ; - -/** - * NOTE: here use interfaceFieldDeclaration for field declared inside annotation. they are sytactically the same. - */ -annotationTypeElementDeclaration - : annotationMethodDeclaration - | interfaceFieldDeclaration - | normalClassDeclaration - | normalInterfaceDeclaration - | enumDeclaration - | annotationTypeDeclaration - | ';' - ; - -annotationMethodDeclaration - : modifiers type IDENTIFIER - '(' ')' ('default' elementValue - )? - ';' - ; - -block - : '{' - (blockStatement - )* - '}' - ; - -/* -staticBlock returns [JCBlock tree] - @init { - ListBuffer stats = new ListBuffer(); - int pos = ((AntlrJavacToken) $start).getStartIndex(); - } - @after { - $tree = T.at(pos).Block(Flags.STATIC, stats.toList()); - pu.storeEnd($tree, $stop); - // construct a dummy static modifiers for end position - pu.storeEnd(T.at(pos).Modifiers(Flags.STATIC, com.sun.tools.javac.util.List.nil()),$st); - } - : st_1='static' '{' - (blockStatement - { - if ($blockStatement.tree == null) { - stats.appendList($blockStatement.list); - } else { - stats.append($blockStatement.tree); - } - } - )* '}' - ; -*/ -blockStatement - : localVariableDeclarationStatement - | classOrInterfaceDeclaration - | statement - ; - - -localVariableDeclarationStatement - : localVariableDeclaration - ';' - ; - -localVariableDeclaration - : variableModifiers type - variableDeclarator - (',' variableDeclarator - )* - ; - -statement - : block - - | ('assert' - ) - expression (':' expression)? ';' - | 'assert' expression (':' expression)? ';' - | 'if' parExpression statement ('else' statement)? - | forstatement - | 'while' parExpression statement - | 'do' statement 'while' parExpression ';' - | trystatement - | 'switch' parExpression '{' switchBlockStatementGroups '}' - | 'synchronized' parExpression block - | 'return' (expression )? ';' - | 'throw' expression ';' - | 'break' - (IDENTIFIER - )? ';' - | 'continue' - (IDENTIFIER - )? ';' - | expression ';' - | IDENTIFIER ':' statement - | ';' - - ; - -switchBlockStatementGroups - : (switchBlockStatementGroup )* - ; - -switchBlockStatementGroup - : - switchLabel - (blockStatement - )* - ; - -switchLabel - : 'case' expression ':' - | 'default' ':' - ; - - -trystatement - : 'try' block - ( catches 'finally' block - | catches - | 'finally' block - ) - ; - -catches - : catchClause - (catchClause - )* - ; - -catchClause - : 'catch' '(' formalParameter - ')' block - ; - -formalParameter - : variableModifiers type IDENTIFIER - ('[' ']' - )* - ; - -forstatement - : - // enhanced for loop - 'for' '(' variableModifiers type IDENTIFIER ':' - expression ')' statement - - // normal for loop - | 'for' '(' - (forInit - )? ';' - (expression - )? ';' - (expressionList - )? ')' statement - ; - -forInit - : localVariableDeclaration - | expressionList - ; - -parExpression - : '(' expression ')' - ; - -expressionList - : expression - (',' expression - )* - ; - - -expression - : conditionalExpression - (assignmentOperator expression - )? - ; - - -assignmentOperator - : '=' - | '+=' - | '-=' - | '*=' - | '/=' - | '&=' - | '|=' - | '^=' - | '%=' - | '<' '<' '=' - | '>' '>' '>' '=' - | '>' '>' '=' - ; - - -conditionalExpression - : conditionalOrExpression - ('?' expression ':' conditionalExpression - )? - ; - -conditionalOrExpression - : conditionalAndExpression - ('||' conditionalAndExpression - )* - ; - -conditionalAndExpression - : inclusiveOrExpression - ('&&' inclusiveOrExpression - )* - ; - -inclusiveOrExpression - : exclusiveOrExpression - ('|' exclusiveOrExpression - )* - ; - -exclusiveOrExpression - : andExpression - ('^' andExpression - )* - ; - -andExpression - : equalityExpression - ('&' equalityExpression - )* - ; - -equalityExpression - : instanceOfExpression - ( - ( '==' - | '!=' - ) - instanceOfExpression - )* - ; - -instanceOfExpression - : relationalExpression - ('instanceof' type - )? - ; - -relationalExpression - : shiftExpression - (relationalOp shiftExpression - )* - ; - -relationalOp - : '<' '=' - | '>' '=' - | '<' - | '>' - ; - -shiftExpression - : additiveExpression - (shiftOp additiveExpression - )* - ; - - -shiftOp - : '<' '<' - | '>' '>' '>' - | '>' '>' - ; - - -additiveExpression - : multiplicativeExpression - ( - ( '+' - | '-' - ) - multiplicativeExpression - )* - ; - -multiplicativeExpression - : - unaryExpression - ( - ( '*' - | '/' - | '%' - ) - unaryExpression - )* - ; - -/** - * NOTE: for '+' and '-', if the next token is int or long interal, then it's not a unary expression. - * it's a literal with signed value. INTLTERAL AND LONG LITERAL are added here for this. - */ -unaryExpression - : '+' unaryExpression - | '-' unaryExpression - | '++' unaryExpression - | '--' unaryExpression - | unaryExpressionNotPlusMinus - ; - -unaryExpressionNotPlusMinus - : '~' unaryExpression - | '!' unaryExpression - | castExpression - | primary - (selector - )* - ( '++' - | '--' - )? - ; - -castExpression - : '(' primitiveType ')' unaryExpression - | '(' type ')' unaryExpressionNotPlusMinus - ; - -/** - * have to use scope here, parameter passing isn't well supported in antlr. - */ -primary - : parExpression - | 'this' - ('.' IDENTIFIER - )* - (identifierSuffix - )? - | IDENTIFIER - ('.' IDENTIFIER - )* - (identifierSuffix - )? - | 'super' - superSuffix - | literal - | creator - | primitiveType - ('[' ']' - )* - '.' 'class' - | 'void' '.' 'class' - ; - - -superSuffix - : arguments - | '.' (typeArguments - )? - IDENTIFIER - (arguments - )? - ; - - -identifierSuffix - : ('[' ']' - )+ - '.' 'class' - | ('[' expression ']' - )+ - | arguments - | '.' 'class' - | '.' nonWildcardTypeArguments IDENTIFIER arguments - | '.' 'this' - | '.' 'super' arguments - | innerCreator - ; - - -selector - : '.' IDENTIFIER - (arguments - )? - | '.' 'this' - | '.' 'super' - superSuffix - | innerCreator - | '[' expression ']' - ; - -creator - : 'new' nonWildcardTypeArguments classOrInterfaceType classCreatorRest - | 'new' classOrInterfaceType classCreatorRest - | arrayCreator - ; - -arrayCreator - : 'new' createdName - '[' ']' - ('[' ']' - )* - arrayInitializer - - | 'new' createdName - '[' expression - ']' - ( '[' expression - ']' - )* - ('[' ']' - )* - ; - -variableInitializer - : arrayInitializer - | expression - ; - -arrayInitializer - : '{' - (variableInitializer - (',' variableInitializer - )* - )? - (',')? - '}' //Yang's fix, position change. - ; - - -createdName - : classOrInterfaceType - | primitiveType - ; - -innerCreator - : '.' 'new' - (nonWildcardTypeArguments - )? - IDENTIFIER - (typeArguments - )? - classCreatorRest - ; - - -classCreatorRest - : arguments - (classBody - )? - ; - - -nonWildcardTypeArguments - : '<' typeList - '>' - ; - -arguments - : '(' (expressionList - )? ')' - ; - -literal - : INTLITERAL - | LONGLITERAL - | FLOATLITERAL - | DOUBLELITERAL - | CHARLITERAL - | STRINGLITERAL - | TRUE - | FALSE - | NULL - ; -