forked from jasder/antlr
tweak
[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 9469]
This commit is contained in:
parent
181611da94
commit
bb73ad341b
|
@ -1,5 +1,4 @@
|
||||||
ûparser grammar JavaParserLR;
|
grammar JavaParserLR;
|
||||||
options {tokenVocab=JavaLexer;}
|
|
||||||
|
|
||||||
// starting point for parsing a java file
|
// starting point for parsing a java file
|
||||||
/* The annotations are separated out to make parsing faster, but must be associated with
|
/* The annotations are separated out to make parsing faster, but must be associated with
|
||||||
|
@ -537,15 +536,16 @@ expression
|
||||||
: '(' expression ')'
|
: '(' expression ')'
|
||||||
| 'this'
|
| 'this'
|
||||||
| 'super'
|
| 'super'
|
||||||
| integerLiteral
|
| literal
|
||||||
| Identifier
|
| Identifier
|
||||||
| type '.' 'class'
|
| type '.' 'class'
|
||||||
| expression '.' Identifier
|
| expression '.' Identifier
|
||||||
| expression '.' 'this'
|
| expression '.' 'this'
|
||||||
| expression '.' 'super' '(' expressionList? ')'
|
| expression '.' 'super' '(' expressionList? ')'
|
||||||
| expression '.' 'new' Identifier '(' expressionList? ')'
|
| expression '.' 'new' Identifier '(' expressionList? ')'
|
||||||
| creator
|
| expression '.' 'super' '.' Identifier arguments?
|
||||||
// | 'new' type ( '(' expressionList? ')' | ('[' expression ']')+)
|
| expression '.' explicitGenericInvocation
|
||||||
|
| 'new' creator
|
||||||
| expression '[' expression ']'
|
| expression '[' expression ']'
|
||||||
| '(' type ')' expression
|
| '(' type ')' expression
|
||||||
| expression ('++' | '--')
|
| expression ('++' | '--')
|
||||||
|
@ -554,10 +554,10 @@ expression
|
||||||
| ('~'|'!') expression
|
| ('~'|'!') expression
|
||||||
| expression ('*'|'/'|'%') expression
|
| expression ('*'|'/'|'%') expression
|
||||||
| expression ('+'|'-') expression
|
| expression ('+'|'-') expression
|
||||||
| expression ('<<' | '>>>' | '>>') expression
|
| expression ('<' '<' | '>' '>' '>' | '>' '>') expression
|
||||||
| expression ('<=' | '>=' | '>' | '<') expression
|
| expression ('<' '=' | '>' '=' | '>' | '<') expression
|
||||||
| expression 'instanceof' expression
|
| expression 'instanceof' type
|
||||||
| expression ('==' | '=') expression
|
| expression ('==' | '!=') expression
|
||||||
| expression '&' expression
|
| expression '&' expression
|
||||||
| expression '^'<assoc=right> expression
|
| expression '^'<assoc=right> expression
|
||||||
| expression '|' expression
|
| expression '|' expression
|
||||||
|
@ -565,7 +565,7 @@ expression
|
||||||
| expression '||' expression
|
| expression '||' expression
|
||||||
| expression '?' expression ':' expression
|
| expression '?' expression ':' expression
|
||||||
| expression
|
| expression
|
||||||
('='<assoc=right>
|
('^='<assoc=right>
|
||||||
|'+='<assoc=right>
|
|'+='<assoc=right>
|
||||||
|'-='<assoc=right>
|
|'-='<assoc=right>
|
||||||
|'*='<assoc=right>
|
|'*='<assoc=right>
|
||||||
|
@ -573,9 +573,11 @@ expression
|
||||||
|'&='<assoc=right>
|
|'&='<assoc=right>
|
||||||
|'|='<assoc=right>
|
|'|='<assoc=right>
|
||||||
|'='<assoc=right>
|
|'='<assoc=right>
|
||||||
|
/*
|
||||||
|'>' '>' '='<assoc=right>
|
|'>' '>' '='<assoc=right>
|
||||||
|'>' '>' '>' '='<assoc=right>
|
|'>' '>' '>' '='<assoc=right>
|
||||||
|'<' '<' '='<assoc=right>
|
|'<' '<' '='<assoc=right>
|
||||||
|
*/
|
||||||
|'%='<assoc=right>
|
|'%='<assoc=right>
|
||||||
)
|
)
|
||||||
expression
|
expression
|
||||||
|
@ -595,6 +597,10 @@ innerCreator
|
||||||
: nonWildcardTypeArguments? Identifier classCreatorRest
|
: nonWildcardTypeArguments? Identifier classCreatorRest
|
||||||
;
|
;
|
||||||
|
|
||||||
|
explicitGenericInvocation
|
||||||
|
: nonWildcardTypeArguments Identifier arguments
|
||||||
|
;
|
||||||
|
|
||||||
arrayCreatorRest
|
arrayCreatorRest
|
||||||
: '['
|
: '['
|
||||||
( ']' ('[' ']')* arrayInitializer
|
( ']' ('[' ']')* arrayInitializer
|
||||||
|
@ -613,3 +619,119 @@ nonWildcardTypeArguments
|
||||||
arguments
|
arguments
|
||||||
: '(' expressionList? ')'
|
: '(' 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;}
|
||||||
|
;
|
||||||
|
|
||||||
|
|
|
@ -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.runtime.debug.BlankDebugEventListener;
|
||||||
import org.antlr.v4.runtime.ANTLRFileStream;
|
import org.antlr.v4.runtime.ANTLRFileStream;
|
||||||
import org.antlr.v4.runtime.CommonTokenStream;
|
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.LexerATNSimulator;
|
||||||
import org.antlr.v4.runtime.atn.ParserATNSimulator;
|
import org.antlr.v4.runtime.atn.ParserATNSimulator;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
/** Parse a java file or directory of java files using the generated parser
|
|
||||||
* ANTLR builds from java.g
|
|
||||||
*/
|
|
||||||
class TestJavaLR {
|
class TestJavaLR {
|
||||||
public static long lexerTime = 0;
|
public static long lexerTime = 0;
|
||||||
public static boolean profile = false;
|
public static boolean profile = false;
|
||||||
|
@ -131,12 +101,14 @@ class TestJavaLR {
|
||||||
// Create a parser that reads from the scanner
|
// Create a parser that reads from the scanner
|
||||||
if ( parser==null ) {
|
if ( parser==null ) {
|
||||||
parser = new JavaParserLR(tokens);
|
parser = new JavaParserLR(tokens);
|
||||||
|
parser.setBuildParseTree(true);
|
||||||
// parser.setErrorHandler(new BailErrorStrategy<Token>());
|
// parser.setErrorHandler(new BailErrorStrategy<Token>());
|
||||||
// parser.getInterpreter().setContextSensitive(true);
|
// parser.getInterpreter().setContextSensitive(true);
|
||||||
}
|
}
|
||||||
parser.setTokenStream(tokens);
|
parser.setTokenStream(tokens);
|
||||||
// start parsing at the compilationUnit rule
|
// start parsing at the compilationUnit rule
|
||||||
parser.compilationUnit();
|
ParserRuleContext<Token> tree = parser.compilationUnit();
|
||||||
|
tree.inspect(parser);
|
||||||
//System.err.println("finished "+f);
|
//System.err.println("finished "+f);
|
||||||
// System.out.println("cache size = "+DefaultErrorStrategy.cache.size());
|
// System.out.println("cache size = "+DefaultErrorStrategy.cache.size());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue