diff --git a/tool/playground/JavaParserLR.g4 b/tool/playground/JavaParserLR.g4 index 2e54ef940..a8d08f701 100644 --- a/tool/playground/JavaParserLR.g4 +++ b/tool/playground/JavaParserLR.g4 @@ -1,5 +1,4 @@ -ūparser grammar JavaParserLR; -options {tokenVocab=JavaLexer;} +grammar JavaParserLR; // starting point for parsing a java file /* The annotations are separated out to make parsing faster, but must be associated with @@ -537,15 +536,16 @@ expression : '(' expression ')' | 'this' | 'super' - | integerLiteral + | literal | Identifier | type '.' 'class' | expression '.' Identifier | expression '.' 'this' | expression '.' 'super' '(' expressionList? ')' | expression '.' 'new' Identifier '(' expressionList? ')' - | creator -// | 'new' type ( '(' expressionList? ')' | ('[' expression ']')+) + | expression '.' 'super' '.' Identifier arguments? + | expression '.' explicitGenericInvocation + | 'new' creator | expression '[' expression ']' | '(' type ')' expression | expression ('++' | '--') @@ -554,10 +554,10 @@ expression | ('~'|'!') expression | expression ('*'|'/'|'%') expression | expression ('+'|'-') expression - | expression ('<<' | '>>>' | '>>') expression - | expression ('<=' | '>=' | '>' | '<') expression - | expression 'instanceof' expression - | expression ('==' | '=') expression + | expression ('<' '<' | '>' '>' '>' | '>' '>') expression + | expression ('<' '=' | '>' '=' | '>' | '<') expression + | expression 'instanceof' type + | expression ('==' | '!=') expression | expression '&' expression | expression '^' expression | expression '|' expression @@ -565,7 +565,7 @@ expression | expression '||' expression | expression '?' expression ':' expression | expression - ('=' + ('^=' |'+=' |'-=' |'*=' @@ -573,9 +573,11 @@ expression |'&=' |'|=' |'=' +/* |'>' '>' '=' |'>' '>' '>' '=' |'<' '<' '=' + */ |'%=' ) expression @@ -595,6 +597,10 @@ innerCreator : nonWildcardTypeArguments? Identifier classCreatorRest ; +explicitGenericInvocation + : nonWildcardTypeArguments Identifier arguments + ; + arrayCreatorRest : '[' ( ']' ('[' ']')* arrayInitializer @@ -613,3 +619,119 @@ nonWildcardTypeArguments arguments : '(' expressionList? ')' ; + +// LEXER + +HexLiteral : '0' ('x'|'X') HexDigit+ IntegerTypeSuffix? ; + +DecimalLiteral : ('0' | '1'..'9' '0'..'9'*) IntegerTypeSuffix? ; + +OctalLiteral : '0' ('0'..'7')+ IntegerTypeSuffix? ; + +fragment +HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ; + +fragment +IntegerTypeSuffix : ('l'|'L') ; + +FloatingPointLiteral + : ('0'..'9')+ '.' ('0'..'9')* Exponent? FloatTypeSuffix? + | '.' ('0'..'9')+ Exponent? FloatTypeSuffix? + | ('0'..'9')+ Exponent FloatTypeSuffix? + | ('0'..'9')+ FloatTypeSuffix + ; + +fragment +Exponent : ('e'|'E') ('+'|'-')? ('0'..'9')+ ; + +fragment +FloatTypeSuffix : ('f'|'F'|'d'|'D') ; + +CharacterLiteral + : '\'' ( EscapeSequence | ~('\''|'\\') ) '\'' + ; + +StringLiteral + : '"' ( EscapeSequence | ~('\\'|'"') )* '"' + ; + +fragment +EscapeSequence + : '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') + | UnicodeEscape + | OctalEscape + ; + +fragment +OctalEscape + : '\\' ('0'..'3') ('0'..'7') ('0'..'7') + | '\\' ('0'..'7') ('0'..'7') + | '\\' ('0'..'7') + ; + +fragment +UnicodeEscape + : '\\' 'u' HexDigit HexDigit HexDigit HexDigit + ; + +ENUM: 'enum' {if (!enumIsKeyword) $type=Identifier;} + ; + +ASSERT + : 'assert' {if (!assertIsKeyword) $type=Identifier;} + ; + +Identifier + : Letter (Letter|JavaIDDigit)* + ; + +/**I found this char range in JavaCC's grammar, but Letter and Digit overlap. + Still works, but... + */ +fragment +Letter + : '\u0024' | + '\u0041'..'\u005a' | + '\u005f' | + '\u0061'..'\u007a' | + '\u00c0'..'\u00d6' | + '\u00d8'..'\u00f6' | + '\u00f8'..'\u00ff' | + '\u0100'..'\u1fff' | + '\u3040'..'\u318f' | + '\u3300'..'\u337f' | + '\u3400'..'\u3d2d' | + '\u4e00'..'\u9fff' | + '\uf900'..'\ufaff' + ; + +fragment +JavaIDDigit + : '\u0030'..'\u0039' | + '\u0660'..'\u0669' | + '\u06f0'..'\u06f9' | + '\u0966'..'\u096f' | + '\u09e6'..'\u09ef' | + '\u0a66'..'\u0a6f' | + '\u0ae6'..'\u0aef' | + '\u0b66'..'\u0b6f' | + '\u0be7'..'\u0bef' | + '\u0c66'..'\u0c6f' | + '\u0ce6'..'\u0cef' | + '\u0d66'..'\u0d6f' | + '\u0e50'..'\u0e59' | + '\u0ed0'..'\u0ed9' | + '\u1040'..'\u1049' + ; + +WS : (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;} + ; + +COMMENT + : '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;} + ; + +LINE_COMMENT + : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} + ; + diff --git a/tool/playground/TestJavaLR.java b/tool/playground/TestJavaLR.java index 97f0b6ff0..84fc2fbac 100644 --- a/tool/playground/TestJavaLR.java +++ b/tool/playground/TestJavaLR.java @@ -1,43 +1,13 @@ -/* - [The "BSD license"] - Copyright (c) 2011 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. - */ - import org.antlr.runtime.debug.BlankDebugEventListener; import org.antlr.v4.runtime.ANTLRFileStream; import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.Token; 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.g - */ class TestJavaLR { public static long lexerTime = 0; public static boolean profile = false; @@ -131,12 +101,14 @@ class TestJavaLR { // Create a parser that reads from the scanner if ( parser==null ) { parser = new JavaParserLR(tokens); + parser.setBuildParseTree(true); // parser.setErrorHandler(new BailErrorStrategy()); // parser.getInterpreter().setContextSensitive(true); } parser.setTokenStream(tokens); // start parsing at the compilationUnit rule - parser.compilationUnit(); + ParserRuleContext tree = parser.compilationUnit(); + tree.inspect(parser); //System.err.println("finished "+f); // System.out.println("cache size = "+DefaultErrorStrategy.cache.size()); }