groovylexer.java
来自「大名鼎鼎的java动态脚本语言。已经通过了sun的认证」· Java 代码 · 共 2,085 行 · 第 1/5 页
JAVA
2,085 行
// $ANTLR 2.7.2: "groovy.g" -> "GroovyLexer.java"$package org.codehaus.groovy.antlr.parser;import org.codehaus.groovy.antlr.*;import java.util.*;import java.io.InputStream;import java.io.Reader;import antlr.InputBuffer;import antlr.LexerSharedInputState;import java.io.InputStream;import antlr.TokenStreamException;import antlr.TokenStreamIOException;import antlr.TokenStreamRecognitionException;import antlr.CharStreamException;import antlr.CharStreamIOException;import antlr.ANTLRException;import java.io.Reader;import java.util.Hashtable;import antlr.CharScanner;import antlr.InputBuffer;import antlr.ByteBuffer;import antlr.CharBuffer;import antlr.Token;import antlr.CommonToken;import antlr.RecognitionException;import antlr.NoViableAltForCharException;import antlr.MismatchedCharException;import antlr.TokenStream;import antlr.ANTLRHashString;import antlr.LexerSharedInputState;import antlr.collections.impl.BitSet;import antlr.SemanticException;public class GroovyLexer extends antlr.CharScanner implements GroovyTokenTypes, TokenStream { /** flag for enabling the "assert" keyword */ private boolean assertEnabled = true; /** flag for enabling the "enum" keyword */ private boolean enumEnabled = true; /** flag for including whitespace tokens (for IDE preparsing) */ private boolean whitespaceIncluded = false; /** Enable the "assert" keyword */ public void enableAssert(boolean shouldEnable) { assertEnabled = shouldEnable; } /** Query the "assert" keyword state */ public boolean isAssertEnabled() { return assertEnabled; } /** Enable the "enum" keyword */ public void enableEnum(boolean shouldEnable) { enumEnabled = shouldEnable; } /** Query the "enum" keyword state */ public boolean isEnumEnabled() { return enumEnabled; } /** Include whitespace tokens. Note that this breaks the parser. */ public void setWhitespaceIncluded(boolean z) { whitespaceIncluded = z; } /** Are whitespace tokens included? */ public boolean isWhitespaceIncluded() { return whitespaceIncluded; } { // Initialization actions performed on construction. setTabSize(1); // get rid of special tab interpretation, for IDEs and general clarity } /** Bumped when inside '[x]' or '(x)', reset inside '{x}'. See ONE_NL. */ protected int parenLevel = 0; protected int suppressNewline = 0; // be really mean to newlines inside strings protected static final int SCS_TYPE = 3, SCS_VAL = 4, SCS_LIT = 8, SCS_LIMIT = 16; protected static final int SCS_SQ_TYPE = 0, SCS_TQ_TYPE = 1, SCS_RE_TYPE = 2; protected int stringCtorState = 0; // hack string and regexp constructor boundaries /** Push parenLevel here and reset whenever inside '{x}'. */ protected ArrayList parenLevelStack = new ArrayList(); protected int lastSigTokenType = EOF; // last returned non-whitespace token protected void pushParenLevel() { parenLevelStack.add(new Integer(parenLevel*SCS_LIMIT + stringCtorState)); parenLevel = 0; stringCtorState = 0; } protected void popParenLevel() { int npl = parenLevelStack.size(); if (npl == 0) return; int i = ((Integer) parenLevelStack.remove(--npl)).intValue(); parenLevel = i / SCS_LIMIT; stringCtorState = i % SCS_LIMIT; } protected void restartStringCtor(boolean expectLiteral) { if (stringCtorState != 0) { stringCtorState = (expectLiteral? SCS_LIT: SCS_VAL) + (stringCtorState & SCS_TYPE); } } protected boolean allowRegexpLiteral() { return !isExpressionEndingToken(lastSigTokenType); } /** Return true for an operator or punctuation which can end an expression. * Return true for keywords, identifiers, and literals. * Return true for tokens which can end expressions (right brackets, ++, --). * Return false for EOF and all other operator and punctuation tokens. * Used to suppress the recognition of /foo/ as opposed to the simple division operator '/'. */ // Cf. 'constant' and 'balancedBrackets' rules in the grammar.) protected static boolean isExpressionEndingToken(int ttype) { switch (ttype) { case INC: // x++ / y case DEC: // x-- / y case RPAREN: // (x) / y case RBRACK: // f[x] / y case RCURLY: // f{x} / y case STRING_LITERAL: // "x" / y case STRING_CTOR_END: // "$x" / y case NUM_INT: // 0 / y case NUM_FLOAT: // 0f / y case NUM_LONG: // 0l / y case NUM_DOUBLE: // 0.0 / y case NUM_BIG_INT: // 0g / y case NUM_BIG_DECIMAL: // 0.0g / y case IDENT: // x / y // and a bunch of keywords (all of them; no sense picking and choosing): case LITERAL_any: case LITERAL_as: case LITERAL_assert: case LITERAL_boolean: case LITERAL_break: case LITERAL_byte: case LITERAL_case: case LITERAL_catch: case LITERAL_char: case LITERAL_class: case LITERAL_continue: case LITERAL_def: case LITERAL_default: case LITERAL_double: case LITERAL_else: case LITERAL_enum: case LITERAL_extends: case LITERAL_false: case LITERAL_finally: case LITERAL_float: case LITERAL_for: case LITERAL_if: case LITERAL_implements: case LITERAL_import: case LITERAL_in: case LITERAL_instanceof: case LITERAL_int: case LITERAL_interface: case LITERAL_long: case LITERAL_native: case LITERAL_new: case LITERAL_null: case LITERAL_package: case LITERAL_private: case LITERAL_protected: case LITERAL_public: case LITERAL_return: case LITERAL_short: case LITERAL_static: case LITERAL_super: case LITERAL_switch: case LITERAL_synchronized: case LITERAL_this: case LITERAL_threadsafe: case LITERAL_throw: case LITERAL_throws: case LITERAL_transient: case LITERAL_true: case LITERAL_try: case LITERAL_void: case LITERAL_volatile: case LITERAL_while: case LITERAL_with: return true; default: return false; } } protected void newlineCheck(boolean check) throws RecognitionException { if (check && suppressNewline > 0) { require(suppressNewline == 0, "end of line reached within a simple string 'x' or \"x\" or /x/", "for multi-line literals, use triple quotes '''x''' or \"\"\"x\"\"\""); suppressNewline = 0; // shut down any flood of errors } newline(); } protected boolean atValidDollarEscape() throws CharStreamException { // '$' (('*')? ('{' | LETTER)) => int k = 1; char lc = LA(k++); if (lc != '$') return false; lc = LA(k++); if (lc == '*') lc = LA(k++); return (lc == '{' || (lc != '$' && Character.isJavaIdentifierStart(lc))); } /** This is a bit of plumbing which resumes collection of string constructor bodies, * after an embedded expression has been parsed. * Usage: new GroovyRecognizer(new GroovyLexer(in).plumb()). */ public TokenStream plumb() { return new TokenStream() { public Token nextToken() throws TokenStreamException { if (stringCtorState >= SCS_LIT) { // This goo is modeled upon the ANTLR code for nextToken: int quoteType = (stringCtorState & SCS_TYPE); stringCtorState = 0; // get out of this mode, now resetText(); try { switch (quoteType) { case SCS_SQ_TYPE: mSTRING_CTOR_END(true, /*fromStart:*/false, false); break; case SCS_TQ_TYPE: mSTRING_CTOR_END(true, /*fromStart:*/false, true); break; case SCS_RE_TYPE: mREGEXP_CTOR_END(true, /*fromStart:*/false); break; default: throw new AssertionError(false); } lastSigTokenType = _returnToken.getType(); return _returnToken; } catch (RecognitionException e) { throw new TokenStreamRecognitionException(e); } catch (CharStreamException cse) { if ( cse instanceof CharStreamIOException ) { throw new TokenStreamIOException(((CharStreamIOException)cse).io); } else { throw new TokenStreamException(cse.getMessage()); } } } Token token = GroovyLexer.this.nextToken(); int lasttype = token.getType(); if (whitespaceIncluded) { switch (lasttype) { // filter out insignificant types case WS: case ONE_NL: case SL_COMMENT: case ML_COMMENT: lasttype = lastSigTokenType; // back up! } } lastSigTokenType = lasttype; return token; } }; } // stuff to adjust ANTLR's tracing machinery public static boolean tracing = false; // only effective if antlr.Tool is run with -traceLexer public void traceIn(String rname) throws CharStreamException { if (!GroovyLexer.tracing) return; super.traceIn(rname); } public void traceOut(String rname) throws CharStreamException { if (!GroovyLexer.tracing) return; if (_returnToken != null) rname += tokenStringOf(_returnToken); super.traceOut(rname); } private static java.util.HashMap ttypes; private static String tokenStringOf(Token t) { if (ttypes == null) { java.util.HashMap map = new java.util.HashMap(); java.lang.reflect.Field[] fields = GroovyTokenTypes.class.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { if (fields[i].getType() != int.class) continue; try { map.put(fields[i].get(null), fields[i].getName()); } catch (IllegalAccessException ee) { } } ttypes = map; } Integer tt = new Integer(t.getType()); Object ttn = ttypes.get(tt); if (ttn == null) ttn = "<"+tt+">"; return "["+ttn+",\""+t.getText()+"\"]"; } protected GroovyRecognizer parser; // little-used link; TODO: get rid of private void require(boolean z, String problem, String solution) throws SemanticException { // TODO: Direct to a common error handler, rather than through the parser. if (!z) parser.requireFailed(problem, solution); } public GroovyLexer(InputStream in) { this(new ByteBuffer(in));}public GroovyLexer(Reader in) { this(new CharBuffer(in));}public GroovyLexer(InputBuffer ib) { this(new LexerSharedInputState(ib));}public GroovyLexer(LexerSharedInputState state) { super(state); caseSensitiveLiterals = true; setCaseSensitive(true); literals = new Hashtable(); literals.put(new ANTLRHashString("byte", this), new Integer(101)); literals.put(new ANTLRHashString("public", this), new Integer(112)); literals.put(new ANTLRHashString("case", this), new Integer(150)); literals.put(new ANTLRHashString("short", this), new Integer(103)); literals.put(new ANTLRHashString("break", this), new Integer(144)); literals.put(new ANTLRHashString("while", this), new Integer(138)); literals.put(new ANTLRHashString("new", this), new Integer(192)); literals.put(new ANTLRHashString("instanceof", this), new Integer(178)); literals.put(new ANTLRHashString("implements", this), new Integer(128)); literals.put(new ANTLRHashString("synchronized", this), new Integer(117)); literals.put(new ANTLRHashString("const", this), new Integer(40)); literals.put(new ANTLRHashString("float", this), new Integer(105)); literals.put(new ANTLRHashString("package", this), new Integer(78)); literals.put(new ANTLRHashString("return", this), new Integer(143)); literals.put(new ANTLRHashString("throw", this), new Integer(146)); literals.put(new ANTLRHashString("null", this), new Integer(195)); literals.put(new ANTLRHashString("def", this), new Integer(81)); literals.put(new ANTLRHashString("threadsafe", this), new Integer(116)); literals.put(new ANTLRHashString("protected", this), new Integer(113)); literals.put(new ANTLRHashString("class", this), new Integer(88)); literals.put(new ANTLRHashString("throws", this), new Integer(127)); literals.put(new ANTLRHashString("do", this), new Integer(41)); literals.put(new ANTLRHashString("strictfp", this), new Integer(42)); literals.put(new ANTLRHashString("super", this), new Integer(93)); literals.put(new ANTLRHashString("with", this), new Integer(139)); literals.put(new ANTLRHashString("transient", this), new Integer(114)); literals.put(new ANTLRHashString("native", this), new Integer(115)); literals.put(new ANTLRHashString("interface", this), new Integer(89)); literals.put(new ANTLRHashString("final", this), new Integer(37)); literals.put(new ANTLRHashString("any", this), new Integer(108)); literals.put(new ANTLRHashString("if", this), new Integer(136)); literals.put(new ANTLRHashString("double", this), new Integer(107)); literals.put(new ANTLRHashString("volatile", this), new Integer(118)); literals.put(new ANTLRHashString("as", this), new Integer(110)); literals.put(new ANTLRHashString("assert", this), new Integer(147)); literals.put(new ANTLRHashString("catch", this), new Integer(153)); literals.put(new ANTLRHashString("try", this), new Integer(151)); literals.put(new ANTLRHashString("goto", this), new Integer(39)); literals.put(new ANTLRHashString("enum", this), new Integer(90)); literals.put(new ANTLRHashString("int", this), new Integer(104)); literals.put(new ANTLRHashString("for", this), new Integer(141)); literals.put(new ANTLRHashString("extends", this), new Integer(92)); literals.put(new ANTLRHashString("boolean", this), new Integer(100)); literals.put(new ANTLRHashString("char", this), new Integer(102)); literals.put(new ANTLRHashString("private", this), new Integer(111)); literals.put(new ANTLRHashString("default", this), new Integer(126)); literals.put(new ANTLRHashString("false", this), new Integer(194)); literals.put(new ANTLRHashString("this", this), new Integer(129)); literals.put(new ANTLRHashString("static", this), new Integer(80)); literals.put(new ANTLRHashString("abstract", this), new Integer(38)); literals.put(new ANTLRHashString("continue", this), new Integer(145)); literals.put(new ANTLRHashString("finally", this), new Integer(152)); literals.put(new ANTLRHashString("else", this), new Integer(137)); literals.put(new ANTLRHashString("import", this), new Integer(79)); literals.put(new ANTLRHashString("in", this), new Integer(142)); literals.put(new ANTLRHashString("void", this), new Integer(99)); literals.put(new ANTLRHashString("switch", this), new Integer(140)); literals.put(new ANTLRHashString("true", this), new Integer(193)); literals.put(new ANTLRHashString("long", this), new Integer(106));}public Token nextToken() throws TokenStreamException { Token theRetToken=null;tryAgain: for (;;) { Token _token = null; int _ttype = Token.INVALID_TYPE; resetText(); try { // for char stream error handling try { // for lexical error handling switch ( LA(1)) { case '(': { mLPAREN(true); theRetToken=_returnToken; break; } case ')': { mRPAREN(true); theRetToken=_returnToken; break; } case '[': { mLBRACK(true); theRetToken=_returnToken; break; } case ']': { mRBRACK(true); theRetToken=_returnToken; break; } case '{': { mLCURLY(true); theRetToken=_returnToken; break; } case '}': { mRCURLY(true); theRetToken=_returnToken; break; } case ':': { mCOLON(true); theRetToken=_returnToken; break; } case ',': { mCOMMA(true);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?