javarecognizer.java
来自「Groovy动态语言 运行在JVM中的动态语言 可以方便的处理业务逻辑变化大的业」· Java 代码 · 共 2,519 行 · 第 1/5 页
JAVA
2,519 行
// $ANTLR 2.7.2: "java.g" -> "JavaRecognizer.java"$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;import antlr.TokenBuffer;import antlr.TokenStreamException;import antlr.TokenStreamIOException;import antlr.ANTLRException;import antlr.LLkParser;import antlr.Token;import antlr.TokenStream;import antlr.RecognitionException;import antlr.NoViableAltException;import antlr.MismatchedTokenException;import antlr.SemanticException;import antlr.ParserSharedInputState;import antlr.collections.impl.BitSet;import antlr.collections.AST;import java.util.Hashtable;import antlr.ASTFactory;import antlr.ASTPair;import antlr.collections.impl.ASTArray;/** 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 */public class JavaRecognizer extends antlr.LLkParser implements JavaTokenTypes { /** 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;protected JavaRecognizer(TokenBuffer tokenBuf, int k) { super(tokenBuf,k); tokenNames = _tokenNames; buildTokenTypeASTClassMap(); astFactory = new ASTFactory(getTokenTypeToASTClassMap());}public JavaRecognizer(TokenBuffer tokenBuf) { this(tokenBuf,2);}protected JavaRecognizer(TokenStream lexer, int k) { super(lexer,k); tokenNames = _tokenNames; buildTokenTypeASTClassMap(); astFactory = new ASTFactory(getTokenTypeToASTClassMap());}public JavaRecognizer(TokenStream lexer) { this(lexer,2);}public JavaRecognizer(ParserSharedInputState state) { super(state,2); tokenNames = _tokenNames; buildTokenTypeASTClassMap(); astFactory = new ASTFactory(getTokenTypeToASTClassMap());} public final void compilationUnit() throws RecognitionException, TokenStreamException { returnAST = null; ASTPair currentAST = new ASTPair(); AST compilationUnit_AST = null; { boolean synPredMatched4 = false; if (((LA(1)==LITERAL_package||LA(1)==AT) && (LA(2)==IDENT))) { int _m4 = mark(); synPredMatched4 = true; inputState.guessing++; try { { annotations(); match(LITERAL_package); } } catch (RecognitionException pe) { synPredMatched4 = false; } rewind(_m4); inputState.guessing--; } if ( synPredMatched4 ) { packageDefinition(); astFactory.addASTChild(currentAST, returnAST); } else if ((_tokenSet_0.member(LA(1))) && (_tokenSet_1.member(LA(2)))) { } else { throw new NoViableAltException(LT(1), getFilename()); } } { _loop6: do { if ((LA(1)==LITERAL_import)) { importDefinition(); astFactory.addASTChild(currentAST, returnAST); } else { break _loop6; } } while (true); } { _loop8: do { if ((_tokenSet_2.member(LA(1)))) { typeDefinition(); astFactory.addASTChild(currentAST, returnAST); } else { break _loop8; } } while (true); } match(Token.EOF_TYPE); compilationUnit_AST = (AST)currentAST.root; returnAST = compilationUnit_AST; } public final void annotations() throws RecognitionException, TokenStreamException { returnAST = null; ASTPair currentAST = new ASTPair(); AST annotations_AST = null; Token first = LT(1); { _loop62: do { if ((LA(1)==AT)) { annotation(); astFactory.addASTChild(currentAST, returnAST); } else { break _loop62; } } while (true); } if ( inputState.guessing==0 ) { annotations_AST = (AST)currentAST.root; annotations_AST = (AST)astFactory.make( (new ASTArray(2)).add(astFactory.create(ANNOTATIONS,"ANNOTATIONS")).add(annotations_AST)); currentAST.root = annotations_AST; currentAST.child = annotations_AST!=null &&annotations_AST.getFirstChild()!=null ? annotations_AST.getFirstChild() : annotations_AST; currentAST.advanceChildToEnd(); } annotations_AST = (AST)currentAST.root; returnAST = annotations_AST; } public final void packageDefinition() throws RecognitionException, TokenStreamException { returnAST = null; ASTPair currentAST = new ASTPair(); AST packageDefinition_AST = null; Token p = null; AST p_AST = null; try { // for error handling annotations(); astFactory.addASTChild(currentAST, returnAST); p = LT(1); p_AST = astFactory.create(p); astFactory.makeASTRoot(currentAST, p_AST); match(LITERAL_package); if ( inputState.guessing==0 ) { p_AST.setType(PACKAGE_DEF); } identifier(); astFactory.addASTChild(currentAST, returnAST); match(SEMI); packageDefinition_AST = (AST)currentAST.root; } catch (RecognitionException ex) { if (inputState.guessing==0) { reportError(ex); consume(); consumeUntil(_tokenSet_0); } else { throw ex; } } returnAST = packageDefinition_AST; } public final void importDefinition() throws RecognitionException, TokenStreamException { returnAST = null; ASTPair currentAST = new ASTPair(); AST importDefinition_AST = null; Token i = null; AST i_AST = null; boolean isStatic = false; try { // for error handling i = LT(1); i_AST = astFactory.create(i); astFactory.makeASTRoot(currentAST, i_AST); match(LITERAL_import); if ( inputState.guessing==0 ) { i_AST.setType(IMPORT); } { switch ( LA(1)) { case LITERAL_static: { match(LITERAL_static); if ( inputState.guessing==0 ) { i_AST.setType(STATIC_IMPORT); } break; } case IDENT: { break; } default: { throw new NoViableAltException(LT(1), getFilename()); } } } identifierStar(); astFactory.addASTChild(currentAST, returnAST); match(SEMI); importDefinition_AST = (AST)currentAST.root; } catch (RecognitionException ex) { if (inputState.guessing==0) { reportError(ex); consume(); consumeUntil(_tokenSet_0); } else { throw ex; } } returnAST = importDefinition_AST; } public final void typeDefinition() throws RecognitionException, TokenStreamException { returnAST = null; ASTPair currentAST = new ASTPair(); AST typeDefinition_AST = null; AST m_AST = null; try { // for error handling switch ( LA(1)) { case FINAL: case ABSTRACT: case STRICTFP: case LITERAL_static: case LITERAL_private: case LITERAL_public: case LITERAL_protected: case LITERAL_transient: case LITERAL_native: case LITERAL_threadsafe: case LITERAL_synchronized: case LITERAL_volatile: case AT:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?