⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java.g

📁 Groovy动态语言 运行在JVM中的动态语言 可以方便的处理业务逻辑变化大的业务
💻 G
📖 第 1 页 / 共 4 页
字号:
// Note: Please don't use physical tabs.  Logical tabs for indent are width 4.header {package org.codehaus.groovy.antlr.java;import org.codehaus.groovy.antlr.*;import org.codehaus.groovy.antlr.parser.*;import java.util.*;import java.io.InputStream;import java.io.Reader;import antlr.InputBuffer;import antlr.LexerSharedInputState;} /** Java 1.5 Recognizer * * Run 'java Main [-showtree] directory-full-of-java-files' * * [The -showtree option pops up a Swing frame that shows *  the AST constructed from the parser.] * * Run 'java Main <directory full of java files>' * * Contributing authors: *      Jeremy Rayner       groovy@ross-rayner.com *		John Mitchell		johnm@non.net *		Terence Parr		parrt@magelang.com *		John Lilley		jlilley@empathy.com *		Scott Stanchfield	thetick@magelang.com *		Markus Mohnen		mohnen@informatik.rwth-aachen.de *		Peter Williams		pete.williams@sun.com *		Allan Jacobs		Allan.Jacobs@eng.sun.com *		Steve Messick		messick@redhills.com *		John Pybus		john@pybus.org * * Version 1.00 December 9, 1997 -- initial release * Version 1.01 December 10, 1997 *		fixed bug in octal def (0..7 not 0..8) * Version 1.10 August 1998 (parrt) *		added tree construction *		fixed definition of WS,comments for mac,pc,unix newlines *		added unary plus * Version 1.11 (Nov 20, 1998) *		Added "shutup" option to turn off last ambig warning. *		Fixed inner class def to allow named class defs as statements *		synchronized requires compound not simple statement *		add [] after builtInType DOT class in primaryExpression *		"const" is reserved but not valid..removed from modifiers * Version 1.12 (Feb 2, 1999) *		Changed LITERAL_xxx to xxx in tree grammar. *		Updated java.g to use tokens {...} now for 2.6.0 (new feature). * * Version 1.13 (Apr 23, 1999) *		Didn't have (stat)? for else clause in tree parser. *		Didn't gen ASTs for interface extends.  Updated tree parser too. *		Updated to 2.6.0. * Version 1.14 (Jun 20, 1999) *		Allowed final/abstract on local classes. *		Removed local interfaces from methods *		Put instanceof precedence where it belongs...in relationalExpr *			It also had expr not type as arg; fixed it. *		Missing ! on SEMI in classBlock *		fixed: (expr) + "string" was parsed incorrectly (+ as unary plus). *		fixed: didn't like Object[].class in parser or tree parser * Version 1.15 (Jun 26, 1999) *		Screwed up rule with instanceof in it. :(  Fixed. *		Tree parser didn't like (expr).something; fixed. *		Allowed multiple inheritance in tree grammar. oops. * Version 1.16 (August 22, 1999) *		Extending an interface built a wacky tree: had extra EXTENDS. *		Tree grammar didn't allow multiple superinterfaces. *		Tree grammar didn't allow empty var initializer: {} * Version 1.17 (October 12, 1999) *		ESC lexer rule allowed 399 max not 377 max. *		java.tree.g didn't handle the expression of synchronized *		statements. * Version 1.18 (August 12, 2001) *	  	Terence updated to Java 2 Version 1.3 by *		observing/combining work of Allan Jacobs and Steve *		Messick.  Handles 1.3 src.  Summary: *		o  primary didn't include boolean.class kind of thing *	  	o  constructor calls parsed explicitly now: * 		   see explicitConstructorInvocation *		o  add strictfp modifier *	  	o  missing objBlock after new expression in tree grammar *		o  merged local class definition alternatives, moved after declaration *		o  fixed problem with ClassName.super.field *	  	o  reordered some alternatives to make things more efficient *		o  long and double constants were not differentiated from int/float *		o  whitespace rule was inefficient: matched only one char *		o  add an examples directory with some nasty 1.3 cases *		o  made Main.java use buffered IO and a Reader for Unicode support *		o  supports UNICODE? *		   Using Unicode charVocabulay makes code file big, but only *		   in the bitsets at the end. I need to make ANTLR generate *		   unicode bitsets more efficiently. * Version 1.19 (April 25, 2002) *		Terence added in nice fixes by John Pybus concerning floating *		constants and problems with super() calls.  John did a nice *		reorg of the primary/postfix expression stuff to read better *		and makes f.g.super() parse properly (it was METHOD_CALL not *		a SUPER_CTOR_CALL).  Also: * *		o  "finally" clause was a root...made it a child of "try" *		o  Added stuff for asserts too for Java 1.4, but *commented out* *		   as it is not backward compatible. * * Version 1.20 (October 27, 2002) * *	  Terence ended up reorging John Pybus' stuff to *	  remove some nondeterminisms and some syntactic predicates. *	  Note that the grammar is stricter now; e.g., this(...) must *	be the first statement. * *	  Trinary ?: operator wasn't working as array name: *		  (isBig ? bigDigits : digits)[i]; * *	  Checked parser/tree parser on source for *		  Resin-2.0.5, jive-2.1.1, jdk 1.3.1, Lucene, antlr 2.7.2a4, *		and the 110k-line jGuru server source. * * Version 1.21 (October 17, 2003) *  Fixed lots of problems including: *  Ray Waldin: add typeDefinition to interfaceBlock in java.tree.g *  He found a problem/fix with floating point that start with 0 *  Ray also fixed problem that (int.class) was not recognized. *  Thorsten van Ellen noticed that \n are allowed incorrectly in strings. *  TJP fixed CHAR_LITERAL analogously. * * Version 1.21.2 (March, 2003) *	  Changes by Matt Quail to support generics (as per JDK1.5/JSR14) *	  Notes: *	  o We only allow the "extends" keyword and not the "implements" *		keyword, since thats what JSR14 seems to imply. *	  o Thanks to Monty Zukowski for his help on the antlr-interest *		mail list. *	  o Thanks to Alan Eliasen for testing the grammar over his *		Fink source base * * Version 1.22 (July, 2004) *	  Changes by Michael Studman to support Java 1.5 language extensions *	  Notes: *	  o Added support for annotations types *	  o Finished off Matt Quail's generics enhancements to support bound type arguments *	  o Added support for new for statement syntax *	  o Added support for static import syntax *	  o Added support for enum types *	  o Tested against JDK 1.5 source base and source base of jdigraph project *	  o Thanks to Matt Quail for doing the hard part by doing most of the generics work * * Version 1.22.1 (July 28, 2004) *	  Bug/omission fixes for Java 1.5 language support *	  o Fixed tree structure bug with classOrInterface - thanks to Pieter Vangorpto for *		spotting this *	  o Fixed bug where incorrect handling of SR and BSR tokens would cause type *		parameters to be recognised as type arguments. *	  o Enabled type parameters on constructors, annotations on enum constants *		and package definitions *	  o Fixed problems when parsing if ((char.class.equals(c))) {} - solution by Matt Quail at Cenqua * * Version 1.22.2 (July 28, 2004) *	  Slight refactoring of Java 1.5 language support *	  o Refactored for/"foreach" productions so that original literal "for" literal *	    is still used but the for sub-clauses vary by token type *	  o Fixed bug where type parameter was not included in generic constructor's branch of AST * * Version 1.22.3 (August 26, 2004) *	  Bug fixes as identified by Michael Stahl; clean up of tabs/spaces *        and other refactorings *	  o Fixed typeParameters omission in identPrimary and newStatement *	  o Replaced GT reconcilliation code with simple semantic predicate *	  o Adapted enum/assert keyword checking support from Michael Stahl's java15 grammar *	  o Refactored typeDefinition production and field productions to reduce duplication * * Version 1.22.4 (October 21, 2004) *    Small bux fixes *    o Added typeArguments to explicitConstructorInvocation, e.g. new <String>MyParameterised() *    o Added typeArguments to postfixExpression productions for anonymous inner class super *      constructor invocation, e.g. new Outer().<String>super() *    o Fixed bug in array declarations identified by Geoff Roy * * Version 1.22.4.j.1 *	  Changes by Jeremy Rayner to support java2groovy tool *    o I have taken java.g for Java1.5 from Michael Studman (1.22.4) *      and have made some changes to enable use by java2groovy tool (Jan 2007) * * This grammar is in the PUBLIC DOMAIN */class JavaRecognizer extends Parser;options {	k = 2;							// two token lookahead	exportVocab=Java;				// Call its vocabulary "Java"	codeGenMakeSwitchThreshold = 2;	// Some optimizations	codeGenBitsetTestThreshold = 3;	defaultErrorHandler = false;	// Don't generate parser error handlers	buildAST = true;}tokens {	BLOCK; MODIFIERS; OBJBLOCK; SLIST; METHOD_DEF; VARIABLE_DEF;	INSTANCE_INIT; STATIC_INIT; TYPE; CLASS_DEF; INTERFACE_DEF;	PACKAGE_DEF; ARRAY_DECLARATOR; EXTENDS_CLAUSE; IMPLEMENTS_CLAUSE;	PARAMETERS; PARAMETER_DEF; LABELED_STAT; TYPECAST; INDEX_OP;	POST_INC; POST_DEC; METHOD_CALL; EXPR; ARRAY_INIT;	IMPORT; UNARY_MINUS; UNARY_PLUS; CASE_GROUP; ELIST; FOR_INIT; FOR_CONDITION;	FOR_ITERATOR; EMPTY_STAT; FINAL="final"; ABSTRACT="abstract";	STRICTFP="strictfp"; SUPER_CTOR_CALL; CTOR_CALL; VARIABLE_PARAMETER_DEF;	STATIC_IMPORT; ENUM_DEF; ENUM_CONSTANT_DEF; FOR_EACH_CLAUSE; ANNOTATION_DEF; ANNOTATIONS;	ANNOTATION; ANNOTATION_MEMBER_VALUE_PAIR; ANNOTATION_FIELD_DEF; ANNOTATION_ARRAY_INIT;	TYPE_ARGUMENTS; TYPE_ARGUMENT; TYPE_PARAMETERS; TYPE_PARAMETER; WILDCARD_TYPE;	TYPE_UPPER_BOUNDS; TYPE_LOWER_BOUNDS;}{    /** This factory is the correct way to wire together a Groovy parser and lexer. */    public static JavaRecognizer make(JavaLexer lexer) {        JavaRecognizer parser = new JavaRecognizer(lexer.plumb());        // TODO: set up a common error-handling control block, to avoid excessive tangle between these guys        parser.lexer = lexer;        lexer.parser = parser;        parser.setASTNodeClass("org.codehaus.groovy.antlr.GroovySourceAST");        return parser;    }    // Create a scanner that reads from the input stream passed to us...    public static JavaRecognizer make(InputStream in) { return make(new JavaLexer(in)); }    public static JavaRecognizer make(Reader in) { return make(new JavaLexer(in)); }    public static JavaRecognizer make(InputBuffer in) { return make(new JavaLexer(in)); }    public static JavaRecognizer make(LexerSharedInputState in) { return make(new JavaLexer(in)); }        private static GroovySourceAST dummyVariableToforceClassLoaderToFindASTClass = new GroovySourceAST();        JavaLexer lexer;    public JavaLexer getLexer() { return lexer; }    public void setFilename(String f) { super.setFilename(f); lexer.setFilename(f); }    private SourceBuffer sourceBuffer;    public void setSourceBuffer(SourceBuffer sourceBuffer) {        this.sourceBuffer = sourceBuffer;    }    /** Create an AST node with the token type and text passed in, but     *  with the same background information as another supplied Token (e.g. line numbers)     * to be used in place of antlr tree construction syntax,     * i.e. #[TOKEN,"text"]  becomes  create(TOKEN,"text",anotherToken)     *     * todo - change antlr.ASTFactory to do this instead...     */    public AST create(int type, String txt, Token first, Token last) {        AST t = astFactory.create(type,txt);        if ( t != null && first != null) {            // first copy details from first token            t.initialize(first);            // then ensure that type and txt are specific to this new node            t.initialize(type,txt);        }        if ((t instanceof GroovySourceAST) && last != null) {            GroovySourceAST node = (GroovySourceAST)t;            node.setLast(last);            // This is a good point to call node.setSnippet(),            // but it bulks up the AST too much for production code.        }        return t;    }        /**	 * Counts the number of LT seen in the typeArguments production.	 * It is used in semantic predicates to ensure we have seen	 * enough closing '>' characters; which actually may have been	 * either GT, SR or BSR tokens.	 */	private int ltCounter = 0;}// Compilation Unit: In Java, this is a single file. This is the start// rule for this parsercompilationUnit	:	// A compilation unit starts with an optional package definition		(	(annotations "package")=> packageDefinition		|	/* nothing */		)		// Next we have a series of zero or more import statements		( importDefinition )*		// Wrapping things up with any number of class or interface		// definitions		( typeDefinition )*		EOF!	;// Package statement: optional annotations followed by "package" then the package identifier.packageDefinition	options {defaultErrorHandler = true;} // let ANTLR handle errors	:	annotations p:"package"^ {#p.setType(PACKAGE_DEF);} identifier SEMI!	;// Import statement: import followed by a package or class nameimportDefinition	options {defaultErrorHandler = true;}	{ boolean isStatic = false; }	:	i:"import"^ {#i.setType(IMPORT);} ( "static"! {#i.setType(STATIC_IMPORT);} )? identifierStar SEMI!	;// A type definition is either a class, interface, enum or annotation with possible additional semis.typeDefinition	options {defaultErrorHandler = true;}	:	m:modifiers!		typeDefinitionInternal[#m]	|	SEMI!	;// Protected type definitions production for reuse in other productionsprotected typeDefinitionInternal[AST mods]	:	classDefinition[#mods]		// inner class	|	interfaceDefinition[#mods]	// inner interface	|	enumDefinition[#mods]		// inner enum	|	annotationDefinition[#mods]	// inner annotation	;// A declaration is the creation of a reference or primitive-type variable// Create a separate Type/Var tree for each var in the var list.declaration!	:	m:modifiers t:typeSpec[false] v:variableDefinitions[#m,#t]		{#declaration = #v;}	;// A type specification is a type name with possible brackets afterwards// (which would make it an array type).typeSpec[boolean addImagNode]	:	classTypeSpec[addImagNode]	|	builtInTypeSpec[addImagNode]	;// A class type specification is a class type with either:// - possible brackets afterwards//   (which would make it an array type).// - generic type arguments afterclassTypeSpec[boolean addImagNode]  {Token first = LT(1);}	:	classOrInterfaceType[false]		(options{greedy=true;}: // match as many as possible			lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} RBRACK!		)*		{			if ( addImagNode ) {				#classTypeSpec = #(create(TYPE,"TYPE",first,LT(1)), #classTypeSpec);			}		}	;// A non-built in type name, with possible type parametersclassOrInterfaceType[boolean addImagNode]  {Token first = LT(1);}	:	IDENT^ (typeArguments)?		(options{greedy=true;}: // match as many as possible			DOT^			IDENT (typeArguments)?		)*		{			if ( addImagNode ) {				#classOrInterfaceType = #(create(TYPE,"TYPE",first,LT(1)), #classOrInterfaceType);			}		}	;// A specialised form of typeSpec where built in types must be arraystypeArgumentSpec	:	classTypeSpec[true]	|	builtInTypeArraySpec[true]	;// A generic type argument is a class type, a possibly bounded wildcard type or a built-in type arraytypeArgument  {Token first = LT(1);}	:	(	typeArgumentSpec		|	wildcardType		)		{#typeArgument = #(create(TYPE_ARGUMENT,"TYPE_ARGUMENT",first,LT(1)), #typeArgument);}	;// Wildcard type indicating all types (with possible constraint)wildcardType	:	q:QUESTION^ {#q.setType(WILDCARD_TYPE);}		(("extends" | "super")=> typeArgumentBounds)?	;// Type arguments to a class or interface typetypeArguments{int currentLtLevel = 0;  Token first = LT(1);}	:		{currentLtLevel = ltCounter;}		LT! {ltCounter++;}		typeArgument		(options{greedy=true;}: // match as many as possible			{inputState.guessing !=0 || ltCounter == currentLtLevel + 1}?			COMMA! typeArgument		)*		(	// turn warning off since Antlr generates the right code,			// plus we have our semantic predicate below			options{generateAmbigWarnings=false;}:			typeArgumentsOrParametersEnd		)?		// make sure we have gobbled up enough '>' characters		// if we are at the "top level" of nested typeArgument productions		{(currentLtLevel != 0) || ltCounter == currentLtLevel}?		{#typeArguments = #(create(TYPE_ARGUMENTS,"TYPE_ARGUMENTS",first,LT(1)), #typeArguments);}	;// this gobbles up *some* amount of '>' characters, and counts how many// it gobbled.protected typeArgumentsOrParametersEnd	:	GT! {ltCounter-=1;}	|	SR! {ltCounter-=2;}	|	BSR! {ltCounter-=3;}	;// Restriction on wildcard types based on super class or derrived classtypeArgumentBounds	{boolean isUpperBounds = false;  Token first = LT(1);}	:		( "extends"! {isUpperBounds=true;} | "super"! ) classOrInterfaceType[false]		{			if (isUpperBounds)			{				#typeArgumentBounds = #(create(TYPE_UPPER_BOUNDS,"TYPE_UPPER_BOUNDS",first,LT(1)), #typeArgumentBounds);			}			else			{				#typeArgumentBounds = #(create(TYPE_LOWER_BOUNDS,"TYPE_LOWER_BOUNDS",first,LT(1)), #typeArgumentBounds);			}		}	;// A builtin type array specification is a builtin type with brackets afterwardsbuiltInTypeArraySpec[boolean addImagNode]  {Token first = LT(1);}	:	builtInType		(options{greedy=true;}: // match as many as possible			lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} RBRACK!		)+		{			if ( addImagNode ) {				#builtInTypeArraySpec = #(create(TYPE,"TYPE",first,LT(1)), #builtInTypeArraySpec);			}		}	;// A builtin type specification is a builtin type with possible brackets// afterwards (which would make it an array type).builtInTypeSpec[boolean addImagNode]  {Token first = LT(1);}	:	builtInType		(options{greedy=true;}: // match as many as possible			lb:LBRACK^ {#lb.setType(ARRAY_DECLARATOR);} RBRACK!		)*		{			if ( addImagNode ) {				#builtInTypeSpec = #(create(TYPE,"TYPE",first,LT(1)), #builtInTypeSpec);			}		}	;// A type name. which is either a (possibly qualified and parameterized)// class name or a primitive (builtin) typetype	:	classOrInterfaceType[false]	|	builtInType	;// The primitive types.builtInType	:	"void"	|	"boolean"	|	"byte"	|	"char"	|	"short"	|	"int"	|	"float"	|	"long"	|	"double"	;// A (possibly-qualified) java identifier. We start with the first IDENT// and expand its name by adding dots and following IDENTSidentifier	:	IDENT ( DOT^ IDENT )*	;identifierStar

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -